MATLAB数值分析实验五(欧拉法,荣格-库塔法解常微分方程)

合集下载

欧拉法matlab程序

欧拉法matlab程序

欧拉法matlab程序1. 介绍在数学和工程领域中,欧拉法(Euler’s Method)是一种用于数值求解常微分方程的方法。

它是一种简单而有效的方法,通过离散化时间和空间,将微分方程转化为差分方程,在计算机程序中实现求解。

由于其易于理解和实现,欧拉法被广泛用于教学和工程实践中。

在本文中,我们将详细讨论如何使用MATLAB编写欧拉法程序。

我们将探讨欧拉法的原理、步骤、程序实现以及示例应用。

2. 欧拉法的原理欧拉法基于微分方程的初值问题,通过近似求解微分方程得到数值解。

它将连续的问题离散化为离散的差分问题。

对于一阶常微分方程,具有以下形式:dy=f(t,y)dt其中,t是自变量,y是因变量,f(t,y)是给定的函数。

假设我们已经知道初值条件t0和y(t0),以及步长ℎ,则欧拉法通过以下递推公式求解数值解:y n+1=y n+ℎ⋅f(t n,y n)其中,y n是第n步的数值解,t n=t0+n⋅ℎ。

欧拉法的基本原理是通过在每个时间步长上使用切线来逼近函数曲线,从而得到数值解。

该方法的准确性取决于步长的选择,较小的步长可以提高准确性,但增加了计算复杂度。

3. MATLAB实现欧拉法程序的步骤3.1 定义微分方程首先,我们需要定义要求解的微分方程。

在MATLAB中,可以使用一个匿名函数来=−αy,可以定义如下:表示微分方程。

例如,对于一个简单的线性微分方程dydtf = @(t, y) -alpha * y;3.2 设置初始条件和步长接下来,我们需要设置初始条件和步长。

初始条件包括t0和y(t0),步长ℎ表示每个时间步长的间隔。

t0 = 0;y0 = 1;h = 0.1;3.3 迭代计算使用欧拉法进行迭代计算,直到达到所需的终止条件。

在每个时间步长上,根据欧拉法的递推公式,更新数值解。

t = t0;y = y0;while t <= tf % 终止条件为t <= tfy = y + h * f(t, y);t = t + h;end3.4 可视化结果最后,我们可以使用MATLAB的绘图功能将结果可视化。

欧拉法matlab一阶常微分方程

欧拉法matlab一阶常微分方程

欧拉法(matlab)一阶常微分方程一、概述微分方程是描述自然界中许多现象的数学模型,它在物理、化学、生物等领域有着广泛的应用。

而欧拉法是求解微分方程的一种数值计算方法,通过利用微分方程的切线近似曲线上的点,来逼近微分方程的解。

在matlab中,欧拉法是求解微分方程的常用方法之一。

本文将介绍欧拉法在matlab中求解一阶常微分方程的具体步骤和实现过程。

二、欧拉法的原理欧拉法是一种基本的数值方法,用于求解形如y' = f(x, y)的一阶常微分方程初值问题。

其基本思想是将微分方程转化为差分方程,通过逐步逼近微分方程的解。

具体步骤如下:1. 确定初值条件,即确定微分方程的初始值(x0, y0)2. 根据微分方程y' = f(x, y)计算斜率f(x, y) = dy/dx3. 根据斜率计算下一个点的坐标,即y1 = y0 + h*f(x0, y0),其中h 为步长4. 更新坐标,即(x0, y0) = (x0+h, y1)5. 重复上述步骤直至达到所需的精度或特定的终止条件通过以上步骤,可以得到微分方程的近似解。

在matlab中,可以利用欧拉法求解一阶常微分方程,具体步骤如下。

三、欧拉法在matlab中的实现1. 编写求解函数我们需要编写一个求解一阶常微分方程的函数。

这个函数的输入参数包括微分方程的函数表达式、初始值、步长和终止条件等。

