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





程序如下:
(使用方法:將下代碼寫(xiě)入記事本,另存為 .vbs 文件,文件名可以隨意,若360誤報(bào)屬360技術(shù)問(wèn)題。)
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) '取導(dǎo)數(shù)的近似值
Dim Delta_x
Delta_x = 0.000001
Derivative = (Limit(expr, point + Delta_x) - Limit(expr, point))/Delta_x
End Function
s_expr = Inputbox("請(qǐng)輸入關(guān)于x的一元方程" & vbCrLf & "注:指數(shù)是“^”,如 x^2 就是 x平方;乘號(hào)是“*”,不支持形如2x的寫(xiě)法,必須寫(xiě)成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("請(qǐng)給出一個(gè)解的估計(jì)值 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 "無(wú)法找到解!請(qǐng)嘗試更換一個(gè)估計(jì)值!":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ā)散,無(wú)法求解!請(qǐng)嘗試更換一個(gè)估計(jì)值!"
End If
If Abs(x0) < 1 Then x0 = "0" & x0
Msgbox s_expr & vbCrLf & vbCrLf & "x = " & x0 & vbCrLf & vbCrLf & "共計(jì)算" & i & "次"
Loop
|
|