第二篇隨筆 9102年11月底,工科男曹**要算一個方程f(x)=0的根,其中f(x)表達式為: 因為實數範圍內f(x)=0的根太多,所以本文只研究-2<x<2的情況.這個式子長的太醜了,曹**看著覺得不爽,導之,得一f'(x) 這個式子更醜,但是,我們有牛頓迭代法,可以構造迭代序列{xn}滿足: ...
第二篇隨筆
9102年11月底,工科男曹**要算一個方程f(x)=0的根,其中f(x)表達式為:
因為實數範圍內f(x)=0的根太多,所以本文只研究-2<x<2的情況.這個式子長的太醜了,曹**看著覺得不爽,導之,得一f'(x)
這個式子更醜,但是,我們有牛頓迭代法,可以構造迭代序列{xn}滿足:
其中f'(xn)不等於0.可以證明,只要初值選的好,序列可以收斂到要求的根.然後就可以寫程式求根了.
先上函數圖像(由desmos繪製),看到指定區間上有5個零點.然後,零點附近取值吧.
再上效果
結果還是不錯的.
最後,上代碼.f(x)和f'(x)用委托的方式傳入calc函數.委托註意實例化
Public Delegate Function myfunc(x As Double) As Double
Public Function func0(x As Double) As Double Return Exp(x) + Pow(x, 4) * Sin(Pow(x, 3)) End Function Public Function func0derive(x As Double) As Double Return Exp(x) + 4 * Pow(x, 3) * Sin(Pow(x, 3)) + 3 * Pow(x, 6) * Cos(Pow(x, 3)) End Function
Dim f0 As New myfunc(AddressOf func0) Dim fd0 As New myfunc(AddressOf func0derive)
calc的參數中f和fd分別是指向f(x)和f'(x)的函數指針,x0為初值,eps為精度,cnt為迭代次數
用傳引用的方式,通過sol返回計算結果.
返回True為沒有出錯,False為出錯.
1 Public Function Calc(f As myfunc, fd As myfunc, x0 As Double, eps As Double, cnt As Integer, ByRef sol As Double) As Boolean 2 If cnt <= 0 Or f Is Nothing Or fd Is Nothing Then 3 Return False 4 End If 5 Try 6 sol = 0 7 Dim x As Double = x0, c0 As Integer = 0 8 While Math.Abs(x) > eps And cnt > c0 9 x = x - f(x) / fd(x) 10 c0 += 1 11 End While 12 sol = x 13 Return True 14 Catch ex As Exception 15 Return False 16 End Try 17 End Function