含三个未知参数的Python曲线拟合:求解g(x)的b1、b2、b3
解决方法:定义拟合函数并使用
curve_fit求解参数 步骤1:定义目标拟合函数g(x)
已知参数(f1/f2/f3、a1/a2/a3、c)无需作为拟合参数传入,可直接在函数内部调用(若为全局定义),或通过闭包封装避免全局变量污染。以下是直接调用已知参数的简洁定义:
import numpy as np from scipy.optimize import curve_fit # 预先定义已知参数(示例值) f1=0.3 f2=0.5 f3=0.2 c = 350. a1=1.82 a2=7.32 a3=1.52 # 仅将未知参数b1、b2、b3作为待拟合参数 def g(x, b1, b2, b3): term1 = f1 * a1 * np.exp(-b1 * (x - c)) term2 = f2 * a2 * np.exp(-b2 * (x - c)) term3 = f3 * a3 * np.exp(-b3 * (x - c)) return term1 + term2 + term3
步骤2:生成参考拟合数据f(x)
用已知的a=1.6、b=0.02、c=350生成目标拟合基准数据:
x = np.arange(300., 701., 5.) # 原函数定义 def func(x, a, b, c): return a * np.exp(-b * (x - c)) # 生成无噪声的真实值,也可添加噪声模拟真实数据集 f_true = func(x, a=1.6, b=0.02, c=350) f_noisy = f_true + np.random.normal(0, 0.05, size=len(x))
步骤3:使用curve_fit执行拟合
指数函数拟合对初始值敏感,需给未知参数设置合理初始猜测值(p0),避免陷入局部最优:
# 初始猜测值可参考原函数的b值,或根据数据趋势调整 p0 = [0.02, 0.02, 0.02] # 执行拟合,若参数有物理约束(如必须为正),可添加bounds参数 params, params_cov = curve_fit(g, x, f_noisy, p0=p0, bounds=(0, np.inf)) # 提取拟合结果 b1_fit, b2_fit, b3_fit = params print(f"拟合参数结果:b1={b1_fit:.4f}, b2={b2_fit:.4f}, b3={b3_fit:.4f}")
关键注意事项
- 初始值优化:若拟合收敛失败,可尝试调整
p0的取值范围,比如围绕原函数b值小幅波动。 - 动态参数适配:如果
f1/f2/f3、a1/a2/a3随数据点变化,可将这些参数设为数组,在g(x)中对应计算每个数据点的分项值。
内容的提问来源于stack exchange,提问作者PEBKAC
相关产品推荐
相关产品推荐

