数值分析龙格库塔.docx
《数值分析龙格库塔.docx》由会员分享,可在线阅读,更多相关《数值分析龙格库塔.docx(9页珍藏版)》请在冰点文库上搜索。
数值分析龙格库塔
、尸■、■
刖言
随着计算机的迅速发展和广泛应用,在众多领域内,我们越来越认识到科学计算是科学研究的重要方法。
数值计算方法是一种利用计算机解决数学问题的数值近似解方法,特别是无法用人工过计算器计算的数学冋题。
数值计算方法常用于矩阵高次代数方程矩阵特征值与特征向量的数值解法,插值法,线性方程组迭代法,函数逼近,数值积分与微分,常微分方程初值问题数值解等。
作为数学与计算机之间的一条通道,数值计算的应用范围已十分广泛,作为用计算机解决实际问题的纽带,数值算法在求解线性方程组,曲线拟合、数值积分、数值微分,迭代方法、插值法、拟合法、最小二乘法等应用广泛。
数值计算方法是和计算机紧密相连的,现代计算机的出现为大规模的数值计算创造了条件,集中而系统的研究适用于计算机的数值方法是十分必要的。
数值计算方法是在数值计算实践和理论分析的基础上发展起来的。
通过数值计算方法与实验将有助于我们理解和掌握数值计算方法基本理论和相关软件的掌握,熟练求解一些数学模和运算。
并提高我们的编程能力来解决实际问题。
摘要
对于本次计算方法与实习的实践环节,我们采用改进欧拉(Euler)方法对给
定的数据进行分析,改进的欧拉(Euler)方法是解决常微分方程初值问题常用的数值解法,本文在简要介绍改进欧拉(Euler)方法及四阶龙格库塔公式的基础上,通过编写C语言程序实现两种数值算法。
通过本次实践环节,我们很好的了解了常微分方程数值解法的原理。
出色的完成了本次课程设计。
关键词:
欧拉方法;四阶龙格--库塔;C语言;数值分析
前言-0-
摘要-1-
实验设计内容-3-
一.实验目的-3-
二.实验内容-3-
三.实验算法-3-
四.实验程序-4-
⑴改进欧拉方法-4-
⑵四阶龙格库塔方法-5-
实验心得-7-
实验设计内容
1.实验目的
1)熟悉求解常微分方程初值问题的有关方法和理论,主要是改进欧拉法、四阶龙格-库塔法;
2)会编制上述方法的计算程序,包括求解微分方程组的计算程序。
2.实验内容
分别用改进的欧拉方法与四阶龙格库塔公式取(h=0.1)求解些列微分方程初
值问题:
y=x2y2
y(0)=0
3.实验算法
解一阶常微分方程初值问题
「
y=f(x,y)a兰x兰b
<
、y(Xo)=yo
将区间[a,b]作n等分,取步长h=。
n
欧拉公式为
yi1=y「hf(Xi,yj
梯形公式为
h
yi^yi■-[f(xi,yi)-f区…y:
』
2
改进欧拉法,采用公式
yii=yi•hf以,yi)
彳+h.-
yii=yi[f区,yj•f以1『j]
L2
或表
yp=yi+hf(Xi,y」
Tc+hf(x+yp)
1丄
yi+=—(yp十yj
L2
y=f(x,y)aMx三b
、y(Xo)=y
常用的是四阶龙格-库塔公式
h
yi+=yi十一(ki+2k2+2k3十k4)
6
ki=f(X,yi)
hh
“k2=f(Xi+—,yi+-kj
22
hh
k3=f(Xi+—,yi+—k2)
22
k^f(Xi■h,yi-hk3)
上各节点处的近
y0,floatxn,int
取步长为h,由初值y出发,可得未知函数y(x)在区间[a,b]似值。
4.实验程序
⑴改进欧拉方法
1.改进欧拉方法的程序
#include
#defineN20
voidModEuler(float(*f)(float,float),floatx0,float
n)
{
inti;
floatyp,yc,x=xO,y=yO,h=(xn-xO)/n;
printf("x[0]=%f\ty[0]=%f\n",x,y);
for(i=1;i<=n;i++)
{
yp=y+h*(*f)(x,y);
x=x0+i*h;
yc=y+h*(*f)(x,yp);
y=(yp+yc)/2;
printf("x[%d]=%f\ty[%d]=%f\n",i,x,i,y);
}
}
floatf(floatx,floaty)
{
returnx*x+y*y;
}
voidmain()
floatxn=1,x0=0,y0=0;ModEuler(f,xO,yO,xn,N);getch();
}
2.运行结果
■UC:
\Users\len©vo\Desktop、口取腔矽拉、。
ebug\2.exe
J~0.003^013
y101=0谢
单
Lc(lJ=0.050000
皿卄_00思063
Lc(21=0.100000
y[21=0.000375
l_J
Lc[31=0.150008
y[31=0.001188
U4J=0.200❺00
V[4]=3.302750
k【51=目.25加00
IF[53M3.005313
j-0-300030
y(&1=0.809128
X(71=0>350000
y[7J=0.014448
ek(8]=0.400000
VE8J-0.021526
Let?
1=0.450308
1F(?
1=0.830622
y(10]=B.041979
Lc(ll>0.550000
055931
dc[12J=0.630000
y[12>0-072698
Lc(13]=0.6S000R
yC131-0.892599
700000
y[141^0.115952
pc£15J=0_750000
y[151-0-143099
00000
y[16]=0.174415
X"]叽850000
SFI17J-0.210319
lx{18900000
^(18]-0-251283
bc(19]=0.9^0000
y[191-0^29794?
^[2OJ=1.0000(30
^[201-0.358646
"
nrj*
⑵四阶龙格库塔方法
1•龙格库塔程序
x,floaty),floatafloatb,float
#include
voidRunge_Kutta(float(*f)(floaty0,intN)
{
floatx=a,y=y0,K1,K2,K3,K4;floath=(b-a)/N;
inti;
printf("x[0]=%f\ty[0]=%f\n",x,y);for(i=1;i<=N;i++)
{
K仁(*f)(x,y);
K2=(*f)(x+h/2,y+h*K1/2);
K3=(*f)(x+h/2,y+h*K2/2);K4=(*f)(x+h,y+h*K3);
y=y+h*(K1+2*K2+2*K3+K4)/6;x=a+i*h;
printf("x[%d]=%f\ty[%d]=%f\n",i,x,i,y);
}
}
floatf(floatx,floaty)
{
returnx*x+y*y;
}
voidmain()
{
floata=0,b=1,y0=0;
Runge_Kutta(f,a,b,y0,20);
getch();
}
2.龙格库塔结果
&\U$er$\tenavQ\Desktop\CVf?
S^S\Debug\4.exe'回|Eg|
K【0】=呂«000000
y[0J-8.O06O0O
xLI1=0.050000
yLli=0_B00042
xC2J=0.139000
^[23=0.600333
x[31=0.150000
y[3)^0.001125
x[4J=0.200000
y[4]°0_002667
x[51=0.259300
^[53=0-005209
k[61=0.300800
9C6J^=0.609003
x[73=0.356000
yL73=0_014302
400000
y[8J=B-0213&9
xL9J^0.450800
y[?
J=0.030434
x[101=0.500000
yL10J=0.041791
^[111=8.550000
Vx1121=6.600000
yL121=0-072448
x[13]=6.6S0000
y[13]=0.092328
x[14]=0.7D0000
y[143^0.115660
xL15J=G.750000
ytl5]=0.142785
XE16J-0.8000BB
^[1&]=0・切4朋0
x[17]=0.850000
y[17J-0.209963
x[183=0.900000
ytl8J=0-250¥07
^Ei?
]=e.?
s0000
y[19J-0,277453
x[20>l.S00800
y[Z01=0.350232
实验心得
课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.随着科学技术发展的日新日异,程序软件已经成为当今计算机应用中空前活跃的领域,在生活领域中的应用可以说得是无处不在。
因此作为二十一世纪的大学来说掌握简单的软件的开发技术是十分重要的。
回顾起此次数值分析的课程设计,至今我仍感慨颇多,的确,从理论到实践,在整整一个星期的日子里,可以说得是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,通过这次课程设计之后,一定把以前所学过的知识重新温故。
我得到了很多同学的帮助。
我想没有他们我可能都要放弃了,因为我本人对数值分析的算法本来就不是很熟悉,学的东西也不能很好的灵活应用,理论联系不了实际。
以前的汇编语言没学好,一开始的程序这块儿就要令我抓狂了。
通过这段时间的学习,我认为要学好C语言编程这门课程,不仅要认真
阅读课本知识,更重要的是要通过上机实践才能增强和巩固我的知识。
特别是作为大学生,更要注重实践这一环节,只有这样我们才能成为合格的计算机人材。
整个过程不断的调试,在调用子程序的时候遇到了部分问题,最后幸好都解决了。
通过这次课程设计也稳固了一些已经学习的数值分析的算法,同时了解了一些以前没有接触的数值分析的算法。
总之,这次的课程设计受益匪浅。
参考文献
[1]
2000
王高熊,周之铭,朱思铭,等.数值计算原理[M].北京:
清华大学出版社,
[2]李庆扬,王能超,易大义,数值分析[M],北京:
清华大学出版社,2001
[3]李庆扬,数值计算原理[M].北京:
清华大学出版社.2000
[4]孙志忠,吴宏伟,计算方法与实习,东南大学出版社