Scipy fsolve判定收敛但Excel单变量求解无解的原因排查
解答
Q1 差异原因
- 收敛判定逻辑不同:
fsolve默认停止条件是函数值绝对值小于xtol(默认1e-8),或迭代步长小于ftol(默认1e-8)。如果函数在初始猜测点附近变化极小,哪怕没有零点,fsolve也会误判为满足收敛条件,停止迭代。- Excel单变量求解的算法(改进牛顿法变种)会跟踪函数值变化趋势,若多次迭代后函数值无向0靠近的迹象,会直接判定无解析解,不会因微小变化就停止。
- 函数本身特性:你的目标函数发散,不存在零点。
fsolve因初始点附近函数梯度极低误判收敛,而Excel能识别出函数无零点的趋势。
Q2 结果与猜测值一致的原因
- 梯度近似为0:
fsolve基于牛顿法,需要计算函数对变量的导数(梯度)确定迭代方向和步长。当rate在0附近时,(1+rate)**x的变化率极低,导致整个npv函数对rate的导数几乎为0。 - 迭代无法推进:梯度为0时,牛顿法无法计算有效迭代步长,只能返回初始猜测值——它认为当前点的变化已经满足停止条件,无需继续迭代。
- 验证方式:你可以计算
f(guess)和f(guess+1e-6)的差值,会发现变化微乎其微,这直接导致fsolve无法找到更优的迭代点。
内容的提问来源于stack exchange,提问作者0in
相关产品推荐
相关产品推荐

