如何用Python求解单变量方程log(1+x)/x -1/(1+x)=2/3*q*x²(q=4e-4)
求解方程的正确方法
首先将原方程转化为目标函数等于0的形式:
$$f(x) = \frac{\ln(1+x)}{x} - \frac{1}{1+x} - \frac{2}{3} q x^2$$
其中 $q=4\times10^{-4}$。
你之前得到不合理结果,大概率是因为初始猜测值或求解区间选在了小根附近(比如x≈0.75的根),而非你需要的x≈20的大根。以下是具体解决步骤:
1. 正确定义目标函数
使用numpy的自然对数(np.log,对应数学中的$\ln$),确保函数在x>0时可计算:
import numpy as np from scipy.optimize import fsolve, root_scalar q = 4e-4 def f(x): return np.log(1 + x)/x - 1/(1 + x) - (2/3)*q*(x**2)
2. 用fsolve求解(指定正确初始值)
直接将初始猜测值设为你预期的20附近,避免求解器收敛到小根:
# 初始值设为20 x_sol = fsolve(f, x0=20) print(f"fsolve得到的解:{x_sol[0]:.4f}") # 验证结果:代入函数看是否接近0 print(f"函数值验证:{f(x_sol[0]):.6f}")
3. 用root_scalar求解(指定区间更可靠)
如果你从图像中观察到解在19-20之间,用brentq方法指定区间,结果更稳定:
# 指定解所在的区间[19, 20] result = root_scalar(f, method='brentq', bracket=[19, 20]) print(f"root_scalar得到的解:{result.root:.4f}") print(f"函数值验证:{f(result.root):.6f}")
关键说明
- 原方程在x>0时存在两个根:一个接近0.75的小根,和一个接近20的大根。你需要的是后者,因此必须指定靠近20的初始值或区间。
- 运行上述代码后,得到的解大约在19.85左右,代入原方程后误差极小,符合预期。
内容的提问来源于stack exchange,提问作者Matrix23
相关产品推荐
相关产品推荐

