C_数值分析软件课程设计 计算B122 韩雨 201209014217_第1页
C_数值分析软件课程设计 计算B122 韩雨 201209014217_第2页
C_数值分析软件课程设计 计算B122 韩雨 201209014217_第3页
C_数值分析软件课程设计 计算B122 韩雨 201209014217_第4页
C_数值分析软件课程设计 计算B122 韩雨 201209014217_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、华北科技学院课程设计说明书华 北 科 技 学 院数值分析课程设计说明书班级: 计算B122 姓名: 韩雨 (201209014217) 设计题目: 非线性方程求根 设计时间: 2014.12.28 至 2015.01.04 指导教师: 张守成 评 语: _评阅成绩: 评阅教师: 目 录设计总说明1前 言2第1章 总体设计方案31.1 软件结构设计3第2章 算法分析及设计42.1二分法42.1.1二分法算法分析:42.1.2二分法算法设计:52.2迭代法52.2.1迭代法算法分析62.2.2迭代法算法设计72.3牛顿算法72.3.1牛顿算法分析82.3.2牛顿算法设计9第3章 软件详细设计103

2、.1主界面设计103.2功能设计103.2.1二分法的实现103.2.2迭代法的实现153.2.3牛顿法的实现183.2.4算法简介功能设计23第4章 软件测试244.1二分法的测试244.1.1 软件计算244.2迭代法的测试254.2.1 软件计算254.3牛顿法的测试264.3.1 软件计算264.4测试结果26第5章 总结27参 考 文 献28附 录28-28-设计总说明非线性方程求根是对于特殊方程的一种求解工具,为解决生活中的一般现象而产生的。但求解中的数值计算非常的大,所以我们要使用计算机来编程实现。在此基础上,前人们已经对这样的数学问题做了大量的研究,虽然取得了巨大的进步,但由于

3、当时的技术不发达,还要限制于人工的计算,这对及时性的大数据处理带来了巨大的挑战。到了21世纪,电子计算机的高速发展满足了这一方法用于现实解决问题。对次做出杰出贡献的数学大师,如I.牛顿、L.欧拉、C.F.高斯等人在这个领域做出了各自的贡献,并奠定了它的理论基础。用数值积分的计算理论加以C+语言编写程序来计算数值积分,不仅可以更好的掌握数值分析本身,还可以提高软件开发的能力。把所学知识用于实际生活中是非常有必要的。好的数值分析软件可以计算出给定函数的根,为解决现实问题提供了可能。因此,数值分析软件的开发是非常实用及有必要的。关键词: 二分法;迭代法;牛顿法;MFC 前 言本课程设计是在学习了数值

4、分析和C语言等有关课程后,通过实际的操作来熟悉数值分析和相关软件的应用,培养独立的完成对相关课题或者项目的分析能力、设计能力和调试能力。好的数值积分软件可以方便的为我们求解出积分值。课程设计,着重培养的是学生的自学能力,以及独立分析互联网上和图书馆里的各种资料,用来丰富自己的知识并且提高对Matlab、VC+等软件的实际操作能力。通过这次的课程设计,使我们对已经学习过的数值分析课程的进一步的掌握,对知识进行最大程度的消化融汇。因此这次的课程设计对我们来说具有非常重要的作用:为以后学习工作做必要的准备和实践,提高自身对数值分析的认识以及软件开发的能力。第1章 总体设计方案1.1 软件结构设计二分

5、法求根发牛顿法求根法迭代法求根发非线性求根C版二分法C版牛顿法C版迭代法算法简介主界面图1.1.1 软件功能结构图第2章 算法分析及设计2.1 二分法算法2.1.1二分法算法分析:给定精确度,用二分法求函数f(x)零点近似值的步骤如下:1 确定区间a,b,验证f(a)·f(b)<0,给定精确度.2 求区间(a,b)的中点c. 3 计算f(c).(1) 若f(c)=0,则c就是函数的零点;(2) 若f(a)·f(c)<0,则令b=c;(3) 若f(c)·f(b)<0,则令a=c.(4) 判断是否达到精确度:即若|a-b|<,则得到零点近似值a

