У меня есть данные, которые я пытаюсь смоделировать с помощью модели lmfit.
В частности, я измеряю сверхпроводящие резисторы. Я пытаюсь подогнать экспериментальные данные (зависимость сопротивления от температуры) к модели, которая включает критическую температуру Tc (зависит от материала), сопротивление ниже Tc (номинально 0) и сопротивление выше Tc (зависит от конструкции).
Вот упрощенная версия (с смоделированными данными) кода, который я использую для построения моих данных вместе с графиком вывода.
Я не получаю никаких ошибок, но, как видите, я также не получаю соответствие, которое соответствует моим данным.
Что я делаю неправильно? Я впервые использую lmfit и Model, поэтому, возможно, совершаю ошибку новичка. Я подумал, что подписался на пример lmfit, но, как я уже сказал, я явно делаю что-то не так.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from lmfit import Model
def main():
x = np.linspace(0, 12, 50)
x_ser = pd.Series(x) # Simulated temperature data
y1 = [0] * 20
y2 = [10] * 30
y1_ser = pd.Series(y1) # Simulated resistance data below Tc
y2_ser = pd.Series(y2) # Simulated resistance data above Tc (
y_ser = y1_ser.append(y2_ser, ignore_index=True)
xcrit_model = Model(data_equation)
params = xcrit_model.make_params(y1_guess=0, y2_guess=12, xcrit_guess=9)
print('params: {}'.format(params))
result = xcrit_model.fit(y_ser, params, x=x_ser)
print(result.fit_report())
plt.plot(x_ser, y_ser, 'bo', label='simulated data')
plt.plot(x_ser, result.init_fit, 'k.', label='initial fit')
plt.plot(x_ser, result.best_fit, 'r:', label='best fit')
plt.legend()
plt.show()
def data_equation(x, y1_guess, y2_guess, xcrit_guess):
x_lt_xcrit = x[x < xcrit_guess]
x_ge_xcrit = x[x >= xcrit_guess]
y1 = [y1_guess] * x_lt_xcrit.size
y1_ser = pd.Series(data=y1)
y2 = [y2_guess] * x_ge_xcrit.size
y2_ser = pd.Series(data=y2)
y = y1_ser.append(y2_ser, ignore_index=True)
return y
if __name__ == '__main__':
main()