VBA:最優化算法(二分法、黃金分割法、循環疊代法)的代碼實現
文章背景:在工程計算中,經常會遇到求解一元非線性方程的問題,如給定一個區間,求解非線性方程的根,或者求最值(最大值或最小值)。下麪介紹三種比較簡單的算法。
(1)二分法對於一元非線性方程f(x)=0,如果已經知道在區間[a,b]內,方程存在零點,可以採用二分法得到x的近似解。如對於f(x)=x^3 x-17,通過作圖可以得出,f(x)在區間[0,6]內存在零點。
二分法的程序框圖如下:
二分法的代碼實現:(function)
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)黃金分割法
2.44
對於一元函數f(x),如果已知在區間[a,b]內,方程存在最小值,可以採用黃金分割法得到x的近似解。如對於f(x)=x^2-6x 15,通過作圖可以得出,f(x)在區間[0,6]內存在最小值。
黃金分割法的程序框圖如下:
黃金分割法的代碼實現:(function)
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)循環疊代法
3.00
對於可以轉化爲x=f(x)形式的一元非線性方程,有時可以採用循環疊代法,得到x的近似解。
循環疊代法求解的程序框圖如下:
循環疊代法的代碼實現:(function)
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)
本站是提供個人知識琯理的網絡存儲空間,所有內容均由用戶發佈,不代表本站觀點。請注意甄別內容中的聯系方式、誘導購買等信息,謹防詐騙。如發現有害或侵權內容,請點擊一鍵擧報。
0條評論