Python:将非线性函数拟合到表面

时间:2018-04-28 14:07:32

标签: scipy data-fitting

我有一个错误高斯函数erfc(x),我需要将其放入我的表面数据中。 整个等式是:

 Z = Z_0 * erfc(x / 2*sqrt(D*t))

我知道数据Z,Z_0,x,t ......我唯一想要的参数是D.使用curve_fit对于单行是好的,但我需要找到整个表面只有一个常数参数D. 表面看起来像这样 surface]。 请问有什么想法吗?感谢

1 个答案:

答案 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)