python中曲線擬合:
乙個是numpy中的polyfit()函式,多項式擬合,給定變數x、y、多項式次數,返回值為多項式的一維係數array;
另乙個是scipy的 optimize 模組中的 curve_fit()函式,可由自己定義擬合函式,更通用;給定變數x、y、擬合函式,返回值有兩個,popt是擬合函式中的一維引數array, pcov為擬合函式中引數的 協方差array ;
二者都是基於最小二乘法;
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""@email : [email protected]
@software: pycharm
@desc :
"""import numpy as np
import matplotlib.pyplot as plt
from scipy import optimize
motor_instruct = [
0,20,
40,60,
80,100,
120,
140,
160,
180,
200,
240,
280,
320,
360,
400,
440,
480,
520,
560,
600,
640,
680,
720,
760,
800,
840,
880,
900,
920,
940,
960,
980,
1000,
1020
]angle_40 = [
0,0,
5.4,
10.98,
17.28,
23.4,
29.52,
35.82,
41.58,
47.34,
53.64,
66.06,
78.48,
91.08,
102.78,
115.38,
127.98,
140.04,
151.92,
163.44,
174.78,
187.56,
200.16,
212.76,
225,
238.5,
252.36,
265.5,
272.52,
279.36,
286.56,
292.5,
298.62,
304.92,
306.18
]angle_212_5 = [
0,0,
4.68,
10.08,
15.3,
20.88,
27,33.3,
40.14,
47.52,
54.54,
69.84,
85.14,
100.44,
115.56,
129.96,
144,
155.16,
165.96,
177.48,
190.44,
204.66,
220.32,
236.16,
251.1,
265.68,
278.1,
290.34,
295.56,
300.6,
306,
311.4,
316.62,
321.84,
322.74
]angle_212_15 = [
0,0,
5.4,
11.16,
16.38,
21.96,
27.54,
33.3,
39.78,
46.08,
52.38,
67.68,
83.52,
98.1,
112.68,
126.36,
138.96,
150.3,
161.28,
172.62,
184.68,
198,
212.76,
227.88,
243.54,
259.38,
273.6,
287.82,
293.4,
299.16,
304.92,
309.96,
316.26,
321.48,
322.56
]def poly_fit(x, y, exponential_number=1):
f1 = np.polyfit(x[1:len(x)-1], y[1:len(y)-1], exponential_number)
print('f1 is :\n', f1)
yvals = np.polyval(f1, x[1:len(x)-1])
print('yvals is :\n', yvals)
# 繪圖
plot1 = plt.plot(x[1:len(x)-1], y[1:len(y)-1], 's', label='original values')
plot2 = plt.plot(x[1:len(x)-1], yvals, 'r', label='polyfit values')
plt.xlabel('x')
plt.ylabel('y')
plt.legend(loc=4) # 指定legend的位置右下角
plt.title('polyfitting')
plt.show()
def fit_function(x, a, b):
return [a * i + b for i in x ]
def curve_fit(x, y):
popt, pcov = optimize.curve_fit(fit_function, x[1:len(x)-1], y[1:len(y)-1])
# 獲取popt裡面是擬合係數
print "popt >> ", popt
a = popt[0]
b = popt[1]
print "協方差矩陣 pcov >> ", pcov
yvals = fit_function(x[1:len(x) - 1], a, b)
print('yvals is :\n', yvals)
# 繪圖
plot1 = plt.plot(x[1:len(x) - 1], y[1:len(y) - 1], 's', label='original values')
plot2 = plt.plot(x[1:len(x) - 1], yvals, 'r', label='polyfit values')
plt.xlabel('x')
plt.ylabel('y')
plt.legend(loc=4) # 指定legend的位置右下角
plt.title('curve_fitting')
plt.show()
if __name__=="__main__":
# poly_fit(motor_instruct, angle_212_15)
curve_fit(motor_instruct, angle_212_15)
以上兩個函式可達到同樣目的,都是對資料進行一次函式擬合; Python曲線擬合
z1 np.polyfit x,y,5 用3次多項式擬合 p1 np.poly1d z1 print p1 在螢幕上列印擬合多項式 yvals p1 x 也可以使用yvals np.polyval z1,x plot1 plt.plot x,y,k.markersize 16,label origi...
MATLAB 曲線擬合
x0.1 0.20.15 0.0 0.2 0.3y 0.95 0.84 0.86 1.06 1.50 0.72 函式功能多項式的擬合運算 呼叫方法polyfit x,y,n x為橫座標,y為縱座標,n為擬合階數。例子x 0 0.1 2.5 1y erf x p polyfit x,y,6 p 0.0...
matlab 曲線擬合
在matlab中經常需要對資料進行曲線擬合,如最常見的多項式擬合,一般可以通過cftool呼叫曲線擬合工具 curve fit tool 通過圖形介面可以很方便的進行曲線擬合,但是有些時候也會遇到不方便用圖形工具。因此這裡簡單的記下兩種常用的擬合方法。1 多項式擬合 polyfit和polyval ...