【发布时间】:2015-12-01 21:09:11
【问题描述】:
我有方程式:
import numpy as np
from scipy import optimize
def wealth_evolution(price, wealth=10, rate=0.01, q=1, realEstate=0.1, prev_price=56):
sum_wantedEstate = 100
for delta in range(1,4):
z = rate - ((price-prev_price) / (price + q / rate))
k = delta * np.divide(1.0, float(np.maximum(0.0, z)))
wantedEstate = (wealth / (price + q / rate)) * np.minimum(k, 1) - realEstate
sum_wantedEstate += wantedEstate
return sum_wantedEstate
所以我找到了这个方程的解:
sol = optimize.fsolve(wealth_evolution, 200)
但如果我将sol 代入等式,我将不会得到0 (welth_evolution(sol))。为什么会发生? fsolve 找到 f(x)=0 的根。
更新:
full_output 给出:
(array([ 2585200.]), {'qtf': array([-99.70002298]), 'nfev': 14, 'fjac': array([[-1.]]), 'r': array([ 3.45456519e-11]), 'fvec': array([ 99.7000116])}, 5, 'The iteration is not making good progress, as measured by the \n improvement from the last ten iterations.')
【问题讨论】:
-
如果您发布由
full_info=True生成的调试输出也会很有帮助。 -
@cel 实际上,它非常接近。运行代码,用
wealth_evolution(sol)检查结果。 -
Roma,听听@ali_m 的建议(除了要使用的参数是
full_output=True)。特别是查看ier和错误消息。 (还要弄清楚为什么会收到关于被零除的警告。)当使用full_output=True时,函数返回ier=5,这是一个错误条件。我不明白为什么该函数不会引发异常。 -
其实第一次运行没有
full_output=True的时候,代码会生成一个RuntimeWarning关于没有取得好的进展。这表明您应该使用full_output=True重新运行代码。 (有点烦人的是,如果您以相同的初始猜测再次运行它,您不会收到该警告。这是一个示例,python 的默认警告行为可能具有欺骗性,scipy 可能应该覆盖它并始终生成警告.)