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

如何拟合系数受约束的多项式?基于NumPy polyfit的技术问询

带约束系数的多项式拟合:无需从头实现!

当然不用自己从头写拟合逻辑啦!利用NumPy的线性代数工具,我们可以轻松改造常规的多项式拟合问题,实现对特定系数的约束。针对你提出的例子,我给你一步步演示:

问题回顾

常规三次多项式拟合的代码是这样的:

import numpy as np

x = np.array([0.0, 1.0, 2.0, 3.0, 4.0, 5.0])
y = np.array([0.0, 0.8, 0.9, 0.1, -0.8, -1.0])
z = np.polyfit(x, y, 3)
# 输出:array([ 0.08703704, -0.81349206, 1.69312169, -0.03968254])

这里z对应的多项式是:$y = z[0]x^3 + z[1]x^2 + z[2]x + z[3]$。现在要求z[2](也就是x的一次项系数)固定为1,我们可以通过问题转化来实现。

核心思路:将约束项移至目标侧

我们把约束条件代入原多项式:
$$y = a x^3 + b x^2 + 1 \cdot x + d$$
将含约束系数的项移到等式左边,得到:
$$y - x = a x^3 + b x^2 + d$$
此时右边是关于$a, b, d$的线性组合,完全可以用普通的最小二乘法求解!

具体实现代码

import numpy as np

# 原始数据
x = np.array([0.0, 1.0, 2.0, 3.0, 4.0, 5.0])
y = np.array([0.0, 0.8, 0.9, 0.1, -0.8, -1.0])

# 处理约束:将x的一次项移到左边,得到新的目标变量
y_new = y - x

# 构造设计矩阵:对应x³、x²、常数项(x^0)
X = np.column_stack([x**3, x**2, np.ones_like(x)])

# 用最小二乘法求解剩余系数
coeffs, _, _, _ = np.linalg.lstsq(X, y_new, rcond=None)

# 组合完整的多项式系数:[a, b, 1, d]
full_coeffs = np.insert(coeffs, 2, 1.0)

print("带约束的拟合系数:", full_coeffs)

运行后你会得到满足约束的最佳拟合系数,这个结果和直接求解带约束的最小二乘问题完全一致。

拓展:其他约束场景

这个方法适用于任何固定单个(或多个)系数的情况:

  • 如果要约束常数项($z[3]$)为0,只需构造目标变量为y,设计矩阵为np.column_stack([x**3, x**2, x]),直接用lstsq求解即可。
  • 如果有多个系数约束,比如同时固定$z[1]=0$和$z[2]=1$,同样把这些项移到左边,剩下的项组成设计矩阵求解。

这样既利用了NumPy高效的内置实现,又不用自己从头推导拟合逻辑,非常方便!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:40:25