Matlab函数最优化问题

前言

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

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

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

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

线性规划问题

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

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

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

fval为目标函数的值

f为目标函数

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

比如x1+x2\leq 1x1+x2\geq -3

A=\begin{bmatrix} 1&2 \\ -1&-2 \end{bmatrix}那么b就等于\begin{bmatrix} 1\\ 3 \end{bmatrix}来表示。

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

Aeq,beq为等式约束

比如x1+x2=1x1-x2=3

A=\begin{bmatrix} 1 &1 \\ 1&-1 \end{bmatrix}还有b=\begin{bmatrix} 1\\3 \end{bmatrix}

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

lb和ub是指定x的范围即lb \leq x\leq ub.

例如求目标函数f(x1,x2,x3)=-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)

Matlab函数最优化问题_第1张图片

实际应用 

某厂生产两种产品

产一吨甲产品用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]

Matlab函数最优化问题_第2张图片

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

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

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

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

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

 比如求下面曲线的最大值

Matlab函数最优化问题_第3张图片

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

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

Matlab函数最优化问题_第4张图片

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

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

非线性规划问题

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

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

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

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

 x - 解
        实数标量

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

求函数f(x)=5cos(x)+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')

Matlab函数最优化问题_第5张图片

 多元函数

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

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

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

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

例如求函数f(x,y)=2x^3+4xy^3-10xy+y^2的最小值点和函数值。

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

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

否则会出现以下报错

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

Matlab函数最优化问题_第6张图片

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

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

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

初值一般设为[1,1]

例如求f(x,y)=3x^4+4xy+y^3的最小值,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)

Matlab函数最优化问题_第7张图片

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

比如x1+x2\leq 1x1+x2\geq -3

A=\begin{bmatrix} 1&2 \\ -1&-2 \end{bmatrix}那么b就等于\begin{bmatrix} 1\\ 3 \end{bmatrix}来表示。

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

Aeq,beq为等式约束

比如x1+x2=1x1-x2=3

A=\begin{bmatrix} 1 &1 \\ 1&-1 \end{bmatrix}还有b=\begin{bmatrix} 1\\3 \end{bmatrix}

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

lb和ub是指定x的范围即lb \leq x\leq ub.

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

nonlcon

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

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

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

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

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

f(x1,x2)=x_{1}^2+x_{2}^2-x_{1}x_{2}-2x_{1}-5x_{2}

其中约束条件为-2x_{1}+3x_{2}\leq 6

                          (x_{1}-1)^2-x_{2}\leq 0

先建立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)处的最优解。

其中目标函数为f(x_{1},x_{2},x_{3})=-x_{1}x_{2}x_{3}

约束条件为0\leq x_{1}+2x_{2}+2x_{3}\leq 72

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

-x_{1}-2x_{2}-2x_{3}\leq 0

0\leq x_{1}+2x_{2}+2x_{3}\leq 72

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)

Matlab函数最优化问题_第8张图片

你可能感兴趣的:(matlab,开发语言)