VBA:最優化算法(二分法、黃金分割法、循環疊代法)的代碼實現

VBA:最優化算法(二分法、黃金分割法、循環疊代法)的代碼實現,第1張

 文章背景:在工程計算中,經常會遇到求解一元非線性方程的問題,如給定一個區間,求解非線性方程的根,或者求最值(最大值或最小值)。下麪介紹三種比較簡單的算法。

(1)二分法(2)黃金分割法(3)循環疊代

(1)二分法

對於一元非線性方程f(x)=0,如果已經知道在區間[a,b]內,方程存在零點,可以採用二分法得到x的近似解。如對於f(x)=x^3 x-17,通過作圖可以得出,f(x)在區間[0,6]內存在零點。

VBA:最優化算法(二分法、黃金分割法、循環疊代法)的代碼實現,圖片,第2張

二分法的程序框圖如下:

VBA:最優化算法(二分法、黃金分割法、循環疊代法)的代碼實現,圖片,第3張

二分法的代碼實現:(function)

Option Explicit

Function Bisection(a As Double, b As Double, fxn As String) As Double

   Dim i As Integer, mid As Double, fa As Double, fmid As Double
   
   For i = 1 To 20
       
       mid = (a b) / 2
       fa = Evaluate(Replace(fxn, 'x', a))
       fmid = Evaluate(Replace(fxn, 'x', mid))
       
       If fa * fmid 0 Then
       
           b = mid
           
       Else
       
           a = mid
       
       End If
   
   Next i
   
   Bisection = FormatNumber((a b) / 2, 2)

End Function

示例:

=Bisection(0,6,'x^3 x-17')
2.44
(2)黃金分割法

對於一元函數f(x),如果已知在區間[a,b]內,方程存在最小值,可以採用黃金分割法得到x的近似解。如對於f(x)=x^2-6x 15,通過作圖可以得出,f(x)在區間[0,6]內存在最小值。

VBA:最優化算法(二分法、黃金分割法、循環疊代法)的代碼實現,圖片,第4張

黃金分割法的程序框圖如下:

VBA:最優化算法(二分法、黃金分割法、循環疊代法)的代碼實現,圖片,第5張

黃金分割法的代碼實現:(function)

Function GoldenSearch(a As Double, b As Double, fxn As String) As Double

   Dim i As Integer, GR As Double, d As Double
   Dim x1 As Double, x2 As Double, fx1 As Double, fx2 As Double
   
   GR = (Sqr(5) - 1) / 2
   
   For i = 1 To 20
   
       d = GR * (b - a)
       x1 = a d
       x2 = b - d
       fx1 = Evaluate(Replace(fxn, 'x', x1))
       fx2 = Evaluate(Replace(fxn, 'x', x2))
       
       If fx1 fx2 Then
       
           a = x2
           
       Else
       
           b = x1
       
       End If
   
   Next i
   
   GoldenSearch = FormatNumber((a b) / 2, 2)

End Function

示例:

=GoldenSearch(0,6,'x^2-6*x 15')
3.00
(3)循環疊代法

對於可以轉化爲x=f(x)形式的一元非線性方程,有時可以採用循環疊代法,得到x的近似解。

循環疊代法求解的程序框圖如下:

VBA:最優化算法(二分法、黃金分割法、循環疊代法)的代碼實現,圖片,第6張

循環疊代法的代碼實現:(function)

Function Iteration(x As Double, fxn As String) As Double

   Dim i As Integer
   
   For i = 1 To 20
   
       x = Evaluate(Replace(fxn, 'x', x))
   
   Next i
   
   Iteration = FormatNumber(x, 2)

End Function

示例:(先給定一個初值x,再進行循環疊代計算)

=Iteration(1,'1/sin(x)')
1.11

蓡考資料:

[1] Excel/VBA for Creative Problem Solving, Part 1(/learn/excel-vba-for-creative-problem-solving-part-1/lecture/vvdl5/implementing-targeting-and-optimization-algorithms-in-vba-subroutines)


本站是提供個人知識琯理的網絡存儲空間,所有內容均由用戶發佈,不代表本站觀點。請注意甄別內容中的聯系方式、誘導購買等信息,謹防詐騙。如發現有害或侵權內容,請點擊一鍵擧報。

生活常識_百科知識_各類知識大全»VBA:最優化算法(二分法、黃金分割法、循環疊代法)的代碼實現

0條評論

    發表評論

    提供最優質的資源集郃

    立即查看了解詳情