如何 求多元一次函数的最大值
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何 求多元一次函数的最大值相关的知识,希望对你有一定的参考价值。
有10个变量X1、X2、X3、、、X10
目标函数 f(x)=a*x1+b*x2+c*x3+………+j*x (a、b、c…..这些都是数)
约束条件: x1+x2+x3+……..+x10=5000
还有些其他的约束,如:
x1+x2+x3>1000,
X3+x5>200
……….
我现在要求f(x)的最大值,编程实现的话,代码里怎么写?
用MATLAB。
例:目标函数35a+88b+43c+18d ,求最大值
约束条件:
45a+86b+25c+12d≤750
26a+45b+16c+10d>200
45a+86b≤450
a≥4
b≥2
5≤c,d≤8
多元函数求最值:
与一元函数相类似,对于有界闭区域上连续的二元函数,一定能在该区域上取得最大值和最小值.使函数取得最值的点既可能在的内部,也可能在的边界上。
若函数的最值在区域的内部取得,这个最值也是函数的极值,它必在函数的驻点或偏导数不存在的点处取得。
若函数的最值在区域的边界上取得,往往比较复杂,在实际应用中可根据问题的具体性质来判断。
在解决实际问题时,如果只有唯一一个最值点的可疑点,无需判别,这个唯一点即为要求的最值点。
参考技术A 我是用MATLAB,例:
目标函数35a+88b+43c+18d ,求最大值
约束条件:
45a+86b+25c+12d≤750
26a+45b+16c+10d>200
45a+86b≤450
a≥4
b≥2
5≤c,d≤8
MATLAB代码如下: 百分号后面是注释
f=[-35;-88;-43;-18]; %由于linprog是求最小值的,题意为最大值,取负数就变成最大值了。
A=[45,86,25,12;-26,-45,-16,-10;15,86,0,0]; %不等式约束条件的左边,写成矩阵的形式,注意这里是小于号,如果题目为大于号,两边加负号
b=[750;-200;450]; %不等式约束条件的右边
Aeq=[]; %等式约束的左边
beq=[]; %等式约束的右边
xmin=[4,2,5,-inf]; %各个变量的最小值,如果没有最小值,也就是最小值为负无穷,用-inf表示
xmax=[inf,inf,inf,8]; %名个变量的最大值,如果没有最大值,用inf(正无穷)表示
x0=xmin; %迭代的初值
[x,fmin]=linprog(f,A,b,Aeq,beq,xmin,xmax,x0);
x,-fmin 参考技术B simplex方法。
去找线性规划程序包,别自己写。
也可以用lingo或者mathematica来做。
对求多元函数微分的理解
例如:求e^(x+2y+3z)+xyz=1 求dz (可确定z=z(x,y)函数)
方法1:对两边求微分得 e^(x+2y+3z)d(x+2y+3z)+d(xyz)=0
该方法使用了微分形式得不变性,也就是说此时这个式子在求微分的时候不用管谁是谁得函数,将自变量和应变量一视同仁,看作是平等的量
为了好理解可以令u=x+2y+3z 原式=d(e^u)+d(xyz)=0
e^ud(u)+d(xyz)=0
e^(x+2y+3z)d(x+2y+3z)+d(xyz)=0
此时利用微分的四则运算可得e^(x+2y+3z)(dx+2dy+3dz)+xydz+yzdx+xzdy=0(原题目求具体每一点的值,可以带入求得)
或者此时可用全微分公式进行求解d(xyz)=dx*偏导x+dy*偏导y(把z看作xy的函数,不能简单的求x偏导把yz看作常数,此时计算复杂)
d(xyz)=dx*偏导x+dy*偏导y+dz*偏导z(此时不把z看作xy的函数)
方法2:利用全微分公式求得z对x,y的偏导,代入求解(为隐函数求导)
可以直接套用公式-Fx/Fz,但是本身此公式就是通过对方程F求x偏导反解得到的,因此可以直接对F求偏导(此时需要把z看作xy的函数(因为想得到z对x的偏导,所以此时必须把z看作xy的函数))
总结:方法1一般不把z看作xy函数
方法2求偏导是把z看作xy函数
以上是关于如何 求多元一次函数的最大值的主要内容,如果未能解决你的问题,请参考以下文章
求三道用mathematica求最值的代码~~急~~~!!!