数值分析实验二Word文档下载推荐.docx
《数值分析实验二Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《数值分析实验二Word文档下载推荐.docx(12页珍藏版)》请在冰豆网上搜索。
3、根据泄积分的计算方法,可以考虑二重积分的计算问题。
四、开发平台
1、操作系统:
WindowsXP\2000\Win7
2、编程语言:
VisualC卄6.0+MFC运行库
五.程序模块
六、程序设计流程图
开始
k=l
输出
K=k+1
结束
输出:
积分£
/(a>
/x的近似值卩广“
七、源程序代码
只截取与本程序相关的部分(MFC类程序此处略):
)
//numerical1.cpp:
implementationfile
//
includeustdafx.hH
#includeHmainframeDlg.hH
#include"
mainframe.h”
include"
numericall.h”
#includcHmath.hM
doublefl(doublex)
{
doublefrel;
frel=sqrt(4.0-pow(sin(x),2));
returnfrel;
}
doublef2(doublex)
doublefre2=0.0.mul=0.0;
if(x==O.OOOOOOOOOOOOOO)fre2=1.0;
else
{mul=sin(x);
fre2=niul/x;
returnfre2;
doublef3(doublex)
doublefre3;
fre3=exp(x)/(4.0+x*x);
returnfre3;
doublef4(doublex)
doublefre4;
fre4=log(1.0+x)/(1.0+x*x);
〃函数一计算函数
〃函数二计算函数
〃函数三计算函数
〃函数四计算函数
gj*OZ=+wnsQx)(j*)=oj:
q=+”x
}(++M:
U>
*1=”)UI)JOJ
:
uOiqnop)/(E-q)Oiqnop)=q
沱=”x
•QJ+KJ=OJ:
(q)(J*)=QJ:
W)(J*)nj
tsjins9Jfc0J'
00=uins^x^Jirqj'
Bjojqnop
((训qnop)(j*)o[qnopp)urqo[qnop飞aiqnop)5uixiiojqnop
(sd?
一iu<
JJCH一DCIIXCld)iXQ丄-xcia:
(劝oqiuo爼一iu4£
uaa_3aixad)ixoi_xaa:
(uosdiuis"
iu43jLiaa"
Dai4xad)i^i~xaa
XoUIX!
1~ui'
lJJCH—;
xn・XCld"
XQ丄一XGG:
(nftjjcnpcnxcid)m<
aci:
(umMUO!
QiiiH-iuqoiav爼一Oai'
Xad)O!
pe爼一xaG
(xad)9SuEq3XHEjEaoa:
SoiEiaD
}(Xdd#oSuHipxaBlBQ3)3^UKM3xaKlKQ0Q:
:
I^ouaiunupio;
\
00=sdo'
iu:
00=Eioqiuo爼一111
00=uosdiuis_ui•00=SuiX!
l~ui
•0=NF:
I-=iunNuoipunj_iu
}(juarejd'
QQ[:
iBouoiunu)3oiBiQ3:
(/*"
nPIN=*/[uaivdd^puM3)IK3!
J3lunu:
IK3y3iunu
闷jtunpj
sum+=FO:
results=sum*h/2.0;
return(results);
doubleSimpson(doubleajoublebjntn,double(*f)(double))〃复化Simpson公式计算函数
doubleF0、Fl・F2、h,fc,xk,sum.rcsi山s;
F0=(*D(a)+(*f)⑹;
Fl=0.0;
F2=0.0;
xk=a;
h=(double)(b-a)/(double)(n*2);
for(intk=l;
k<
2*n;
k++)
(
xk+=h;
if(!
(k%2))
F2+=(*f)(xk);
Fl+=(*f)(xk);
fc=(*f)(xk);
sum=FQ+2.0*F2+4.0*Fl;
results=sum*h/3.0;
doubleRomberg(doublea,doubleb.doubleeps.double(*f)(double))//Romberg公式计算函数
doubleFa.Fb・T[10]hp.q,x,cp.s;
intk=l;
intn=l;
Fa=(*f)(a);
Fb=(*f)(b);
T(0]=(Fa+Fb)*(b-a)/2.0;
h=b-a;
cp=cps+1.0:
while((cp>
=eps)&
&
(k<
=90))
p=0.0;
for(inti=O;
i<
n-1;
i++)
{x=a+(i+0.5)*h;
p=p+(*f)(x);
p=(T[0]+h*p)/2.0;
s=1.0;
for(intm=l;
m<
=k;
m++)
s=4.0*s;
q=(s*p-T(m-l])/(s-1.0);
T(m-l]=p;
p=q;
ep=fabs(q-T[k-l]);
k=k+1;
T[k-1]=q;
n=n+n;
h=h/2.0;
}return(q);
voidnumcrical:
OnButtonl()
UpdateData(true);
if(m_FunctionNum==-1)
MessageBox("
请选择一个数值积分进行il•算”);
elseif(m_N=O)
请输入N的值以确左步长”);
switch(m_FunctionNum)
case0:
m_TiXing=Tixing(0.0.0.25,m_N,fl);
break;
case1:
m_TiXing=Tixing(0.0.1.0jn_N,f2);
break:
case2:
m_TiXing=Tixing(0.0J.0jn_N,f3);
case3:
m_TiXing=Tixing(0.0J.Ojn_N,f4);
default:
UpdateData(false);
voidnumerical:
OnButton2()
请选择一个数值积分进行汁算”);
elseif(m_N=O)
MessageBoxC请输入N的值以确左步长”);
m_Simpson=Simpson(0・0.0・25、m_N,fl);
break;
m_Simpson=Simpson(0・0・1.0、m_N,f2);
m_Simpson=Simpson(0.0.1.0jn_N,f3);
m_Simpson=Simpson(0.0.1.0jn_N,f4);
voidnunicrical:
OnButton3()
UpdatcData(true);
请选择一个数值积分进行汁算);
elseif(m_eps==0)
MessageBox(M请输入N的值以确左步长”);
m_Romberg=Rombcrg(0.0.0.25.m_eps,fl);
m_Romberg=Romberg(0.0.1.0.m_eps,f2);
ni_Romberg=Romberg(0.0,1.0.m_eps.f3);
in_Romberg=Romberg(0.0.1.0.m_eps,f4);
运行结果:
A、在复选框中选择数值积分项,并撼确左摊钮,进入子菜单:
数值积分
B、按照提示进行操作:
在编借框中得到答案
①第一个积分
②第二个积分
*sinx
ax
x
J4+x2
1+0
结果分析:
A、分别用两种算法计算同一个积分,并比较其结果当同时用三种方法计算第二个公式的积分时:
结果如上图所示:
精确解:
(/«
0.9460831)
可以看出步长精度取值相同时
复合Simpson算法求得的解为0.946083310888472,更接近真值已达到六位精
而复合梯形公式求得的解为0.94451352166539,仅有两位精准
而Romberg算法求得的解为0.946083004063674亦有六位精准
B、分别取不同步长h=(b^a)/n,试比较计算结果(如n二10.20等);
分别取n二3,3,10进行分析,结果如下图所示
数值枳分
逢择一个进行计苒
—sin亠xdx
xV=
3
0.001
复合梯形公式
Romburg^法
「返回〕
I谨择一个进行计算'
从结果可以看岀步长减小对Romberg公式精度提髙并不明显
i)又复合梯形公式及复合Simpson公式可以看出,n越大,精度越高
ii)但继续增大之后(例如大于10后)没有太多实际意义
iii)但对复合梯形公式的精度改善很大: