[英]Python scipy fsolve works incorrectly
我有方程式:
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.')
您是否嘗試過繪制功能?
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左右。 因此,將其最小化將導致無限的價格 。
因此,要么您必須忍受這一點, 要么想出另一種功能來優化或限制搜索范圍(在這種情況下,您不必搜索,因為它只是最大值...)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.