方程求根计算器实验报告一C++版.docx
- 文档编号:29806050
- 上传时间:2023-07-27
- 格式:DOCX
- 页数:24
- 大小:139.22KB
方程求根计算器实验报告一C++版.docx
《方程求根计算器实验报告一C++版.docx》由会员分享,可在线阅读,更多相关《方程求根计算器实验报告一C++版.docx(24页珍藏版)》请在冰豆网上搜索。
方程求根计算器实验报告一C++版
计算方法实验
题目:
班级:
学号:
姓名:
目录
计算方法实验1
1实验目的3
2实验步骤3
2.1环境配置:
3
2.2添加头文件3
2.3主要模块3
3代码4
3.1主程序部分4
3.2多项式方程部分4
3.3核心算法部分7
3.4数据结构部分11
4运行结果16
4.1二分法运行结果16
4.2牛顿迭代法运行结果17
4.3割线法运行结果18
边界情况调试18
5总结20
输入输出20
二分法20
牛顿迭代法20
割线法20
6参考资料20
1实验目的
1.通过编程加深二分法、牛顿法和割线法求解多项式方程的理解
2.观察上述三种方法的计算稳定性和求解精度并比较各种方法利弊
2实验步骤
2.1环境配置:
VS2013,C++控制台程序
2.2添加头文件
#include"stdio.h"
#include"stdlib.h"
#include"stdafx.h"
2.3主要模块
程序一共分成三层,最底层是数据结构部分,负责存储数据,第二层是交互部分,即多项式方程部分,负责输入输出获得数据,最上层是核心的算法部分,负责处理已获得的数据。
主函数负责获取方程系数并显示,算法和方程作为后台程序,顺序表作为存储手段。
3代码
3.1主程序部分
//squencelistandlinklist1.cpp:
定义控制台应用程序的入口点。
//
#include"stdio.h"
#include"stdlib.h"
#include"stdafx.h"
#include"squencelist.h"
#include"equation.h"
#include
///////////////////////////////////主程序//////////////////////////////////////
int_tmain(intargc,_TCHAR*argv[])
{
GetEquation();
ShowMenu();
return0;
}
3.2多项式方程部分
●方程部分头文件
#ifndef_EQUATION_H
#define_EQUATION_H
#include"squencelist.h"
#include"stdio.h"
#include"stdlib.h"
externinthighestx;
externsequenlist*B;
externsequenlist*D;
doubleFunction(sequenlist*B,doublex);
voidGetEquation(void);
voidShowMenu(void);
voidprintfunction(sequenlist*A);
sequenlistDerivative(sequenlist*A,inthighestx);
#endif
●方程部分CPP文件
#include"stdafx.h"
#include"equation.h"
#include"math.h"
#include"algorithm.h"
#include"squencelist.h"
//全局变量
inthighestx=0;
sequenlist*B;
sequenlist*D;
//////////////////////////多项式函数///////////////////////////
doubleFunction(sequenlist*A,doublex)
{
doublef=0.00;
inti;
for(i=1;i<=A->last;i++)
f=f+A->data[i]*pow(x,A->last-i);
returnf;
}
////////////////////////多项式函数系数/////////////////////////
voidGetEquation(void)
{
intj=0;
intx=0;
B=InitList();
cout<<"方程最高项次数(如y=x^3最高项次数为3):
"< cin>>highestx; cout<<"输入方程系数,输入00结束(如y=x^2+2x+1输入12100): "< cin>>x; while(x! =00) { for(j=1;j<=highestx+1;j++) { if(! Insert(B,x,j))exit(0); cin>>x; } } j=1; printfunction(B); } //////////////////////////显示交互///////////////////////////// voidShowMenu(void) { intx; doublea,b,ex,ef,res,x0,x1; cout<<"选择求解方程根的方法: "< cout<<"1.二分法求解"< cout<<"2.牛顿迭代法求解"< cout<<"3.割线法求解"< cin>>x; switch(x) { case1: cout<<"请输入区间上下限(如【a,b】输入ab): "< cin>>a>>b; cout<<"请输入根的容许误差和函数的容许误差(若只有一个误差则另一项为0): "< cin>>ex>>ef; res=Dichotomy(a,b,ex,ef); break; case2: cout<<"请输入初始值x0: "< cin>>x0; cout<<"请输入根的容许误差和函数的容许误差(若只有一个误差则另一项为0): "< cin>>ex>>ef; res=Newtonsmethod(x0,ex,ef); break; case3: cout<<"请输入初始值x0,x1: "< cin>>x0>>x1; cout<<"请输入根的容许误差和函数的容许误差(若只有一个误差则另一项为0): "< cin>>ex>>ef; res=Cutmethod(x0,x1,ex,ef); break; default: break; } } ////////////////////////打印输出函数/////////////////////////// voidprintfunction(sequenlist*A) { inti; cout<<"f="; for(i=1;i { if(A->data[i+1]<0) cout< elsecout< } cout< } //////////////////////////函数微分///////////////////////////// sequenlistDerivative(sequenlist*A,inthighestx) { inti; D=InitList(); for(i=1;i<=A->last;i++) Insert(D,(A->data[i]*(A->last-i)),i); D->last=A->last-1; return*D; } 3.3核心算法部分 ●算法部分头文件 #ifndef_ALGORITHM_H #define_ALGORITHM_H #include"stdio.h" #include"stdlib.h" intJudge(doublex1,doublex0,doublee); doubleDichotomy(doublexa,doublexb,doubleex,doubleef); doubleNewtonsmethod(doublex0,doubleex,doubleef); doubleCutmethod(doublex1,doublex0,doubleex,doubleef); #endif ●算法部分CPP文件 #include"algorithm.h" #include"stdafx.h" #include"squencelist.h" #include"equation.h" //////////////////////////误差判别//////////////////////////// inlineintJudge(doublex1,doublex0,doublee) { if(e==0) return0; if(x1==0) { if(fabs(x0) elsereturn0; } if(x0==0) { if(fabs(x1) elsereturn0; } if(fabs(x1-x0) return1; elsereturn0; } //////////////////////////二分法//////////////////////////// doubleDichotomy(doublexa,doublexb,doubleex,doubleef) { cout<<"///////////////////二分法///////////////////"< doublexn=0,fn=0,fa=Function(B,xa),fb=Function(B,xb); doublea,b; intn=1,flag=0; a=xa; b=xb; cout<<"二分次数"<<"\t"<<'x'<<"\t\t"<<"f(x)"< if(fa*fb>0) { cout<<"无法使用二分法"< flag=1; } while (1) { if(fa==0) { xn=xa; cout< break; } if(fb==0) { xn=xb; cout< break; } xn=(a+b)/2; fn=Function(B,xn); cout< if(fn==0)break; if(fn*fa<0) { b=xn; flag=(Judge(a,b,ex)||Judge(fn,0,ef)); } elseif(fn*fb<0) { a=xn; flag=(Judge(a,b,ex)||Judge(fn,0,ef)); } if(flag)break; } returnxn; } //////////////////////////牛顿迭代法//////////////////////////// doubleNewtonsmethod(doublex0,doubleex,doubleef) { doublexn=0,fn=0,dfn=0; intn=1,flag=0; cout<<"///////////////////牛顿迭代法///////////////////"< cout<<"迭代次数"<<"\t"<<"x"<<"\t\t"<<"f(x)"< *D=Derivative(B,highestx); fn=Function(B,x0); dfn=Function(D,x0); if(fabs(fn) while (1) { if(dfn==0) { cout<<"导数为零"< break; } xn=x0-fn/dfn; fn=Function(B,x0); dfn=Function(D,x0); flag=(Judge(xn,x0,ex)||Judge(fn,0,ef)); if(flag)break; x0=xn; cout< if(n>3000) { cout<<"迭代失败"< return0; } } returnxn; } //////////////////////////割线法//////////////////////////// doubleCutmethod(doublex1,doublex0,doubleex,doubleef) { doublexn,fn,f0,f1; intn=1,flag=0; cout<<"///////////////////割线法///////////////////"< cout<<"迭代次数"<<"\t"<<"x"<<"\t\t"<<"f(x)"< *D=Derivative(B,highestx); f0=Function(B,x0); f1=Function(B,x1); if(fabs(f0) { cout< returnx0; } if(fabs(f1) { cout< returnx1; } if(Judge(x1,x0,ex)) { cout< returnx1; } while(! flag) { xn=x1-f1*(x1-x0)/(f1-f0); fn=Function(B,xn); flag=(Judge(xn,x1,ex)||Judge(fn,0,ef)); cout< x0=x1; x1=xn; if(n>3000) { cout<<"迭代失败"< return0; } } returnxn; } 3.4数据结构部分 ●数据结构头文件 #ifndef_SQUENCELIST_H #define_SQUENCELIST_H #include"stdio.h" #include"stdlib.h" #include"stdafx.h" #include usingnamespacestd; #definemaxsize1024 /** *sequenlist */ typedefintdatatype; typedefstruct { datatypedata[maxsize]; intlast; }sequenlist; sequenlist*InitList(); intLength(sequenlist*); intInsert(sequenlist*,datatype,int); intDelete(sequenlist*,int); intLocate(sequenlist*,datatype); voiddel_node(sequenlist*,datatype); voidPrintList(sequenlist*); intCompare_L(sequenlist*,sequenlist*); voidInvert(sequenlist*); /** *linklist */ typedefcharlinkdatatype; typedefstructnode { linkdatatypedata; structnode*next; }linklist; linklist*CreateListF(); #endif ●数据结构CPP文件 #include"stdafx.h" #include"squencelist.h" ///////////////////////////////////数据结构部分/////////////////////////////////////////// ///////////////////////////////////sequenlist/////////////////////////////////////////// sequenlist*InitList() { sequenlist*L=(sequenlist*)malloc(sizeof(sequenlist)); L->last=0; returnL; //sequenlist*L=newsequenlist; } intLength(sequenlist*L) { returnL->last; } intInsert(sequenlist*L,datatypex,inti) { intj; if(L->last>=maxsize-1) { cout<<"表已满"< return0; } for(j=L->last;j>=i;j--) L->data[j+1]=L->data[j]; L->data[i]=x; L->last++; return1; } intDelete(sequenlist*L,inti) { intj; if((i<1)||(i>L->last)) { cout<<"非法删除位置"< return0; } for(j=i;j<=L->last;j++) L->data[j]=L->data[j+1]; L->last--; return1; } intLocate(sequenlist*L,datatypex) { inti=1; while(i<=L->last) { if(L->data[i]! =x)i++; elsereturni; } return0; } /*顺序表中删除所有元素为x的结点*/ voiddel_node(sequenlist*L,datatypex) { inti=Locate(L,x); while(i! =0) { if(! Delete(L,i))break; i=Locate(L,x); } } voidPrintList(sequenlist*L) { inti=1; for(i=1;i<=L->last;i++) cout< cout< } intCompare_L(sequenlist*A,sequenlist*B) { intj=1; inti=0; intn,m; n=A->last; m=B->last; while((j<=n)&&(j<=m)) { if(A->data[j]==B->data[j])i=0; if(A->data[j] { i=-1; break; } if(A->data[j]>B->data[j]) { i=1; break; } j++; } if(i! =0)returni; else { if(m if(n if(m==n)i=0; returni; } } voidInvert(sequenlist*L) { inti; inttemp; for(i=1;i<=L->last/2;i++)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 方程 求根 计算器 实验 报告 C+