函数的基本框架如下:```matlabfunction [x, y] = euler_method(f, x0, y0, h, x_end)x = x0:h:x_end; 生成x的序列y = zeros(size(x)); 初始化y的序列y(1) = y0; 设置初始值for i = 2:length(x)y(i) = y(i-1) + h*f(x(i-1), y(i-1)); 根据欧拉法更新y值endend```在上述函数中,f表示微分方程的函数表达式,x0和y0表示初始值,h表示步长,x_end表示终止条件。

Removed_微分方程求解的后退欧拉法、龙格库塔法

Removed_微分方程求解的后退欧拉法、龙格库塔法

使截断误差的阶数尽可能高。即取不同点的斜率的加权平均作为平均斜率,以便
提高阶数。
2.对于三阶龙格—库塔法:
yn1
yn
h 6
(k1
4k2
k3 )
利用 k1 f (xn , yn )
k2
f (xn
1 2 h, yn
1 2 hk1)
:50 45. 44. 43. by 42.41.— 4—0.— 3—9.—3—8.by37@.—— 36.35. —34—. ——33.312. 1.2.3.34.0.5.6—.—29.by28.by@27.26.—— 25. 24. 23. 22. by 21.20. — 1—9.by:18.by:17.— 1—6.— 1—5.—1—4.—— 13. 12. 111.0“. ”by: 9M.“OOOKN”b8y.:——7.——6.——5.——4.——3.——2.——1.——
1)
x 0, y 0
及其精确解 y x 2 e x2
按 (1)后退欧拉法,步长 h=0.05, h=0.1;
(2)三阶龙格—库塔法,步长 h=0.05, h=0.1;
(3)四阶标准龙格—库塔法,步长 h=0.05,h=0.1;
求在节点 xk 1 0.1k(k 1, 2,,10) 处的数值解及误差比较各方法的优缺点。
数值计算方法实验上机测验
微分方程求解的后退欧拉法、龙格库塔法(三阶、四阶)
日期: 2011-06-16
一、测验目的
1. 学习 matlab 的使用方法。 2. 掌握常微分方程的几种数值解法:后退欧拉法、龙格库塔法(三阶、四阶)。 3. 比较各方法的数值解及误差,了解各方法的优缺点。
二、实验题目
给定的初值问题

MATLAB常微分方程的数值解法

MATLAB常微分方程的数值解法

MATLAB常微分⽅程的数值解法MATLAB常微分⽅程的数值解法⼀、实验⽬的科学技术中常常要求解常微分⽅程的定解问题,所谓数值解法就是求未知函数在⼀系列离散点处的近似值。

⼆、实验原理三、实验程序1. 尤拉公式程序四、实验内容选⼀可求解的常微分⽅程的定解问题,分别⽤以上1, 4两种⽅法求出未知函数在节点处的近似值,并对所求结果与分析解的(数值或图形)结果进⾏⽐较。

五、解答1. 程序求解初值问题取n=10源程序:euler23.m:function [A1,A2,B1,B2,C1,C2]=euler23(a,b,n,y0)%欧拉法解⼀阶常微分⽅程%初始条件y0h = (b-a)/n; %步长h%区域的左边界a%区域的右边界bx = a:h:b;m=length(x);%前向欧拉法y = y0;for i=2:my(i)=y(i-1)+h*oula(x(i-1),y(i-1));A1(i)=x(i);A2(i)=y(i);endplot(x,y,'r-');hold on;%改进欧拉法y = y0;for i=2:my(i)=y(i-1)+h/2*( oula(x(i-1),y(i-1))+oula(x(i),y(i-1))+h*(oula(x(i-1),x(i-1))));B1(i)=x(i);B2(i)=y(i);endplot(x,y,'m-');hold on;%欧拉两步公式y=y0;y(2)=y(1)+h*oula(x(1),y(1));for i=2:m-1y(i+1)=y(i-1)+2*h*oula(x(i),y(i));C1(i)=x(i);C2(i)=y(i);endplot(x,y,'b-');hold on;%精确解⽤作图xx = x;f = dsolve('Dy=-3*y+8*x-7','y(0)=1','x');%求出解析解y = subs(f,xx); %将xx代⼊解析解,得到解析解对应的数值plot(xx,y,'k--');legend('前向欧拉法','改进欧拉法','欧拉两步法','解析解');oula.m:function f=oula(x,y)f=-3*y+8*x-7;2. 运算结果A1,A2为前向欧拉法在节点处的近似值,B1,B2为改进的欧拉法在节点处的近似值,C1,C2为欧拉公式法在节点处的近似值。

