已知x与f(x)取值时如何借助Python包求解三次函数未知系数
三次函数未知系数的Python求解方案
完全可以通过Python实现三次函数的系数反求,这个问题本质是线性方程组求解/多项式拟合问题,和已知系数求方程根是完全不同的两类问题,用numpy这类常规科学计算库就能快速实现,不需要复杂的专用工具。
核心原理
三次函数的形式为 f(x) = ax³ + bx² + cx + d,对于每一组已知的观测值$(x_i, f(x_i))$,代入公式就能得到一个关于未知数a、b、c、d的线性方程:a*x_i³ + b*x_i² + c*x_i + d = f(x_i)
只要累计的方程数量≥4,就可以通过求解得到系数值:
- 若刚好有4组无误差的精确观测值,可直接求解线性方程组得到唯一精确解
- 若有超过4组带测量误差的观测值,可通过最小二乘拟合得到最优的系数估计值
实现方法
场景1:4组无误差精确数据
使用numpy的线性代数求解器直接解线性方程组即可,示例代码如下:
import numpy as np # 替换为你自己的4组x、f(x)对应取值 x = np.array([0, 1, 2, 3]) y = np.array([4, 10, 26, 58]) # 示例数据对应真实系数a=1,b=2,c=3,d=4 # 构造线性方程组的系数矩阵 coef_matrix = np.vstack([x**3, x**2, x, np.ones(len(x))]).T # 求解方程组 a, b, c, d = np.linalg.solve(coef_matrix, y) print(f"求解结果:a={a}, b={b}, c={c}, d={d}")
场景2:≥4组带误差的多组数据
课程项目中采集的真实数据一般都带测量误差,这时候直接用numpy内置的多项式拟合函数polyfit做最小二乘拟合即可,鲁棒性更强,示例代码如下:
import numpy as np # 替换为你自己的多组x、f(x)对应取值,数据量≥4即可 x = np.array([0, 0.5, 1, 1.5, 2, 2.5, 3]) # 示例数据为真实值加小幅度随机噪声,模拟真实测量场景 y = x**3 + 2*x**2 + 3*x + 4 + np.random.normal(0, 0.1, size=len(x)) # 三次多项式拟合,deg参数指定多项式最高次为3 a, b, c, d = np.polyfit(x, y, deg=3) print(f"拟合得到的系数:a={a:.4f}, b={b:.4f}, c={c:.4f}, d={d:.4f}")
注意事项
- 如果你的数据中存在重复x值、或者x取值存在共线性问题,
np.linalg.solve会抛出运算错误,这种场景下无论数据是否精确,都建议优先用np.polyfit计算 - 如果需要输出系数的置信区间、做更复杂的拟合误差分析,可以使用scipy库的
scipy.optimize.curve_fit接口,调用逻辑和polyfit类似,支持自定义拟合的约束条件
内容的提问来源于stack exchange,提问作者user032020
相关产品推荐
相关产品推荐

