约束条件下最值问题matlab实例(一)
数学模型
? = [0.003,0.2241,0.2626,0.2674,0.2884] ∙ [?0,?1,?2,?3,?4]?
求max(f)
约束条件为:
?0 + ?1 + ?2 + ?3 + ?4 = 1
0.1285?1 ≤ ?
0.1086?2 ≤ ?
0.0893?3 ≤ ?
0.1419?4 ≤ ?
?? ≥ 0 , ? = 0 , 1 , 2 , 3 , 4
其中,? 为定值取值范围为[0,1],取值步长为0.0001.
(有人说我的问题跟这个不一样,3?0 + 2?1 + ?2 + 4?3 + ?4 = 1 ,其实可以转化成上述同类问题:
令x0p=3x0,x1p=2x1,x3p=4x3,
则上述函数可转化为
? = 0.003/3?0p+0.2241/2?1p+0.2626?2+0.2674/4?3p+0.2884?4
同理,约束条件也可转换。)
求解方法
? = 0.003?0+0.2241?1+0.2626?2+0.2674?3+0.2884?4
由于? 对X求导的导数大小排列为 [0.003,0.2241,0.2626,0.2674,0.2884],且?0 + ?1 + ?2 + ?3 + ?4 = 1
可得
为了便于理解,这里不讲算法推到过程,只讲大家看的懂的实料。
公式?0 + ?1 + ?2 + ?3 + ?4 = 1 可认为是把1分配给x0,x1,x2,x3,x4.
由于
则把1分配给X的优先顺序是x4,x3,x2,x1,x0.明白了这一层就可以写代码了。
伪代码为:
for a=0:1
初始化X(赋0值)
for x4到x1
该元素赋值:xi=a/约束值
while true
if 满足其他约束条件
break
else
xi=xi-步长
end
end
end
x0=1-x1-x2-x3-x4
a+=步长
end
matlab代码如下
X=[0 0 0 0 0];
res=[0 0.1285 0.1086 0.0893 0.1419];
weights=[0.003 0.2241 0.2626 0.2627 0.2884];
a=0;
maxx=zeros(1,2000);
for i=1:2000
x1=[0 0 0 0 0];
for j=5:-1:2
x2=x1;
x2(j)=a/res(j);
while true
if res1(x2,a,j,res)
x1=x2;
break;
else
x2(j)=x2(j)-0.0001;
end
end
end
x1(1)=1-sum(x1);
maxx(i)=weights*x1';
a=a+0.0001;
end
plot(1:2000,maxx);
%判断第i个元素是否符合约束条件
function pa=res1(x,b,i,r)
pa=1;%初始值,1代表符合
if sum(x)>1 || x(i)>b/r(i)
pa=0;
end
end
结果如图

下期给大家带来约束条件下的最值问题(二):极大值的最小值问题matlab实例