最小二乘多项式拟合

时间:2018-04-21 18:29:10

标签: python python-3.x

如何使用leastsq拟合此多项式?目的是从实验和分析值中获得优化的图表:

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

x_data是温度,y_data是分析性的,y1_data是实验性的

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 * Tavg

def 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')

我需要找到一个使用leastsq优化的图表,它可以最小化分析值和实验值之间的误差。我在线查看了最少的例子,但我很难理解并将其应用到我的代码中。欢迎任何帮助和见解。

1 个答案:

答案 0 :(得分:-1)

您可以使用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()

你得到这样的东西:

enter image description here

然后,进行拟合(得到近似数据的多项式的系数)和要绘制的数据(评估由你得到的系数给出的多项式):

X = np.arange(0, data.size)

coeff = np.polyfit(X, data, 5)
Y_fitted = np.polyval(coeff, X)

plot(Y_fitted); grid(True); show()

结果如下:

enter image description here

但要看到np.polyfit的力量,我们还需要一个图表:原始数据(橙色)与多项式(蓝色):

enter image description here

正如您所看到的,在这个具体的时间间隔内,多项式非常接近您的数据,并且多项式的次数越高,近似值就越好。