实验报告七 常微分方程初值问题的数值解法,DOC

实验报告七 常微分方程初值问题的数值解法,DOC

浙江大学城市学院实验报告 课程名称数值计算方法实验项目名称常微分方程初值问题的数值解法实验成绩指导老师(签名)日期2015/12/1612Euler 法y=euler(a,b,n,y0,f,f1,b1)改进Euler 法y=eulerpro(a,b,n,y0,f,f1,b1)2-2 分析应用题假设等分区间数100n =,用欧拉法和改进欧拉法在区间[0,10]t ∈内求解初值问题()()20(0)10y t y t y '=-⎧⎨=⎩并作出解的曲线图形,同时将方程的解析解也画在同一张图上,并作比较,分析这两种方法的精度。

2-3分析应用题用以下三种不同的方法求下述微分方程的数值解,取10h=画出解的图形,与精确值比较并进行分析。

12312求微分方程的解析解及其数值的代入dsolve(‘egn1’,‘egn2’,‘x’)subs(expr,{x,y,…},{x1,y1,…})其中‘egn i’表示第i个方程,‘x’表示微分方程中的自变量,默认时自变量为t。

subs命令中的expr、x、y为符合型表达式,x、y分别用数值x1、x2代入。

>>symsxyz>>subs('x+y+z',{x,y,z},{1,2,3})ans=6>>symsx>>subs('x^2',x,2)ans=⏹4,5阶龙格-库塔方法求解微分方程数值解[t,x]=ode45(f,ts,x0,options)其中f是由待解方程写成的m文件名;x0为函数的初值;t,x分别为输出的自变量和函数值(列向量),t的步长是程序根据误差限自动选定的。

若ts=[t0,t1,t2,…,tf],则输出在自变量指定值,等步长时用ts=t0:k:tf ,输出在等分点;options 用于设定误差限(可以缺省,缺省时设定为相对误差310-,绝对误差610-),程序为:options=odeset(‘reltol ’,rt,’abstol ’,at),这里rt,at 分别为设定的相对误差和绝对误差。

微分方程的MATLAB实现与欧拉算法

微分方程的MATLAB实现与欧拉算法

微分方程的MATLAB实现与欧拉算法微分方程是数学中的重要概念,由于数值计算的发展,人们开始使用计算机来求解微分方程。

MATLAB作为一款强大的数学计算软件,提供了丰富的工具和函数来求解微分方程。

本文将介绍MATLAB如何实现微分方程的求解,并详细讨论了欧拉算法的原理和实现。

MATLAB中求解微分方程的函数主要有ode45、ode23、ode15s、ode23s和ode113等。

其中,ode45是最常用的函数,其基本用法如下:```[t,y] = ode45(fun,tspan,y0)```其中,fun是代表微分方程函数的句柄,tspan是时间范围,y0是初始条件。

返回的t是时间向量,y是对应时间的函数值。

例如,我们要求解一个简单的一阶常微分方程dy/dt = -2y,初始条件为y(0) = 1,在MATLAB中的代码如下:```tspan = [0 10];y0=1;[t,y] = ode45(fun,tspan,y0);```运行上述代码,我们得到了在时间范围[0,10]内的y的值,并且存储在数组y中。

欧拉算法是一种简单而粗糙的求解微分方程的方法,其基本原理是利用初始条件和微分方程的定义式逐步逼近所要求解的函数。

欧拉算法的迭代公式为y(n+1)=y(n)+h*f(t(n),y(n)),其中h为步长,f为微分方程的函数。

