Edited at

pythonで近似式の計算

More than 1 year has passed since last update.


近似式の計算


numpyによる方法


polyfit

import numpy as np

np.polyfitを利用

np.polyfit(x,y,1)で1次近似,1を変えることで,次数を変えた計算ができる。

np.poly1d(np.polyfit(x, y, 1))で関数が生成される。

np.poly1d(np.polyfit(x, y, 1))(引数)で引数による数値が計算される。


import numpy as np
from matplotlib import pyplot as plt

x= np.linspace(-10,10,20)
y= x**3 + 2*x**2 + 3*x + 10+ np.random.randn(20)*50

#近似式の係数
res1=np.polyfit(x, y, 1)
res2=np.polyfit(x, y, 2)
res3=np.polyfit(x, y, 3)
#近似式の計算
y1 = np.poly1d(res1)(x) #1次
y2 = np.poly1d(res2)(x) #2次
y3 = np.poly1d(res3)(x) #3次

#グラフ表示
plt.scatter(x, y, label='元データ')
plt.plot(x, y1, label='1次')
plt.plot(x, y2, label='2次')
plt.plot(x, y3, label='3次')
plt.legend()
plt.show()


計算結果

3ji.png


scipyによる方法


leastsqによる近似

from scipy import optimize

関数を定義して,optimize.leastsq(func1, param1, args=(x, y))で係数を求める。


from scipy import optimize

# 1次式の近似
def func1(param,x,y):
residual = y - (param[0]*x + param[1])
return residual
param1 = [0, 0]
res_leas1 = optimize.leastsq(func1, param1, args=(x, y))#係数
# 2次式の近似
def func2(param,x,y):
residual = y - (param[0]*x**2 + param[1]*x + param[2])
return residual
param2 = [0, 0, 0]
res_leas2 = optimize.leastsq(func2, param2, args=(x, y))

# 3次式の近似
def func3(param,x,y):
residual = y - (param[0]*x**3 + param[1]*x**2 + param[2]*x + param[3])
return residual
param3 = [0, 0, 0, 0]
res_leas3 = optimize.leastsq(func3, param3, args=(x, y))


curve_fitによる近似

from scipy import optimize

関数を定義して,optimize.curve_fit(func_c1, x, y)で係数を求める。


from scipy import optimize

# 1次式の近似
def func_c1(x, a, b):
return a*x + b
res_c1 = optimize.curve_fit(func_c1, x, y)#係数

# 2次式の近似
def func_c2(x, a, b, c):
return a*x**2 + b*x + c
res_c2 = optimize.curve_fit(func_c2, x, y)

# 3次式の近似
def func_c3(x, a, b, c, d):
return a*x**3 + b*x**2 + c*x +d
res_c3 = optimize.curve_fit(func_c3, x, y)