约束条件下最值问题matlab实例(一)

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

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_43486175

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值