scipy 在Python中用一个变量求解方程

xesrikrc  于 12个月前  发布在  Python
关注(0)|答案(2)|浏览(156)

我在试着解这个方程:log(1+x)/x - 1/(1+x) == 2/3 * q * x**2用于xq = 4e-4
我试

import numpy as np
import scipy.optimize as so
q = 4e-4
eqn = lambda x: np.log(1+x) / x  -  1 / (1+x)   -   2/3 * q * x**2 
sol = so.fsolve(eqn, 1)[0]
print(sol)

q = 4e-4
eqn = lambda x: np.log(1+x) / x  -  1 / (1+x)   -   2/3 * q * x**2 
sol = so.root_scalar(eqn, bracket=(1e-6, 1e20)).root
print(sol)

却得到荒谬的答案
我试着画出如下的方程:

答案是x ~ 20。我怎么才能拿到这个?

gr8qqesn

gr8qqesn1#

当你提供一个好的初始猜测或一个更紧的括号时,这些算法工作得最好。

import numpy as np
from scipy.optimize import fsolve, root_scalar, root

def eqn(x): 
    q = 4e-4
    return np.log(1+x)/x - 1/(1+x) - 2/3*q*x**2

sol_fsolve = fsolve(eqn, 10)[0]
sol_rootscalar = root_scalar(eqn, bracket=(1e-6, 100)).root
sol_root = root(eqn, 10).x[0]

print(sol_fsolve)       # 19.84860182482322
print(sol_rootscalar)   # 19.848601824823366
print(sol_root)         # 19.84860182482322
yqkkidmi

yqkkidmi2#

只需修改x的init值就可以了

import numpy as np
import scipy.optimize as so

q = 4e-4
eqn = lambda x: np.log(1+x) / x  -  1 / (1+x)   -   2/3 * q * x**2 
sol = so.fsolve(eqn, [15])[0]
print(sol)

将输出

19.848601824823362

相关问题