2017-11-29 13 views
0

私は、直線に関して閉曲線上にある2つの最も遠い点を見つけたいと思っています。ラグランジュ乗数は仕事のようです。しかし、何か私のコードに間違っています:私は10のソリューションポイント(長さ(xsol)= 10、いくつかは繰り返されるので、画像はわずか7です)、それらのうち2つだけが(赤いダニで)欲しいものです。なぜ、いくつかの点が曲線上にないのでしょうか?間違って何私のラグランジュ乗数のMATLABコードに何が間違っていますか?

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

+0

いくつかの解は複雑な平面にあるためです。あなたが真実を解決することだけを意味するなら、あなたは複雑な解決策を無視することができます。また、私は制約にある4つの真の解を数えます。 – TroyHaskin

+0

syms x y realを置くと、matlabはただ一つの解を与えますが、ポイントをプロットすることさえできません。 – lmathl

+0

複雑な解は有効な解(基本代数の基本定理に従う)であるため、シンボリックエンジンの数字の集合は制限しません。そして、一意性が失われていると思われるので、エンジンは明らかに解決策をパラメータ化することを決定します。 – TroyHaskin

答えて

0

ラグランジュ乗数は、ローカル最大値、ローカル分、および複雑な解を与えます。最も遠い2点を得るためには、もう1つのステップが必要です。すべての「解」の関数値を評価し、最大値と最小値に関する指標を見つけ、最後に2点を求めます。

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); 
関連する問題