我有一个错误高斯函数erfc(x),我需要将其放入我的表面数据中。 整个等式是:
Z = Z_0 * erfc(x / 2*sqrt(D*t))
我知道数据Z,Z_0,x,t ......我唯一想要的参数是D.使用curve_fit对于单行是好的,但我需要找到整个表面只有一个常数参数D. 表面看起来像这样 ]。 请问有什么想法吗?感谢
答案 0 :(得分:0)
我创建了一个演示多变量curve_fit
的示例。请注意,我使用了一个类对象来存储参数Z0
,但还有其他方法可以执行此操作(请参阅this question)。
import numpy as np
from scipy.optimize import curve_fit
from scipy.special import erfc
# Class to contain model and parameters
class fitClass:
def __init__(self):
pass
# Model with unknown parameter D
def func(self, p, D):
x, t = p
Z = self.Z0 * erfc(x / 2*np.sqrt(D*t))
return Z
# Instantiate class and define parameters
inst = fitClass()
inst.Z0 = 1.0
D = 10.0
Nx = int(1e2)
Nt = int(1e1)
# Independent variables
x = np.linspace(-1.0, 1.0, Nx)
t = np.linspace(1.0, 5.0, Nt)
X, T = np.meshgrid(x, t)
# Merge independent variables
xdata = np.vstack([X.reshape(-1), T.reshape(-1)])
# Synthetic ydata (noisy measurement)
noise = 0.5*(np.random.rand(Nx*Nt)-0.5)
Z = inst.func(xdata, D)
Z_noisy = Z + noise
# Fit model to data
popt, pcov = curve_fit(inst.func, xdata, Z_noisy)
D_fit = popt[0]
print(D_fit)