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让其牛顿下山*/