数学实验“欧拉数值算法,Runge-Kutta数值算法”实验报告(内含matlab程序)

时间:2024.4.13

西京学院数学软件实验任务书


                         实验二十四实验报告

一、实验名称:欧拉数值算法(显式,隐式,欧拉预估-校正法),Runge-Kutta数值算法。

二、实验目的:进一步熟悉欧拉数值算法(显式,隐式,欧拉预估-校正法),Runge-Kutta数值算法。

三、实验要求:运用Matlab/C/C++/Java/Maple/Mathematica等其中一种语言完成程序设计。

四、实验原理

1.欧拉数值算法(显式):

微分方程里最简单的方程形式莫过于一阶常微分方程的初值问题,即:

其中为常数。

因为其简单但又是求解其他方程的基础,所以发展了许多典型的解法。所有算法中的就是代表上式中,而表示表示

简单欧拉法是一种单步递推算法。简单欧拉法的公式如下所示:

简单欧拉法的算法过程介绍如下:

给出自变量的定义域,初始值及步长

,计算

2.欧拉数值算法(隐式):

隐式欧拉法也叫退欧拉法,隐式欧拉法的公式如下所示:

隐式欧拉法是一阶精度的方法,比它精度高的公式是:

隐式欧拉的算法过程介绍如下。

给出自变量的定义域,初始值及步长

,用牛顿法或其他方法求解方

得出

3.欧拉预估-校正法:

改进欧拉法是一种二阶显式求解法,其计算公式如下所示:

4.Runge-Kutta数值算法:

二阶龙格-库塔法有多种形式,除了改进的欧拉法外,还有中点法。中点法计算公式为:

五、实验内容:

%欧拉数值算法(显式)

function [h,k,X,Y,P,REn]=Qeuler1(funfcn,x0,y0,b,n,tol)

x=x0; h=(b-x)/n; X=zeros(n,1); y=y0;

Y=zeros(n,1); k=1; X(k)=x; Y(k)=y';

for k=2:n+1

 fxy=feval(funfcn,x,y);

 delta=norm(h*fxy,'inf');

 wucha=tol*max(norm(y,'inf'),1.0);

if delta>=wucha

x=x+h; y=y+h*fxy; X(k)=x;Y(k)=y';

end

plot(X,Y,'rp')

grid

label('自变量 X'), ylabel('因变量 Y')

title('用向前欧拉(Euler)公式计算dy/dx=f(x,y),y(x0)=y0在[x0,b]上的数值解')

end

P=[X,Y];

syms dy2,

REn=0.5*dy2*h^2;

%欧拉数值算法(隐式)

function [X,Y,n,P]=Heuler1(funfcn,x0,b,y0,h,tol)

n=fix((b-x0)/h); X=zeros(n+1,1); Y=zeros(n+1,1);

k=1; X(k)=x0; Y(k,:)=y0; Y1(k,:)=y0;

clc,x0,h,y0

for i=2:n+1

X(i)=x0+h; Y(i,:)=y0+h*feval(funfcn,x0,y0);

Y1(i,:)=y0+h*feval(funfcn,X(i),Y(i,:));

Wu=abs(Y1(i,:)-Y(i,:));

while Wu>tol

   p=Y1(i,:);

Y1(i,:)=y0+h*feval(funfcn,X(i),p);

Y(i,:)=p;

  end

x0=x0+h; y0=Y1(i,:);

Y(i,:)=y0; plot(X,Y,'ro')

grid on

xlabel('自变量 X'), ylabel('因变量 Y')

title('用向后欧拉公式计算dy/dx=f(x,y),y(x0)=y0在[x0,b]上的数值解')

