我正在尝试将 2 个图表拟合到 2 个共享参数的不同函数中。函数相当复杂,涉及 atan、ln 和分数。Symfit 似乎为这种拟合提供了功能,但这种拟合遇到了
RuntimeWarning:在 sqrt return np.sqrt(self.variance(param)) 中遇到无效值
并且没有完成。
是否有另一个拟合函数在数值上更有效,或者是否有一个 scipy 函数可以实现相同的功能?
# parameters
mag, theta, phi, mode_angle = parameters('mag, theta, phi, mode_angle')
# setting initial parameter values and ranges
phi.max = math.radians(360)
phi.min = 0
theta.max = math.radians(180)
theta.min = 0
theta.value = math.radians(70)
mode_angle.value = 0.4
mode_angle.min = 0.39
mode_angle.max = 0.47
mag.value = 1e-14
mag.max = 1e-10
mag.min = 1e-18
q0.value = 1e-9
q0.max = 1e-4
q0.min = 1e-13
# variables from two graphs that share the same x axis
x1, y1, y2 = variables('x1, y1, y2')
x = np.linspace(-108, 501-108, 501)
# model includes two functions that share the same parameters and x
model = {
y1: func1(mag, theta, phi, mode_angle, x1),
y2: func2(mag, theta, phi, mode_angle, x1)
}
# calling the fit
fit = Fit(model,
x1 = x,
y1 = graph1_ydata,
y2 = graph2_ydata,
minimizer = DifferentialEvolution
)
# fit execution
fit_result = fit.execute()
虽然以下代码片段非常简单,因为可以快速发现并解决除以零(奇点),但它应该说明问题。相同的问题(除以零或可能为负根)也可能出现在标准中。开发。计算。使用许多参数,找到这些问题点变得更加复杂。
# Generating data
data_to_be_fitted=[]
xx = np.linspace(0.00001,12.00001, 400)
for i in range(0, len(xx)):
data_to_be_fitted.append( 1/xx[i])
q, a = parameters('q, a')
x1, y= variables('x1, y')
# Model
model = {
y: q/x1 # works with q / (x-a)
}
# Parameters
q.value = 1
q.min = -1
q.max = 1
a.value = 1
a.min = -1
a.max = 1
# Fitting
x = np.linspace(0,12, 400)
fit = Fit(model,
x1 = x,
y = data_to_be_fitted
)
fit_result = fit.execute()
print(fit_result)
我希望拟合能够为我提供拟合参数。我假设,拟合运行到一个奇点。好的,我通过排除一些拟合变量 x 来避免被零除。然而,这需要检查拟合函数。我仍然想知道,是否存在一些软件包解决方案。