用python求解负幂或非整数幂多项式方程

2024-09-28 19:02:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着解这个方程

1600 = 0.41 + 6.31*d**-1.54 + 2.42*d**-3 

Mathematica可以在不到1秒内给我d=6.4673。但我无法用python符号计算得到答案。在

使用“解”的sympy采取永远。有没有办法用python符号计算来解这个方程?看来问题主要来自于非整数负幂。在


Tags: 答案整数方程sympy办法mathematica符号计算
2条回答

要问的第一个问题是:你想要符号解还是数值解。在

对于一个象征性的解决方案:没有。在替换x = d**(-1/50)之后,方程变成A*x**150 + B*x**77 + C == 0。对于这样的高次多项式方程组,目前还没有一个符号公式。在

对于数值解决方案:您不需要SymPy,因为symphy用于符号计算。找一个与希比的根。作为一个起点:

from scipy.optimize import root
root(lambda d: 0.41 + 6.31*d**(-1.54) + 2.42*d**(-3) - 1600, 0.1)

这给出了0.1191005作为解决方案。初始点必须是一个小正数,否则解算器将无法收敛。正如WIP所说,Mathematica以这种方式失败了,它的答案是假的。在

但是对于标量方程最好使用专用的解算器,比如^{},特别是因为这里有一个单调函数。此解算器需要一个括号间隔开始:一个点的函数是正的,另一个点是负的。如果没有计算器,可以注意到0.1给出了一个正值(其中一个项是2.42*1000),而1给出了一个负值(三个小数字减去1600)。所以

^{pr2}$

它快速可靠地返回0.11910050394499523。在

SymPy通过mpmath库提供数值计算;这包括通过nsolve进行数值寻根。在本例中,由于denomominator中有一个d,因此我们按照nsolve的docstring的建议,使用表达式的分子并给出一个初始猜测。很快就会找到已经被引用的同一个根:

>>> f
-6.31*d**(-1.54) + 1599.59 - 2.42/d**3
>>> nsolve(f.as_numer_denom()[0], 1)
0.119100503944930

相关问题 更多 >