私は、その微係数がゼロに等しい関数の値を探したいと思います。心臓関数の差分がゼロに等しい
function val = Heart(x1, x2)
val=(1.25*x2-sqrt(abs(x1))).^2+x1.^2-1;
endfunction;
私はnumderivative
機能で試してみました。 Gracias。
私は、その微係数がゼロに等しい関数の値を探したいと思います。心臓関数の差分がゼロに等しい
function val = Heart(x1, x2)
val=(1.25*x2-sqrt(abs(x1))).^2+x1.^2-1;
endfunction;
私はnumderivative
機能で試してみました。 Gracias。
Heart()
は暗黙の関数なので、Scilabでは関数が現在定義されている方法でこの問題を解決できません。 hereと答えているので、Scilabは暗黙の区別をすることができません。さらに、あなたの方程式は実際には3Dサーフェスを定義していますので、実際には偏微分で計算できます。
あなたが暗黙の曲線0=Heart(x1,x2)
のx1
に関連して派生がゼロである、x1
値を検索したい場合は、あなたがこの問題を解決するために、あなた自身の以前の質問からthis answerに提示方法を使用することができます。
ハートカーブのプロットを調べると、微分値がゼロ(2つの最大値)が2つしかないことがわかります:それらはカーブの上部にあり、x1=-0.6
とx1=0.6
に近く、それぞれ、これらの点の多くの近似値を見つけるには、次の操作を行う必要があります。
numderivative()
を使用して、d_heart()
を定義します。私たちが探している答えは、この関数のゼロです。0=d_heart(x1)
を解決するためにfsolve()
を使用してください。 2つの推測を入力する必要があります。それらは-0.6と0.6です。このような何か:
function y = heart_up(x1)
y = 4/5 * (sqrt(abs(x1))+sqrt(1-x1.^2))
endfunction
function y = d_heart(x1)
y = numderivative(heart_up, x1);
endfunction
x1 = fsolve(-0.6, d_heart); y1 = heart_up(x1);
x2 = fsolve(0.6, d_heart); y2 = heart_up(x2);
あなたはheart_up()
が本当に心の上部にあるとの結果がそれらをプロットすることにより、右であることをことを可視化することができます。
x = -1:0.01:1;
contour2d(x, 2*x, Heart, [0 0]);
plot2d(x, heart_up(x), 2);
plot2d([x1 x2], [y1 y2], -2);
このスクリプトを短縮(改善)することはできますか?私はJacobian Heart関数を考え、それを評価し、ゼロ点を見つけます。いくつかの乗り物!
luispaulomlの兆候後:
[function val = Heart(x1, x2)
val=(1.25*x2-sqrt(abs(x1))).^2+x1.^2-1;
endfunction;
function y = heart_up(x1)
y = 4/5 * (sqrt(abs(x1))+sqrt(1-x1.^2))
endfunction
function y = heart_down(x1)
y = 4/5 * (sqrt(abs(x1))-sqrt(1-x1.^2))
endfunction
function y = du_heart(x1)
y = numderivative(heart_up, x1);
endfunction
function y = dd_heart(x1)
y = numderivative(heart_down, x1);
endfunction
x1 = fsolve(-0.6, du_heart); y1 = heart_up(x1);disp(y1,"y1",x1,"x1");
x2 = fsolve(0.6, du_heart); y2 = heart_up(x2);disp(y2,"y2",x2,"x2");
x3 = fsolve(0.0, du_heart); y3 = heart_up(x3);disp(y3,"y3",x3,"x3");
x4 = fsolve(0.0, dd_heart); y4 = heart_down(x4);disp(y4,"y4",x4,"x4");
x = -1:0.01:1;
contour2d(x, 2*x, Heart, \[0 0\]);
plot(\[x1 x2\],\[y1 y2\],'gd');
plot(\[x3 x4\],\[y3 y4\],'rx');
replot(\[-1.415,-1,1.415,1.415\]);][1]
別の可能な解決策は、次のとおりです。私たちはScilabのと自分自身を理解し始めているこの機能を 。 私が提案しているスクリプトでは、Heart関数のクリティカルポイントまたは極端なポイントが見つかりました。 私たちはコメントを読むことにあなたの注意を呼ぶ!!
function val = Hxyg(x,y)
val=(1.25*y-sqrt(abs(x))).^2+x.^2-1;
endfunction;
x = -1:0.01:1;
contour2d(x, 2*x, Hxyg, [0 0]);
replot([-1.415,-1,1.415,1.415]);
//We define the Hxy function with x as additional input argument(as a parameter)
//Since y, will be our unknown, we have interposed x and y in the argument list of the Hxy function
//(y it is the unknown and x is the parameter).
//This will be necessary to determine the intersects on the Y axis
function val = Hxy(y,x)
val=(1.25*y-sqrt(abs(x))).^2+x.^2-1; // switched .^ to^to handle vectors
endfunction;
function [val] = HH(v)//v:(y,x)
x=v(2);
y=v(1);
val=Hxy(y,x);
endfunction;
function Jpx=dfx(v)//v:(y,x)
Jpx=numderivative(HH,v);
Jpx=Jpx(2);
endfunction
//Find the local maxima.
function Z = flm(v)//v:(y,x)
Z = [ HH(v)
dfx(v)
]
endfunction
//v:(y,x)
xlm1=fsolve([1.4;-0.4],flm)
disp(xlm1)
xlm2=fsolve([1.4;0.4],flm)
disp(xlm2)
plot([xlm1(2) xlm2(2)],[xlm1(1) xlm2(1)],'gx')
//Find the y-intercepts. Hxy(y,x)
//the Hxy function uses x as a parameters.
//We define the Hxy function with x as additional input argument(as a parameter),
//which is declared after the y unknown. Then we pass a list as the second input argument
//of the fsolve function after initial value of Hxy function argument; in this situation only variable y.
//The first element of the list is the Hxy function. The additional variable x is directly passed to the Hxy function.
x=0.0;
yint1=fsolve(1,list(Hxy,x))// --->Hxy(y,x)=>1.5625*y^2-1
disp(yint1)
yint2=fsolve(-1,list(Hxy,x))// ---> Hxy(y,x)=>1.5625*y^2-1
disp(yint2)
plot([x x],[yint1 yint2],'rx')