2009-11-18 16:59:51| 分类: 计算方法数学类 |字号 订阅
//牛顿迭代法,牛顿下山迭代
#include <stdio.h>
#include <math.h>
float NewtonFun(float x0,float c);
float XiaShanFun(float x0,float c);
float Fun1(float x,float p);//下山迭代函数
float Fun2(float x);//原函数f(x)
void main()
{
float X,Y,a0,a1;
printf("输入初始迭代值:");
scanf("%f",&a0);
a1=Fun1(a0,1);
if(fabs(a0-a1)<1)
{
printf("局部收敛,直接牛顿迭代:\n");
Y=a0;
}
else
{
Y=XiaShanFun(a0,1e-4);
printf("下山结果是:x1=%f\n",Y);
}
X=NewtonFun(Y,1e-4);
printf("牛顿迭代结果是:%f\n",X);
}
float NewtonFun(float x0,float c)
{
float i,j;
int n;n=1;
i=Fun1(x0,1);
j=x0;
printf("x0=%f\nx1=%f\n",x0,i);
while(fabs(i-j)>c)
{
n++;
j=i;
i=Fun1(j,1);
printf("x%d=%f\n",++n,i);
}
printf("共经过%d次迭代\n",n);
return i;
}
float XiaShanFun(float x0,float c)
{
float a,q;
q=1.0;
a=Fun1(x0,q);
printf("x0=%-12ff(x0)=%f\n",x0,Fun2(x0));
printf("下山结果如下:\nx1\t\tr\t\tf(x)\n");
printf("%-12f%-12f%f\n",a,q,Fun2(a));
while(fabs(Fun2(a))>fabs(Fun2(x0)))
{
q=q/2.0;
a=Fun1(x0,q);
if(q<c)
{
printf("\n***下山不成功***\n");
break;
}
printf("%-12f%-12f%f\n",a,q,Fun2(a));
}
return a;
}
float Fun1(float x,float p)
{
//return x-p*((pow(x,3)-3*x-1)/(3*x*x-3));
return x-((x*x*x-x-1)/(3*x*x-1))*p;
}
float Fun2(float x)
{
return pow(x,3)-x-1;
//return pow(x,3)-3*x-1;
}
/*在本例题中,方程解在1.5左右,输入0.6让其牛顿下山*/
牛顿迭代、牛顿下山
最新推荐文章于 2024-01-06 22:35:30 发布