Я хочу подогнать кривую к своему экспериментальному набору данных, и я действительно не знаю, как это сделать.Я искал возможности, и я наткнулся на curve_fit
(а также least_suqares
), который, кажется, подходит для этой задачи, но я все еще очень незнаком с тем, как это работает, так как я изо всех сил пытаюсь получить это вмоя толстая головаЯ начал свою попытку с определения начальных значений:
import numpy as np
import math
from scipy.optimize import curve_fit, least_squares
f_exp = np.array([1, 1.6, 2.7, 4.4, 7.3, 12, 20, 32, 56, 88, 144, 250000])
e_exp = np.array([7.15, 7.30, 7.20, 7.25, 7.26, 7.28, 7.32, 7.25, 7.35, 7.34, 7.37, 13.55])
n_e_exp = len(e_exp)
ezero = 7.15
einf = 13.55
fc = np.arange(1,11000,1000)
alpha = np.arange(0,1.1,0.1)
log_f_mod = np.arange(-3, 6.5, 0.5)
f_mod = 10 ** log_f_mod
n_f_mod = len(f_mod)
n_fc = len(fc)
n_alpha = len(alpha)
x = np.zeros((n_f_mod, n_fc))
for j in range(n_f_mod):
for k in range(n_fc):
x[j,k] = np.log(f_mod[j] / fc[k])
Обратите внимание, что x
является функцией fc
.Теперь я определяю функцию, которую хочу запустить, используя curve_fit
, least_squares
или другую более подходящую функцию:
def c_c_eRI(einf, ezero, alpha, x):
eR = einf + 1/2 * (ezero - einf) * (1 - np.sinh((1 - alpha) * x) / (np.cosh((1 - alpha) * x) + np.cos(alpha * math.pi / 2)))
eI = np.abs(1/2 * (ezero - einf) * np.cos(alpha * math.pi / 2) / (np.cosh((1 - alpha) * x) + np.sin(alpha * math.pi / 2)))
eRI = np.sqrt(eR ** 2 + eI ** 2)
return eRI
На этом этапе я пытался заставить ее работать без каких-либоудача:
fit = curve_fit(c_c_eRI, f_exp, e_exp)
- Есть ли способ использовать функцию (например,
curve_fit
, least_squares
или какую-то другую) для подгонки кривой к экспериментальным данным и одновременно предоставляют значения независимых переменных, которые alpha
и fc
(от которых x
является функцией) , которые используются для достижения самого соответствия?
Другими словами, цель состоит в том, чтобы найти значения alpha
и fc
(от которых x
является функцией), которые обеспечивают наилучшее возможное соответствие f_exp
против e_exp
аналогично тому, как решатель EXCEL
находит минимальные квадратные невязки, варьируя alpha
и fc
.
Конечная цель - для построения f_exp
против e_exp
а также подгоночную кривую, используя matplotlib
- я также немного растерялся, как это сделать.
Я прошу прощения заотсутствие более обобщенного примера.