问题描述:
sympy解带自然对数函数log(x*y)的一元方程时,程序长时间运行无法求解的问题。sympy解方程长时间运行不报错,但是无法求出解。等待较长时间后报错:
原因剖析:
由于方程中系数精度较高,所以需要长时间求解。导致带log的函数长时间无法求出准确解。
#无法求出解,因为系数的精度太高了。
from sympy import symbols, Eq, solve, log
x= symbols("x")
coef = 5.2348999999999
f1 = coef*log(100.0*x) - 38
solve(f1)
解决方案1:
将系数进行四舍五入,保留不影响结果的项即可。
round(number, ndigits=None)
返回小数点后四舍五入到ndigits精度的数字。如果ndigits被省略或为None,它将返回与其输入最近的整数。
注意:
round()对于float的行为可能令人惊讶:例如,round(2.675,2)给出的是2.67,而不是预期的2.68。这不是一个错误:这是因为大多数十进制分数【decimal fractions】不能精确地表示为浮点值。
#使用round进行去取整
from sympy import symbols, Eq, solve, log
x= symbols("x")
coef = 5.2348999999999
coef = round(coef,3)
f = coef*log(100.0*x) - 38
solve(f)
->可以得到结果: [14.2060024069850]
解决方案2:
先对表达式进行求解,得到关于其他符号的表达式。再将值使用subs()带入到sympy.solve()后表达式中。
xreplace(),replace(),subs():都有替代表达式中符号的作用。
exp.evalf():可以将exp中的pi,exp,ln等符号进行计算,得到浮点数。
import sympy
v, t = sympy.symbols("v,t")
#任意定义一个函数
def mass():
return sympy.ln(v*t)+4
re = sympy.solve(mass(),v)
re = re[0]
print(re,type(re))
#结果: exp(-4)/t <class 'sympy.core.mul.Mul'>
#如果结果中都pi以及exp等sympy符号。直接subs后,会保留符号
print(re.subs({t:2}))
# exp(-4)/2
#对保留符号的结果进行evalf(),求取值。xreplace,replace,subs都有替代符号的作用。
print(re.xreplace({t:2}).evalf())
# 0.00915781944436709