數(shù)值法解方程廣泛應用于各種工程科學領(lǐng)域,它可以求出解的近似值,而對于高次方程沒有求根公式,而且對于各種困難的方程,數(shù)值法就顯得尤為重要。
我們的老師向我們介紹了“二分法”,這種方法雖也是數(shù)值解法,但是使用起來不僅繁瑣,計算復雜,而且效率低下。相比之下,使用牛頓法就顯得更好。
下面簡要的介紹一下牛頓法:
(圖片繪制的不太好,看得懂就行。。)
對于方程一元f(x)=0,設(shè)其中一個解為x0,尋找x0就是我們的任務(wù)。我們首先找一個在x0附近的解的估計值x1。
牛頓法的核心思想就是利用曲線f(x)在 x1 點的切線(即導數(shù))來近似的替代方程左邊復雜的f(x),由于直線與x軸的交點十分容易求得,所以很容易可以找出一個近似的原方程的解,然后將這個解作為新的x1,重復上述過程,得出的解就會越來越接近于真實情況。而且,在多數(shù)情況下,只要初始值不是給的相差太遠,牛頓法的逼近速度是很快的,遠遠快于二分法。
根據(jù)這個方法,不難寫出牛頓法的程序,下面給出這個程序:
效果:





程序如下:
(使用方法:將下代碼寫入記事本,另存為 .vbs 文件,文件名可以隨意,若360誤報屬360技術(shù)問題。)
Dim x0, x1, x2, x3, m_expr, i, x, Res, der, s_expr
Function Limit (expr, point) '取極限的近似值
Dim dif, i, nk, difk, ndifk, k, x
dif = 1
ndifk = 1000
x = point + dif
nk = Eval(expr)
For i = 1 To 3
dif = dif / 100
x = point + dif
k = Eval(expr)
difk = Abs(nk - k)
nk = k
'If difk < ndifk Then
'ndifk = difk
'Else
'Limit = "F"
'End If
Next
If Limit <> "F" Then Limit = k
End Function
Function Derivative (expr, point) '取導數(shù)的近似值
Dim Delta_x
Delta_x = 0.000001
Derivative = (Limit(expr, point + Delta_x) - Limit(expr, point))/Delta_x
End Function
s_expr = Inputbox("請輸入關(guān)于x的一元方程" & vbCrLf & "注:指數(shù)是“^”,如 x^2 就是 x平方;乘號是“*”,不支持形如2x的寫法,必須寫成2*x")
m_expr = Mid(s_expr,1,InStr(s_expr,"=")-1) & "-(" & Mid(s_expr,InStr(s_expr,"=")+1,Len(s_expr)-InStr(s_expr,"=")) & ")"
x0 = 1
Do
x0 = Inputbox("請給出一個解的估計值 x0 ,輸入exit退出", "初始值", x0)
If LCase(x0) = "exit" Then Exit Do
x = x0
Res = ""
For i = 1 To 1000
x = x0
der = Derivative(m_expr, x)
If der = 0 Then Msgbox "無法找到解!請嘗試更換一個估計值!":Exit For
x1 = (Eval(m_expr)/der)
x0 = x0 - x1
If x1 = 0 Then
Exit For
End If
Next
If abs(x1) > 0.001 Then
Msgbox "解發(fā)散,無法求解!請嘗試更換一個估計值!"
End If
If Abs(x0) < 1 Then x0 = "0" & x0
Msgbox s_expr & vbCrLf & vbCrLf & "x = " & x0 & vbCrLf & vbCrLf & "共計算" & i & "次"
Loop
|