我有方程:
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的根。
UPD: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.')发布于 2015-12-02 14:21:26
你试过绘制你的函数了吗?
import numpy as np
from scipy import optimize
from matplotlib import pyplot as plt
small = 1e-30
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(small, z)))
wantedEstate = (wealth / (price + q / rate)) * np.minimum(k, 1) - realEstate
sum_wantedEstate += wantedEstate
return sum_wantedEstate
price_range = np.linspace(0,10000,10000)
we = [wealth_evolution(p) for p in price_range]
plt.plot(price_range,we)
plt.xlabel('price')
plt.ylabel('wealth_evolution(price)')
plt.show()

至少对于您指定的参数,它没有根,这是fsolve试图找到的。如果您想最小化一个函数,可以尝试fmin。对于这个函数来说,这是没有帮助的,因为它似乎只是渐进地衰减到99.7左右。因此,将其最小化将导致无限的代价。
因此,要么您必须接受这种情况,要么想出一个不同的函数来优化或限制搜索范围(在这种情况下,您不必搜索,因为它只是最大值.)。
https://stackoverflow.com/questions/34030183
复制相似问题