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

Python中如何用SciPy实现可自定义阶数的通用多项式曲线拟合

这个需求完全可以实现,无需绕开SciPy的入参规则,直接用Python的可变参数就能适配curve_fit的要求。

实现方案

你不需要动态生成固定参数名的函数,直接定义接收可变参数的通用多项式目标函数即可:

def poly_objective(x, *coeffs):
    # coeffs 顺序:x^1系数、x^2系数……x^n系数、常数项
    result = 0
    # 遍历前n个系数,对应x的1到n次幂
    for power, coeff in enumerate(coeffs[:-1], start=1):
        result += coeff * (x ** power)
    # 加上最后一位常数项
    result += coeffs[-1]
    return result

curve_fit会自动根据你传入的初始值p0的长度,给目标函数传递对应数量的参数,比如要做5阶多项式拟合,只要传入长度为6的初始值(5个次幂系数+1个常数项)即可,调用示例如下:

import numpy as np
from scipy.optimize import curve_fit

# 模拟测试数据
x = np.linspace(0, 10, 100)
# 真实5阶多项式加噪声:y = 0.1x^5 + 0.5x^4 + 1.5x^3 + 3x^2 + 2x +10
y = 2 * x + 3 * x**2 + 1.5 * x**3 + 0.5 * x**4 + 0.1 * x**5 + 10 + np.random.normal(0, 5, size=x.shape)

# 指定拟合阶数
order = 5
# 生成对应长度的初始值,可根据实际场景调整初始值提高拟合精度
p0 = np.ones(order + 1)
popt, _ = curve_fit(poly_objective, x, y, p0=p0)

# 输出拟合结果,顺序为x^1系数、x^2系数……x^5系数、常数项
print(popt)

更简洁的替代写法

你也可以直接用NumPy内置的polyval方法实现,代码更短,只是系数顺序反过来(从最高次幂到常数项):

def poly_objective_np(x, *coeffs):
    # coeffs 顺序:x^n系数、x^(n-1)系数……x^1系数、常数项
    return np.polyval(coeffs, x)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 23:06:04