• 使用牛顿迭代法求方程的根


    第二篇随笔

    9102年11月底,工科男曹**要算一个方程f(x)=0的根,其中f(x)表达式为:

    因为实数范围内f(x)=0的根太多,所以本文只研究-2<x<2的情况.这个式子长的太丑了,曹**看着觉得不爽,导之,得一f'(x)

    这个式子更丑,但是,我们有牛顿迭代法,可以构造迭代序列{xn}满足:

    其中f'(xn)不等于0.可以证明,只要初值选的好,序列可以收敛到要求的根.然后就可以写程序求根了.

    先上函数图像(由desmos绘制),看到指定区间上有5个零点.然后,零点附近取值吧.

    再上效果

    结果还是不错的.

    最后,上代码.f(x)和f'(x)用委托的方式传入calc函数.委托注意实例化

    Public Delegate Function myfunc(x As Double) As Double
    Public Function func0(x As Double) As Double
        Return Exp(x) + Pow(x, 4) * Sin(Pow(x, 3))
    End Function
    Public Function func0derive(x As Double) As Double
        Return Exp(x) + 4 * Pow(x, 3) * Sin(Pow(x, 3)) + 3 * Pow(x, 6) * Cos(Pow(x, 3))
    End Function
    Dim f0 As New myfunc(AddressOf func0)
    Dim fd0 As New myfunc(AddressOf func0derive)

    calc的参数中f和fd分别是指向f(x)和f'(x)的函数指针,x0为初值,eps为精度,cnt为迭代次数

    用传引用的方式,通过sol返回计算结果.

    返回True为没有出错,False为出错.

     1 Public Function Calc(f As myfunc, fd As myfunc, x0 As Double, eps As Double, cnt As Integer, ByRef sol As Double) As Boolean
     2         If cnt <= 0 Or f Is Nothing Or fd Is Nothing Then
     3             Return False
     4         End If
     5         Try
     6             sol = 0
     7             Dim x As Double = x0, c0 As Integer = 0
     8             While Math.Abs(x) > eps And cnt > c0
     9                 x = x - f(x) / fd(x)
    10                 c0 += 1
    11             End While
    12             sol = x
    13             Return True
    14         Catch ex As Exception
    15             Return False
    16         End Try
    17     End Function
  • 相关阅读:
    从小知识开始练习
    shell的基本语法
    shell的一些简单用法
    HTML 父元素与子元素之间的margin-top问题
    HTML input文本框设置和移除默认值
    c# winform进入窗口后在文本框里的默认焦点
    c#面向对象基础 重写、虚方法、抽象类
    c#面向对象基础 封装、继承
    c#面向对象基础 静态成员、构造函数、命名空间与类库
    c#面向对象基础 类、方法、方法重载
  • 原文地址:https://www.cnblogs.com/woshilxcdexuesheng/p/11964097.html
Copyright © 2020-2023  润新知