线性函数和非线性函数的区别在于它们的函数图像是否为一条直线。
线性函数的图像是一条直线,表示其中每个自变量的增量引起的因变量的增量是固定的。这意味着函数的图像是一个斜率为常数的直线,可以用y = mx + b的形式表示,其中m是斜率,b是y轴截距。
而非线性函数的图像不是直线,表示其中每个自变量的增量引起的因变量的增量不是固定的。这意味着函数的图像可能会是任何形状,例如,三角函数、指数函数和对数函数都是非线性函数。非线性函数不存在一个通用的一般表达式,而要根据函数本身的特性来确定。
因此,线性函数和非线性函数的主要区别在于它们是否遵循线性关系。
线性规划问题是目标函数和约束条件均为线性函数的问题
[x,fval]=linprog(f,A,b,Aeq,beq,lb,ub)
x为解(实数向量或者实数数组)
fval为目标函数的值
f为目标函数
A,b为不等式约束,即Ax≤b
比如和
若没有约束条件,则A=[ ],b=[ ]来表示。
Aeq,beq为等式约束,
比如和
若没有约束条件,则和上面一样,用[ ],[ ]来表示。
lb和ub是指定x的范围即.
例如求目标函数的最小值
其中约束条件为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)
某厂生产两种产品
产一吨甲产品用A资源 3吨、 B资源 4m^3
产一吨乙产品用A资源 2 吨 、B资源 6m3 、C资源7个单位
一吨甲产品和乙产品分别价值7万元和5万元
三种资源分别限制为90吨、200m^3和210个单位
建立描述生产两种产品使总价值最高的线性规划数学模型?
目标函数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]
即总价值最高是218万,当甲=14,乙=24的时候。
t特别说明linprog命令是用来求最小值的解
但是在我们生活当中比如这题要求最大值
所以必须要把目标函数加个负号才能用于此linprog命令。
是有点抽象,所以我画个图帮助大家理解
比如求下面曲线的最大值
所以我们要把y变成负的,也就是关于x轴进行对称的函数
即得到-y(x)的图像如下
所以我们只要算出该函数的最小值,最后再给他加个负号回去即可得到最大值,
这也就是为什么 前面的题要加负号的原因。
顾名思义就是目标函数和约束条件都是非线性。
[x,fval] = fminbnd(fun,x1,x2)
fun - 要计算最小值的函数
函数句柄(标识符@) | 函数名称(字符串)
x1 - 下界
有限实数标量
x2 - 上界
有限实数标量
x - 解
实数标量
fval - 解处的目标函数值
实数
求函数在区间(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')
[x,fval]= fminsearch(fun,x0)
fun - 要计算最小值的函数
函数句柄 | 函数名称
x0 - 初始点
实数向量 | 实数数组
x - 解
实数向量 | 实数数组
fval - 目标函数的值
实数
例如求函数的最小值点和函数值。
需要注意的是,要把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
即f(x1,x2)=f(x,y)=f(1,1)时,最小值为f(1,1)=-3.
[x,fval] = fminunc(fun,x0)
参数、语法和上面的fminsearch一样,这里就不解释了
初值一般设为[1,1]
例如求的最小值,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)
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
比如和
若没有约束条件,则A=[ ],b=[ ]来表示。
Aeq,beq为等式约束,
比如和
若没有约束条件,则和上面一样,用[ ],[ ]来表示。
lb和ub是指定x的范围即.
若没有界,则可以用[ ]来表示。
nonlcon
其中nonlcon用来计算非线性的约束。
如非线性不等式约束C(x)≤0 和 非线性等式约束Ceq(x)=0.
需要通过指定函数句柄来使用。
指定函数之前需要建立M文件(非线性约束函数),并保存使用。
例如求下面非线性函数的最优解最小值(在初始点(0,1)处)。
其中约束条件为
先建立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)处的最优解。
其中目标函数为
约束条件为
首先先把约束条件化为标准形式(Ax≤b)
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)