如何将多个常量和变量传递给 Scipy 优化?
How to pass multiple constants and variables to Scipy Optimize?
我正在尝试将模型数据(根据 eR
计算)拟合到我的实验数据 e_exp
。我不太确定如何将常量和变量传递给 func
.
import numpy as np
import math
from scipy.optimize import curve_fit, least_squares, minimize
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])
ezero = np.min(e_exp)
einf = np.max(e_exp)
ig_fc = 500
ig_alpha = 0.35
def CCER(einf, ezero, f_exp, fc, alpha):
x = [np.log(_ / ig_fc) for _ in f_exp]
eR = [ezero + 1/2 * (einf - ezero) * (1 + np.sinh((1 - ig_alpha) * _) / (np.cosh((1 - ig_alpha) * _) + np.sin(1/2 * ig_alpha * math.pi))) for _ in x]
return eR
def func(z):
return np.sum((CCER(z[0], z[1], z[2], z[3], z[4], z[5]) - e_exp) ** 2)
res = minimize(func, (ig_fc, ig_alpha), method='SLSQP')
einf
、ezero
、f_exp
都是常量加上我需要优化的变量是ig_fc
和ig_alpha
,其中ig
代表初始猜测。
我怎样才能完成这项工作?
我也不确定 scipy
中的哪种优化算法最适合我的问题(curve_fit
、least_squares
或 minimize
)。
我相信你想要的是:
def CCER(x, fc, alpha):
y = np.log(x/fc)
eR = ezero + 1/2 * (einf - ezero) * (1 + np.sinh((1 - alpha) * y) / (np.cosh((1 - alpha) * y) + np.sin(1/2 * alpha * math.pi)))
return eR
res = curve_fit(CCER, f_exp, e_exp, p0=(ig_fc, ig_alpha))
您将第一个值作为参数传递给 CCER
,然后将其余两个值(fc
和 alpha
)视为可优化参数。所有固定参数将从外部范围读取 - 无需将它们显式传递给此处的函数。
最后,在 curve_fit
中,您只需要传递一个输入数组 (f_exp
) 和相应的输出 (e_exp
),以及 - 可能 - 一个初始元组猜测 p0
.
我正在尝试将模型数据(根据 eR
计算)拟合到我的实验数据 e_exp
。我不太确定如何将常量和变量传递给 func
.
import numpy as np
import math
from scipy.optimize import curve_fit, least_squares, minimize
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])
ezero = np.min(e_exp)
einf = np.max(e_exp)
ig_fc = 500
ig_alpha = 0.35
def CCER(einf, ezero, f_exp, fc, alpha):
x = [np.log(_ / ig_fc) for _ in f_exp]
eR = [ezero + 1/2 * (einf - ezero) * (1 + np.sinh((1 - ig_alpha) * _) / (np.cosh((1 - ig_alpha) * _) + np.sin(1/2 * ig_alpha * math.pi))) for _ in x]
return eR
def func(z):
return np.sum((CCER(z[0], z[1], z[2], z[3], z[4], z[5]) - e_exp) ** 2)
res = minimize(func, (ig_fc, ig_alpha), method='SLSQP')
einf
、ezero
、f_exp
都是常量加上我需要优化的变量是ig_fc
和ig_alpha
,其中ig
代表初始猜测。
我怎样才能完成这项工作?
我也不确定 scipy
中的哪种优化算法最适合我的问题(curve_fit
、least_squares
或 minimize
)。
我相信你想要的是:
def CCER(x, fc, alpha):
y = np.log(x/fc)
eR = ezero + 1/2 * (einf - ezero) * (1 + np.sinh((1 - alpha) * y) / (np.cosh((1 - alpha) * y) + np.sin(1/2 * alpha * math.pi)))
return eR
res = curve_fit(CCER, f_exp, e_exp, p0=(ig_fc, ig_alpha))
您将第一个值作为参数传递给 CCER
,然后将其余两个值(fc
和 alpha
)视为可优化参数。所有固定参数将从外部范围读取 - 无需将它们显式传递给此处的函数。
最后,在 curve_fit
中,您只需要传递一个输入数组 (f_exp
) 和相应的输出 (e_exp
),以及 - 可能 - 一个初始元组猜测 p0
.