我们可以用MATLAB实现欧拉算法来求解微分方程。

以下是一个简单的例子,求解一阶常微分方程dy/dt = -2y,初始条件为y(0) = 1,步长为0.1,时间范围为[0,10]:```h=0.1;t=0:h:10;y(1)=1;for i = 1:length(t)-1y(i+1)=y(i)+h*(-2*y(i));end```在上述代码中,我们首先定义了步长h和时间范围t,然后初始化初始值y(1),接下来通过循环计算每个时间点的函数值。

通过以上的示例,我们可以看到,虽然欧拉算法是一种较为简单的求解微分方程的方法,但是当步长较大时,结果往往不够精确,因此在实际应用中,通常会使用更为高阶的方法,如ode45函数。

数值分析Matlab作业龙格库塔欧拉方法解二阶微分方程-推荐下载

四阶龙格库塔方法使用四级四阶经典显式Rungkutta公式稳定性很好,RK4法是四阶方法,每步的误差是h5阶,而总积累误差为h4阶。

所以比欧拉稳定。

运行第三个程序:在一幅图中显示欧拉法和RK4法,随着截断误差的积累,欧拉法产生了较大的误差h=0.01h=0.0001,仍然是开始较为稳定,逐渐误差变大总结:RK4是很好的方法,很稳定,而且四阶是很常用的方法,因为到五阶的时候精度并没有相应提升。

通过这两种方法计算出角度峰值y=3.141593,周期是1.777510。

三个程序欧拉法clear;clch=0.00001;a=0;b=25;x=a:h:b;y(1)=0;z(1)=0;for i=1:length(x)-1 % 欧拉y(i+1)=y(i)+h*z(i);z(i+1)=z(i)+h*7.35499*cos(y(i));endplot(x,y,'r*');xlabel('时间');ylabel('角度');A=[x,y];%y(find(y==max(y)))%Num=(find(y==max(y)))[y,T]=max(y);fprintf('角度峰值等于%d',y) %角度的峰值也就是πfprintf('\n')fprintf('周期等于%d',T*h)%周期legend('欧拉');龙格库塔方法先定义函数rightf_sys1.mfunction w=rightf_sys1(x,y,z)w=7.35499*cos(y);clear;clc;%set(0,'RecursionLimit',500)h=0.01;a=0;b=25;x=a:h:b;RK_y(1)=0; %初值%RK_z(1)=0;初值for i=1:length(x)-1K1=RK_z(i); L1=rightf_sys1(x(i),RK_y(i),RK_z(i));%K1 and L1K2=RK_z(i)+0.5*h*L1;L2=rightf_sys1(x(i)+0.5*h,RK_y(i)+0.5*h*K1,RK_z(i)+0.5*h*L1);K3=RK_z(i)+0.5*h*L2;L3=rightf_sys1(x(i)+0.5*h,RK_y(i)+0.5*h*K2,RK_z(i)+0.5*h*L2);K4=RK_z(i)+h*L3;% K4L4=rightf_sys1(x(i)+h,RK_y(i)+h*K3,RK_z(i)+h*L3);and L4RK_y(i+1)=RK_y(i)+1/6*h*(K1+2*K2+2*K3+K4);RK_z(i+1)=RK_z(i)+1/6*h*(L1+2*L2+2*L3+L4);endplot(x,RK_y,'b+');xlabel('Variable x');ylabel('Variable y');A=[x,RK_y];[y,T]=max(RK_y);legend('RK4方法');fprintf('角度峰值等于%d',y) %角度的峰值也就是πfprintf('\n')%周期fprintf('周期等于%d',T*h)两个方法在一起对比使用跟上一个相同的函数rightf_sys1.mclear;clc; %清屏h=0.0001;a=0;b=25;x=a:h:b;Euler_y(1)=0;%欧拉的初值Euler_z(1)=0;RK_y(1)=0;%龙格库塔初值RK_z(1)=0;for i=1:length(x)-1%先是欧拉法Euler_y(i+1)=Euler_y(i)+h*Euler_z(i);Euler_z(i+1)=Euler_z(i)+h*7.35499*cos(Euler_y(i));%龙格库塔K1=RK_z(i); L1=rightf_sys1(x(i),RK_y(i),RK_z(i)); % K1 andL1K2=RK_z(i)+0.5*h*L1;L2=rightf_sys1(x(i)+0.5*h,RK_y(i)+0.5*h*K1,RK_z(i)+0.5*h*L1);% K2 and L2K3=RK_z(i)+0.5*h*L2;L3=rightf_sys1(x(i)+0.5*h,RK_y(i)+0.5*h*K2,RK_z(i)+0.5*h*L2);% K3 and L3K4=RK_z(i)+h*L3; L4=rightf_sys1(x(i)+h,RK_y(i)+h*K3,RK_z(i)+h*L3); K4 and L4RK_y(i+1)=RK_y(i)+1/6*h*(K1+2*K2+2*K3+K4);RK_z(i+1)=RK_z(i)+1/6*h*(L1+2*L2+2*L3+L4);endplot(x,Euler_y,'r-',x,RK_y,'b-');[y,T]=max(RK_y);%角度的峰值也就是πfprintf('角度峰值等于%d',y)fprintf('\n')%周期fprintf('周期等于%d',T*h)xlabel('时间');ylabel('角度');legend('欧拉','RK4');。

