You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

含三个未知参数的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 05:20:24