python函数拟合
- 背景
最近在抖音直播數學答疑的時候,恰好有一位朋友問到了這個問題,已知x,z,y三列數據如上圖所示,請問y的最后一位數是多少?
乍一看,還以為很簡單,拎(掄)起粉筆就一頓操作(猛如虎)
(1)分別將x,z,y三列數據記作3個數列{xn},{zn}\{x_n\}, \{z_n\}{xn?},{zn?} 和 {yn}\{y_n\}{yn?}, 其中n表示其所在數列的序號或位置。
(2)很容易發現如下規律
zn?xn=6(1)z_n-x_n=6 \tag{1}zn??xn?=6(1)
和
xn+yn=xn+1(2)x_n+y_n=x_{n+1} \tag{2}xn?+yn?=xn+1?(2)
以及
zn+yn=zn+1(3)z_n+y_n=z_{n+1} \tag{3}zn?+yn?=zn+1?(3)
將(2)和(3)組合一下便得到(1),即
zn?xn=zn+1?xn+1=6(4)z_n-x_n=z_{n+1}-x_{n+1} =6 \tag{4}zn??xn?=zn+1??xn+1?=6(4)
而問題相當于是要求{yn}\{y_n\}{yn?}的下一個yn+1y_{n+1}yn+1?,上面3個關系式中卻沒有任何項涉及到,故這些關系不能解決根本問題,現在擺在我們面前的有兩條路
- 找出數列 {xn}\{x_n\}{xn?} ,{zn}\{z_n\}{zn?} 的下一項 m 和 m+6,然后利用(1)-(4)的關系進行求解yny_{n}yn? 下一項 λ\lambdaλ;
| x | -5 | 5 | 0 | 2 | 9 | 6 | 4 | 10 | m |
| z | 1 | 11 | 6 | 8 | 15 | 12 | 10 | 16 | m+6 |
| y | 10 | -5 | 2 | 7 | -3 | -2 | 6 | λ\lambdaλ |
- 直接找出 {yn}和{xn},{zn}\{y_n\} 和\{x_n\}, \{z_n\}{yn?}和{xn?},{zn?} 之間的關系表達式, 即
yn=f(xn,zn)(5)y_n = f(x_n, z_n) \tag{5}yn?=f(xn?,zn?)(5)
由 {xn}\{x_n\}{xn?} 和 {zn}\{z_n\}{zn?}的關系,(5)又可以改寫成
yn=f(xn)(6)y_n = f(x_n) \tag{6}yn?=f(xn?)(6)
第一條道路相當于繞了一圈,簡稱間接法,第二條道路更直接,簡稱直接法,我們先采用直接法來進行解答
- 先畫出{yn}和{xn}\{y_n\} 和\{x_n\}{yn?}和{xn?}散點圖
為了找出{yn}和{xn}\{y_n\} 和\{x_n\}{yn?}和{xn?}之間的函數關系,我們可以先建立一個最簡單最純粹的假設
y=ax+b(7)y =ax+b \tag{7}y=ax+b(7)
沒錯,就是最簡單的線性關系,然后擬合出來系數 a 和 b分別是 -0.97580645和5.0702765 (保留8位小數),這樣{yn}和{xn}\{y_n\} 和\{x_n\}{yn?}和{xn?}之間的函數關系便是
y=?0.9758x+5.07(8)y = -0.9758 x + 5.07\tag{8}y=?0.9758x+5.07(8)
然后畫出來擬合函數,觀察其與原數列之間的差距
我們看到除了第1個點和第5個點靠得近,其余的點差距還是挺大的,既然一次擬合性能太差,那么我來個2次函數唄,即假設
y=ax2+bx+c(9)y =ax^2+bx+c \tag{9}y=ax2+bx+c(9)
觀察發現2次函數擬合和1次函數擬合沒啥大的區別,再繼續提高擬合函數次數
4次時候
觀察發現第1,3,4,5四個點都靠的比較近,差距在縮小,繼續提高次數
5次的時候
觀察發現第2,6,7三個點擬合的還不夠完美,繼續提高次數
6次的時候
此時,擬合曲線恰好經過數列{yn}\{y_n\}{yn?}的7點,可以認為擬合效果比較完美,此時的擬合函數為
y=?0.01265x6+0.2035x5?0.591x4?4.176x3+22.7x2?24.32x+2(10)y = -0.01265 x^6 + 0.2035 x^5 - 0.591 x^4 - 4.176 x^3 + 22.7 x^2 - 24.32 x + 2 \tag{10}y=?0.01265x6+0.2035x5?0.591x4?4.176x3+22.7x2?24.32x+2(10)
將x = 10代入上(10)式,求得 y = -351.60606060605966
從y值可以猜出這是一個無限循環小數,循環節為6060,故最后所求的y值為
?351.6060˙-351.\dot{6060}?351.6060˙
- 完整代碼
參考文獻
1, https://docs.scipy.org/doc/numpy-1.15.0/reference/generated/numpy.polyfit.html
總結
以上是生活随笔為你收集整理的python函数拟合的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java游戏妖魔兽_妖1.17正式版下载
- 下一篇: css常用样式大全集锦