matlab用欧拉法求常微分方程初值

matlab用欧拉法求常微分方程初值用欧拉法求解常微分方程是一种常用的数值解法。

在数学和工程领域中,常微分方程是一类描述自然现象和物理过程的重要方程。

在实际问题中,我们往往难以得到准确的解析解,因此需要借助数值方法来近似求解。

欧拉法是其中一种简单而有效的数值解法。

让我们来了解一下常微分方程的基本概念。

常微分方程是指未知函数与其导数之间的关系式。

通常形式为dy/dx=f(x,y),其中f(x,y)为已知的函数。

常微分方程的解就是满足该关系式的函数y(x)。

接下来,我们来看一下欧拉法的基本原理。

欧拉法的基本思想是将微分方程转化为差分方程,通过迭代计算来逼近解析解。

具体而言,我们将自变量x离散化为一系列的点,然后根据微分方程的导数定义,将微分项转化为差分项。

假设我们的求解区间为[x0,xn],步长为h,那么我们可以得到近似解的递推公式为:y(i+1) = y(i) + h*f(x(i),y(i))其中,y(i)表示第i个点的函数值,x(i)表示第i个点的自变量值,f(x(i),y(i))表示在(x(i),y(i))处微分方程的导数值。

通过递推计算,我们可以得到离散点上的函数近似解。

当步长h足够小的时候,欧拉法可以得到较为精确的结果。

然而,需要注意的是,欧拉法的精度受到步长的限制,当步长过大时,误差会较大。

现在,我们来通过一个具体的例子来说明欧拉法的应用。

假设我们要求解如下的常微分方程:dy/dx = x^2其中,初始条件为y(0) = 1,求解区间为[0,1]。

我们可以将该微分方程转化为差分方程,并使用欧拉法进行求解。

我们将求解区间离散化,假设步长h=0.1,则我们可以得到离散点x0=0,x1=0.1,x2=0.2,...,x10=1。

然后,根据欧拉法的递推公式,我们可以得到近似解的计算过程如下:y(1) = y(0) + h*f(x(0),y(0))= 1 + 0.1*(0^2)= 1y(2) = y(1) + h*f(x(1),y(1))= 1 + 0.1*(0.1^2)= 1.001y(3) = y(2) + h*f(x(2),y(2))= 1.001 + 0.1*(0.2^2)= 1.004...y(10) = y(9) + h*f(x(9),y(9))= y(9) + 0.1*(0.9^2)通过逐步计算,我们可以得到离散点上的近似解。

数学建模2-常微分方程的MATLAB解法