6、(或b),否则重复2-4.2.1.2二分法算法设计:double CBinary:Bisection(double a,double b)UpdateData(true);m_display="二分次数 中点 函数值rn"double c,fc,fa=f(a),fb=f(b),fd=1000;int n=1;CString s;while(1)if(fa*fb>0) return 1000;c=(a+b)/2,fc=f(c);if(fabs(fc)<m_jing) break;else if(fa*fc<0) b=c;fb=fc;else a=c;fa=f

7、c;if(b-a<1e-6) break;s.Format("%6d",n);m_display+=s;s.Format("%lf",c);m_display=m_display+" "+s;if(fabs(fc)>0.1&&fd<fc) s.Format("%8.6f",fc*(1e-5);else s.Format("%8.6f",fc);m_display=m_display+" "+s+"rn"fd=fc;n+;f

8、c=f(c);s.Format("%6d",n);m_display+=s;s.Format("%lf",c);m_display=m_display+" "+s;/if(fabs(fc)>0.01) s.Format("%8.6f",fc*(1e-5);s.Format("%8.6f",fc);m_display=m_display+" "+s+"rn"m_cishu=n;UpdateData(false);return c;2.2迭代法2.2.1

9、迭代法算法分析对于给定的线性方程组x=Bx+f(这里的x、B、f同为矩阵,任意线性方程组都可以变换成此形式),用公式x(k+1)=Bx(k)+f(括号中为上标,代表迭代k次得到的x,初始时k=0)逐步带入求近似解的方法称为迭代法(或称一阶定常迭代法)。如果k趋向无穷大时limx(k)存在,记为x*,称此迭代法收敛。显然x*就是此方程组的解,否则称为迭代法发散。2.2.2迭代法算法设计double CDiedai:f(double x)CString str,str1=str=m_gai;str.Format("%lf",x);str1.Replace("x&quo

10、t;,str); CCalculation calcu;calcu.m_bDegree=1;str=calcu.MainPro(str1);if(-1!=str.Find(" ")str.Delete(str.Find(" ");return atof(str);void CDiedai:OnOK() / TODO: Add extra validation hereUpdateData(true);double x1=m_chu,x2=x1+1;int count=0;CString s;m_diedai=""while(fabs(

11、x2-x1)>m_jing)x2=x1;x1=f(x1);m_diedai=m_diedai+"f("s.Format("%10.8f",x2);m_diedai=m_diedai+s+")="/if(fabs(x1/x2)>10&&fabs(x2)<0.01) x1*=1e-6;s.Format("%10.8f",x1);m_diedai=m_diedai+s+"rn"count+;if(count>10000|x1>1e6)m_diedai+=&

12、quot;迭代不收敛"break;m_count=count;s.Format("%8.6f",x1);m_jie=s;UpdateData(false);/CDialog:OnOK();BOOL CDiedai:OnInitDialog() CDialog:OnInitDialog();/ TODO: Add extra initialization hereUpdateData(true);m_jing=1e-6;UpdateData(false);return TRUE; 2.3牛顿法算法2.3.1牛顿算法分析设r是的根,选取作为r的初始近似值,过点做曲线的

13、切线L,L的方程为,求出L与x轴交点的横坐标,称x1为r的一次近似值。过点做曲线的切线,并求该切线与x轴交点的横坐,称为r的二次近似值。重复以上过程,得r的近似值序列,其中,称为r的次近似值,上式称为牛顿迭代公式。用牛顿迭代法解非线性方程,是把非线性方程线性化的一种近似方法。把在点的某邻域内展开成泰勒级数,取其线性部分(即泰勒展开的前两项),并令其等于0,即,以此作为非线性方程的近似方程,若,则其解为, 这样,得到牛顿迭代法的一个迭代关系式:。2.3.2牛顿算法设计double CNiuton:f(double x)CString str,str1=str=m_shi;str.Format(&

14、quot;%lf",x);str1.Replace("x",str); CCalculation calcu;calcu.m_bDegree=1;str=calcu.MainPro(str1);if(-1!=str.Find(" ")str.Delete(str.Find(" ");return atof(str);double CNiuton:qiudao(double x)double dx=0.1,d1,d2;/CString s;/m_display=""d1=(f(x+dx)-f(x)/dx;w

15、hile(1)d2=d1;dx*=0.5;d1=(f(x+dx)-f(x)/dx;if(dx<1e-6) break;if(fabs(d2-d1)<1e-6) break;return d2;double CNiuton:Newton(double x0)UpdateData(true);double x1,d=1;int k=0,count=0;m_display=""CString s;while(fabs(d)>=m_jing)x1=x0-f(x0)/qiudao(x0);if(k+>1000) break;d=(fabs(x1)<1?x

16、1-x0:(x1-x0)/x1);x0=x1;s.Format("%d",k);m_display=m_display+"x("+s+")="s.Format("%f",x0);m_display=m_display+s+"rn"count+;m_count=count;UpdateData(false);return x1;void CNiuton:OnOK() / TODO: Add extra validation hereUpdateData(true);double jie;CStri

17、ng s;jie=Newton(m_x);s.Format("%8.6f",jie);m_jie=s;UpdateData(false);BOOL CNiuton:OnInitDialog() CDialog:OnInitDialog();UpdateData(true);m_jing=1e-6;UpdateData(false);return TRUE; 第3章 软件详细设计3.1主界面设计3.2功能设计3.2.1二分法的实现通过类向导为控件赋值,从界面获取上下界以及精度值,从而进行计算,将结果显示在对应框。若输入错误的数据将进行错误提示。图3.2.1 二分法代码:#in

18、clude "stdafx.h"#include "qiugen.h"#include "Binary.h"#include "math.h"#include "Calculation.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endifCBinary:CBinary(CWnd* pParent /*=NULL*/): CDialog(CBinary:IDD, pPare

19、nt)/AFX_DATA_INIT(CBinary)m_shi = _T("");m_shang = 0.0;m_xia = 0.0;m_jing = 0.0;m_cishu = 0;m_display = _T("");m_jie = _T("");void CBinary:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);DDX_Text(pDX, IDC_EDIT1, m_shi);DDX_Text(pDX, IDC_EDIT2, m_shang);DDX

20、_Text(pDX, IDC_EDIT3, m_xia);DDX_Text(pDX, IDC_EDIT4, m_jing);DDX_Text(pDX, IDC_EDIT6, m_cishu);DDX_Text(pDX, IDC_EDIT7, m_display);DDX_Text(pDX, IDC_EDIT5, m_jie);BEGIN_MESSAGE_MAP(CBinary, CDialog)END_MESSAGE_MAP()double CBinary:Bisection(double a,double b)UpdateData(true);m_display="二分次数 中点

21、函数值rn"double c,fc,fa=f(a),fb=f(b),fd=1000;int n=1;CString s;while(1)if(fa*fb>0) return 1000;c=(a+b)/2,fc=f(c);if(fabs(fc)<m_jing) break;else if(fa*fc<0) b=c;fb=fc;else a=c;fa=fc;if(b-a<1e-6) break;s.Format("%6d",n);m_display+=s;s.Format("%lf",c);m_display=m_displ

22、ay+" "+s;if(fabs(fc)>0.1&&fd<fc) s.Format("%8.6f",fc*(1e-5);else s.Format("%8.6f",fc);m_display=m_display+" "+s+"rn"fd=fc;n+;fc=f(c);s.Format("%6d",n);m_display+=s;s.Format("%lf",c);m_display=m_display+" "+

23、s;s.Format("%8.6f",fc);m_display=m_display+" "+s+"rn"m_cishu=n;UpdateData(false);return c;double CBinary:f(double x)CString str,str1=str=m_shi;str.Format("%lf",x);str1.Replace("x",str); CCalculation calcu;calcu.m_bDegree=1;str=calcu.MainPro(str1);if(

24、-1!=str.Find(" ")str.Delete(str.Find(" ");return atof(str);void CBinary:OnOK() UpdateData(true);double jie;CString s;jie=Bisection(m_xia,m_shang);if(jie=1000)m_jie="Error"m_display="错误!rn在您指定的区间内没有根或者有多个根!rn请重新调整区间!"m_cishu=0;elses.Format("%8.6f",jie

25、);m_jie=s;UpdateData(false);BOOL CBinary:OnInitDialog() CDialog:OnInitDialog();UpdateData(true);m_jing=1e-6;UpdateData(false);return TRUE; 3.2.2迭代法的实现图3.2.4 迭代法代码:#include "stdafx.h"#include "qiugen.h"#include "Diedai.h"#include "math.h"#include "Calculat

26、ion.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endifCDiedai:CDiedai(CWnd* pParent /*=NULL*/): CDialog(CDiedai:IDD, pParent)/AFX_DATA_INIT(CDiedai)m_yuan = _T("");m_gai = _T("");m_chu = 0.0;m_jing = 0.0;m_diedai = _T("");m_co

27、unt = 0;m_jie = _T("");void CDiedai:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);DDX_Text(pDX, IDC_EDIT1, m_yuan);DDX_Text(pDX, IDC_EDIT2, m_gai);DDX_Text(pDX, IDC_EDIT3, m_chu);DDX_Text(pDX, IDC_EDIT4, m_jing);DDX_Text(pDX, IDC_EDIT5, m_diedai);DDX_Text(pDX, IDC_EDIT6, m_

28、count);DDX_Text(pDX, IDC_EDIT7, m_jie);BEGIN_MESSAGE_MAP(CDiedai, CDialog)END_MESSAGE_MAP()double CDiedai:f(double x)CString str,str1=str=m_gai;str.Format("%lf",x);str1.Replace("x",str); CCalculation calcu;calcu.m_bDegree=1;str=calcu.MainPro(str1);if(-1!=str.Find(" ")st

29、r.Delete(str.Find(" ");return atof(str);void CDiedai:OnOK() UpdateData(true);double x1=m_chu,x2=x1+1;int count=0;CString s;m_diedai=""while(fabs(x2-x1)>m_jing)x2=x1;x1=f(x1);m_diedai=m_diedai+"f("s.Format("%10.8f",x2);m_diedai=m_diedai+s+")="s.For

30、mat("%10.8f",x1);m_diedai=m_diedai+s+"rn"count+;if(count>10000|x1>1e6)m_diedai+="迭代不收敛"break;m_count=count;s.Format("%8.6f",x1);m_jie=s;UpdateData(false);BOOL CDiedai:OnInitDialog() CDialog:OnInitDialog();UpdateData(true);m_jing=1e-6;UpdateData(false);re

31、turn TRUE; 3.2.3牛顿法的实现同样,通过类向导为控件赋值 。单机计算按钮,即可将结果显示在结果框。图3.2.6 牛顿法代码:#include "stdafx.h"#include "qiugen.h"#include "Niuton.h"#include "Calculation.h"#include "math.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#e

32、ndifCNiuton:CNiuton(CWnd* pParent /*=NULL*/): CDialog(CNiuton:IDD, pParent)m_shi = _T("");m_x = 0.0;m_jing = 0.0;m_display = _T("");m_jie = _T("");m_count = 0;void CNiuton:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CNiuton)DDX_Text(pDX,

33、IDC_EDIT1, m_shi);DDX_Text(pDX, IDC_EDIT2, m_x);DDX_Text(pDX, IDC_EDIT3, m_jing);DDX_Text(pDX, IDC_EDIT5, m_display);DDX_Text(pDX, IDC_EDIT4, m_jie);DDX_Text(pDX, IDC_EDIT6, m_count);/AFX_DATA_MAPBEGIN_MESSAGE_MAP(CNiuton, CDialog)END_MESSAGE_MAP()/ CNiuton message handlersdouble CNiuton:f(double x)

34、CString str,str1=str=m_shi;str.Format("%lf",x);str1.Replace("x",str);CCalculation calcu;calcu.m_bDegree=1;str=calcu.MainPro(str1);if(-1!=str.Find(" ")str.Delete(str.Find(" ");return atof(str);double CNiuton:qiudao(double x)double dx=0.1,d1,d2;/CString s;/m_dis

35、play=""d1=(f(x+dx)-f(x)/dx;while(1)d2=d1;dx*=0.5;d1=(f(x+dx)-f(x)/dx;if(dx<1e-6) break;if(fabs(d2-d1)<1e-6) break;return d2;double CNiuton:Newton(double x0)UpdateData(true);double x1,d=1;int k=0,count=0;m_display=""CString s;while(fabs(d)>=m_jing)x1=x0-f(x0)/qiudao(x0);i

36、f(k+>1000) break;/MessageBox("aa");d=(fabs(x1)<1?x1-x0:(x1-x0)/x1);/d=fabs(x1-x0);x0=x1;s.Format("%d",k);m_display=m_display+"x("+s+")="s.Format("%f",x0);m_display=m_display+s+"rn"count+;m_count=count;/if(count>1000) break;UpdateDa

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论