分别用牛顿迭代法弦截法和二分法求根.docx

上传人:b****6 文档编号:8562878 上传时间:2023-01-31 格式:DOCX 页数:15 大小:109.23KB
下载 相关 举报
分别用牛顿迭代法弦截法和二分法求根.docx_第1页
第1页 / 共15页
分别用牛顿迭代法弦截法和二分法求根.docx_第2页
第2页 / 共15页
分别用牛顿迭代法弦截法和二分法求根.docx_第3页
第3页 / 共15页
分别用牛顿迭代法弦截法和二分法求根.docx_第4页
第4页 / 共15页
分别用牛顿迭代法弦截法和二分法求根.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

分别用牛顿迭代法弦截法和二分法求根.docx

《分别用牛顿迭代法弦截法和二分法求根.docx》由会员分享,可在线阅读,更多相关《分别用牛顿迭代法弦截法和二分法求根.docx(15页珍藏版)》请在冰豆网上搜索。

分别用牛顿迭代法弦截法和二分法求根.docx

分别用牛顿迭代法弦截法和二分法求根

华北理工大学

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文库,基于牛顿迭代法、弦截法和二分法求根。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 工作总结汇报

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1