上机报告-二分法,史蒂芬森迭代,割线法

  • 格式:doc
  • 大小:213.22 KB
  • 文档页数:8

计算方法上机实习报告[题目及目的要求]1.用二分法求方程0163=--x x 在[0,5]上根的近似值。

用牛顿迭代法求0133=--x x 在2=x 附近的实根。

2.完成史蒂芬森迭代加速法和割线法的子程序,并利用方程010423=--x x 对比对分法与一般迭代法。

[方法原理说明]1.二分法和牛顿迭代法:二分法是逐次把有根区间分半,舍弃无根区间而保留有根区间的一种逼近根的方法。

在这个过程中有根区间的长度以2的幂次方减少,当有根区间的长度小于给定的精度时,其中点就作为根的近似值。

牛顿迭代法的迭代格式为: 初值0x ()()k k k k x f x f x x '1-=+ (k=0,1,2....)显然,牛顿迭代格式能够迭代下去必须要求()k x f 的导数不能为0.当某个()0'=k x f 或很小时,迭代中断;当()k x f 满足一定条件时,牛顿迭代具有平方收敛速度。

该方法对初值0x 要求较高,若选取不当,则可能发散,若选取的好,则收敛很快。

2.史蒂芬森迭代加速法和割线法迭代法就是通过一个迭代格式进行反复迭代以产生一个序列。

若这个序列收敛于方程的根,就称这个迭代格式收敛。

史蒂芬森迭代加速法的迭代格式为()kk k k k k k x y z x y x x +---=+221()k k x f y = ,()k k y f z = (k=0,1,2....)割线法与牛顿迭代法一样,即在根的某个邻域内,()k x f 有直至二阶的连续导数,且()0'≠k x f ,则在邻域内选取初值10,x x ,迭代均收敛。

割线法的迭代格式为初值10,x x()()()()111--+---=k k k k k k k x x x f x f x f x x (k=2,3....)[计算步骤]1.二分法:1)给定a,b 及精度要求ep ; 2)计算x=(a+b )/2 及()k x f ;3)若b-a<ep ,则返回主程序,x 作为近似根,否则转4; 4)若()()0<a f x f ,则b x ⇒,否则a x ⇒; 5)转2。

牛顿迭代法:1)输入初始值0x ,精度要求ep ,允许最大迭代次数max N ; 2)k=1,G=()0'x f ;3)若G <ep ,则停止计算,迭代中断,否则计算 ()Gx f x x 001-=4)若ep x x <-01,则1x 为近似解,返回主程序。

否则计算 ()k k x x G x f ⇒+⇒⇒1,,011' 5)若max N k ≥,则停止计算,迭代发散,否则转3。

2.割线法:1)输入初始值10,x x ,精度要求ep ,允许的最大迭代次数max N ; 2)k=1,G=()0'x f ;3)若G <ep ,则停止计算,迭代中断,否则计算()()()()0101112x x x f x f x f x x ---=4)若ep x x <-12,则2x 为近似解,返回主程序。

否则计算k k x x ⇒+⇒1,125)若max N k ≥,则停止计算,迭代发散,否则转3。

史蒂芬森加速迭代法:1)输入初始值0x ,精度要求ep ,允许的最大迭代次数max N ; 2)计算()()()x f x f x x f x '1201G ,===,; 3)若G <ep ,则停止计算,迭代中断,否则计算210212012x x x x x x x +--=4)若ep x x <-01,则1x 近似解,返回主程序。

否则计算 k k x x ⇒+⇒1,015)若max N k ≥,则停止计算,迭代发散,否则转3。

