解决使用sympy解带自然对数函数log(x*y)的一元方程时,程序长时间运行无法求解的问题。sympy解方程长时间运行不报错,但是无法求出解。长时间运行后报错:

问题描述:

        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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值