Python: Подгонка нелинейной функции к поверхности - PullRequest
0 голосов
/ 28 апреля 2018

У меня есть функция гаусса ошибки erfc (x), которую мне нужно вписать в мои данные поверхности. Целое уравнение:

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

Я знаю по данным Z, Z_0, x, t ... единственный параметр, который я ищу, - это D. Использование curve_fit подходит для отдельных линий, но мне нужно найти только один постоянный параметр D для всей поверхности. Поверхность выглядит так surface]. Есть идеи, пожалуйста? Спасибо

1 Ответ

0 голосов
/ 28 апреля 2018

Я создал пример, демонстрирующий многовариантность curve_fit. Обратите внимание, что я использовал объект класса для хранения параметра Z0, но есть и другие способы сделать это (см. этот вопрос ).

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)
...