Python - 从转折点坐标生成多项式
Posted
技术标签:
【中文标题】Python - 从转折点坐标生成多项式【英文标题】:Python - Generate polynomial from turning point coordinates 【发布时间】:2020-10-21 00:51:15 【问题描述】:Diagram
使用多项式转折点的坐标列表,我试图找到多项式的系数列表。上图以图形方式显示了我正在尝试解决的问题。
我尝试使用numpy.polyfit
来生成多项式,但是给出的多项式在任何地方都经过这些点,而不是专门在转折点。
是否存在可以做到这一点的函数?
如果没有这样的函数,我正在考虑的一种方法是整合 (x-turningX[0])(x-turningX[1])(x-turningX[n])
以找到多项式,但我不确定如何在 python 中解决这个问题。
【问题讨论】:
“给定的多项式在任何地方都经过这些点”到底是什么意思?你不希望它通过积分吗?请将您的代码作为minimal reproducible example 编辑到您的问题中,并将输出“拟合”曲线的图像添加到提供给numpy.polyfit()
的数据上。还请提供使用的数据 - 这样我就可以将代码粘贴到文件中,将数据粘贴到另一个文件(或包含在代码中)并运行它而不添加任何内容以查看与您获得的相同结果。
您可以像Using matplotlib to “smoothen” a line with very few points 一样通过您的点绘制贝塞尔曲线。一个普通的 polyfit 可以非常剧烈地振荡。只有由多条接触曲线组成的曲线才能具有受控行为。单个多项式无法在数学上完成您的要求。
@JohanC 谢谢你,这正是我需要的东西!
@JohanC,当然,单个多项式可以完成所要求的。如果度数足够高,单个多项式可以拟合一头大象。 :)
@damoys,您真的需要多项式,还是只需要通过转折点的平滑曲线?
【参考方案1】:
您可以使用scipy.interpolate.CubicHermiteSpline
创建这样的曲线,方法是为dydx
参数提供一个零数组。比如这段代码
In [60]: import numpy as np
In [61]: from scipy.interpolate import CubicHermiteSpline
In [62]: x = np.array([1, 2.5, 4.5, 6, 7]) # x coordinates of turning points
In [63]: y = np.array([1, 3, 2, 3.5, 2.5]) # y coordinates of turning points
In [64]: p = CubicHermiteSpline(x=x, y=y, dydx=np.zeros_like(y)) # interpolator
In [65]: plot(x, y, 'o')
Out[65]: [<matplotlib.lines.Line2D at 0xa2f1aef90>]
In [66]: xx = np.linspace(0.9, 7.1, 1000)
In [67]: plot(xx, p(xx))
Out[67]: [<matplotlib.lines.Line2D at 0xa287fb9d0>]
生成此图:
【讨论】:
以上是关于Python - 从转折点坐标生成多项式的主要内容,如果未能解决你的问题,请参考以下文章
怎样用origin7.5 由已知的一些点做出一条折线图,求解折线图转折点的坐标值(未知)?
#yyds干货盘点# 3. 无转折不编程,滚雪球学 Python