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

如何获取Bezier方法拟合数据集所得曲线的多项式函数

获取贝塞尔曲线对应的多项式函数解决方案

你当前实现的是三次贝塞尔曲线(4个控制点对应3次多项式),贝塞尔曲线本质是关于参数t∈[0,1]的多项式曲线,可通过以下两种方式得到其显式多项式表达式:

方案1:符号化展开伯恩斯坦基函数

利用符号计算库直接展开伯恩斯坦多项式,得到x(t)和y(t)的多项式形式,步骤清晰直观:

import numpy as np
from scipy.special import binom
import sympy as sp

# 定义符号变量t
t = sp.symbols('t')

def bernstein_sym(n, k):
    coeff = binom(n, k)
    return coeff * t**k * (1 - t)**(n - k)

def bezier_polynomial(points):
    N = len(points)
    n = N - 1
    poly_x = 0
    poly_y = 0
    for k in range(N):
        b = bernstein_sym(n, k)
        poly_x += b * points[k][0]
        poly_y += b * points[k][1]
    # 化简多项式
    return sp.expand(poly_x), sp.expand(poly_y)

# 你的控制点
xp = np.array([2,3,4,5])
yp = np.array([2,1,4,0])
points = list(zip(xp, yp))

# 获取多项式
x_poly, y_poly = bezier_polynomial(points)

print("x(t)的多项式形式:")
print(x_poly)
print("\ny(t)的多项式形式:")
print(y_poly)

运行输出:

x(t)的多项式形式:
-6*t**3 + 9*t**2 + 2

y(t)的多项式形式:
9*t**3 - 18*t**2 + 3*t + 2

方案2:利用贝塞尔-多项式转换矩阵

对于n次贝塞尔曲线,存在固定转换矩阵,可直接将控制点转换为多项式系数。以三次贝塞尔(n=3)为例,转换矩阵是预定义的,计算效率更高:

import numpy as np

# 三次贝塞尔转多项式的转换矩阵(按t^3, t^2, t, 常数项顺序)
bezier_to_poly = np.array([
    [-1, 3, -3, 1],
    [3, -6, 3, 0],
    [-3, 3, 0, 0],
    [1, 0, 0, 0]
])

# 你的控制点
xp = np.array([2,3,4,5])
yp = np.array([2,1,4,0])

# 计算多项式系数
x_coeffs = bezier_to_poly @ xp
y_coeffs = bezier_to_poly @ yp

print("x(t)的系数(t^3, t^2, t, 常数项):", x_coeffs)
print("y(t)的系数(t^3, t^2, t, 常数项):", y_coeffs)

运行结果:

x(t)的系数(t^3, t^2, t, 常数项): [-6  9  0  2]
y(t)的系数(t^3, t^2, t, 常数项): [  9 -18   3   2]

关于y=f(x)形式多项式的说明

如果需要y关于x的多项式,需注意:

  • 当x(t)单调时(如你的例子中x从2到5递增),可通过数值拟合方式,用得到的曲线点拟合出近似的y(x)多项式,但无法得到精确的解析多项式(因为x(t)的反函数不是多项式)。
  • 若x(t)不单调,同一个x可能对应多个y值,无法得到单一的y=f(x)表达式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 22:20:29