[程序清单及运行结果]1.二分法和牛顿迭代法: 1)二分法: #include<stdio.h> double f(double x) { double f1; f1=x*x*x-6*x-1; return(f1); }double df(double a,double b,double x,double ep) { double c; c=b-a; while(c>=ep) { x=(a+b)/2; if(f(a)*f(x)>0) a=x; else b=x; c=b-a; } x=(a+b)/2; return(x); }main() { double a,b,x,ep; a=0.0; b=5.0; ep=0.000001; x=0.0; x=df(a,b,x,ep); printf("the root of f(x) is %f\n",x); }执行结果:2)牛顿迭代法:#include<stdio.h>double f(double x){double al;al=x*x*x-3*x-1;return(al);}double fl(double x){double bl;bl=3*x*x-3;return(bl);}double nt(double x,double ep,int flag,int nmax){int k;double x0,g;flag=1;k=1;while((fabs(x-x0)>ep)&&(k<nmax)){x0=x;g=fl(x0);if(fabs(g)<ep){flag=0;break;}x=x0-f(x0)/g;k=k+1;}return(x);}main(){int flag,nmax;double x,ep;ep=0.000001;nmax=200;x=2;x=nt(x,ep,flag,nmax);if(flag==0)printf("the newton method is failure");else printf("the root of f(x) is %f\n",x); }执行结果:2.史蒂芬森加速迭代法和割线法1)史蒂芬森加速迭代法:#include<stdio.h>#include<math.h>double f(double x){double a1;a1=x*x*x+4*x*x-10;return(a1);}double nt(double x,double ep,int flag,int nmax){ int k;double x0,g;flag=1;k=1;while((fabs(x-x0)>ep)&&(k<nmax)) {x0=x;if(fabs(g)<ep){flag=0;break;}x=x0-(f(x0)-x0)*(f(x0)-x0)/(f(f(x 0))-2*f(x0)+x0); k=k+1; }if(k>=nmax) flag=0; return(x); }void main() {int flag,nmax; double x,ep; ep=0.000001; nmax=200; x=2;x=nt(x,ep,flag,nmax);if(flag==0) printf("the method is failure");else printf("the root of f(x) is %f\n",x); }执行结果:2)割线法:#include<stdio.h> #include<math.h> double f(double x) {double a1;a1=x*x*x+4*x*x-10; return(a1); }double nt(double x1,double x2,double ep,int nmax) {int k; double x3; k=1;while((fabs(x3-x2)>ep)&&(k<nmax)) {x3=x2-f(x2)/(f(x2)-f(x1))*(x2-x1);x1=x2; x2=x3; k=k+1; }return(x3); }void main() {int nmax;double x1,x2,x3,ep; ep=0.000001; nmax=200; x1=1.6; x2=1.5;x3=nt(x1,x2,ep,nmax); printf("the root of f(x) is %f\n",x3); }执行结果:3.对分法和一般迭代法求解方程010423=--x x 一般迭代法:#include<stdio.h>#include<math.h>double f(x)double x;{double a1;a1=x*x*x+4*x*x-10;return(a1);}double f1(x)double x;{double b1;b1=3*x*x+4*x;return(b1);}double nt(x,ep,flag,nmax)double x,ep;int flag,nmax;{int k;FILE *fp;int i;double x0,g;flag=1;k=1;while((fabs(x-x0)>ep)&&(k<nmax)){fp=fopen("diedai.xls","w");x0=x;g=f1(x0);if(fabs(g)<ep){flag=0;break;}for(i=0;i<20;i++){x=x0-f(x0)/g;printf("%14.8f\n",x);fprintf(fp,"%d%15.8f\n",i,x);x0=x;}k=k+1;fclose(fp);}if(k>=nmax) flag=0;return(x);}void main(){int flag,nmax;double x,ep;ep=0.000001;nmax=200;x=2;x=nt(x,ep,flag,nmax);if(flag==0) printf("the newton method is failure");else printf("the root of f(x) is %f\n",x);}对分法:#include<stdio.h> double f(x)double x;{double f1;f1=x*x*x+4*x*x-10; return(f1);} double df(a,b,x,ep)double a,b,x,ep;{double c;FILE *fp;int i;c=b-a;while(c>=ep){fp=fopen("erfenfa.xls","w"); for(i=0;i<20;i++){x=(a+b)/2;if(f(a)*f(x)>0) a=x;else b=x;c=b-a;printf("%14.8f\n",x); fprintf(fp,"%d%15.8f\n",i,x); }fclose(fp);}x=(a+b)/2;return(x); }void main(){double a,b,x,ep;a=1;b=2;ep=0.000001;x=0;x=df(a,b,x,ep);printf("the root of f(x) is %f\n",x); }[运行结果分析及程序评价]1.运行结果分析:二分法求根收敛速度:一般迭代法收敛速度:由二分法和一般迭代法图表,可以看出用一般迭代法求根的收敛速度快于二分法[总结]通过本次上机实习,熟悉了二分法、牛顿迭代法、史蒂芬森加速迭代法和割线法的应用,并加深了对二分法和牛顿迭代法收敛速度的了解。