本文为北海的数模课程学习笔记,课程出自微信公众号:数学建模BOOM。
问题分析
代码求解
clc,clear;
a=(0:0.001:0.05); % a矩阵的元素是不同风险率,从0到0.05等差取值,相邻两个数相差0.001
f=[-0.05,-0.27,-0.19,-0.185,-0.185]; % 目标函数的系数向量(这里列出的都是同一变量的系数,所以不需要分行)
% 用zeros(4,1)先构造4行一列的全是0的矩阵,也就是对x_0无约束;
% 再构造对角矩阵diag([0.025,0.015,0.055,0.026]),对角线上元素为约束条件中变量的系数
A=[zeros(4,1),diag([0.025,0.015,0.055,0.026])];
Aep=[1,1.01,1.02,1.045,1.065];
bep=1;
LB=zeros(1,5); %写为行向量和列向量都可以没有特别要求
Q=zeros(1,length(a)); % 初始化保存最优解的矩阵Q,因为现在还没求出最优解,元素全设为0
XX=[]; % 定义个空矩阵,用来存不同风险率下的最优解
% 利用矩阵Q存储风险率a(i)下最大的收益;for循环中i在变化,风险率a(i)不同,求出对应的最优解存在矩阵Q内
for i=1:length(a) % length求出矩阵a的元素个数,有多少个元素,就循环多少次
b=a(i)*ones(4,1); % b是约束条件的常数项矩阵,4行1列,每个元素值都是常数a(i)
[x,y]=linprog(f,A,b,Aep,bep,LB); % 调用linprog函数
Q(i)=-y; % 负负得正,就是所需求的最大值了
XX=[XX;x']; %表格中的数值为在对应风险下对不同项目投资的金额(x)
%x'是求x向量的转置(将行向量转化为列向量)
end
plot(a,Q,'*r');
xlabel('风险率')
ylabel('最大收益')
%Q为收益表格 XX为投资方案表格
运行结果