Ứng dụng toán ưu hóa trong kinh tế sử dụng chương trình xpress-Mp

Ngôn ngữ Xpress-Mosel cho phép người dùng định nghĩa mô hình dưới dạng mô hình toán học và giải quyết chúng. Chương trình Mosel có thể được ứng dụng để giải các thuật toán trong ngôn ngữ cấp cao này, Mosel có thể được dùng độc lập hoặc thông qua môi trường Xpress-IVE, có nhiều chức năng khác, và cho giao diện đồ họa về thông tin hình ảnh.

pdf44 trang | Chia sẻ: vietpd | Lượt xem: 1354 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Ứng dụng toán ưu hóa trong kinh tế sử dụng chương trình xpress-Mp, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
CHƯƠNG 2: ỨNG DỤNG TOÁN ƯU HÓA TRONG KINH TẾ SỬ DỤNG CHƯƠNG TRÌNH XPRESS-MP 2.1 Chương trình Xpress-MP 2.1.1 Giới thiệu Sản phẩm FICOTM XPRESS cho ta nhiều cách làm việc với mô hình và công cụ tối ưu. Xpress-MP có cấu trúc như Hình 2.1: Hình 2.1 Mô hình Xpress-MP • Ngôn ngữ cấp cao Ngôn ngữ Xpress-Mosel cho phép người dùng định nghĩa mô hình dưới dạng mô hình toán học và giải quyết chúng. Chương trình Mosel có thể được ứng dụng để giải các thuật toán trong ngôn ngữ cấp cao này, Mosel có thể được dùng độc lập hoặc thông qua môi trường Xpress-IVE, có nhiều chức năng khác, và cho giao diện đồ họa về thông tin hình ảnh. 14 Mosel dùng Xpress-Optimizer để giải các mô hình toán (quy hoạch tuyến tính, quy hoạch nguyên, và quy hoạch toàn phương, quy hoạch ngẫu nhiên và quy hoạch ràng buộc), lấy được dữ liệu tĩnh và động (thông qua ODBC) và lấy được các hàm hệ thống. Hơn nữa Mosel có thể xuất dữ liệu (nghiệm bài toán và giá trị hàm mục tiêu) ra ngoài dưới dạng tập tin. • Thư viện tích hợp Có 2 cách để nhúng mô hình toán vào ứng dụng của người dùng: - Sử dụng các ngôn ngữ lập trình (C, C++, C#, Visual Basic, Java). - Sử dụng Xpress-BCL. • Giải trực tiếp BCL: ở mức thấp nhất, BCL làm trực tiếp với Xpress- Optimizer hoặc Xpress-SLP dưới dạng thư viện. Chương trình Xpress-IVE được dùng để giải các bài toán trong luận văn này. Giao diện Xpress-IVE như Hình 2.2: Hình 2.2 Giao diện chương trình Xpress-IVE 15 xét Thí dụ 1.1 bài toán kế hoạch sản xuất của xưởng mộc có: Mô hình toán 1 2 1 2 1 2 1 2 max 5. 20. 3. 2. 160 1. 3. 200 0 0 z x x x x x x x x= + + ≤ + ≤ ≥ ≥ (2.1) Bây giờ chúng ta đưa mô hình (2.1) về mô hình Mosel để giải trên Xpress-MP Mô hình Mosel model "Thi du 1.1 bai toan ke hoach san xuat cua xuong moc" uses "mmxprs"; declarations x1: mpvar ! So luong bo co loai nho x2: mpvar ! So luong bo co loai lon muctieu:linctr end-declarations muctieu := 5*x1 + 20*x2 3*x1 + 2*x2 <= 160 1*x1 + 3*x2 <= 200 x1 >= 0 x2 >= 0 maximize(muctieu) !hien thi ket qua writeln("ham muc tieu muctieu = ", getobjval) writeln("nghiem x(1) = ", getsol(x1)) writeln("nghiem x(2) = ", getsol(x2)) end-model Đối với bài toán có số lượng biến và ràng buộc lớn thì ta thường đưa về dạng ma trận. Bài toán xưởng mộc có thể được đưa về mô hình toán ma trận 16 Dạng chính tắc: min 0 Tz c x Ax b x = ≤ ≥ Với c = (5, 20), x = (x1, x2), b = (160, 200), 3 2 1 3 A ⎛ ⎞= ⎜ ⎟⎝ ⎠ Mô hình Mosel 1: Dữ liệu được khai báo trực tiếp trong mô hình model "Thi du 1.1 bai toan ke hoach san xuat cua xuong moc" uses "mmxprs"; declarations c : array(1..2) of real ! vecto he so ham muc tieu b : array(1..2) of real ! vecto he so A : array(1..2,1..2) of real ! ma tran he so x : array(1..2) of mpvar ! vecto bien so luong bo co muctieu:linctr end-declarations c :: [5,20] b :: [160, 200] A :: [3, 2, 1, 3] muctieu := sum(j in 1..2) c(j)*x(j) forall(i in 1..2) sum(j in 1..2)A(i,j)* x(j) <= b(i) forall(j in 1..2) x(j) >= 0 maximize(muctieu) !hien thi ket qua writeln("ham muc tieu muctieu = ", getobjval) forall(j in 1..2) writeln("nghiem x(", j ,") = ", getsol(x(j))) end-model 17 Mô hình Mosel 2: Tách dữ liệu độc lập với mô hình Mosel model "Bai toan xuong moc" uses "mmxprs"; !gain access to the Xpress-Optimizer solver parameters SoDong = 2 SoCot = 2 end-parameters declarations M = 1..SoDong ! so dong N = 1..SoCot ! so cot !N = {"bo co nho","bo co lon"} c : array(N) of real ! vecto he so ham muc tieu b : array(M) of real ! vecto he so A : array(M,N) of real ! ma tran he so x : array(N) of mpvar ! vecto bien muctieu:linctr end-declarations initializations from "XuongMoc.dat" c b A end-initializations muctieu := sum(j in N) c(j)*x(j) forall(i in M) sum(j in N)A(i,j)* x(j) <= b(i) forall(j in N) x(j) >= 0 maximize(muctieu) !hien thi ket qua writeln("Doanh thu cua cong ty xuong moc: ", getobjval) forall(j in N) writeln("nghiem x(", j ,")=", getsol(x(j))) end-model 18 Mô hình Mosel đọc dữ liệu từ tập tin XuongMoc.dat. và tập tinh XuongMoc.dat như sau: c : [5 20] b : [160 200] A : [3, 2, 1, 3] Kết quả chạy các mô hình Doanh thu cua cong ty xuong moc: 1333.33 nghiem x(1)=0 nghiem x(2)=66.6667 2.1.2 Cấu trúc của mô hình xưởng mộc và mô hình Mosel tổng quát model ModelName uses "mmxprs","mmquad","mmive","mmodbc" parameters !... end-parameters declarations !.. end-declarations initializations !... end-initializations (! Phat trien mo hinh !muc tieu !cac rang buoc !) writeln("hien thi nghiem") !... writeln("hien thi muc tieu") end-model 19 • Bắt đầu mô hình Mosel Mỗi mô hinh Mosel bắt đầu với từ khóa model, và kết thúc với end-model. model ModelName … end-model • Khai báo thư viện trong Mosel uses "mmxprs","mmquad","mmive","mmodbc" mmxprs: thư viện chứa các hàm giải bài toán quy hoạch tuyến, quy hoạch nguyên. mmquad: thư viện chứa các hàm giải bài toán quy hoạch toàn phương. mmodbc: thư viện chứa các hàm kết nối đến bảng tính Excel, và database (SQL, Access). mmive: thư viện chứa các hàm vẽ đồ thị. • Khai báo khối tham số parameters !... end-parameters • Khai báo các đối tượng dùng trong mô hình declarations !.. end-declarations Nếu mô hình kết nối dữ liệu từ các tập tin khác thì sẽ dùng khối lệnh initializations !... end-initializations Dữ liệu có thể kết nối từ: - Tập tin *.dat, *.txt. - Bảng tính Exel. - SQL, Access. 20 • Định nghĩa bài toán Chuyển mô hình từ ngôn ngữ toán học sang ngôn ngữ Xpress-MP gồm có: - Hàm mục tiêu - Các ràng buộc đẳng thức và bất đẳng thức Tìm mục tiêu của bài toán: để cực đại (hoặc cực tiểu) mục tiêu chúng ta sử dụng hàm maximize (hoặc minimize) tương ứng. • Hiển thị kết quả ra màn hình: dùng lệnh writeln("nghiem bai toan"). • Xuống dòng: dùng dấu chấm phẩy ; để ngăn hai câu lệnh. • Lời chú giải: dùng ký tự ! trước dòng cần ghi chú, nếu có nhiều hơn một dòng thì ta dùng: (! Dòng 1 … Dòng N !) • Dãy và tập chỉ số M = 1..2 dãy chỉ số từ 1 đến 2, chỉ số dòng N = 1..2 dãy chỉ số từ 1 đến 2, chỉ số cột hoặc N = {"bo co nho","bo co lon"} • Mảng một chiều hoặc nhiều chiều c : array(N) of real ! vecto he so ham muc tieu b : array(M) of real ! vecto he so A : array(M,N) of real ! ma tran he so x : array(N) of mpvar ! vecto bien • Các kiểu dữ liệu cơ bản trong Mosel real: có giá trị trong khoảng (-1.7e+308, 1.7e+308), mặc định giá trị bằng 0. integer: có giá trị trong khoảng (-214783648, 2147483647), mặc định giá trị bằng 0. string: chuỗi ký tự, mặc định chuỗi ký tự trống. boolean: kiểu logic (true hoặc false), mặc định false. mpvar : biến quyết định. linctr: ràng buộc tuyến tính (dùng cho hàm mục tiêu hoặc ràng buộc). 21 Hơn nữa phầm mêm Xpress-MP có khả năng lập trình như các ngôn ngữ lập trình cao cấp khác như C, C++, C#, Visual Basic… • Cấu trúc lựa chọn if … then … [elif … then .. ] [else …] end-if case truonghop_0 of truonghop_1: … [ truongho_2: … ] [ else … ] end-case Nếu thực hiện nhiều dòng lệnh thì ta đặt chúng trong khối: do … end-do • Vòng lặp Vòng lặp forall: forall(tapchiso) donglenh tapchiso: tập chỉ số N Vòng lặp while: while(bt_logic) donglenh bt_logic: trả về kết quả true hoặc false Vòng lặp repeat: repeat donglenh until(bt_logic) • Lệnh break và next break: được dùng để thoát khỏi vòng lặp. next: được dùng để nhảy tới vòng lặp tiếp theo. • Tổng các phần tử sum(tapchiso)… Thí dụ: forall(i in M)sum(j in N)A(i,j)* x(j) <= b(i) 22 2.2 Ứng dụng tối ưu hóa trong kinh tế Toán tối ưu được phát triển và ứng dụng mạnh trong nhiều lĩnh vực, đặc biệt được phát triển mạnh hơn cả trong lĩnh vực kinh tế, kinh doanh, quản lý, sản xuất, xây dựng, … Một ứng dụng thực tế lý thuyết tối ưu được chúng tôi chọn là bài toán lựa chọn danh mục đầu tư, đây là bài toán rất được quan tâm ở thời điểm này. Và chúng tôi sẽ giới thiệu cách sử dụng chương trình Xpress-IVE chi tiết để giải một bài toán tối ưu. Bài toán lựa chọn danh mục đầu tư có nhiều dạng, sau đây ta sẽ xét một số dạng cơ bản: Thí dụ 2.1: xét bài toán lựa chọn danh mục đầu tư (BT1) Một người đầu tư muốn vào 10 loại chứng khoán khác nhau, Anh ta tính thu lại nguồn đầu tư sau 1 năm. Bảng các loại cổ phiếu như sau: STT Lĩnh vực Quốc gia Rủi ro Lợi nhuận mong đợi 1 Tài chính Canada N 5 2 Phần cứng Mỹ R 17 3 Nhạc kịch Mỹ R 26 4 Viễn thông Mỹ R 12 5 Rượu bia Anh N 8 6 Xây dựng Pháp N 9 7 Xe hơi Đức N 7 8 Ngân hàng Thụy sĩ N 6 9 Phần mềm Ấn độ R 31 10 Điện tử Nhật R 21 Bảng 2.1 Bảng các loại cổ phiếu 23 và có một số ràng buộc sau: - Đầu tư vào mỗi loại cổ phiếu nhiều nhất không quá 30% số tiền đầu tư ban đầu. - Mong muốn đầu tư 50% vào Bắc Mỹ. - Và nhiều nhất 3 loại cổ phiếu có mức độ rủi ro cao. Đầu tư như thế nào để có thu nhập mong đợi là cao nhất? Mô hình toán: Gọi CP là tập các cổ phiếu trong danh mục đầu tư. CPRuiRo tập các cổ phiếu có độ rủi ro cao trong danh mục đầu tư. Gọi biến voni là tỉ lệ tiền đầu tư vào cổ phiếu i, i CP∈ - Đầu tư vào mỗi loại cổ phiếu nhiều nhất không quá 30% số tiền đầu tư ban đầu: , 0 0,3ii CP von∀ ∈ ≤ ≤ - Tổng tỉ lệ tiền đầu tư bằng 100%: 1i i CP von ∈ =∑ - Tổng tỉ lệ tiền đầu tư vào cổ phiếu có độ rủi ro không quá 1/3 tổng số tiền đầu tư ban đầu: 1 3ii CPRuiRo von ∈ ≤∑ Đầu tư ít nhất 50% ở các nước Bắc Mỹ: Gọi CPBacMy tập các cổ phiếu ở các nước Bắc Mỹ 0,5i i CPBacMy von ∈ ≥∑ Gọi CoTuci là thu nhập mong đợi của cổ phiếu i sau 1 năm đầu tư. Mục tiêu của nhà đầu tư là thu nhập mong đợi cao nhất từ đầu tư trên tất cả các cổ phiếu, có dạng: max .i i i CP CoTuc von ∈ ∑ 24 Mô hình hoàn chỉnh: max . 1 3 0,5 ,0 0,3 i i i CP i i CPRuiRo i i CPBacMy i CoTuc von von von i CP von ∈ ∈ ∈ ≤ ≥ ∀ ∈ ≤ ≤ ∑ ∑ ∑ Mô hình Mosel: model "Toi uu Danh Muc Dau Tu voi LP" uses "mmxprs"; declarations CP = 1..10 ! Tap cac co phieu CPRuiRo = {2,3,4,9,10} ! Tap cac co phieu co do rui ro cao CPBacMy = {1,2,3,4} ! Tap cac co phieu o Bac My CoTuc: array(CP) of real ! Loi nhuan cua co phieu tuong ung von: array(CP) of mpvar ! ti le von dau tu vao co phieu end-declarations CoTuc:: [5,17,26,12,8,9,7,6,31,21] ! muc tieu: tong loi nhuan thu duoc TongCoTuc:= sum(i in CP) CoTuc(i)*von(i) ! gioi han dau tu vao co phieu co rui ro cao sum(i in CPRuiRo) von(i) <= 1/3 ! ti le von dau tu vao co phieu o Bac My sum(i in CPBacMy) von(i) >= 0.5 ! tong so von dau tu sum(i in CP) von(i) = 1 ! chan tren moi co phieu forall(i in CP) von(i) <= 0.3 ! Solve the problem maximize(TongCoTuc) ! Xuat ket qua writeln("Tong thu nhap mong doi: ", getobjval) 25 forall(i in CP) writeln("Ti le von dau tu vao co phieu ", i, " = ", getsol(von(i))*100, "%") end-model Kết quả: Giải mô hình ta được kết quả: Tong thu nhap mong doi: 14.0667 Ti le von dau tu vao co phieu 1 = 30% Ti le von dau tu vao co phieu 2 = 0% Ti le von dau tu vao co phieu 3 = 20% Ti le von dau tu vao co phieu 4 = 0% Ti le von dau tu vao co phieu 5 = 6.66667% Ti le von dau tu vao co phieu 6 = 30% Ti le von dau tu vao co phieu 7 = 0% Ti le von dau tu vao co phieu 8 = 0% Ti le von dau tu vao co phieu 9 = 13.3333% Ti le von dau tu vao co phieu 10 = 0% Mô hình Mosel và kết quả của bài toán BT1 trên Xpress-IVE như Hình 2.3: 26 Hình 2.3 Cửa sổ soạn thảo và hiển thị kết quả chương trình Xpress-IVE. 27 Chi tiết về nghiệm của bài toán BT1 như Hình 2.4: Hình 2.4 Thông tin chi tiết nghiệm bài toán. 28 Bây giờ chúng ta thay dãy chỉ số bởi tập các chuỗi ký tự Trong mô hình Mosel của bài toán BT1, chúng ta thay các khai báo sau: CP = 1..10 ! Tap cac co phieu CPRuiRo = {2,3,4,9,10} ! Tap cac co phieu co do rui ro cao CPBacMy = {1,2,3,4} ! Tap cac co phieu o Bac My Bởi CP = {"Tai chinh","Phan cung","Nhac kich","Vien thong","Ruou bia","Xay dung","Xe hoi","Ngan hang","Phan mem","Ðien tu"} CPRuiRo={"Phan cung","Nhac kich","Vien thong","Phan mem","Ðien tu"} CPBacMy={"Tai chinh","Phan cung","Nhac kich","Vien thong"} CoTuc:: (["Tai chinh","Phan cung","Nhac kich","Vien thong","Ruou bia","Xay dung","Xe hoi","Ngan hang","Phan mem","Ðien tu"])[5,17,26,12,8,9,7,6,31,21] Kết quả Tong thu nhap mong doi: 14.0667 Ti le von dau tu vao co phieu Ngan hang = 0% Ti le von dau tu vao co phieu Nhac kich = 20% Ti le von dau tu vao co phieu Phan cung = 0% Ti le von dau tu vao co phieu Phan mem = 13.3333% Ti le von dau tu vao co phieu Ruou bia = 6.66667% Ti le von dau tu vao co phieu Tai chinh = 30% Ti le von dau tu vao co phieu Vien thong = 0% Ti le von dau tu vao co phieu Xay dung = 30% Ti le von dau tu vao co phieu Xe hoi = 0% Ti le von dau tu vao co phieu Ðien tu = 0% Làm việc với dữ liệu Trong mô hình trên, chúng ta thấy các số liệu nằm trong cùng mô hình toán. Bây giờ ta muốn tách rời các số liệu này nằm trong một tập tin khác để dễ quản lý và làm cho mô hình Mosel đơn giản và linh động hơn. 29 Dùng tham số Khai báo hằng số và gán giá trị parameters DATAFILE = "DanhMucLPdata.dat" ! File with problem data OUTFILE = "KetQuaDanhMucLPdata.dat" ! Output file MAXCPRuiRo = 1/3 ! Max. dau tu vao co phieu rui ro cao MAXVon = 0.3 ! Max. dau tu tren moi co phieu MINCPBacMy = 0.5 ! Min. gia tri dau tu vao Bac My end-parameters Khai báo các biến, tham số declarations CP : set of string ! Tap cac co phieu CPRuiRo : set of string ! Tap cac co phieu co do rui ro cao CPBacMy : set of string ! Tap cac co phieu o Bac My CoTuc: array(CP) of real ! Loi nhuan cua co phieu tuong ung von: array(CP) of mpvar ! ti le von dau tu vao co phieu end-declarations Kết nối dữ liệu từ tập tin initializations from DATAFILE CPRuiRo CPBacMy CoTuc end-initializations Tập tin DanhMucLPdata.dat CPRuiRo : ["Phan cung" "Nhac kich" "Vien thong" "Phan mem" "Ðien tu"] CPBacMy : ["Tai chinh" "Phan cung" "Nhac kich" "Vien thong"] CoTuc: [("Tai chinh") 5 ("Phan cung") 17 ("Nhac kich") 26 ("Vien thong") 12 ("Ruou bia") 8 ("Xay dung") 9 ("Xe hoi") 7 ("Ngan hang") 6 ("Phan mem") 31 ("Ðien tu") 21] 30 Mô hình Mosel hoàn chỉnh model "Toi uu Danh Muc Dau Tu voi LP" uses "mmxprs"; parameters DATAFILE = "DanhMucLPdata.dat" ! File with problem data OUTFILE = "KetQuaDanhMucLPdata.dat" ! Output file MAXCPRuiRo = 1/3 ! Max. dau tu vao co phieu rui ro cao MAXVon = 0.3 ! Max. dau tu tren moi co phieu MINCPBacMy = 0.5 ! Min. gia tri dau tu vao Bac My end-parameters declarations CP : set of string ! Tap cac co phieu CPRuiRo : set of string ! Tap cac co phieu co do rui ro cao CPBacMy : set of string ! Tap cac co phieu o Bac My CoTuc: array(CP) of real ! Loi nhuan cua co phieu tuong ung von: array(CP) of mpvar ! ti le von dau tu vao co phieu end-declarations initializations from DATAFILE CPRuiRo CPBacMy CoTuc end-initializations ! muc tieu: tong loi nhuan thu duoc TongCoTuc:= sum(i in CP) CoTuc(i)*von(i) ! gioi han dau tu vao co phieu co rui ro cao sum(i in CPRuiRo) von(i) <= MAXCPRuiRo ! ti le von dau tu vao co phieu o Bac My sum(i in CPBacMy) von(i) >= MINCPBacMy ! tong so von dau tu sum(i in CP) von(i) = 1 ! chan tren moi co phieu forall(i in CP) von(i) <= MAXVon ! Solve the problem maximize(TongCoTuc) ! Xuat ket qua ra file .dat 31 fopen(OUTFILE, F_OUTPUT) writeln("Tong thu nhap mong doi: ", getobjval) forall(i in CP) writeln("Ti le von dau tu vao co phieu ", i, " = ", getsol(von(i))*100, "%") fclose(F_OUTPUT) end-model Kết quả chạy chương trình Xuất ra tập tin có tên KetQuaDanhMucLPdata.dat và có Tong thu nhap mong doi: 14.0667 Ti le von dau tu vao co phieu Tai chinh = 30.000% Ti le von dau tu vao co phieu Phan cung = 0.000% Ti le von dau tu vao co phieu Nhac kich = 20.000% Ti le von dau tu vao co phieu Vien thong = 0.000% Ti le von dau tu vao co phieu Ruou bia = 6.667% Ti le von dau tu vao co phieu Xay dung = 30.000% Ti le von dau tu vao co phieu Xe hoi = 0.000% Ti le von dau tu vao co phieu Ngan hang = 0.000% Ti le von dau tu vao co phieu Phan mem = 13.333% Ti le von dau tu vao co phieu Ðien tu = 0.000% Giải bài toán tối ưu với vòng lặp, Vẽ đồ thị người dùng Thí dụ 2.2: xét thí dụ 2.1 bài toán danh mục đầu tư (BT1), Người đầu tư tính toán phương sai từ thu nhập mong đợi trên cổ phiếu được Bảng 2.2. Khi đó chúng ta được bài toán lựa chọn danh mục đầu tư (BT2). 32 Số Lĩnh vực Phương sai 1 Tài chính 0.1 2 Phần cứng 19 3 Nhạc kịch 28 4 Viễn thông 22 5 Rượu bia 4 6 Xây dựng 3.5 7 Xe hơi 5 8 Ngân hàng 0.5 9 Phần mềm 25 10 Điện tử 16 Bảng 2.2 Bảng phương sai. với dữ liệu được thêm vào, người đầu tư quyết định chạy mô hình quy hoạch tuyến tính với các giới hạn rủi ro khác nhau trên danh mục đầu của cổ phiếu có mức rủ ro cao và cho kết quả bằng đồ thị, đường kết quả cho tổng thu nhập mong đợi. phương sai là đại lượng chỉ rủi ro của cổ phiếu: - Định nghĩa mô hình thay đổi theo tham số rủi ro. - Với mỗi giá trị tham số rủi ro: + Định nghĩa lại ràng buộc giới hạn phần trăm rủi ro. + Giải tìm kết quả bài toán. + Nếu bài toán là có nghiệm: lưu nghiệm. - Vẽ đồ thị. 33 Khai báo biến lưu nghiệm thu nhập mong đợi và phương sai declarations NghiemCoTuc: array(range) of real ! gia tri nghiem (tong thu nhap mong doi ) NghiemPhuongsai: array(range) of real ! Gia tri nghiem (trung binh phuong sai) TongCoTuc, RuiRoCao: linctr end-declarations giải bài toán theo vòng lặp là 20 ct:=0 forall(r in 0..20) do ! Limit the percentage of high-risk values RuiRoCao:= sum(i in CPRuiRo) von(i) <= r/20 maximize(TongCoTuc) ! Solve the problem if (getprobstat = XPRS_OPT) then ! Save the optimal solution value ct+=1 NghiemCoTuc(ct):= getobjval NghiemPhuongsai(ct):= getsol(sum(i in CP) PhuongSai(i)*von(i)) writeln("Nghiem cho cp co rui ro <= ", 100*r/20, "% ", " = ", NghiemCoTuc(ct), " voi phuong sai = ", NghiemPhuongsai(ct) ) else writeln("Vo nghiem cho cp co rui ro <= ", 100*r/20, "%") end-if end-do Kết quả Vo nghiem cho cp co rui ro <= 0% Vo nghiem cho cp co rui ro <= 5% Vo nghiem cho cp co rui ro <= 10% Vo nghiem cho cp co rui ro <= 15% Nghiem cho cp co rui ro <= 20% = 11 voi phuong sai = 7.48 Nghiem cho cp co rui ro <= 25% = 12.15 voi phuong sai = 8.53 Nghiem cho cp co rui ro <= 30% = 13.3 voi phuong sai = 9.58 34 Nghiem cho cp co rui ro <= 35% = 14.45 voi phuong sai = 10.63 Nghiem cho cp co rui ro <= 40% = 15.6 voi phuong sai = 11.68 Nghiem cho cp co rui ro <= 45% = 16.7 voi phuong sai = 12.755 Nghiem cho cp co rui ro <= 50% = 17.8 voi phuong sai = 13.83 Nghiem cho cp co rui ro <= 55% = 18.85 voi phuong sai = 15.225 Nghiem cho cp co rui ro <= 60% = 19.9 voi phuong sai = 16.62 Nghiem cho cp co rui ro <= 65% = 20.5 voi phuong sai = 17.245 Nghiem cho cp co rui ro <= 70% = 21.1 voi phuong sai = 18.51 Nghiem cho cp co rui ro <= 75% = 21.7 voi phuong sai = 19.455 Nghiem cho cp co rui ro <= 80% = 22.3 voi phuong sai = 20.4 Nghiem cho cp co rui ro <= 85% = 22.9 voi phuong sai = 21.025 Nghiem cho cp co rui ro <= 90% = 23.5 voi phuong sai = 21.65 Nghiem cho cp co rui ro <= 95% = 24.1 voi phuong sai = 22.275 Nghiem cho cp co rui ro <= 100% = 24.7 voi phuong sai = 22.9 Vẽ đồ thị người dùng Bắt đầu mô hình ta thêm “mmive”, cung cấp các hàm vẽ đồ thị uses "mmive" Và các lệnh vẽ đồ thị như sau: declarations plot1: integer end-declarations plot1 := IVEaddplot("Gia tri cua nghiem", IVE_BLACK) forall(r in 1..ct) IVEdrawpoi