常微分方程的MATLAB解法一、数值解法原理1.欧拉方法精度不高,采用改进的Euler方法:①梯形公式:②改进Euler法:2.龙格-库塔(Runge-Kutta)方法①二阶:可表示为:又所以②四阶:3.线性多步法二、初值问题的MATLAB解法和符号解1.MATLAB数值解(1) MATLAB数值解非刚性常微分方程:①对简单的一阶方程初值问题:编写函数如下:function [x,y]=eulerpro(fun,x0,xfinal,y0,n); if nargin<5,n=50;endh=(xfinal-x0)/n;x(1)=x0;y(1)=y0;for i=1:nx(i+1)=x(i)+h;y1=y(i)+h*feval(fun,x(i),y(i));y2=y(i)+h*feval(fun,x(i+1),y1);y(i+1)=(y1+y2)/2;end②ode23,ode45(采用四五阶RK方法,首选),ode113的使用四阶RK方法函数代码:function [x,y]=rk4pro(fun,x0,xfinal,y0,n);if nargin<5,n=50;endh=(xfinal-x0)/n;x(1)=x0;y(1)=y0;for i=1:nx(i+1)=x(i)+h;k1=feval(fun,x(i),y(i));k2=feval(fun,x(i)+h/2,y(i)+h*k1/2);k3=feval(fun,x(i)+h/2,y(i)+h*k2/2);k4=feval(fun,x(i)+h,y(i)+h*k3);y(i+1)=y(i)+h*(k1+2*k2+2*k3+k4)/6;end刚性常微分方程:ode15s,ode23s,ode23t,ode23tb,用法与上面类似。

高阶微分方程的解法:2.常微分方程的解析解:(1)无初边值条件:(2)有初边值条件:(3)求解常微分方程组:(4)求解线性常微分方程组:①一阶齐此线性微分方程组②非齐次线性微分方程组(5)边值问题的MATLAB解法调用bvp4c函数求解一般地,bvp4c的调用格式如下:sol=bvp4c(@odefun,@bcfun,solinit,options,p1,p2,…); 函数odefun的格式为yprime=odefun(x,y,p1,p2, …);函数bcfun的格式为res=bcfun(ya,yb, p1,p2, …);初始猜测结构solinit有两个域:solinit.x提供初始猜测的x 值,排列顺序从左到右排列,其中solinit.x(1)和solinit.x(end)分别为a 和b 。

matlab迭龙格库塔法解常微分方程

一、介绍迭龙格-库塔法(Runge-Kutta method)是一种数值求解常微分方程(ODE)的常用方法。

它是由卡尔·迭龙格(Carl Runge)和马丁·威尔黑尔姆·库塔(Wilhelm Kutta)在20世纪初提出的,该方法以两位数值分析家的名字来命名。

二、简单描述迭龙格-库塔法是通过数值逼近的方式,来计算常微分方程的近似解。

它是一种显式求解方法,适用于解非线性常微分方程和具有较大阶数的常微分方程。

三、数学原理迭龙格-库塔法主要是通过将微分方程转化为差分方程,利用数值解的方式来逼近微分方程的解。

它是一种显式方法,通过不断迭代得到下一个时间步的近似解。

四、matlab中的应用在matlab中,可以使用ode45函数来调用迭龙格-库塔法求解常微分方程。

ode45函数是matlab中集成的一个函数,通过调用ode45函数,可以直接求解常微分方程的数值解。

五、实例演示下面通过一个简单的例子来演示如何使用matlab中的ode45函数来求解常微分方程。

我们考虑一个简单的一阶常微分方程:dy/dt = -y初始条件为y(0) = 1。

在matlab中,可以通过以下代码来求解该微分方程:```定义微分方程的函数function dydt = myode(t, y)dydt = -y;调用ode45函数求解[t, y] = ode45(myode, [0, 5], 1);plot(t, y);```运行以上代码,即可得到微分方程的数值解,并通过绘图来展示解的变化。

六、总结迭龙格-库塔法是一种常用的数值解常微分方程的方法,它在matlab中有较为方便的调用方式。

通过ode45函数,可以快速求解常微分方程的数值解,并通过绘图来展示结果。

