| ||||||||
| | ||||||||
| Newton's method calculates the roots of equations. In other words, it finds the values of X for which F(X) = 0.
This program graphs the equation X^3/3 - 2*X + 5. When you click on the graph, it uses Newton's method to find a root of the equation, starting from the X value that you clicked. | ||||||||
| | ||||||||
' The function.
Private Function F(ByVal x As Double) As Single
Return x * x * x / 3 - 2 * x * x + 5
End Function
' Draw the background graph.
Private Sub DrawGraph(ByVal gr As Graphics)
gr.Clear(Me.BackColor)
' Scale for convenience.
gr.ScaleTransform(SCALE_FACTOR, -SCALE_FACTOR)
gr.TranslateTransform( _
Me.ClientRectangle.Width / 2, _
Me.ClientRectangle.Height / 2, _
Drawing2D.MatrixOrder.Append)
' Draw the axes.
Dim blue_pen As New Pen(Color.Blue, 0)
For x As Integer = -10 To 10
gr.DrawLine(blue_pen, x, -0.5!, x, 0.5!)
Next x
For y As Integer = -10 To 10
gr.DrawLine(blue_pen, -0.5!, y, 0.5!, y)
Next y
gr.DrawLine(blue_pen, -10, 0, 10, 0)
gr.DrawLine(blue_pen, 0, -10, 0, 10)
blue_pen.Dispose()
' Draw the curve.
Dim red_pen As New Pen(Color.Red, 0)
Dim y1 As Single
Dim y2 As Single = F(-10)
Const STEP_SIZE As Single = 0.1
For x As Single = -10 + STEP_SIZE To 10 Step STEP_SIZE
y1 = y2
y2 = F(x)
gr.DrawLine(red_pen, x - STEP_SIZE, y1, x, y2)
Next x
red_pen.Dispose()
End Sub | ||||||||
| | ||||||||
The way Newton's method works is it starts from an initial guess X0 (given by the point you clicked). It then estimates the difference between that value and root:
epsilon = -F(x) / dFdx(x) The method then sets its next guess for x to be the current value plus epsilon (X(n+1) = X(n) + epsilon). It repeats this process until epsilon is smaller than some cutoff value. | ||||||||
| | ||||||||
' The function's derivative.
Private Function dFdx(ByVal x As Double) As Single
Return x * x - 4 * x
End Function
' Find the roots by using Newton's method.
Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e _
As
System.Windows.Forms.MouseEventArgs) Handles _
MyBase.MouseDown
' Clear previous results.
Dim gr As Graphics = Me.CreateGraphics()
DrawGraph(gr)
' Convert the X coordinate into world coordinates.
Dim m As Matrix = gr.Transform()
m.Invert()
Dim pts() As PointF = {New PointF(e.X, e.Y)}
m.TransformPoints(pts)
Dim x0 As Single = pts(0).X
Const CUTOFF As Single = 0.0000001
Dim epsilon As Single
Dim the_pen As New Pen(Color.Black, 0)
Dim iterations As Integer = 0
Do
iterations += 1
gr.DrawLine(the_pen, x0, -1.5!, x0, 1.5!)
epsilon = -F(x0) / dFdx(x0)
x0 = x0 + epsilon
Loop While Abs(epsilon) > CUTOFF
gr.DrawLine(the_pen, x0, -3.0!, x0, 3.0!)
the_pen.Dispose()
Me.Text = x0 & " +/-" & epsilon & " in " & iterations & _
" iterations"
End Sub | ||||||||
| | ||||||||
| Newton's method uses the function's derivative to make its next X value guess. If the curve is relatively flat for the current value of X, then the derivative (which is the slope of the function) gives a value far away from the current one and the method is unstable. In this example, try clicking on a point where X is at or near 0 and see what happens.
For more information on Newton's method, see Eric W. Weisstein's article Newton's Method from MathWorld--A Wolfram Web Resource. | ||||||||
![]() |
正文
牛顿法求方程的解2008-08-27 21:08:00
【评论】 【打印】 【字体:大 中 小】 本文链接:http://blog.pfan.cn/iamben250/37911.html
阅读(5832) | 评论(0)
版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!


评论