我想对实验数据集拟合曲线,但我真的不知道该怎么做。我一直在寻找可能性,遇到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
是其函数),以提供最适合{{ 1}}与f_exp
的方式类似,e_exp
求解器通过改变EXCEL
和alpha
来找到最小平方残差。
最终目标是绘制fc
与f_exp
以及使用e_exp
的拟合曲线-我对如何为此。
对于缺少一个更通用的示例,我深表歉意。
答案 0 :(得分:1)
如果我正确理解了您的示例,我认为您只需将函数定义更改为
def c_c_eRI(x, einf, ezero, alpha):
...
从curve_fit docs:The model function, f(x, …). It must take the independent variable as the first argument and the parameters to fit as separate remaining arguments.