分别用牛顿迭代法弦截法和二分法求根.docx
《分别用牛顿迭代法弦截法和二分法求根.docx》由会员分享,可在线阅读,更多相关《分别用牛顿迭代法弦截法和二分法求根.docx(15页珍藏版)》请在冰豆网上搜索。
分别用牛顿迭代法弦截法和二分法求根
华北理工大学
2016-2017第2学期
《软件设计基础-C++》
课程设计报告
设计名称:
分别用牛顿迭代法、弦截法和二分法求根
姓名:
温祥学号:
201614030414
专业班级:
无极非金属材料工程专业材4
学院:
材料科学与工程学院
设计时间:
2017.06.04
设计地点:
学校01机房
指导教师评语:
教师评定:
自评成绩:
指导教师签字:
年月日
1.课程设计目的
2.课程设计任务与要求
3.课程设计说明书
4.课程设计成果
5.程序调试过程
6.设计问题的不足和改进方案
7.课程设计心得
8.参考文献
1.课程设计目的
《软件设计基础-C++》课程设计是这门课程的实践性教学环节之一,本次设计结合实际应用的要求,使课程设计既覆盖C++的知识点,又接近工程实际需要。
目的是通过课程设计的综合训练,培养学生实际分析问题、解决问题的能力,以及编程和动手能力,最终目标是通过课程设计这种形式,帮助学生系统掌握C++这门课程的主要内容,养成良好的编程习惯,更好的完成教学任务。
2.课程设计任务与要求:
要求:
本次课程设计利用《软件设计基础-C++》课程中所学到的编程知识和编程技巧,完成具有一定难度和工作量的程序设计题目,帮助学生掌握编程、调试的基本技能,独立完成所布置的任务。
要求:
1、对系统进行功能需求分析
2、设计合理的数据结构和系统框架
3、编程简练,程序功能齐全,能正确运行
4、说明书、流程图要清楚
5、课题完成后必须按要求提交课程设计报告
任务:
分别用牛顿迭代法、弦截法和二分法求根
(1)用设计和模块化C语言的思想来完成程序的设计;
(2)分别编写牛顿迭代法、弦截法和二分法求根的函数。
(3)在VC++6.0环境中,调试程序,及时查究错误,独立调试完成。
(4)程序调试通过后,完成程序文档的整理,加必要的注释。
(5)在基本要求达到后,进行创新设计,如利用输入文本文件提供矩阵的数据等。
3.课程设计说明书
概要设计
用户输入x0,计算机显示牛顿迭代法计算的值,用户分别输入x的范围,分别输出二分法和弦截法的计算值,并计算出各种方法的迭代次数,输出最小的迭代次数。
模块说明:
在我设计的程序中一共包括了七个模块,分别是:
main模块、f函数模块、f1模块、nt模块、half模块、chord模块、cishu模块。
这七个模块说明如下:
1)main模块
该函数无返回值。
要实现的功能是询问x初值,输出牛顿迭代法的计算值,询问x的范围,输出二分法和弦截法的计算值。
代码参见main函数。
2)f模块
该函数返回x的给定公式函数值。
代码参见f函数。
3)f1模块
该函数返回给定公式的导数的函数值。
代码参见f1函数。
4)nt模块
主要使用for函数,判断是否满足精度要求,实现语句循环,使该函数返回牛顿迭代法的计算根。
代码参见nt函数。
5)half模块
使用for函数,判断是否满足精度要求,使用if函数判断是否异号,实现语句循环,使该函数返回二分法计算的根。
代码参见half函数。
6)chord模块
使用for函数,判断是否满足精度要求,使用if函数判断是否异号,实现语句循环,使该函数返回弦截法的计算值。
代码参见chord函数。
7)cishu模块
主要使用break,判断是否跳出循环,该函数返回迭代次数的函数值。
代码参见cishu函数。
模块结构图:
每一次运算的过程可以由这几部分完成:
用户输入x初值,计算牛顿迭代法的值并输出,用户输入x的范围,计算二分法和弦截法的值并输出结果,总共五个步骤:
模块
函数名称
用户输入x初值
main
计算牛顿迭代法的值并输出
nt
用户输入x的范围
main
计算二分法
half
弦截法
chord
迭代次数
cishu
对于每一次运行,关注的数据有四个:
x的初值,x的范围,x范围的函数值,x的迭代次数。
详细设计
总体流程图:
各功能模块流程图:
1)main函数
voidmain()
{
while
(1)//使函数一直运行
{
cout<<"\n-----牛顿迭代法-----"<cout<<"请输入x0:
";
cin>>a;
nt();
cout<<"\n-----二分法弦截法求根-----"<cout<<"请输入根所在的范围:
";
cin>>b>>c;
half();
chord();
cishu();
}
}
2)f(doublex)函数
doublef(doublex)//给定公式
{
return(x*x*x-2*x*x+7*x+4);
}
3)f1(doublex)函数
doublef1(doublex)//求导
{
return(3*x*x-4*x+7);
}
4)nt(doublea)函数
voidnt()//牛顿迭代法
{
doublex0,x=a;
for(inti=0;(fabs(x-x0))>1e-6;i++)//判断是否满足精度
{
x0=x;
x=x0-f(x)/f1(x);//牛顿法公式
}
nn=i;
cout<<"牛顿迭代法的结果为:
"<}
5)half(doubleb,doublec)函数
voidhalf()//二分法
{
doublex0,x1,x2;
x1=b;
x2=c;
for(inti=0;(fabs(x1-x2))>1e-6;i++)//判断是否满足精度
{
x0=(x1+x2)/2;//二分法公式找中点
if(f(x0)*f(x1)<0)//判断是否异号
x2=x0;//若异号取右区间
else//否则取左区间
x1=x0;
}
ef=i;
cout<<"二分法的结果为:
"<}
6)chord(doubleb,doublec)函数
voidchord()//弦截法
{
doublex0,x1,x2;
x1=b;
x2=c;
for(inti=0;(fabs(x1-x2))>1e-6;i++)//判断是否满足精度
{
x0=x2-(x2-x1)*f(x2)/(f(x2)-f(x1));//弦截法公式
if(f(x1)*f(x0)<0)//判断异号
x2=x0;//若异号取右区间
else//否则区左区间
x1=x0;
}
xj=i;
cout<<"弦截法的结果为:
"<}
7)cishu函数
voidcishu()
{
d[0]=nn;
d[1]=ef;
d[2]=xj;
intmin=1000000;
for(inti=0;i<3;i++)
{
if(d[i]min=d[i];
cout<<"\n"<<"最少的次数为"<break;//若d[i]}
if(min==d[0])
cout<<"是牛顿迭代法。
"<if(min==d[1])
cout<<"是二分法。
"<if(min==d[2])
cout<<"是弦截法。
"<}
4.课程设计成果
程序的源代码
#include
usingnamespacestd;
#include
doublef(doublex);//声明函数
doublef1(doublex);
doublea,b,c;
intnn=0,ef=0,xj=0;
intd[3];//定义整型数组d,包含3个数组元素
voidnt();
voidhalf();
voidchord();
voidcishu();
voidmain()
{
while
(1)//使函数一直运行
{
cout<<"\n-----牛顿迭代法-----"<cout<<"请输入x0:
";
cin>>a;
nt();
cout<<"\n-----二分法求根-----"<cout<<"请输入根所在的范围:
";
cin>>b>>c;
half();
cishu();
cout<<"\n-----弦截法求根-----"<cout<<"请输入根所在的范围:
";
cin>>b>>c;
chord();
cishu();
}
}
doublef(doublex)//给定公式
{
return(x*x*x-2*x*x+7*x+4);
}
doublef1(doublex)//求导
{
return(3*x*x-4*x+7);
}
voidnt()//牛顿迭代法
{
doublex0,x=a;
for(inti=0;(fabs(x-x0))>1e-6;i++)//判断是否满足精度
{
x0=x;
x=x0-f(x)/f1(x);//牛顿法公式
}
nn=i;
cout<<"牛顿迭代法的结果为:
"<}
voidhalf()//二分法
{
doublex0,x1,x2;
x1=b;
x2=c;
for(inti=0;(fabs(x1-x2))>1e-6;i++)//判断是否满足精度
{
x0=(x1+x2)/2;//二分法公式找中点
if(f(x0)*f(x1)<0)//判断是否异号
x2=x0;//若异号取右区间
else//否则取左区间
x1=x0;
}
ef=i;
cout<<"二分法的结果为:
"<}
voidchord()//弦截法
{
doublex0,x1,x2;
x1=b;
x2=c;
for(inti=0;(fabs(x1-x2))>1e-6;i++)//判断是否满足精度
{
x0=x2-(x2-x1)*f(x2)/(f(x2)-f(x1));//弦截法公式
if(f(x1)*f(x0)<0)//判断异号
x2=x0;//若异号取右区间
else//否则区左区间
x1=x0;
}
xj=i;
cout<<"弦截法的结果为:
"<}
voidcishu()
{
d[0]=nn;
d[1]=ef;
d[2]=xj;
intmin=1000000;
for(inti=0;i<3;i++)
{
if(d[i]min=d[i];
cout<<"\n"<<"最少的次数为"<break;//若d[i]}
if(min==d[0])
cout<<"是牛顿迭代法。
"<if(min==d[1])
cout<<"是二分法。
"<if(min==d[2])
cout<<"是弦截法。
"<}
运行结果
5.程序调试过程
调试步骤
使用户输入x初值0.5,计算牛顿迭代法的正确计算值,输入x的范围(-1,1),计算二分法的正确计算值,输入x的范围(-1,0),计算弦截法的正确计算值,而且可以计算出函数的迭代次数,比较3种方法的迭代次数,并输出最小迭代次数。
遇到的问题
二分法和弦截法函数处,区间的取舍有困难。
对公示的理解不到位,常常使计算结果误差很大,甚至得不到正确结果。
6.设计问题的不足和改进方案
1、设计问题的不足
经过和同学之间的讨论,以及网上借鉴前辈的源程序,最终我的程序基本完成了任务中规定的设计内容,程序运行正确,并求出三种方法的迭代次数,并输出最少的迭代次数。
但在进行程序设计的过程中,发现自己仍然对许多方面的内容理解不够透彻,在设计程序时,需要收集大量的资料,借鉴前辈的成果,在实际设计这一方面仍缺乏经验,需要在今后的学习中,加大课程设计方面的练习,提高自己的编程能力。
2、对课题提出更完善的方案
将程序运行时输入的内容保存在外存储器中,在程序运行结束以及下次运行时,仍能够使用已保存的数据,实现程序的实用性。
增加人机互动模块,选择退出,继续等功能。
7.课程设计心得
经过本次课设,我不仅熟悉了牛顿迭代法、二分法和弦截法的运算原理,加深了对程序语句的理解与运用,而且掌握了程序设计的基本步骤,熟悉了如何简化一个复杂问题的基本思路。
当然,经过这种实践类的作业,我也充分认识到自己知识的严重欠缺,对程序语句的理解和熟练程度不够,面对一个复杂的问题,要学会简化处理步骤,分步骤一点一点的循序处理,只有这样,才能高效的解决一个复杂问题,才能准确而有序的得到正确的结果。
今后,我要谦虚而谨慎的学习相关科学文化知识。
总之,通过分别用牛顿迭代法、弦截法和二分法求根的课程设计,提高了我面对实际问题利用C++语言解决的能力,提高了我对C++语言进行程序设计的能力,加强了函数运用。
提高了我的归纳总结的能力、程序调试的技巧、代码规范化的素质。
提高了我对问题的分析、解决、运用的能力。
在此,我十分感谢帮助我的同学,更感谢教授我C++语言的老师,使我能够学习并利用C++语言来解决数学问题。
8.参考文献
1.C/C++程序设计案例教程——基于计算思维。
2.XX文库,基于牛顿迭代法、弦截法和二分法求根。