Matlab函数最优化问题(专题八)

前言

线性函数和非线性函数的区别在于它们的函数图像是否为一条直线。

线性函数的图像是一条直线,表示其中每个自变量的增量引起的因变量的增量是固定的。这意味着函数的图像是一个斜率为常数的直线,可以用y = mx + b的形式表示,其中m是斜率,b是y轴截距。

而非线性函数的图像不是直线,表示其中每个自变量的增量引起的因变量的增量不是固定的。这意味着函数的图像可能会是任何形状,例如,三角函数、指数函数和对数函数都是非线性函数。非线性函数不存在一个通用的一般表达式,而要根据函数本身的特性来确定。

因此,线性函数和非线性函数的主要区别在于它们是否遵循线性关系。

线性规划问题

线性规划问题是目标函数和约束条件均为线性函数的问题

[x,fval]=linprog(f,A,b,Aeq,beq,lb,ub)

x为解(实数向量或者实数数组)

fval为目标函数的值

f为目标函数

A,b为不等式约束,即Ax≤b

比如eq?x1+x2%5Cleq%201eq?x1+x2%5Cgeq%20-3

eq?A%3D%5Cbegin%7Bbmatrix%7D%201%262%20%5C%5C%20-1%26-2%20%5Cend%7Bbmatrix%7D那么b就等于eq?%5Cbegin%7Bbmatrix%7D%201%5C%5C%203%20%5Cend%7Bbmatrix%7D来表示。

若没有约束条件,则A=[ ],b=[ ]来表示。

 

Aeq,beq为等式约束,

比如eq?x1+x2%3D1eq?x1-x2%3D3

eq?A%3D%5Cbegin%7Bbmatrix%7D%201%20%261%20%5C%5C%201%26-1%20%5Cend%7Bbmatrix%7D还有eq?b%3D%5Cbegin%7Bbmatrix%7D%201%5C%5C3%20%5Cend%7Bbmatrix%7D

若没有约束条件,则和上面一样,用[ ],[ ]来表示。

lb和ub是指定x的范围即eq?lb%20%5Cleq%20x%5Cleq%20ub.

例如求目标函数eq?f%28x1%2Cx2%2Cx3%29%3D-25x1-40x2-61x3的最小值

其中约束条件为x1,x2,x3≥0

x1-x2+x3≤20

3x1+2x2+4x3≤42

3x1+2x2≤30

编写程序如下

clear
f=[-25,-40,-61];
A=[1 -1 1;3 2 4;3 2 0];
b=[20;42;30];
lb=[0;0;0];
[x,fval]=linprog(f,A,b,[],[],lb)

4ef63ee473b04df3a2af9bc6f18d6dfc.png

实际应用 

某厂生产两种产品

产一吨甲产品用A资源 3吨、 B4m^3 

产一吨乙产品用A资源 2 吨 、B资源 6m3 、C资源7个单位

一吨甲产品和乙产品分别价值7万元和5万元

三种资源分别限制为90吨、200m^3210个单位

建立描述生产两种产品使总价值最高线性规划数学模型

目标函数z=7x1+5x2

条件约束3x1+2x2≤90

              4x1+6x2≤200

              0x1+7x2≤210

模型建立

 

上限

A资源/吨

3

2

90

B资源/m^3

4

6

200

C资源/个

0

7

210

总价值/万元

7

5

目标max 

clear
c=[7 5]; 
A=[3 2;4 6;0 7]; 
k=[90;200;210]; 
[x,z]=linprog (-c,A,k);
A=[x;-z]

68d167d25e6d4d299f707a37fad57366.png

即总价值最高是218万,当甲=14,乙=24的时候。

t特别说明linprog命令是用来求最小值的解

但是在我们生活当中比如这题要求最大值

所以必须要把目标函数加个负号才能用于此linprog命令。

是有点抽象,所以我画个图帮助大家理解

 比如求下面曲线的最大值

e527f1218b24451f94c04fbe45b12328.png

所以我们要把y变成负的,也就是关于x轴进行对称的函数

即得到-y(x)的图像如下

418b4b4ada404a6c8db091af66effdce.png

所以我们只要算出该函数的最小值,最后再给他加个负号回去即可得到最大值,

这也就是为什么 前面的题要加负号的原因。

非线性规划问题

顾名思义就是目标函数和约束条件都是非线性。

有约束的一元函数的最小值

 [x,fval] = fminbnd(fun,x1,x2)

 fun - 要计算最小值的函数
        函数句柄(标识符@) | 函数名称(字符串)
      x1 - 下界
        有限实数标量
      x2 - 上界
        有限实数标量

 x - 解
        实数标量

 fval - 解处的目标函数值
        实数

求函数eq?f%28x%29%3D5cos%28x%29+x在区间(1,10)的最小值,并画图。

clear
[x,fval]=fminbnd('5*cos(x)+x',1,10)
x1=1:0.1:10;
y=5*cos(x1)+x1;
plot(x1,y,'b',x,fval,'ro')

f8542d45ee474c8292b9cfec28c21fd1.png

 多元函数

 无约束条件多元函数最小值

  [x,fval]= fminsearch(fun,x0)

 fun - 要计算最小值的函数
        函数句柄 | 函数名称
      x0 - 初始点
        实数向量 | 实数数组

 

 x - 解
        实数向量 | 实数数组
  fval - 目标函数的值
        实数

