Полиномиальная аппроксимация наименьших квадратов

Villa Sega спросил: 28 марта 2018 в 04:49 в: python

Как подобрать этот многочлен с наименьшим значением q? Цель состоит в том, чтобы получить график, оптимизированный из экспериментальных и аналитических значений:

from scipy.integrate import quad
import pylab as py
import numpy as np

x_data=[329.74403, 329.21733, 328.73927, 328.25111, 327.75969, 327.26852, 
326.7746,326.28142, 325.78471,325.28635,324.78976]
y_data=[]
y1_data=[1.55e-06, 1.82e-06, 1.93e-06, 1.17e-06, 1.93e-06, 1.79e-06, 1.31e- 
06, 1.75e-06,1.68e-06,1.39e-06, 1.69e-06]Tavg = sum(x_data)/len(x_data)
B=0.33
m0 = 1.0
st = 0.1 * Tavgdef p(Tc):
    return 1.0/(np.sqrt(2.0*np.pi)*st)*np.exp(-((Tc- 
    Tavg)**2.0)/(2.0*st**2.0))def F(Tc, Ti):
    if (Tc-Ti) <0:
       return 0
    else:
       return ((Tc-Ti)/Tc)**B*p(Tc)
def M(t):
    for Ti in x_data:
       k = quad(F, 0.0, 2000.0, args=(Ti,))[0]
       y_data.append(k*m0)#graph of temperature vs analytical is done here
def plt():
    py.xlabel('Temperature')
    py.ylabel('Magnetisation')
    py.plot(x_data,y_data)
    py.savefig('graf.png')

Мне нужно найти оптимизированный график используя минимум, что минимизирует ошибку между аналитическим и экспериментальным значением. Я посмотрел онлайн для примеров с наименьшим количеством примеров, но мне было трудно понять и применить его к моему коду. Любая помощь и понимание приветствуются.

1 ответ

ForceBru ответил: 28 марта 2018 в 05:44

Вы можете использовать numpy.polyfit для подгонки и numpy.polyval для получения данных для построения.

coefficients = numpy.polyfit(x_data, y_data, degree)fitted_data = numpy.polyval(coefficients, x_data)

Пример использования

Создайте и нанесите несколько случайных данных, которые выглядят как данные о ценах на акции:

from pylab import *data = 10 + np.cumsum(np.random.normal(0.1, 0.1, size=100))
plot(data); grid(True); show()

Вы получите что-то вроде этого:

вы выбираете данные, которые дают (и вы получаете) коэффициенты, которые вы получили):
X = np.arange(0, data.size)coeff = np.polyfit(X, data, 5)
Y_fitted = np.polyval(coeff, X)plot(Y_fitted); grid(True); show()

Результат выглядит следующим образом:

Но чтобы увидеть всю мощь np.polyfit, нам нужен еще один график: исходные данные (оранжевый) против полинома (синий):

Как вы можете видеть, на этом конкретном интервале полином достаточно хорошо аппроксимирует ваши данные, и чем выше степень полинома, тем лучше аппроксимация.

ForceBru ответил: 28 марта 2018 в 05:30
Подожди, почему понизился? Пожалуйста, объясни.
Villa Sega ответил: 29 марта 2018 в 07:12
Имеет ли степень в функции коэффициента какое-либо значение? а какой смысл использовать для подгонки данных? Честно говоря, я бы предпочел, чтобы вы использовали функцию leastsq, но все равно спасибо за ваш вклад в curve_fit. Однако Curve_fit, похоже, не работает для меня, поскольку график теоретически должен идти вниз, но на вашем рисунке он идет вверх.
ForceBru ответил: 29 марта 2018 в 04:17
@VillaSega, я ничего не сказал о curve_fit, о чем ты говоришь? Я использовал случайные данные для графика, так что он может идти вверх или вниз для вас, и это совершенно нормально. Степень имеет большое значение: чем выше степень, тем лучше приближение. Вы сказали, что вам нужен график аппроксимации, поэтому для этого вы должны вычислить значение полинома для всех точек в X, что и делает np.polyval. Кроме того, этот метод уже использует наименьшие квадраты автоматически.