如何用Python同时对双函数应用最小均方拟合获取参数Rr、Lr、cm
双函数联合最小均方拟合的可行方案
1. 利用scipy.optimize.minimize自定义总损失
不用手动实现完整的最小均方计算逻辑,直接借助scipy.optimize.minimize最小化两个函数的均方误差之和:
- 先定义两个描述垂直轴行为的目标函数
func1和func2 - 编写总损失函数,输入待求参数
[Rr, Lr, cm],分别计算两个函数与仿真数据的均方误差并求和 - 传入初始参数(建议用Excel手动拟合的结果)和仿真数据,调用
minimize求解最优参数
示例代码:
import numpy as np from scipy.optimize import minimize # 替换为你的第一个垂直轴行为公式 def func1(x, Rr, Lr, cm): return ... # 替换为你的第二个垂直轴行为公式 def func2(x, Rr, Lr, cm): return ... def total_loss(params, x, y1_exp, y2_exp): Rr, Lr, cm = params y1_pred = func1(x, Rr, Lr, cm) y2_pred = func2(x, Rr, Lr, cm) mse1 = np.mean((y1_pred - y1_exp)**2) mse2 = np.mean((y2_pred - y2_exp)**2) return mse1 + mse2 # 初始参数(用Excel结果或合理值) initial_guess = [1.0, 0.5, 0.01] # 仿真数据:x为输入变量,y1_exp、y2_exp为对应输出的仿真值 x_data = np.array(...) y1_exp_data = np.array(...) y2_exp_data = np.array(...) result = minimize(total_loss, initial_guess, args=(x_data, y1_exp_data, y2_exp_data)) optimal_Rr, optimal_Lr, optimal_cm = result.x
2. 合并双函数为单向量适配scipy.curve_fit
curve_fit其实支持输出向量的函数,只需将两个函数的输出拼接成一维数组,同时把仿真数据也做对应拼接:
示例代码:
from scipy.optimize import curve_fit def combined_func(x, Rr, Lr, cm): y1 = func1(x, Rr, Lr, cm) y2 = func2(x, Rr, Lr, cm) return np.concatenate([y1, y2]) # 拼接仿真数据 combined_exp = np.concatenate([y1_exp_data, y2_exp_data]) popt, pcov = curve_fit(combined_func, x_data, combined_exp, p0=initial_guess) optimal_Rr, optimal_Lr, optimal_cm = popt
3. 使用lmfit库简化多参数拟合
lmfit针对多参数、多输出拟合做了优化,无需手动拼接损失,直接定义参数和残差函数即可:
示例代码:
from lmfit import Parameters, minimize params = Parameters() params.add('Rr', value=initial_guess[0]) params.add('Lr', value=initial_guess[1]) params.add('cm', value=initial_guess[2]) def residual(params, x, y1_exp, y2_exp): Rr = params['Rr'].value Lr = params['Lr'].value cm = params['cm'].value y1_pred = func1(x, Rr, Lr, cm) y2_pred = func2(x, Rr, Lr, cm) return np.concatenate([y1_pred - y1_exp, y2_pred - y2_exp]) result = minimize(residual, params, args=(x_data, y1_exp_data, y2_exp_data)) optimal_Rr = result.params['Rr'].value optimal_Lr = result.params['Lr'].value optimal_cm = result.params['cm'].value
关键注意事项
- 初始参数选择:务必用Excel手动拟合的结果作为初始值,避免算法陷入局部最优解
- 误差加权:如果两个函数的输出量级差异较大,可在损失函数中对均方误差添加权重,确保两个拟合方向的平衡
内容的提问来源于stack exchange,提问作者David Rura
相关产品推荐
相关产品推荐

