迭代法解方程

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

迭代法解方程
•迭代法
如果方程的形式可以化简成 x = f(x) ,其中
f(x)是一个比较简单明了的函数例如
ln(x)+1。

其相对图形如右图所示,这样我们
可以先假设一个x值,将该x代入f(x)中,
这样可以计算出一个新的x,重复以上步骤,
直到达到一个稳定的x,即相邻两次的x值相
差不大。

迭代法有可能出现振动发散的情况,
因此如果循环超过一定次数应该退出循环,
重新选取初始值。

此外迭代法通常只能解出
一到两个方程的实数根。

•二分法
如果方程的形式可以化简成 f(x)=0 ,那么
我们设法得到一个x1使f(x1)大于零,再设
法得到一个x2使f(x2)小于零,那么如果
f(x)在x1到x2之间是连续的化,则必然有
一个点x0使f(x0)=0。

于是我们计算x1和
x2的中点x3,如果f(x3)大于零则说明x0
在x3和x2之间否则x0在x1和x3之间,如
此循环下去直到得出一个符合要求的根。


右图所示。

二分法如果可以开始则一定有解,
不会出现无解的情况。

当然二分发仍然可能
遗漏一些解。

rootx=f_solve(x1,x2)
例程
数据类型:x1,x2和函数的返回值均为双精度类型
参数说明:x1,x2为试探用的x值,要求其相应的y(x1)和y(x2)必需一正一

返 回 值:该函数返回在x1,x2区间中的一个解,如果无解或者输入参数有
问题则返回-9999999.99999E-999
其他要求:该函数将调用f_y(x)函数,必需有相应函数
VERSION 5.00
Begin VB.Form Form1
Caption = "Form1"
ClientHeight = 5700
ClientLeft = 60
ClientTop = 345
ClientWidth = 7230
LinkTopic = "Form1"
ScaleHeight = 5700
ScaleWidth = 7230
StartUpPosition = 3 'Windows Default
Begin VB.PictureBox Picture1
Height = 4935
Left = 120
ScaleHeight = 4875
ScaleWidth = 6915
TabIndex = 1
Top = 720
Width = 6975
End
Begin mandButton Command1
Caption = "Command1"
Height = 495
Left = 120
TabIndex = 0
Top = 120
Width = 3015
End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Explicit
Sub draw_pic(ByVal x_min As Double, ByVal x_max As Double, ByVal y_min As Double, ByVal y_max As
Double)
Dim x, i, y As Double
Picture1.Scale (x_min, y_max)-(x_max, y_min)
Picture1.Line (0, y_min)-(0, y_max)
Picture1.Line (x_min, 0)-(x_max, 0)
For x = x_min To x_max Step 0.01
y = f_y(x)
If y < y_min Then y = y_min
If y > y_max Then y = y_max
Picture1.PSet (x, y), RGB(255, 0, 0)
Next
End Sub
Function f_y(ByVal x As Double) As Double ‘定义方程
f_y = x + 2 * x ^ 2 - 4 * x ^ 3 + x ^ 4
End Function
Function f_solve(ByVal x1 As Double, ByVal x2 As Double) As Double ‘定义解及过程 ??ByVal?? Dim x3 As Double
Dim y1 As Double
Dim y2 As Double
Dim y3 As Double
Dim y0 As Double
Dim dx0 As Double
Dim n As Long
y1 = f_y(x1) 'x1,x2初始值是多少????? 代入方程,获得第一个试探解的函数值
y2 = f_y(x2) '获得第二个试探解的函数值
If y1 * y2 > 0 Then '如果两个试探解对应的函数值不是一正一负,则返回错误值
f_solve = 9.999E-99
MsgBox ("试探解不合适" + Str(y1) + " " + Str(y2))
Exit Function
End If
y0 = Abs(y1) + Abs(y2) '获得最初的y的绝对数量级,未来退出循环时需要判断其相对大小
If y0 > 1 Then y0 = 1
dx0 = Abs(x1 - x2) '初始试探x之间的差距
n = 0 '循环计数器
Do
n = n + 1
x3 = (x1 + x2) / 2
y3 = f_y(x3)
If y1 * y3 > 0 Then '新的试探解和y1同号,则用新试探解替代x1
x1 = x3
ElseIf y2 * y3 > 0 Then '新的试探解和y2同号,则用新试探解替代x2
x2 = x3
ElseIf y3 = 0 Then '恰好找到了解
'注意此处虽然什么也不作,但是不可以删除
Else
f_solve = 9.999E-99 '出现了错误
Exit Function
End If
y1 = f_y(x1) '获得第一个试探解的函数值
y2 = f_y(x2) '获得第二个试探解的函数值
Loop While Abs(y3) > 0.000000000001 * y0 And Abs(x1 - x2) > 0.000000000001 * dx0 And n <= 20000 'Picture1.PSet (x3, 0)
'Picture1.Print x3
'Picture1.Print n
f_solve = x3
End Function
Private Sub Command1_Click()
Dim r As Double
r = f_solve(0.5, 2)
Command1.Caption = Str(r)
draw_pic -1, 4, -10, 2
End Sub
•牛顿法
如果方程的形式可以化简成 f(x)=0 ,并且可以比较方便的求出f(x)的导数,那么我们只要知道一个点的f(x)就可以根据x,f(x)及f(x)的导数求出下一个更加接近X0的x,循环求解我们可以解出该方程的根。

牛顿法的特点是收敛速度快,不会出现发散(前提是方程有解),该方法依然没有解决解出全部根的问题。

如右图所示。

相关文档
最新文档