使 numpy fsolve 在分段常量函数上工作
Making numpy fsolve work on piecewise constant functions
我正在尝试使用 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)
我正在尝试使用 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)