3次多項式の実根みなさん、こんにちは、
誰もが知っていますかようにJMPスクリプトで次数3多項式の実根を計算するには?
私は持っています係数 0 = A + BX + C.X2 + DX ^ 3である。必要なのは本当の解決策です。
目的の値にできるだけ近づけるために、多数の行を含む新しいデータテーブルを作成し始めましたが、時間がかかりすぎます。
ありがとう、
再:3次多項式の実根私は自分のJMPバージョンに合った答えを選びました。
ご協力ありがとうございました。
再:3次多項式の実根Minimize()とNonlinearプラットフォームの両方を試しました。どちらも多項式を解くためにはうまく機能しますが、初期値が悪いために1つ以上の根を見逃すことは簡単です。グラフを見ると役立ちます。
Rがインストールされていれば、このJSL関数を試すことができます。
Names Default To Here(1);
// Function calling R, returns real roots of polynomials
// Input: a matrix of coefficients [x^0 ... x^n]
realroots = Function({p},
R Init();
R Send(p);
R Submit("roots=polyroot(p); real=Re(roots[which(round(Im(roots),12)==0)])");
real = R Get(real);
R Term();
real;
);
// Try it!
p1 = [-4 0 1]; // two real roots: ±2^2=4
p2 = [-27 0 0 1]; // one real root: 3^3=27
p3 = [7 -8 4 1]; // one real root
p4 = [1 -3 1 1]; // three real roots
ex1 = realroots(p1);
ex2 = realroots(p2);
ex3 = realroots(p3);
ex4 = realroots(p4);
Show(ex1, ex2, ex3, ex4);
再:3次多項式の実根(数学者ではない、これにはいくつかの欠陥があると私は確信しています...)あなたの最初のアイデアと似ていますが、JSLに仕事をさせてください。MinimizeがJMP 10以降、いくつかの改善を見たことは間違いありません。 https://community.jmp.com/t5/JMPer-Cable/Minimize-and-Maximize-Functions-in-JSL/ba-p/36355/jump-to/first-unread-message
a = -2;
b = -3;
c = 5;
d = 1;
f = Function( {x},
a + b * x + c * x * x + d * x * x * x
);
lo = -1e99;
hi = 1e99;
vlo = f( lo );
vhi = f( hi );
v = 1;
nn=0;
While( (abs(v)>1e-15) ,
test = (lo + hi) / 2;
v = f( test );
If( v > 0,
If(
vhi > 0, hi = test,
vlo > 0, lo = test
),
If(
vhi < 0, hi = test,
vlo < 0, lo = test
)
);
);
New Window( "Example",
Graph Box(
X Scale( -10, 10 ),
Y Scale( -30, 30 ),
Pen Color( "red" );
Y Function( f(x), x );
pencolor("black");
V Line( test );
hline(0);
)
);
ゼロが見つかりました
^ 2と^ 3の項の係数が大きすぎる場合は、-1e99から1e99までの区間を短くする必要があります。
再:3次多項式の実根JMP 10以降、改善されている可能性があります。許容値などのパラメータを試してみることもできます。再:3次多項式の実根最小化関数はそれを行う良い方法のようですが、私はそれを機能させることはできません:
私はあなたのスクリプトを試しましたが、3行目( minFromLeft = 最小化 ( 名前Expr ( f ) 、 { バツ } ) ; )
次のような警告が表示されます。
"最適化に失敗しました:失敗しました:目的関数を縮小できません"
私はJMPバージョン10.0.0を持っています。
それと関係がありますか?
再:3次多項式の実根おそらくMinimize()関数が役立ちます。ゼロではなく最小値を見つけるので、ゼロ値が最小になるように立方体を変換する必要があります。 Minimum関数は導関数を取ると言っているので、おそらく二乗は絶対値よりも優れています。
f = Expr( Power( -2 - 3 * x + 5 * Power( x, 2 ) + Power( x, 3 ), 2 ) );
x = -100;
minFromLeft = Minimize( Name Expr( f ), {x} );
xFromLeft = x;
x = 100;
minFromRight = Minimize( Name Expr( f ), {x} );
xFromRight = x;
show(xFromLeft, minFromLeft, xFromRight, minFromRight);
// result:
xFromLeft = -5.5995441248061;
minFromLeft = 1.07130883787516e-10;
xFromRight = 0.276987650239635;
minFromRight = 2.4771578468284;
そのような境界を知っていれば左右から検索すると、少なくとも1つの実根が見つかるはずです。それで問題は2次式になります。
再:3次多項式の実根この回答ありがとうございます。
それは確かにやり方ですが、私がスクリプトを使うたびにうまくいくとは限らないことを私は恐れています。負の数の平方根がその理由です。
Excelではそれは可能ですが、JMPではできません。1つのスクリプトに2つのソフトウェアを使用しない方がいいと思います。
他の方法がありますか。
再:3次多項式の実根これが使えます式最初の根を得るには、そのxの値を式に代入して多項式の次数を2に減らし、2次式を使って残りの根を求めます。