pythonscipyfsolve工作不正确

pythonscipyfsolve工作不正确,python,scipy,equation,Python,Scipy,Equation,我有一个方程式: 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

我有一个方程式:

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)
我找到了这个方程的解:

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\u evolution(sol)
)。为什么会这样
fsolve
查找
f(x)=0的根

UPD:
full\u输出提供:

(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左右。因此,最小化它将导致无限的价格


因此,要么你不得不接受这一点,要么想出一个不同的函数来优化或限制你的搜索范围(在这种情况下,你不必搜索,因为它只是最大值…)

您是否尝试过绘制函数

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左右。因此,最小化它将导致无限的价格


因此,要么你不得不接受这一点,要么想出一个不同的函数来优化或限制你的搜索范围(在这种情况下,你不必搜索,因为它只是最大值…)

您可能想展示一个例子,如果您发布了由
full\u info=True
@cel生成的调试输出,这也会很有帮助。事实上,它已经非常接近了。运行代码,并使用
wealth\u evolution(sol)
检查结果。Roma,接受@ali\u m的建议(要使用的参数是
full\u output=True
)。特别是查看
ier
和错误消息。(也要弄清楚为什么会收到关于被零除的警告。)当使用
full_output=True
时,函数返回
ier=5
,这是一种错误情况。我不明白的是为什么函数没有引发异常。事实上,第一次在没有
full\u output=True
的情况下运行它时,代码会生成一个运行时警告,说明没有取得良好的进展。这表明您应该使用
full\u output=True
重新运行代码。(如果以相同的初始猜测再次运行它,则不会得到警告,这有点令人恼火。这是一个python默认警告行为可能具有欺骗性的示例,scipy可能会覆盖它并始终生成警告。)您可能想展示一个例子,如果您发布了由
full\u info=True
@cel生成的调试输出,这也会很有帮助。事实上,它已经非常接近了。运行代码,并使用
wealth\u evolution(sol)
检查结果。Roma,接受@ali\u m的建议(要使用的参数是
full\u output=True
)。特别是查看
ier
和错误消息。(也要弄清楚为什么会收到关于被零除的警告。)当使用
full_output=True
时,函数返回
ier=5
,这是一种错误情况。我不明白的是为什么函数没有引发异常。事实上,第一次在没有
full\u output=True
的情况下运行它时,代码会生成一个运行时警告,说明没有取得良好的进展。这表明您应该使用
full\u output=True
重新运行代码。(如果你用同样的初始猜测再次运行它,你不会得到警告,这有点令人恼火。这是一个python默认警告行为可能具有欺骗性的示例,scipy可能会覆盖它并始终生成警告。)人们使用像python这样的好的交互式工具总是让我感到惊讶,然后期待它神奇地发现他们“知道”的东西,而不检查(通过绘图)它是否真的在那里。您应该始终绘制您的函数!这将为您提供关于使用哪个解算器(或最小化器)的非常好的信息,以及关于从何处开始搜索的好主意。与在卡片上运行Fortran程序的时代相比(是的,我这样做了),现在做起来很容易。人们使用像Python这样的友好、交互式工具,然后期望它神奇地发现他们“知道”的东西,而不检查(通过标绘)它是否确实存在,这总是让我感到惊讶。您应该始终绘制您的函数!这将为您提供关于使用哪个解算器(或最小化器)的非常好的信息,以及关于从何处开始搜索的好主意。与在卡片上运行Fortran程序的时代相比(是的,我这样做了),现在做起来很容易。