我找到了满足我的criterea的解决方案 . 解决方案是首先找到近似于最小二乘意义的点的B样条,然后将该样条转换为多段贝塞尔曲线 . B样条确实具有以下优点:与贝塞尔曲线相比,它们不会通过控制点提供一种指定近似曲线的所需"smoothness"的方法 . 生成这样的样条线所需的功能在FITPACK库中实现,scipy为其提供了python绑定 . 让我假设我将我的数据读入列表 x 和 y ,然后我可以这样做:
import matplotlib.pyplot as plt
import numpy as np
from scipy import interpolate
tck,u = interpolate.splprep([x,y],s=3)
unew = np.arange(0,1.01,0.01)
out = interpolate.splev(unew,tck)
plt.figure()
plt.plot(x,y,out[0],out[1])
plt.show()
结果如下所示:
如果我希望曲线更平滑,那么我可以将 s 参数增加到 splprep . 如果我希望近似值更接近数据,我可以减少 s 参数,以减少平滑度 . 通过以编程方式查看多个 s 参数,我可以找到符合给定要求的良好参数 .
但问题是如何将该结果转换为贝塞尔曲线 . Zachary Pincus