python - 使 numpy fsolve 能够处理分段常量函数

标签 python numpy numerical-methods

我正在尝试使用 fsolve 来查找各种参数分段定义函数的交点:

max_price = 20.0
b = 0.5
consumption_func = lambda x,b : max_price if x <= b else max_price - (x-b)
func = lambda x: consumption_func(x,b)

bid_start, _, ier, msg = fsolve(lambda x: func(x) - 5.0, 0.0, xtol=0.0001, full_output=True)

但是,如果起点位于函数恒定的范围内,即使对于这个非常简单的函数,求解器也无法找到交集:

bid_start, _, ier, msg = fsolve(lambda x: func(x) - 5.0, b-0.1, full_output=True)

Out: array([0.4]) #starting point
msg='The iteration is not making good progress, as measured by the 
  improvement from the last ten iterations.'

如果在非常量范围内则成功:

bid_start, _, ier, msg = fsolve(lambda x: func(x) - 5.0, b-0.1, full_output=True)

Out: array([15.5]) #correct answer

我猜这与 fsolve 使用的 MINPACK 算法有关(可能是基于梯度的)。在这个简单的例子中,我设法通过传递 b 作为参数来绕过它,但将来我计划使用更复杂的函数;知道如何让 fsolve 在这里工作吗?

最佳答案

您可以通过向方程中添加随机线性函数来使fsolve摆脱困境。使用随机方程的解作为原始方程的起点。随机方程的解有时会接近真实方程的原解,从而导致收敛。如果没有;用另一个随机数再试一次。

请参阅下面的 while 循环,该循环一直运行到原方程的 fsolve 的标志 ier 等于 1,表示成功。

from scipy.optimize import fsolve
import random
max_price = 20.0
b = 0.5
consumption_func = lambda x,b : max_price if x <= b else max_price - (x-b)
func = lambda x: consumption_func(x,b)

ier = 0
while ier != 1:
    k = random.uniform(-0.01, 0.01)
    func_random = lambda x: func(x) + k*x
    x_prelim = fsolve(lambda x: func_random(x) - 5.0, 0.0, xtol=0.01)
    bid_start, _, ier, msg = fsolve(lambda x: func(x) - 5.0, x_prelim, xtol=0.0001, full_output=True)

print(bid_start)

关于python - 使 numpy fsolve 能够处理分段常量函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41057453/

相关文章:

python - 如何使用 ctypes 编写和包装 sqlite3 所需的 python 函数作为回调?

python - TensorFlow 无法将字符串转换为数字

Java-寻找有关计算函数的最小值/最大值或步长间隔中的导数的建议

python - 在矩阵上使用 scipy.fsolve

python - 与 c++ 相比,与solve_ivp 集成非常慢

python - Fastapi 帖子无法识别我的参数

python - 如何使用feature hasher将非数值型离散数据进行转换,以便传递给SVM?

python - 计算大矩阵 (300000 x 70000) 的均值和协方差

python - 选择 numpy 数组中特定维度的索引

python - 用Python计算傅里叶系数?