You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 16:55:02