song.yz@foxmail.com wechat: math-box

计算数学

Muhammad两步三阶迭代格式

对于非线性方程F(x)=0,对方程函数在xn处泰勒展开得: F(x)=F(xn)++1(k1)!F(k1)(xn)(xxn)(k1)+01(1t)(k1)(k1)!F(k)[xn+t(xxn)](xxn)kdtk=1时,有 F(x)=F(xn)+01F[xn+t(xxn)](xxn)dt 对上式采用不同的数值积分方法可以得到一系列迭代公式。 Muhammad Aslam Noor给出了如下两种的积分公式 01F[xn+t(xxn)](xxn)dt[14F(xn)+34F(xn+2x3)](xxn) 01F[xn+t(xxn)](xxn)dt[34F(2xn+x3)+14F(xn)](xxn) 由牛顿法作为第一步,由此可以给出如下两种解算非线性方程的两步迭代格式: {yn=xnF(xn)1F(xn)xn+1=xnF(xn)14F(xn)+34F(xn+2yn3)n=1,2, {yn=xnF(xn)1F(xn)xn+1=xnF(xn)34F(2xn+yn3)+14F(yn)n=1,2, 以上格式为三阶收敛,且同样适用于非线性方程组的计算。 计算非线性方程 f(x)=3x52x3+6x8 的根。 容易给出 df(x)dx=15x46x2+6 下面给出go语言代码。

// muhammad
package main

import (
	"fmt"
	"math"
)

func main() {
	/*------------------------------------------------------
	!  Author  : Song Yezhi      
	!  verison : 2021-10-04 19:02:15
	!  -----------------------------------------------------
	!  Input  Parameters :
	!
	!  Output Parameters :
	!
	------------------------------------------------------*/
	var x0 float64 = 1.5
	fmt.Printf("muhammad 1 method: \n")
	_, _= muhammad1(x0)
	
	fmt.Printf("------------------ \n")
	fmt.Printf("muhammad 2 method: \n")
	_, _= muhammad2(x0)
}
func muhammad1(x0 float64)(x1,fx float64){
/*------------------------------------------------------
  Author  : Song Yezhi                       
  verison : 2021-10-4 18:51
  go build -gcflags "-N -l"  
     
  -----------------------------------------------------  
  Input  Parameters :
 
  Output Parameters :
 
------------------------------------------------------*/
    imax := 200
    tol := 1e-8
    x1 = x0
    
    var y1,tmp,dx,x2 float64
    for i:=0;i < imax ; i++ {
        fx = funcX(x1)
        y1 = x1 - fx/dfuncX(x1)
        tmp = 0.25*dfuncX(x1) +0.75 * dfuncX((x1+2*y1)/3.0)
        x2 = x1 - fx/tmp
        dx = math.Abs(x2-x1)
        if dx < tol {
            break
        }
        x1 = x2 
        fmt.Printf("i= %4d  x= %12.7f  f(x)=%12.7f \n", i, x2, fx)       
    }
    return x2,fx
}

func muhammad2(x0 float64)(x1,fx float64){
/*------------------------------------------------------
  Author  : Song Yezhi                       
  verison : 2021.10.04 
  go build -gcflags "-N -l"  
     
  -----------------------------------------------------  
  Input  Parameters :
 
  Output Parameters :
 
------------------------------------------------------*/
    imax := 200
    tol := 1e-8
    x1 = x0
    
    var y1,tmp,dx,x2 float64
    for i:=0;i < imax ; i++ {
        fx = funcX(x1)
        y1 = x1 - fx/dfuncX(x1)
        tmp = 0.75*dfuncX((2.0*x1+y1)/3.0) +0.25 * dfuncX(y1)
        x2 = x1 - fx/tmp
        dx = math.Abs(x2-x1)
        if dx < tol {
            break
        }
        x1 = x2 
        fmt.Printf("i= %4d  x= %12.7f  f(x)=%12.7f \n", i, x2, fx)       
    }
    return x2,fx
}
func funcX(x float64) float64 {
	/*------------------------------------------------------
	  !  Author  : Song Yezhi      
	  !  verison : 2021.10.04
	  !
	  ------------------------------------------------------*/
	fx := 3.0*math.Pow(x,5)-2.0*x*x*x + 6*x -8.0
	return fx
}
func dfuncX(x float64) float64 {
	/*------------------------------------------------------
	!  Author  : Song Yezhi      
	!  verison : 2021.10.04
	!
	------------------------------------------------------*/
	df := 15.0*math.Pow(x,4)-6.0*x*x + 6.0
	return df
}