二分法+牛顿下山法

最近写了牛顿下山法,就是针对x^3-x-1=0这个函数F(x)=0求根的问题。牛顿下山法的迭代使造出一个迭代函数G(x)=x-(x^3-x-1)/(3*x^2-1),不断迭代过程中,要注意下山条件| F(xk+1) | < | F(xk) |成立。同时根据牛顿迭代公式,设定系数k有xk+1=xk+1-k*F(xk)/F'(xk),在迭代过程中为满足下山条件,而不断去寻找相应的k值使成立。在进行相关的迭代前,我们采用二分法使逼近根值,再作相关的牛顿迭代。通过F'(x)=3*x^2-1,进行相关的分析,我们可以大概得出F(x)的图像如下。

显然,可知我们的二分法该如何进行设置了~下为相应伪代码

const double H =1;//二分法逼近步长
const double LIMIT = 0.1;//二分法限定范围
const int N = 5;//系数最多计算次数

double F(double x)//原函数
{
	return x*x*x-x-1;
}
double G(double x)//迭代函数
{
	return x-F(x)/(3*x*x-1);
}
double Dichotomic(double x)//二分法逼近
{
	double a,b,fx;//b为上界,a为下界
	fx=F(x);
	if(fx>0)
	{
		a=x-H;
		while(F(a)>0)a-=H;//寻求F(a)<0
		b=x;
	}
	else 
	{		
		b=x+H;
		while(F(b)<0)b-=H;//寻求F(b)>0
		a=x;
	}
	do{
		x=(a+b)/2;
		fx=F(x);
		if(fx*F(a)>0)a=x;
		else b=x;
	}while( (b-a)>LIMIT );
	return x;
}
void Newton(double x0)
{
	//参数设定
     ……
     //二分逼近
     ……
	//迭代循环
         {
         ……
             //判断是否满足下山条件
               {
             //探测系数值,用二分法,每次减为半步长
            …… 
        }
         }
}

        

你可能感兴趣的:(编程练习)