作业帮 > 综合 > 作业

请问如何用matlab求函数u = x*y^2*z^3的最值,其中x^2+2*y^2 + z^2 = 1(x > 0;

来源:学生作业帮 编辑:搜搜做题作业网作业帮 分类:综合作业 时间:2024/05/06 11:58:50
请问如何用matlab求函数u = x*y^2*z^3的最值,其中x^2+2*y^2 + z^2 = 1(x > 0; y > 0; z>0)
求函数u = x*y^2*z^3的最值,其中x^2 + 2*y^2 + z^2 = 1(x > 0; y > 0; z > 0).
我自己编的代码如下
syms x y z t
u=x*(y^2)*(z^3)
v=x^2+2*(y^2)+(z^2)-1;
L=u-t*v;
Lx=diff(L,x);
Ly=diff(L,y);
Lz=diff(L,z);
[t x y z]=solve(Lx,Ly,Lz,v);
n=length(x);
for i=1:n
if (x(i)>0)&(y(i)>0)&(z(i)>0)
disp(['函数u=xyz在(',num2str(x(i)),',',num2str(y(i)),',',...num2str(z(i)),')处取得极 值,为',num2str(x(i)*(y(i)^2)*(z(i)^3))]);
end
end
但是报出了?Undefined function or method 'gt' for input arguments of type 'sym'错误,很苦恼不知道该如何修改
请问如何用matlab求函数u = x*y^2*z^3的最值,其中x^2+2*y^2 + z^2 = 1(x > 0;
我复制了一下你的程序报错是在z1上,这是solve解法的一个常见错误,你可以用fzero或者fsolve而不要单纯的solve.用matlab做符号运算是不太合适的,matlab都是划分网格数值运算.
如果你用mathematica可以用符号运算解


此外,你这个解法有点太粗糙了.我个人建议你先用lagrange multiplier matlab作为关键词搜索一下例程,比如用jabocian来代替diff都会好很多
再问: 这个是我们的作业,规定要用matlab做,我刚刚接触matlab对fzero和fsolve也不是很了解,自己试着用了下效果也不行,您能进一步给出具体实现这一功能的代码并稍加讲解么?感激不尽
再答: 一时间也懒得帮你重新写一个了,这是我当初学习拉格朗日乘子的时候的文档,很幼稚不过刚才试了一下还是能解的。 分别建立文件func function gamma = func(X) x = X(1); y = X(2); z = X(3); lambda = X(4); gamma = x*y^2*z^3 + lambda*(x^2 + 2*y^2 +z^2 -1); end 和dfunc function dLambda = dfunc(X) dLambda = nan(size(X)); h = 1e-5; %variable for i=1:numel(X) dX=zeros(size(X)); dX(i) = h; dLambda(i) = (func(X+dX)-func(X-dX))/(2*h); end 在主菜单运行X1 = fsolve(@dfunc,[0.7 0.7 0.7 0])然后再运行func(X1)就得解了 运行的时候应该还有个判断就是X1(4)==0的话继续运算,但是我用mathematica已经算出解我就用0.7去尝试了。 func定义了lagrange multiplier。dfuc实际上就是jacobian,fsolve就是令jacobian=0。跟你的区别在于这里全部都用的是数学计算,而你用的符号计算。