最近写了牛顿下山法,就是针对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)
{
//参数设定
……
//二分逼近
……
//迭代循环
{
……
//判断是否满足下山条件
{
//探测系数值,用二分法,每次减为半步长
……
}
}
}