非线性方程求根问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机学院上机实践报告
一、目的
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) } 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/19 x=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((x1b)) { printf("re_select a proper initial value x0!\n"); exit(0); } if(fabs(x1-x0) { 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 #include #include #define EPS 0.000001 double 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) } 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 #include #include #define EPS 0.00001 double g(double x) { return(pow((5.0/2.0*x*x+19.0/2.0*x-21.0),1.0/3.0));