希望本篇文章对读者有所帮助,谢谢阅读。

七、应用场景和优势在实际应用中,迭龙格-库塔法广泛应用于各种科学和工程领域,如物理学、化学、生物学、经济学等。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

佛山科学技术学院
实 验 报 告
课程名称 数值分析 实验项目 常微分方程问题初值问题数值解法 专业班级 姓 名 学 号 指导教师 陈剑 成 绩 日 期
一. 实验目的
1、理解如何在计算机上实现用Euler 法、改进Euler 法、Runge -Kutta 算法求一阶常微分方程初值问题
⎩⎨
⎧=∈='1
)(]
,[),,()(y a y b a x y x f x y 的数值解。

2、利用图形直观分析近似解和准确解之间的误差。

二、实验要求
(1) 按照题目要求完成实验内容; (2) 写出相应的Matlab 程序;
(3) 给出实验结果(可以用表格展示实验结果); (4) 分析和讨论实验结果并提出可能的优化实验。

(5) 写出实验报告。

三、实验步骤
1、用Matlab 编写解常微分方程初值问题的Euler 法、改进Euler 法和经典的四阶Runge-Kutta 法。

2、给定初值问题
⎪⎩⎪⎨⎧
=≤≤-=;
1)1(,
21,1')1(2y x x
y x y


⎪⎨⎧=≤≤++-=31)0(10,25050')2(2y x x x y y 要求:(a )用Euler 法和改进的Euler 法(步长均取h=0.05)及经典的四阶Runge-Kutta 法(h=0.1)求(1)的数值解,并打印)10,....2,1,0(1.01=+=i i x 的值。

(b) 用经典的四阶Runge-Kutta 方法解(2),步长分别取h=0.1, 0.05,0.025,计算并打印
)10,....2,1,0(1.0==i i x 个点的值,与准确解2503
1
)(x e x y x +=-比较,并列表写出在
x=0.2,0.5,0.8处,对于不同步长h 下的误差,讨论同一节点处,误差随步长的变化规律。

(c )用Matlab 绘图函数绘制(2)的精确解和近似解的图形。

四、实验结果 %Euler.m
function y = Euler(x0,xn,y0,h) %Euler 法解方程f_xy ; %x0,y0为初始条件; %x0,xn 为求值区间; %h 为步长; %求区间个数: n = (xn-x0)/h;
%矩阵x 存储n+1个节点: x = [x0:h:xn]';
%矩阵y 存储节点处的值: y = [y0;zeros(n,1)];
%矩阵y_存储节点处导数值: y_(1)= f_xy(x0,y0); y_ = [y_(1);zeros(n,1)];
%进行迭代(欧拉法迭代;求导数): for i = 2:n+1
y (i) = y(i-1)+h*y_(i-1); y_(i) = f_xy(x(i),y(i)); end
%Imp_Euler.m
function y = Imp_Euler(x0,xn,y0,h)
%改进的Euler法解方程f_xy;
%x0,y0为初始条件;
%x0,xn为求值区间;
%h为步长;
%求区间个数:
n = (xn-x0)/h;
%矩阵x存储n+1个节点:
x = [x0:h:xn]';
%矩阵y存储节点处的值:
y = [y0;zeros(n,1)];
%矩阵y_存储节点处导数值:
y_(1)= f_xy(x0,y0);
y_ = [y_(1);zeros(n,1)];
%使用改进Euler法求值(欧拉法求近似;近似点导数;梯形校正;求导):for i = 2:n+1
y_l = y(i-1) + h*y_(i-1);
y_l = f_xy(x(i),y_l);
y(i) = y(i-1) + (h/2)*(y_(i-1)+y_l);
y_(i)= f_xy(x(i),y(i));
end
%R_Kutta4.m
function y = R_Kutta4(x0,xn,y0,h)
%Runger_Kutta法解方程f_xy;
%x0,y0为初始条件;
%x0,xn为求值区间;
%h为步长;
%求区间个数:
n = (xn-x0)/h;
%矩阵x存储n+1个节点:
x = [x0:h:xn]';
%矩阵y存储节点处的值:
y = [y0;zeros(n,1)];
%矩阵k1,k2,k3,k4存储各节点(中点)数值:
k1(1)= f_xy(x0,y0);
k1 = [k1(1);zeros(n,1)];
k2(1)= f_xy(x0+h/2,y0+h*k1(1)/2);
k2 = [k2(1);zeros(n,1)];
k3(1)= f_xy(x0+h/2,y0+h*k2(1)/2);
k3 = [k3(1);zeros(n,1)];
k4(1)= f_xy(x0+h,y0+h*k3(1));
k4 = [k4(1);zeros(n,1)];
for i= 2:n+1
y(i) = y(i-1)+(h/6)*(k1(i-1)+2*k2(i-1)+2*k3(i-1)+k4(i-1));
k1(i)= f_xy(x(i),y(i));
k2(i)= f_xy(x(i)+h/2,y(i)+h*k1(i)/2);
k3(i)= f_xy(x(i)+h/2,y(i)+h*k2(i)/2);
k4(i)= f_xy(x(i)+h,y(i)+h*k3(i));
end
(a):
%f_xy.m
function y_=f_xy(x,y)
%求解第五次作业第一题的点(x,y)处的导数;
y_ = 1/(x^2) - y/x;
%run521.m
clc,clear;
x0 = 1;
xn = 2;
h = 0.05;
y0 = 1;
%便于显示出x,与y对应:x = [x0:h:xn]';
y = Euler(x0,xn,y0,h);
YE =[x,y];
y = Imp_Euler(x0,xn,y0,h); YIE= [x,y];
h = 0.1;
x = [x0:h:xn]';
y = R_Kutta4(x0,xn,y0,h); YRK= [x,y];
(b): %f_xy.m
function y_=f_xy(x,y) %求第二个方程的导数: y_ = -50*y+50*(x^2)+2*x;
%run522.m
clc,clear; x0 = 0; xn = 1; y0 = 1/3; %步长0.1: h = 0.1; x = [x0:h:xn]';
y = R_Kutta4(x0,xn,y0,h); y_r= f_Real(x); Y1 = [x,y,y_r];
%步长0.05: h = 0.05; x = [x0:h:xn]';
y = R_Kutta4(x0,xn,y0,h); y_r= f_Real(x); Y2 = [x,y,y_r]; %步长0.025: h = 0.025; x = [x0:h:xn]';
y = R_Kutta4(x0,xn,y0,h); y_r= f_Real(x); Y3 = [x,y,y_r];
五、讨论分析
(a)
从结果可以看出使用RK 方法,步长较大但是结果也更加精确; (b)
分析求值结果的误差,可以发现当步长取0.1时,误差是超级大的(10^8数量级),但是当步长缩小一半取0.05时,误差就很小了,再缩小一半,误差就更小了。

根据书本的介绍,步长缩小一半,精度提高十多倍,但是从测试情况来看,步长有个临界点(可能仅仅针对这种凹形,指数形函数),太大时,会忽略掉函数的某些属性,譬如取0.1时跳过了凹形区域,从而丧失了精确度(错误结果),所以步长选择时要比较谨慎,以免出现这种情况,至于h 和误差的关系,在不出现
步长0.1: x 误差
步长0.05: x 误差
步长0.025: x 误差
错误选择的情况下,步长越小,误差是越小的,而且是指数型减小。

另外通过操作可以看到三种步长下的插值和准确值函数图像:
注意第一幅图有科学计数法标注(10^10)
下面两幅图可以看出,当步长减小时到0.025时,基本就与原值一致了:
六、改进实验建议
实验的题目表述有比较大的问题,有重复操作部分,有些表达也不是很清楚,所以希望出题时能够认真考虑下实现过程,是否有矛盾或是冗余的,不然很浪费时间又不能锻炼操作能力。

总的来说还是有收获的,尤其是RK步长取0.1时都觉得是否程序出错。

相关文档
最新文档