2024-09-28 19:02:44 发布
网友
我试着解这个方程
1600 = 0.41 + 6.31*d**-1.54 + 2.42*d**-3
Mathematica可以在不到1秒内给我d=6.4673。但我无法用python符号计算得到答案。在
d=6.4673
使用“解”的sympy采取永远。有没有办法用python符号计算来解这个方程?看来问题主要来自于非整数负幂。在
要问的第一个问题是:你想要符号解还是数值解。在
对于一个象征性的解决方案:没有。在替换x = d**(-1/50)之后,方程变成A*x**150 + B*x**77 + C == 0。对于这样的高次多项式方程组,目前还没有一个符号公式。在
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.1191005
但是对于标量方程最好使用专用的解算器,比如^{},特别是因为这里有一个单调函数。此解算器需要一个括号间隔开始:一个点的函数是正的,另一个点是负的。如果没有计算器,可以注意到0.1给出了一个正值(其中一个项是2.42*1000),而1给出了一个负值(三个小数字减去1600)。所以
2.42*1000
它快速可靠地返回0.11910050394499523。在
0.11910050394499523
SymPy通过mpmath库提供数值计算;这包括通过nsolve进行数值寻根。在本例中,由于denomominator中有一个d,因此我们按照nsolve的docstring的建议,使用表达式的分子并给出一个初始猜测。很快就会找到已经被引用的同一个根:
mpmath
nsolve
d
>>> f -6.31*d**(-1.54) + 1599.59 - 2.42/d**3 >>> nsolve(f.as_numer_denom()[0], 1) 0.119100503944930
要问的第一个问题是:你想要符号解还是数值解。在
对于一个象征性的解决方案:没有。在替换
x = d**(-1/50)
之后,方程变成A*x**150 + B*x**77 + C == 0
。对于这样的高次多项式方程组,目前还没有一个符号公式。在对于数值解决方案:您不需要SymPy,因为symphy用于符号计算。找一个与希比的根。作为一个起点:
这给出了
0.1191005
作为解决方案。初始点必须是一个小正数,否则解算器将无法收敛。正如WIP所说,Mathematica以这种方式失败了,它的答案是假的。在但是对于标量方程最好使用专用的解算器,比如^{} ,特别是因为这里有一个单调函数。此解算器需要一个括号间隔开始:一个点的函数是正的,另一个点是负的。如果没有计算器,可以注意到0.1给出了一个正值(其中一个项是
^{pr2}$2.42*1000
),而1给出了一个负值(三个小数字减去1600)。所以它快速可靠地返回
0.11910050394499523
。在SymPy通过
mpmath
库提供数值计算;这包括通过nsolve
进行数值寻根。在本例中,由于denomominator中有一个d
,因此我们按照nsolve
的docstring的建议,使用表达式的分子并给出一个初始猜测。很快就会找到已经被引用的同一个根:相关问题 更多 >
编程相关推荐