约束条件下最值问题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实例