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,然后使用二次解法获得剩余的根。