最小二乘法曲線擬合

2021-08-14 05:55:57 字數 3013 閱讀 2759

設有如下實驗資料x1

2345

6789

1011

1213

141516y

46.4

88.8

9.22

9.59.7

9.86

1010.2

10.32

10.42

10.5

10.55

10.58

10.60

試用最小二乘法多次(1到5次)多項式曲線擬合以上資料。

import numpy as np

import matplotlib.pyplot as plt

defmain_element_gauss

(a,n):

for i in range(0,n-1):

if(np.max(np.fabs(a[i:,i]))!=np.fabs(a[i,i])): #如果當前係數不是最大值,則列主元

temp_i=int(np.where(np.fabs(a[i:,i])==np.max(np.fabs(a[i:,i])))[0]) #temp_i為最大值所在的行索引

#print(a[temp_i+i,i])

a[[i,temp_i+i],:]=a[[temp_i+i,i],:] #交換

for j in range(i+1,n):

a[j,:]=a[j,:]-a[i,:]*(a[j,i]/a[i,i]) #消元

a[j,i]=0

#print("第%d次消元係數矩陣為:\n"%(i+1),a)

#回代得解

x=np.zeros((n,1))

for i in range(n-1,-1,-1):

temp=0

for j in range(0,n):

temp+=a[i,j]*x[j,0]

x[i,0]=(a[i,n]-temp)/a[i,i]

return x

defcurve_fitting

(x,y,n):

#係數增廣矩陣

a=np.zeros((n,n+1))

for i in range(0,n):

for j in range(0,n):

a[i,j]=np.sum([x**(i+j) for x in x])

a[i,n]=np.sum([(x**i)*y for x,y in zip(x,y)])

result=main_element_gauss(a,n)

#輸出表示式

expression="\n表示式:"+str(float(result[0]))+"+("+str(float(result[1]))+")*x"

for i in range(2,n):

expression=expression+"+("+str(float(result[i]))+")*(x**"+str(i)+")"

print(expression)

#繪圖#在最小值至最大值區間取1000點

x_temp=np.linspace(np.min(x),np.max(x),1000,endpoint=true)

y_temp=

for x in x_temp:

temp_result=0.0

for i in range(0,n):

temp_result=temp_result+result[i]*(x**i)

plt.title("curve_fitting")

plt.plot(x,y,'s',label="original values")#藍點表示原來的值

plt.plot(x_temp,y_temp,'r',label='fitting values')#擬合曲線

plt.xlabel('x')

plt.ylabel('y')

plt.legend(loc=4)#指定legend的位置右下角

plt.show()

defmain

(): x=[float(i) for i in (input("請輸入x的對應值:").split())]

y=[float(i) for i in (input("請輸入y的對應值:").split())]

n=int(input("請選擇幾次多項式曲線擬合:"))

curve_fitting(x,y,n+1)

'''numpy 自帶的多項式擬合

f1 = np.polyfit(x, y, n)

p1 = np.poly1d(f1)

print(p1)

'''if __name__=='__main__':

main()

一次多項式曲線擬合

二次多項式曲線擬合

三次多項式曲線擬合

四次多項式曲線擬合

五次多項式曲線擬合

深入理解了最小二乘的原理,即擬合的點與實際點的距離的絕對值和最小,也就是說是盡可能的過更多點。

對於bug的除錯能力更進一步,之前的列主元高斯消元法在那個實驗沒發生錯誤,而在這個實驗當我直接來拿用時,在1次和2次擬合時沒出現問題,但是高次的時候就出現問題了,所以有時候不僅僅滿足實驗所布置的任務,往往會收穫的更多。

通過上面的結果圖,輕而易舉的就可以發現當擬合的次數越高時,其越準確。

最小二乘法曲線擬合

在實際工程中,我們常會遇到這種問題 已知一組點的橫縱座標,需要繪製出一條盡可能逼近這些點的曲線 或直線 以進行進一步進行加工或者分析兩個變數之間的相互關係。而獲取這個曲線方程的過程就是曲線擬合。首先,我們從曲線擬合的最簡單情況 直線擬合來引入問題。如果待擬合點集近似排列在一條直線上時,我們可以設直線...

最小二乘法的曲線擬合

最小二乘法的曲線擬合 bool cdatadistillview leastdoublemultiplication long px,long py,long m,long n,double result,double warp for i 0 i m i z 0 b 0 1 d1 n p 0 c ...

(C )曲線擬合的最小二乘法

using system using system.collections.generic using system.linq using system.text namespace 數值分析實驗報告 region 曲線擬合的最小二乘法 private static void imput conso...