在我的情况下,目标函数是一个数值过程,其中包含通过二分法对方程求根的过程。对于某些参数集,方程没有中间变量的根。我认为使二等分求根例程返回None可以解决这样的问题。由于具有一组日期的对象函数在这种情况之间被回归scipy.optimize.curve_fit并p0分开,因此错误是停止该过程。
为了研究这个案例,我们展示了一个简化的案例。
import numpy as np
#Define object function:
def f(x,a1,a2):
if a1 < 0:
return None
elif a2 < 0:
return np.inf
else:
return a1 * x**2 + a2
#Making data:
x = np.linspace(-5,5,10)
i = 0
y = np.empty_like(x)
for xi in x:
y[i] = f(xi,1,1)
i += 1
import scipy.optimize as sp
para,pvoc = sp.curve_fit(f,x,y,p0=(-1,1))
#TypeError: unsupported operand type(s) for -: 'NoneType' and 'float'
para,pvoc = sp.curve_fit(f,x,y,p0=(1,-1))
#RuntimeError: Optimal parameters not found: Number of calls to function has reached maxfev = 600.
我也试过inf了,显然不行。我应该返回什么来继续这个curve_fit过程?想象一下它正在尝试收敛,curve_fit当它遇到这种情况时会发生什么。
附加思考:我尝试try...except...忽略错误并模拟一个p0在可解决范围内的情况,但会将不可解决的段传递给真正的拟合。
import numpy as np
def f(x,a1,a2):
if a1 < 0:
return None
elif a1 < 2:
return a1 * x**2 + a2
elif a2 < 0:
return np.inf
else:
return a1 * x**2 + a2
def ff(x,a1,a2):
output = f(x,a1,a2)
if output == None:
return 0
else:
return output
x = np.linspace(-5,5,10)
i = 0
y = np.empty_like(x)
for xi in x:
y[i] = f(xi,1,1)
i += 1
import scipy.optimize as sp
#para,pvoc = sp.curve_fit(f,x,y,p0=(-1,1))
#TypeError: unsupported operand type(s) for -: 'NoneType' and 'float':
#para,pvoc = sp.curve_fit(f,x,y,p0=(1,-1))
try:
para,pvoc = sp.curve_fit(f,x,y,p0=(-3,1))
except TypeError:
pass
显然在收敛过程中遇到了错误,并已报告并被排除在外。我应该怎么做才能继续curve_fit原来的收敛方向?即使我可以做出让步,我怎么能告诉curve_fit将最后一次尝试返回给a1?
另一方面,我尝试将它try... except...放在对象函数中,以便在出现错误时返回 0。结果正如我所料:
para,pvoc = sp.curve_fit(ff,x,y,p0=(-3,1))
#OptimizeWarning: Covariance of the parameters could not be estimated
category=OptimizeWarning)