例如求函数eq?f%28x%2Cy%29%3D2x%5E3+4xy%5E3-10xy+y%5E2的最小值点和函数值。

需要注意的是,要把y编写成x(2)

因为我们返回的x本身只有一个参数,且里面是一个数组形式的出现

否则会出现以下报错

4c7bc855442140be9290f7311f088efb.png

clear
[x,fval]=fminsearch(@(x)2*x(1).^3+4*x(1)*x(2).^2-10*x(1)*x(2)+x(2).^2,[0 0])
%假设两个初值都为0,0

5e42584397cd4190bf86341683c7a056.png

即f(x1,x2)=f(x,y)=f(1,1)时,最小值为f(1,1)=-3.

 

 [x,fval] = fminunc(fun,x0)

参数、语法和上面的fminsearch一样,这里就不解释了

初值一般设为[1,1]

例如求eq?f%28x%2Cy%29%3D3x%5E4+4xy+y%5E3的最小值,z=f(x,y)

clear
fun='3*x(1)^4+4*x(1)*x(2)+x(2)^3';
x0=[1 1];
[x,fval]=fminunc(fun,x0)

ebea072a20274e429982c0c7328c7f66.png

fminunc和fminsearch区别

当函数的阶数大于2时,使用fminunc比fminsearch更有效,

但是所选函数高度不连续时没使用fminsearch效果会更好。 

有约束条件的多元函数最小值

[x,fval]=fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)

x为解(实数向量或者实数数组)

x0为初值

fval为目标函数的值

fun为目标函数

A,b为不等式约束,即Ax≤b

比如eq?x1+x2%5Cleq%201eq?x1+x2%5Cgeq%20-3

eq?A%3D%5Cbegin%7Bbmatrix%7D%201%262%20%5C%5C%20-1%26-2%20%5Cend%7Bbmatrix%7D那么b就等于eq?%5Cbegin%7Bbmatrix%7D%201%5C%5C%203%20%5Cend%7Bbmatrix%7D来表示。

若没有约束条件,则A=[ ],b=[ ]来表示。

 

Aeq,beq为等式约束,

比如eq?x1+x2%3D1eq?x1-x2%3D3

eq?A%3D%5Cbegin%7Bbmatrix%7D%201%20%261%20%5C%5C%201%26-1%20%5Cend%7Bbmatrix%7D还有eq?b%3D%5Cbegin%7Bbmatrix%7D%201%5C%5C3%20%5Cend%7Bbmatrix%7D

若没有约束条件,则和上面一样,用[ ],[ ]来表示。

 

lb和ub是指定x的范围即eq?lb%20%5Cleq%20x%5Cleq%20ub.

若没有界,则可以用[ ]来表示。

nonlcon

其中nonlcon用来计算非线性的约束。

如非线性不等式约束C(x)≤0 和 非线性等式约束Ceq(x)=0.

需要通过指定函数句柄来使用。

指定函数之前需要建立M文件(非线性约束函数),并保存使用。

例如求下面非线性函数的最优解最小值(在初始点(0,1)处)。

eq?f%28x1%2Cx2%29%3Dx_%7B1%7D%5E2+x_%7B2%7D%5E2-x_%7B1%7Dx_%7B2%7D-2x_%7B1%7D-5x_%7B2%7D

其中约束条件为eq?-2x_%7B1%7D+3x_%7B2%7D%5Cleq%206

                          eq?%28x_%7B1%7D-1%29%5E2-x_%7B2%7D%5Cleq%200

 

先建立mycon.m文件

因为第二个约束条件是非线性,所以先建立非线性约束函数。

function [c, ceq]=mycon(x)
c=(x(1)-1)^2-x(2);
ceq=[ ];

之后命令行输入

clear
fun='x(1)^2+x(2)^2-x(1)*x(2)-2*x(1)-5*x(2)';
x0=[0 1];
A=[-2 3];
b=6;
Aeq=[];
beq=[];
lb=[];
ub=[];
[x,fval]=fmincon(fun,x0,A,b,Aeq,beq,lb,ub,@mycon)

求在初始点x=(10,10,10)处的最优解。

其中目标函数为eq?f%28x_%7B1%7D%2Cx_%7B2%7D%2Cx_%7B3%7D%29%3D-x_%7B1%7Dx_%7B2%7Dx_%7B3%7D

约束条件为eq?0%5Cleq%20x_%7B1%7D+2x_%7B2%7D+2x_%7B3%7D%5Cleq%2072

首先先把约束条件化为标准形式(Ax≤b)

eq?-x_%7B1%7D-2x_%7B2%7D-2x_%7B3%7D%5Cleq%200

eq?0%5Cleq%20x_%7B1%7D+2x_%7B2%7D+2x_%7B3%7D%5Cleq%2072

clear
fun='-x(1)*x(2)*x(3)';
x0=10*ones(1,3);
A=[-1 -2 -2;1 2 2];
b=[0;72];
[x,fval]=fmincon(fun,x0,A,b)

853d1c1cde5d428f930a10ae8f39f2c3.png

 

 

  • 29
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

无常(F)

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

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

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

打赏作者

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

抵扣说明:

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

余额充值