我正在尝试构建一个程序,该程序在给定图形上一堆点的坐标的情况下(大致)找到图形的方程。假定给定的坐标表示图的整体(即:行为在给定的域外不变)。
我使用下面的简单功能来做到这一点:
#x and y are arrays of the x coordinates and corrosponding y coordinates
def get_equation(x,y):
degree = 2
coefs, res, _, _, _ = np.polyfit(x,y,degree, full = True)
ffit = np.poly1d(coefs)
print (ffit)
return ffit
这对于诸如x ^ 2之类的基本方程的图上的坐标相当有效,但对于诸如以下图之类的更复杂的图则根本不起作用。
如何在给定图形坐标的情况下找到更复杂的图形的方程式?
还可以弄清楚图形的程度是什么,还是总是必须手动输入?
答案 0 :(得分:1)
您需要更改多项式的阶数。例如,我创建了一个五阶多项式。
import numpy as np
import matplotlib.pyplot as plt
def SomePoly(k):
a = [9, 1.5, -12.5, -2.5, 3.5, 1]
return sum([a[p]*k**p for p in range(len(a))])
x = np.arange(-3,2, 0.1)
y = SomePoly(x)
plt.plot(x, y)
现在查看每个学位的结果:
for degree in [2,4,5]:
coefs, res, _, _, _ = np.polyfit(x,y,degree, full = True)
print(degree, res)
结果:
2 [947.22023682]
4 [683.734662]
5 [8.70566837e-27]
答案 1 :(得分:1)
如果行为在给定域外没有改变,请查看样条线并将其拟合到该域。这可以通过scipy.interpolate完成。
这是一个例子
from matplotlib.pyplot import subplots
from numpy import linspace, random, sin, cos
from scipy import interpolate
x = linspace(0, 10)
y = sin(x * .5) + cos (x * 2) + random.randn(x.size) * 1e-1
# fit spline
spl = interpolate.InterpolatedUnivariateSpline(x, y)
fitx = linspace(0, x.max(), 100)
fig, ax = subplots()
ax.scatter(x, y)
ax.plot(fitx, spl(fitx))
fig.show()