Python - Получить уравнение графика заданных координат - PullRequest
0 голосов
/ 27 октября 2018

Я пытаюсь построить программу, которая находит (приблизительно) уравнение графа, учитывая координаты группы точек на графе. Предполагается, что указанные координаты представляют собой всю диаграмму (т. Е. Поведение не изменяется за пределами данной области).

Я использую простую функцию ниже, чтобы сделать это:

#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, но совсем не работает для более сложных графиков, таких как график ниже.

enter image description here

Как найти уравнение для более сложных графиков, подобных приведенному выше, с учетом координат на графике?

Кроме того, возможно ли выяснить, какова степень графика, или это всегда нужно вводить вручную?

Ответы [ 2 ]

0 голосов
/ 28 октября 2018

Если поведение не изменяется за пределами данного домена, изучите сплайны и подгоните их к домену.Это можно сделать с помощью 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()
0 голосов
/ 27 октября 2018

Вам нужно поменять градус на полином.Например, я создал полином 5-го порядка.

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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...