方程求根计算器实验报告一C++版.docx

上传人:b****6 文档编号:3307052 上传时间:2022-11-21 格式:DOCX 页数:21 大小:139.06KB
下载 相关 举报
方程求根计算器实验报告一C++版.docx_第1页
第1页 / 共21页
方程求根计算器实验报告一C++版.docx_第2页
第2页 / 共21页
方程求根计算器实验报告一C++版.docx_第3页
第3页 / 共21页
方程求根计算器实验报告一C++版.docx_第4页
第4页 / 共21页
方程求根计算器实验报告一C++版.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

方程求根计算器实验报告一C++版.docx

《方程求根计算器实验报告一C++版.docx》由会员分享,可在线阅读,更多相关《方程求根计算器实验报告一C++版.docx(21页珍藏版)》请在冰豆网上搜索。

方程求根计算器实验报告一C++版.docx

方程求根计算器实验报告一C++版

计算方法实验

 

题目:

班级:

学号:

姓名:

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;ilast;i++)

{

if(A->data[i+1]<0)

cout<data[i]<<"*"<<"x^"<last-i;

elsecout<data[i]<<"*"<<"x^"<last-i<<"+";

}

cout<data[i]<

}

//////////////////////////函数微分/////////////////////////////

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<data[i]<<'';

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]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++)

{

temp=L->data[i];

L->data[i]=L->data[L->last+1-i];

L->data[L->last+1-i]=temp;

}

}

///////////////////////////////////linklist///////////////////////////////////////////

linklist*CreateListF()

{

linklist*head,*p;

charch;

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

当前位置:首页 > PPT模板 > 节日庆典

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

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