我的lagrange乘法器matlab代码有什么问题?

时间:2017-11-29 02:13:09

标签: matlab

我想找到相对于直线位于闭合曲线上的两个最远点。拉格朗日乘数似乎是在做这项工作。但是我的代码出了点问题:我有10个解决方案点(长度(xsol)= 10,有些重复,所以图片只有7个),其中只有两个是我想要的(红色刻度)。为什么有些点不在曲线上?

syms x y L
g = @(x,y) x^2+2*x*y^2+y^6-1;
h = @(x,y) -4*x+y; % to max or min this such that g=0 is satisfied
gradg = jacobian(g,[x,y]); gradh = jacobian(h,[x,y]);
lagr = gradh - L*gradg;
[L,xsol,ysol]=solve(lagr(1),lagr(2),g);
plot(xsol,ysol,'bo')

enter image description here

有什么问题?

1 个答案:

答案 0 :(得分:0)

拉格朗日乘数给出局部最大值,局部最小值以及复杂解。为了获得最远的两点,我们还需要一个步骤:评估所有解决方案的函数值,找到关于最大值和最小值的索引,最后得到两点。

xsolreal=real(double(xsol)); % take the real part for giving accurate results
ysolreal=real(double(ysol));
fnvalue=zeros(1,length(xsol));
for i=1:length(xsol)
    fnvalue(i)=-4*xsolreal(i)+ysolreal(i); % function value of the given line
end
gmax=find(fnvalue == max(fnvalue(:)));
gmin=find(fnvalue == min(fnvalue(:)));
x1=xsolreal(gmax);
y1=ysolreal(gmax);
x2=xsolreal(gmin);
y2=ysolreal(gmin);