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

已知函数f(x)形式与多组(x,f(x))样本 求解未知参数a/b/c的方法

参数求解可行方案

你考虑用线性回归的思路是可落地的,但原式存在参数的非线性耦合,不能直接套无约束普通线性回归,具体有两类成熟实现路径:

方案1:变量转换为带约束线性最小二乘(计算效率最高)

先把原式做代数展开,平方项拆开后形式如下:

f(x) = a·cos(x) + b²·x + 2bc·(√x · tg(x)) + c²·tg²(x)

展开后式子对中间参数是完全线性的,先做特征变换和参数替换:

  • 对每组样本的输入x,计算4个线性特征:
    • feat1 = cos(x),对应系数 β1 = a
    • feat2 = x,对应系数 β2 = b²
    • feat3 = sqrt(x) * tg(x),对应系数 β3 = 2bc
    • feat4 = tg(x)**2,对应系数 β4 = c²
      此时问题转化为带约束的线性最小二乘问题,优化目标是最小化所有样本的预测值与真实f(x)的残差平方和,约束条件共3个:

β2 ≥ 0
β4 ≥ 0
β3² = 4 * β2 * β4

求解得到β1~β4后,直接反推原始参数即可:

  • a = β1
  • b = √β2 (如果业务场景明确b为负,可对结果取负,无特殊要求默认取正)
  • c = β3 / (2*b) (约束满足时,该值和√β4完全相等)

实现时直接调用数值计算库自带的带约束最小二乘接口即可,不需要手写优化逻辑,求解速度快,对千级以上样本量的适配性很好。

方案2:直接非线性最小二乘(代码逻辑最直观)

如果不想做特征转换和约束配置,直接把a、b、c三个原始参数作为待优化变量,定义损失为所有样本的预测残差平方和:

loss = sum( (a*cos(x_i) + (b*sqrt(x_i) + c*tg(x_i))**2 - f_true_i)**2 )

用高斯-牛顿法、L-BFGS这类通用非线性优化算法直接迭代求解即可。

这个方案不需要做额外的代数转换,代码写起来非常直白;缺点是对初始值有一定敏感度,初次求解可以给a、b、c都设初值为1,如果收敛后残差过大,换几组随机初值重跑,挑残差最小的结果即可。

落地注意事项

  • 提前清洗数据中x=π/2 + kπ的样本,这类点tg(x)无定义,会导致计算报错
  • 如果有效样本量少于5组,建议在损失里加L2正则项避免过拟合;样本量≥10时普通最小二乘的结果就足够稳定
  • 求解完成后可以抽20%左右的样本做校验,确认预测误差在业务可接受范围内即可

内容的提问来源于stack exchange,提问作者Graviada

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 07:12:26