非线性方程求根问题

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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));

相关文档
最新文档