Борьба с созданием и использованием линии тренда параболы - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть куча реальных данных, которые я хочу проанализировать с помощью параболы. Через другую онлайн-справку я получил параболу. Тем не менее, я не думаю, что это выглядит правильно. Я также сделал несколько уравнений, чтобы найти A, B и C для уравнения, которое, я считаю, я сделал правильно. Когда я go подключаю свои выводы к онлайн-графику, графики не совпадают. Я застрял на этом так долго, и я даже не знаю, в чем проблема, но что-то не так.

  • Уравнение параболы может быть неправильным
  • Мой искатель уравнений может быть неправым

...

import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
def func(x,x0,a,b,c):
    return  a*(x-x0)**2+b*(x-x0)+c
x = np.array([9.18,  8.2,   8.3,   7.32,  8.38,  8.23,  7.13,  8.49,  7.25,  7.26,  7.24,  7.42,
  6.9,   7.47,  6.9,   8.3,   8.2,   8.57,  6.97,  7.12,  8.69, 6.87,  6.95,  8.33,
  6.32,  7.49,  7.37,  8.15,  9.76,  7.5,  7.9,   8.56,  7.27,  6.89,  8.09,  7.83,
  7.08,  9.09,  9.15,  6.51,  8.91,  9.01,  7.79,  6.95,  8.66,  8.49,  6.77,  8.21,
  6.78,  5.92,  7.38,  7.77,  7.72,  7.67,  5.99,  7.05,  7.03,  8.21,  7.25,  7.37,
  7.14,  5.95,  5.47,  6.43,  9.72,  7.53,  6.48,  8.71,  5.88,  6.47,  6.62,  5.71,
  7.81,  5.18,  4.96,  5.33,  4.79,  8.52,  4.83,  8.69,  9.04,  6.38,  4.68,  5.85,
  4.86,  5.19,  5.91,  8.58,  5.06,  5.3,   4.72,  8.2,   8.68,  8.3,   5.6,   4.81,
  6.04,  6.13,  6.72,  5.46,  4.67,  5.04,  8.32,  7.21,  6.63,  4.49,  8.44,  4.4,
  5.06,  6.39,  4.74,  6.48,  4.9,   5.00,  9.51,  4.54,  4.93,  6.49,  4.39,  4.2,
  5.38,  8.81,  4.25,  4.66,  7.85,  4.17,  7.03,  6.38,  4.47,  5.38,  5.00,  7.49,
  7.84,  5.27,  4.78,  4.9,  10.22,  4.35,  7.27,  4.8,   4.46,  5.45,  7.85, 10.66,
  6.13,  8.00,  5.02,  5.7,   6.54,  4.52,  7.69,  5.43,  4.36,  3.74,  5.73,  5.49,
  3.65,  3.49,  8.1,   3.25,  3.12,  8.72,  7.82,  6.09,  3.29,  4.42, 10.45,  4.73,
  4.66,  3.25,  6.42,  3.14,  5.49,  6.6,   2.19,  5.05,  1.86,  1.77,  1.86,  2.02,
  5.26,  3.35,  1.75,  1.61,  1.6,   1.31,  1.27,  0.92,  0.68,  0.04,])
y = np.array([88.2,  90.7,  89.85, 84.99, 88.87, 89.38, 93.47, 87.7,  92.13, 91.67, 91.41, 90.43,
 92.66, 89.84, 92.19, 86.55, 86.8,  85.66, 91.12, 90.18, 85.00, 91.27, 90.83, 85.88,
 93.77, 88.33, 88.55, 85.34, 81.61, 87.23, 85.95, 84.12, 87.91, 89.38, 85.25, 85.96,
 88.43, 82.63, 82.27, 90.38, 82.7,  82.4,  85.34, 88.05, 82.87, 83.18, 88.34, 83.6,
 87.88, 91.94, 85.49, 84.33, 84.46, 84.29, 90.57, 85.69, 85.72, 82.41, 84.78, 84.27,
 84.69, 89.00, 91.49, 86.69, 78.24, 82.84, 86.07, 80.09, 88.32, 85.85, 85.31, 88.79,
 81.72, 91.7,  93.13, 90.74, 94.1,  79.83, 93.35, 79.38, 78.52, 85.37, 94.26, 87.34,
 92.82, 90.66, 86.93, 79.31, 91.28, 89.75, 93.34, 79.93, 78.79, 79.63, 87.77, 92.17,
 85.64, 85.33, 83.31, 87.85, 92.07, 89.39, 78.52, 81.15, 82.76, 92.71, 78.15, 93.19,
 88.78, 83.31, 90.34, 82.7,  89.19, 88.18, 75.43, 90.73, 88.23, 81.99, 91.41, 92.45,
 85.27, 75.91, 91.58, 88.75, 77.62, 91.69, 79.67, 81.38, 89.43, 84.64, 86.29, 78.07,
 77.14, 84.6,  86.79, 86.11, 72.85, 88.96, 77.91, 86.08, 87.31, 82.82, 75.88, 71.48,
 79.95, 75.14, 83.48, 80.94, 78.28, 85.52, 75.43, 81.45, 85.94, 89.94, 80.39, 81.02,
 89.86, 91.07, 73.73, 92.62, 93.52, 72.41, 73.86, 77.83, 90.75, 83.31, 69.96, 81.85,
 82.11, 90.50, 75.88, 88.89, 74.97, 71.63, 92.3,  72.89, 93.08, 93.67, 91.71, 88.93,
 71.30, 77.02, 91.06, 93.35, 93.25, 93.71, 93.78, 94.93, 94.59, 79.81,])

popt, pcov = curve_fit(func, x, y)
plt.plot(x, y, '.')
parY = func(x, * popt)
x.sort()

print(parY[-2])
print(parY[-1])
print(parY[0])
print(parY[1])
print(parY[2])

b = (parY[1] - parY[-1]) / 2 
a = ((parY[-2] - parY[1]) - ((b * -2) - b)) / 3
c = parY[1] - (a + b)
print("A = ", a)
print("B = ", b)
print("C = ", c)
plt.plot(x, func(x, * popt), 'r')
plt.show()
...