У меня есть куча реальных данных, которые я хочу проанализировать с помощью параболы. Через другую онлайн-справку я получил параболу. Тем не менее, я не думаю, что это выглядит правильно. Я также сделал несколько уравнений, чтобы найти 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()