end

  X=X(1:n+1); Y=Y(1:n+1,:); n=1:n+1; P=[n',X,Y]

%欧拉预估-校正法

function [H,X,Y,k,h,P]=gaiEuler(funfcn,x0,b,y0,tol)

pow=1/3;

if nargin < 5 | isempty(tol),

tol = 1.e-6;

end;

if nargin < 6 | isempty(trace),

 trace = 0;

end;

x=x0; h=0.0078125*(b-x);

y=y0(:);p=128; n=fix((b-x0)/h);

H=zeros(p,1); X=zeros(p,1);

Y=zeros(p,length(y)); k=1;

X(k)=x; Y(k,:)=y';

while (x<b)&(x+h>x)

  if x+h>b

h=b-x;

  end

   fxy=feval(funfcn,x,y); fxy=fxy(:);

delta=norm(h*fxy,'inf'); wucha=tol*max(norm(y,'inf'),1.0);

if delta<=wucha

x=x+h; y1=y+h*fxy; fxy1=feval(funfcn,x,y1);

fxy=fxy(:);y2=(fxy+fxy1)/2; y=y+h*y2; k=k+1;

if k>length(X)

X=[X;zeros(p,1)]; Y=[Y;zeros(p,length(y))];

H=[H;zeros(p,1)];

        end

H(k)=h;X(k)=x;Y(k,:)=y'; plot(X,Y,'mh'), grid

xlabel('自变量 X'), ylabel('因变量 Y')

title('用改进的欧拉公式计算dy/dx=f(x,y),y(x0)=y0在[x0,b]上的数值解')

end

if delta~=0.0

h=min(h*8,0.9*h*(wucha/delta)^pow);

end

end

if (x<b)

disp('Singularity likely.'), x

  end

H=H(1:k);  X=X(1:k); Y=Y(1:k,:); n=1:k; P=[n',H,X,Y]

%Runge-Kutta数值算法

function [k,X,Y,fxy,wch,wucha,P]=RK3(funfcn,fun,x0,b,C,y0,h)

x=x0; y=y0;p=128;

n=fix((b-x0)/h);

fxy=zeros(p,1);

wucha=zeros(p,1);

wch=zeros(p,1);

X=zeros(p,1);

Y=zeros(p,length(y));

k=1; X(k)=x; Y(k,:)=y';

clc,x,h,y

for k=2:n+1

x=x+h;a2=C(4);

a3=C(5);b21=C(6);

b31=C(7);

b32=C(8);c1=C(1);

c2=C(2);

c3=C(3);

x1=x+a2*h;

x2=x+a3*h;

k1=feval(funfcn,x,y);

y1=y+b21*h*k1;

k2=feval(funfcn,x1,y1);

y2=y+b31*h*k1+b32*h*k2;

k3=feval(funfcn,x2,y2);

fxy(k)=feval(fun,x);

y=y+h*(c1*k1+c2*k2+c3*k3);

X(k)=x; Y(k,:)=y;

k=k+1;

plot(X,Y,'rp',X,fxy,'bo'),

grid,xlabel('自变量 X'), ylabel('因变量 Y')

legend('用三阶龙格-库塔方法计算dy/dx=f(x,y),y(x0)=y0在[x0,b]上的数值解','y/dx=f(x,y),y(x0)=y0的精确解y=f(x)')

end

for k=2:n+1

wucha(k)=norm(Y(k-1)-Y(k));

wch(k)=norm(fxy(k)-Y(k));

end

X=X(1:k);

Y=Y(1:k,:);

fxy=fxy(1:k,:);

n=1:k;

wucha=wucha(1:k,:);

wch=wch(1:k,:);

P=[n',X,Y,fxy,wch,wucha];


第二篇:数学实验“微分方程组数值算法——四阶Runge-Kutta数值算法”实验报告(内含matlab程序)


西京学院数学软件实验任务书


                         实验二十六实验报告

一、实验名称:微分方程组数值算法——四阶Runge-Kutta数值算法。

二、实验目的:进一步熟悉微分方程组数值算法——四阶Runge-Kutta数值算法。

三、实验要求:运用Matlab/C/C++/Java/Maple/Mathematica等其中一种语言完成程序设计。

四、实验原理

四阶Runge-Kutta数值算法:

对于求解一阶微分方程组问题

由初值问题的经典Runge-kutta公式可得一阶常微分方程组初值问题的Runge-kutta公式:

五、实验内容:

%四阶Runge-Kutta数值算法

function y=DELGKT4_lungkuta(f, h,a,b,y0,varvec)

format long;

N=(b-a)/h;

y=zeros(N+1,1);

y(1)=y0;

x=a:h:b;

var=findsym(f);

for i=2:N+1

    K1=Funval(f,varvec,[x(i-1) y(i-1)]);

    K2=Funval(f,varvec,[x(i-1)+h/2 y(i-1)+K1*h/2]);

    K3=Funval(f,varvec,[x(i-1)+h/2 y(i-2)+K2*h/2]);

    K4=Funval(f,varvec,[x(i-1)+h y(i-1)+h*K3]);

    y(i)=y(i-1)+h*(K1+2*K2+2*K3+K4)/6;

end

format short;

更多相关推荐:
《数学实验》报告matlab_第六次作业

数学实验报告实验名称matlab常微分概率和统计作图学院机械工程学院专业班级姓名学号20xx年11月一实验目的掌握运用Matlab解常微分方程的方法以及运用数值法解常微分的方法和步骤学会使用matlab一组数据...

Matlab数学实验报告模板

数学实验报告日期20年月日Maylab实验报告学院数学系班级09级A班姓名学号名称二0一二年五月八日

《数学实验》报告matlab-_第三次作业

数学实验报告实验名称matlab绘图学院机械工程学院20xx年10月一实验目的掌握Matlab绘图的基本知识学会使用matlab绘制三维曲线和三维曲面掌握基本的绘图指令学会为图形添加各种标注以及改变图形的着色效...

matlab数学实验报告2

西安交通大学数学实验报告数学实验报告20xx年6月12日2西安交通大学数学实验报告培养容器温度变化率模型一实验目的利用matlab软件估测培养容器温度变化率二实验问题现在大棚技术越来越好能够将温度控制在一定温度...

matlab——大学数学实验报告

济南大学20##~20##学年第二学期数学实验上机考试题班级计科1201学号##姓名##考试时间20##年6月17日授课教师##说明:每题分值20分。第5题,第6题,第7题和第8题可以任选其一,第9题和第10题…

matlab11实验报告

辽宁工程技术大学上机实验报告1程序x2025303540455055606539Xones101xY13215116417117918719621222524339bbintrrintstatsregressY...

Matlab实验报告五(微分方程求解Euler折线法)

数学与信息科学系实验报告实验名称微分方程求解所属课程数学软件与实验实验类型综合型实验专业信息与计算科学班级学号姓名指导教师1234

东南大学几何与代数matlab实验报告

数学实验报告学号姓名吴雪松得分实验1求解线性方程组实验内容用MATLAB求解如下线性方程组Axb其中5100A00006510000006510000006510000006510000006510000006...

数学实验“微分方程组数值算法——四阶Runge-Kutta数值算法”实验报告(内含matlab程序)

西京学院数学软件实验任务书实验二十六实验报告一实验名称微分方程组数值算法四阶RungeKutta数值算法二实验目的进一步熟悉微分方程组数值算法四阶RungeKutta数值算法三实验要求运用MatlabCCJav...

数学实验“几种常见的求积分近似解的方法”实验报告(内含matlab程序)

西京学院数学软件实验任务书实验二十一实验报告一实验名称Romberg积分法Gauss型积分法高斯勒让德积分法高斯切比雪夫积分法高斯拉盖尔积分法高斯埃尔米特积分法二实验目的进一步熟悉Romberg积分法Gauss...

matlab实验报告

MATLAB教程及实训班级学号姓名实验报告实验1熟悉matlab的开发环境及矩阵操作一实验的教学目标通过本次实验使学生熟悉MATLAB70的开发环境熟悉MATLAB工作界面的多个常用窗口包括命令窗口历史命令窗口...

matlab基本操作实验报告

实验一matlab基本操作一实验目的熟悉matlab的安装与启动熟悉matlab用户界面熟悉matlab功能建模元素熟悉matlab优化建模过程二实验设备与仪器1微机2matlab仿真软件三实验步骤1了解mat...

matlab数学实验报告(22篇)