当前位置:文档之家› 非线性方程求根问题

非线性方程求根问题

计算机学院上机实践报告一、目的1.通过本实验,帮助加深对非线性方程求根方法的构造过程的理解;2.能将各种方法编写为程序并上机实现;3.比较各种方法在求解同一非线性方程根时,在收敛情况上的差异。

二、容与设计思想1.用二分法求方程f(x)=x3-2x-5=0在区间[2 , 3]的根。

2.方程f(x)=2x3-5x2-19x+42=0在x=3.0附近有根,试写出其三种不同的等价形式以构成三种不同的迭代格式,再用简单迭代法求根,观察这三种迭代是否收敛。

三、使用环境1. 硬件环境微型计算机(Intel x86系列CPU)一台2. 软件环境Windows2000/XP操作系统VC++6.0或其它的开发工具。

四、核心代码及调试过程1.用二分法求方程f(x)=x3-2x-5=0在区间[2 , 3]的根主要代码:void bisect(double a,double b,int max_B){ double root, ya,yb,yroot;int i,actual_B;ya=f(a);yb=f(b);if(ya*yb>0){ printf("method failed!\n");exit(0); }for(i=1;i<=max_B;i++){ root=(a+b)/2;yroot=f(root); //取当前含根区间的中点if(yroot==0){ a=root;b=root;}else if(yb*yroot>0) //取含根区间为[a,(a+b)/2]{ b=root;yb=yroot;}Else //取含根区间为[(a+b)/2,b]{ a=root;ya=yroot;}if(fabs(b-a)<EPS) break;}root=(a+b)/2; yroot=f(root); actual_B=i;printf("root=%10.6lf\tf(root)=%10.6e\tatual_B=%d\n",root,yroot,actual_B); } 结果:2.迭代格式分别为:x=2/19*x*x*x-5/19*x*x+42/19x=sqrt(2/5*x*x*x-19/5*x+42/5);x=(5/2*x*x+19/2*x-21)^(1/3)主要代码:double g(double x){return(pow((2.0/19.0*x*x*x-5/19*x*x+42/19),1.0)); /*定义迭代函数*/}void iterate(double a,double b,double x0,int max_D){int k=1;double x1;while(k<=max_D){x1=g(x0); /*迭代计算*/if((x1<a)||(x1>b)){printf("re_select a proper initial value x0!\n");exit(0);}if(fabs(x1-x0)<EPS) /*迭代成功并达到精度要求*/{printf("method succeed!\n");printf("root=%10.6lf\n",x1);break;}x0=x1;k++; /*x0的值被更新,累加迭代次数*/}printf("iteration times=%d\n",k); /*输出实际迭代次数*/if(k>max_D)printf("method failed!\n");}int main(){ double a=2.0,b=3.0,x0=(a+b)/2.0;int max_D=50;iterate(a,b,x0,max_D);}前两种迭代结果:第三种:输入数据时应注意数据的类型,否则程序会报错。

五、总结1、两道题结果值均是7为有效数字,精度较高,计算次数较少。

2、写程序时应注意数字的类型。

六、附录代码:1——1#include<stdio.h>#include<math.h>#include<stdlib.h>#define EPS 0.000001double f(double x){return(x*x*x-2*x-5);}void bisect(double a,double b,int max_B){double root, ya,yb,yroot;int i,actual_B;ya=f(a);yb=f(b);if(ya*yb>0){printf("method failed!\n");exit(0);}for(i=1;i<=max_B;i++){root=(a+b)/2;yroot=f(root);if(yroot==0){ a=root;b=root;}else if(yb*yroot>0){ b=root;yb=yroot;}else{ a=root;ya=yroot;}if(fabs(b-a)<EPS) break;}root=(a+b)/2; yroot=f(root); actual_B=i;printf("root=%10.6lf\tf(root)=%10.6e\tatual_B=%d\n",root,yroot,actual_B);}int main(){double a=2,b=3;int max_B=50;bisect(a, b,max_B);return 0; }1——2#include<stdio.h>#include<math.h>#include<stdlib.h>#define EPS 0.00001double g(double x){return(pow((5.0/2.0*x*x+19.0/2.0*x-21.0),1.0/3.0));}void iterate(double a,double b,double x0,int max_D){int k=1;double x1;while(k<=max_D){x1=g(x0);if((x1<a)||(x1>b)){printf("re_select a proper initial value x0!\n");exit(0);}if(fabs(x1-x0)<EPS){printf("method succeed!\n");printf("root=%10.6lf\n",x1);break;}x0=x1;k++;}printf("iteration times=%d\n",k);if(k>max_D)printf("method failed!\n");}int main(){double a=2.0,b=4.0,x0=(a+b)/2.0;int max_D=50;iterate(a,b,x0,max_D);}2——1#include<stdio.h>#include<math.h>#include<stdlib.h>#define EPS 0.00001double g(double x){return(pow((2.0/5.0*x*x*x-19.0/5.0*x+42/5),1.0/2.0)); }void iterate(double a,double b,double x0,int max_D){int k=1;double x1;while(k<=max_D){x1=g(x0);if((x1<a)||(x1>b)){printf("re_select a proper initial value x0!\n");exit(0);}if(fabs(x1-x0)<EPS){printf("method succeed!\n");printf("root=%10.6lf\n",x1);break;}x0=x1;k++;}printf("iteration times=%d\n",k);if(k>max_D)printf("method failed!\n");}int main(){double a=2.0,b=4.0,x0=(a+b)/2.0;int max_D=50;iterate(a,b,x0,max_D);}2——2#include<stdio.h>#include<math.h>#include<stdlib.h>#define EPS 0.00001double g(double x){return(pow((2.0/19.0*x*x*x-5.0/19.0*x*x+42.0/19.0),1.0)); }void iterate(double a,double b,double x0,int max_D){int k=1;double x1;while(k<=max_D){x1=g(x0);if((x1<a)||(x1>b)){printf("re_select a proper initial value x0!\n");exit(0);}if(fabs(x1-x0)<EPS){printf("method succeed!\n");printf("root=%10.6lf\n",x1);break;}x0=x1;k++;}printf("iteration times=%d\n",k);if(k>max_D)printf("method failed!\n");}int main(){double a=2.0,b=4.0,x0=(a+b)/2.0;int max_D=50;iterate(a,b,x0,max_D);}。

相关主题