設有如下實驗資料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...