影象處理九:擬合曲線
阿新 • • 發佈:2019-01-07
一、最小二乘法擬合曲線
import numpy as np import matplotlib.pyplot as plt from scipy.optimize import curve_fit #自定義函式 e指數形式 def func(x, a, b,c): return a*np.sqrt(x)*(b*np.square(x)+c) #定義x、y散點座標 x = [10,20,30,40,50,60,70,80] x = np.array(x) y = [158,455,265,152,263,813,562,126] y = np.array(y) #非線性最小二乘法擬合 popt, pcov = curve_fit(func, x, y) #獲取popt裡面是擬合係數 print(popt) a = popt[0] b = popt[1] c = popt[2] yvals = func(x,a,b,c) #擬合y值 print('popt:', popt) print('係數a:', a) print('係數b:', b) print('係數c:', c) print('係數pcov:', pcov) print('係數yvals:', yvals) #繪圖 plot1 = plt.plot(x, y, 's',label='original values') plot2 = plt.plot(x, yvals, 'r',label='polyfit values') plt.xlabel('x') plt.ylabel('y') plt.legend(loc=4) #指定legend的位置右下角 plt.title('curve_fit') plt.show()
二、高斯分佈擬合曲線
import numpy as np import math import matplotlib.pyplot as plt from scipy.optimize import curve_fit #自定義函式 e指數形式 def func(x, a,u, sig): return a*(np.exp(-(x - u) ** 2 /(2* sig **2))/(math.sqrt(2*math.pi)*sig))*(431+(4750/x)) #定義x、y散點座標 x = [10,20,30,40,50,60,70,80] x=np.array(x) # x = np.array(range(20)) print('x is :\n',x) y = [158,455,265,152,263,813,562,126] y = np.array(y) print('y is :\n',y) popt, pcov = curve_fit(func, x, y,p0=[3.1,4.2,3.3]) #獲取popt裡面是擬合係數 a = popt[0] u = popt[1] sig = popt[2] yvals = func(x,a,u,sig) #擬合y值 print(u'係數a:', a) print(u'係數u:', u) print(u'係數sig:', sig) #繪圖 plot1 = plt.plot(x, y, 's',label='original values') plot2 = plt.plot(x, yvals, 'r',label='polyfit values') plt.xlabel('x') plt.ylabel('y') plt.legend(loc=4) #指定legend的位置右下角 plt.title('curve_fit') plt.show()
三、多項式擬合曲線
import numpy as np import matplotlib.pyplot as plt #定義x、y散點座標 #x = [10,20,30,40,50,60,70,80] #y = [158,455,265,152,263,813,562,126] #x = [16,32,48,64,80,96,112,128,144,160,176,192,208,224,240,256,272,288,304] x = [0,16,32,48,64,80,96,112,128,144,160,176,192,208,224,240,256,272,288,304,320,336,352,368,384,400,416,432,448,464,480,496,] x = np.array(x) #y = [506,506,506,506,506,506,506,506,506,505,505,505,505,505,505,505,506,505,504] y = [340,338,345,348,348,349,50,350,350,350,350,350,350,350,350,350,350,349,348,348,348,347,347,348,348,347,347,347,347,348,347,346] y = np.array(y) #用3次多項式擬合 f1 = np.polyfit(x, y, 3) p1 = np.poly1d(f1) yvals = p1(x)#擬合y值 #x1 = [32,48,64,80,96,112,128,144,160,176,192,208,224,240,256,272,288,304,320] x1 = [16,32,48,64,80,96,112,128,144,160,176,192,208,224,240,256,272,288,304,320,336,352,368,384,400,416,432,448,464,480,496,512] x1 = np.array(x1) #y1 = [529,528,528,529,529,529,529,529,529,529,528,528,528,528,528,528,528,528,529] y1 = [370,367,376,378,378,379,379,380,380,380,379,379,379,379,378,378,378,378,377,376,376,375,375,372,372,372,372,375,375,372,372,373] y1 = np.array(y1) f2 = np.polyfit(x1,y1,3) p2 = np.poly1d(f2) yvals_2 = p2(x1) #也可使用yvals=np.polyval(f1, x) #繪圖 plot1 = plt.plot(x, y, 's',label='original values') plot2 = plt.plot(x, yvals, 'r',label='polyfit values') plt.xlabel('x') plt.ylabel('y') plot3 = plt.plot(x1, y1, 's', label = 'original values') plot4 = plt.plot(x1, yvals_2, 'r',label='',color='green') #plt.axis('off') #plt.legend(loc=4) #指定legend的位置右下角 #plt.title('polyfitting') #plt.show() plt.savefig("F:/a.jpg")