3 次多項式的實根大家好,
有誰知道如何使用 JMP 腳本計算 3 次多項式的實根?
我有係數等式:0 = A + BX + C.X² + DX^3。 我需要的是真正的解決方案。
我開始創建一個包含很多行的新數據表,以便盡可能接近所需的值,但這需要太多時間。
謝謝,
回复:3次多項式的實根我選擇了適合我的 JMP 版本的答案。
謝謝大家的幫助!
回复:3次多項式的實根我嘗試了 Minimize() 和非線性平台。 兩者都可以很好地解決多項式,但由於初始值不好,很容易錯過一個或多個根。 查看圖表會有所幫助。
如果你安裝了 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 完成工作。 我很確定自 JMP 10 以來,Minimize 已經看到了一些改進。 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);
)
);
Found a zeroFound a zero發現零
如果 ^2 和 ^3 項的係數太大,則需要使 -1e99 到 1e99 的區間更小。
回复:3次多項式的實根自 JMP 10 以來可能已經有所改進。 您可以嘗試使用參數進行試驗,例如容差。回复:3次多項式的實根最小化功能似乎是一個很好的方法,但我不能讓它工作:
我試過你的腳本,但在第 3 行( minFromLeft =最小化(名稱表達式( F ) , { X } ) ; )
我收到以下警報:
“優化失敗:失敗:無法減少目標函數”
我有 JMP 版本 10.0.0。
和那有關係嗎?
回复:3次多項式的實根也許 Minimize() 函數可以提供幫助。因為它找到最小值,而不是零,所以你必須轉換你的三次方,使零處於最小值。大概平方比絕對值好,因為最小函數說它會取導數。
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;
如果你知道這樣的界限,從左右搜索應該至少找到一個實根,這樣問題就變成了二次方。
回复:3次多項式的實根謝謝你的回答。
這確實是一種做法,但我擔心每次使用腳本時都不會起作用:負數的平方根就是原因。
在 Excel 中我可以做到這一點,但在 JMP 上卻不行,而且我寧願不為一個腳本使用兩個軟件。
有沒有人有另一種方法?
回复:3次多項式的實根你可以用這個公式要獲得第一個根,將 x 值代入表達式以將多項式階數減少為 2,然後使用二次解法獲得剩餘的根。