VB 牛顿迭代法、二分法和弦截法解一元三次方程
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
VB 牛顿迭代法、二分法和弦截法解一元三次方程
Option Explicit
Private a As Double, b As Double, c As Double, d As Double, xx1 As Double, xx2 As Double, e As Double
Private Sub Form_Load()
a = 1 'a * x ^ 3 +
b * x ^ 2 +
c * x +
d = 0
b = 2
c = 3
d = -4
xx1 = 0 '二分法区间或弦截法区间或牛顿迭代法初值
xx2 = 1 '二分法区间或弦截法区间
e = 0.00001 '精度
End Sub
Private Sub Command1_Click() '牛顿迭代法
Dim x As Double, y As Double, dy As Double, ydy As Double, i As Long
x = xx1
For i = 0 To 1000
y = f(a, b, c, d, x)
dy = f1(a, b, c, x)
If Abs(y) < e Then
Print "牛顿迭代法x = " & x
Print "迭代次数i = " & i
Exit Sub
ElseIf dy = 0 Then
Print "失败,请另设初值试试"
Exit Sub
End If
ydy = y / dy
x = x - ydy
Next
Print "失败!"
End Sub
Private Sub Command2_Click() '二分法
Dim x1 As Double, x2 As Double, x0 As Double, y1 As Double, y2 As Double, y0 As Double, i As Long
x1 = xx1
x2 = xx2
y1 = f(a, b, c, d, x1)
y2 = f(a, b, c, d, x2)
If (y1 > 0 And y2 > 0) Or (y1 < 0 And y2 < 0) Then
Print "y1=" & y1 & " y2=" & y2 & ",二分法里y1与y2不能同号,请重新设置x1和x2"
ElseIf y1 = 0 Then
Print "二分法x = " & x1
Print "迭代次数i = " & i
ElseIf y2 = 0 Then
Print "二分法x = " & x2
Print "迭代次数i = " & i
Else
For i = 1 To 1000
x0 = (x1 + x2) / 2
'Debug.Print x0
y0 = f(a, b, c, d, x0)
If y0 = 0 Then
Print "二分法x = " & x0
Print "迭代次数i = " & i
Exit Sub
ElseIf Abs(x1 - x2) < e Then
Print "二分法x = " & x0
Print "迭代次数i = " & i
Exit Sub
ElseIf (y1 < 0 And y0 < 0) Or (y1 > 0 And y0 > 0) Then
x1 = x0
Else
x2 = x0
End If
Next
Print "失败!"
End If
End Sub
Private Sub Command3_Click() '弦截法
Dim x1 As Double, x2 As Double, x0 As Double, y1 As Double, y2 As Double, y0 As Double, i As Long
x1 = xx1
x2 = xx2
y1 = f(a, b, c, d, x1)
y2 = f(a, b, c, d, x2)
If (y1 > 0 And y2 > 0) Or (y1 < 0 And y2 < 0) Then
Print "y1=" & y1 & " y2=" & y2 & ",二分法里y1与y2不能同号,请重新设置x1和x2"
ElseIf y1 = 0 Then
Print "弦截法x = " & x1
Print "迭代次数i = " & i
ElseIf y2 = 0 Then
Print "弦截法x = " & x2
Print "迭代次数i = " & i
Else
For i = 1 To 1000
x0 = x1 - (x2 - x1) / (y2 - y1) * y1
'Debug.Print x0
y0 = f(a, b, c, d, x0)
If y0 = 0 Then
Print "弦截法x = " & x0
Print "迭代次数i = " & i
Exit Sub
ElseIf Abs(x1 - x2) < e Then
Print "弦截法x = " & x0
Print "迭代次数i = " & i
Exit Sub
ElseIf (y1 < 0 And y0 < 0) Or (y1 > 0 And y0 > 0) Then
x1 = x0
Else