找到多项式曲线之间交点的有效方法?

时间:2013-10-20 01:08:08

标签: python numpy

np.polyfit()的拟合返回了几个多项式表达式。然后,我用matplotlib绘制多项式曲线:

y_fit = np.arange(min(y), max(y), .1) # use more points for a smoother plot
x_fit = p[0](y_fit)
axes.plot(x_fit, y_fit, '-', color='green')

我得到的是这个

Polynomial Curves

它们实际上是一个段落的边界。 我希望在绿色闭合多边形内看到一个封闭的蓝色多边形。使用人工智能,很清楚如何将它们相交并删除多余的部分。

尝试过的一种简单而残酷的方法是用fsolve()求解成对耦合的非线性方程。 然而,这是不可行的,因为我有很多多项式曲线,因此成对求解它们太昂贵了。而且,很明显并非所有交叉点都很重要。 (有些交叉点甚至没有意义!)

所以我可以这样做(关键交叉点有效

1 个答案:

答案 0 :(得分:2)

您可以通过查找根来找到多项式曲线的交点:

import numpy as np

# fake data
x = np.linspace(0, 4, 20)
y1 = np.cos(x)
y2 = np.sin(x)

# polynomial fits
p1 = np.polynomial.Polynomial.fit(x, y1, 3)
p2 = np.polynomial.Polynomial.fit(x, y2, 3)

# find roots
x_0 = (p1 - p2).roots()
print(x_0)

# select roots in specific range only
x_0 = x_0[(x_0 > 0) & (x_0 < 4)]

# plot
xx = np.linspace(0, 4, 2000)

import matplotlib.pyplot as plt
plt.plot(x, y1, 'b.', x, y2, 'g.')
plt.plot(xx, p1(xx), xx, p2(xx))
plt.plot(x_0, p1(x_0), 'ko')
plt.show()

对于通过np.polyfit获得的多项式,请使用np.roots