数值分析Matlab作业龙格库塔欧拉方法解二阶微分方程
python龙格库塔法求解二阶方程
Python是一种高级编程语言,广泛应用于科学计算和工程领域。
而在科学计算中,求解二阶常微分方程是一个常见的问题。
龙格库塔法(Runge-Kutta method)是一种常用的数值求解方法,可以用来求解常微分方程的初值问题。
在Python中,我们可以利用其强大的数值计算库来实现龙格库塔法求解二阶常微分方程。
在本文中,我们将介绍如何使用Python中的龙格库塔法来求解二阶常微分方程。
文章将从以下几个方面展开讲解:1. 二阶常微分方程的基本概念2. 龙格库塔法的原理与公式推导3. Python中如何实现龙格库塔法求解二阶常微分方程4. 一个具体的求解例子及代码实现5. 总结与展望一、二阶常微分方程的基本概念二阶常微分方程是指具有形如y''(t) = f(t, y, y')(t)的形式,其中t是自变量,y是未知函数,f是已知函数。
求解二阶常微分方程的目标是找到一个满足方程的函数y(t)。
通常情况下,需要给出该方程的初值条件,即y(0)和y'(0),以求得方程的具体解。
二、龙格库塔法的原理与公式推导龙格库塔法是一种数值求解常微分方程初值问题的方法,通过迭代计算来逼近方程的解。
它的基本思想是将微分方程的解按照一定的步长进行逼近,然后利用逼近值来计算下一个逼近值,直到达到所需的精度。
龙格库塔法的一般形式为:k1 = h * f(tn, yn)k2 = h * f(tn + 1/2 * h, yn + 1/2 * k1)k3 = h * f(tn + 1/2 * h, yn + 1/2 * k2)k4 = h * f(tn + h, yn + k3)yn+1 = yn + 1/6 * (k1 + 2*k2 + 2*k3 + k4)其中,h是步长,t是自变量,y是未知函数,f是已知函数,k1、k2、k3、k4是中间变量。
三、Python中如何实现龙格库塔法求解二阶常微分方程在Python中,可以利用其强大的数值计算库来实现龙格库塔法求解二阶常微分方程。
matlab龙格库塔方法求解二元二阶常微分方程组
matlab龙格库塔方法求解二元二阶常微分方程组文章标题:深入探讨matlab中的龙格库塔方法及其在求解二元二阶常微分方程组中的应用摘要:在科学与工程领域,常常需要求解复杂的微分方程组,而matlab作为一种强大的数学工具,提供了许多求解微分方程组的方法。
本文将深入探讨matlab中的龙格库塔方法及其在求解二元二阶常微分方程组中的应用,以便读者全面理解该方法并能灵活应用于实际问题中。
正文:一、介绍龙格库塔方法龙格-库塔法(Runge-Kutta methods)是一种数值求解常微分方程的方法,通过将微分方程的解进行离散化,将微分方程转化为差分方程,从而进行数值求解。
龙格库塔方法通过迭代计算,能够得到微分方程的数值解,广泛应用于科学计算和工程技术领域。
二、matlab中的龙格库塔方法在matlab中,龙格库塔方法通过ode45函数实现,该函数能够对一阶或高阶常微分方程进行数值求解。
用户可以通过设定初始条件、微分方程表达式,以及积分区间等参数,快速得到微分方程的数值解。
ode45函数采用自适应步长的方式进行求解,能够有效解决微分方程解的数值稳定性和精确度问题。
三、龙格库塔方法在求解二元二阶常微分方程组中的应用考虑如下形式的二元二阶常微分方程组:$$\begin{cases}y_1' = f_1(t, y_1, y_2) \\y_2' = f_2(t, y_1, y_2)\end{cases}$$其中,$y_1(t)$和$y_2(t)$是未知函数,$f_1(t, y_1, y_2)$和$f_2(t,y_1, y_2)$分别表示其对应的函数表达式。
通过matlab中的ode45函数,可以将该二元二阶常微分方程组转化为一阶常微分方程组的形式,然后利用龙格库塔方法进行数值求解。
设定初始条件$y_1(0) = y1_0, y_2(0) = y2_0$,对应的一阶方程组为:$$\begin{cases}u_1' = u_3 \\u_2' = u_4 \\u_3' = f_1(t, u_1, u_2) \\u_4' = f_2(t, u_1, u_2)\end{cases}$$其中,$u_1(t) = y_1(t), u_2(t) = y_2(t), u_3(t) = y_1'(t), u_4(t) =y_2'(t)$,通过ode45函数求解该一阶常微分方程组即可得到原二元二阶常微分方程组的数值解。
matlab 二阶常微分方程数值求解函数
matlab 二阶常微分方程数值求解函数【实用版】目录1.Matlab 二阶常微分方程数值求解函数介绍2.二阶常微分方程的格式和解法3.Matlab 中的数值求解方法4.常见问题和解决方法5.总结正文Matlab 是一种广泛使用的科学计算软件,它提供了丰富的函数库和工具箱,使得科学家和工程师可以方便地进行各种数学计算和数据分析。
在 Matlab 中,二阶常微分方程的数值求解是一个非常常用的功能。
二阶常微分方程是指形如 dx/dt = ax + bx + cy 的微分方程,其中a、b、c 是常数,x、y 是变量。
这种微分方程在自然科学、工程技术、经济学等领域有着广泛的应用。
然而,许多二阶常微分方程无法通过解析方法求解,这时候就需要使用数值求解方法。
Matlab 中提供了多种数值求解方法,包括欧拉法、改进欧拉法、龙格库塔法等。
这些方法都可以通过 Matlab 自带的函数库进行求解。
以欧拉法为例,可以使用 Matlab 中的 ode45 函数进行求解。
这个函数接受三个参数,分别是方程式、初始条件和求解参数。
方程式和初始条件都是字符串,方程式中变量和参数之间用空格隔开,初始条件中变量和参数之间用逗号隔开。
求解参数包括求解的步数、求解的精度等。
在使用 Matlab 进行二阶常微分方程数值求解时,可能会遇到一些问题。
例如,求解的结果可能有误差,这时候可以通过增加求解的步数或提高求解的精度来提高结果的准确性。
有时候,求解的过程可能会出现不稳定的现象,这时候可以通过调整求解的参数或更换求解方法来解决。
总的来说,Matlab 是一种强大的科学计算工具,它提供的二阶常微分方程数值求解函数可以帮助我们解决许多实际问题。
matlab欧拉法求解微分方程
matlab欧拉法求解微分方程Matlab是一款用于科学计算、数据处理和可视化的工具软件,它不仅可以处理数字、符号运算,还可以用于各种重要的数学应用。
欧拉法是最简单的数值解微分方程的方法之一,它可以在Matlab中进行实现。
欧拉法的实现过程如下:1. 设定初始条件。
对于一个一阶微分方程$y' = f(t,y)$,需要给出初值$y(t_0) =y_0$和一定的步长$h$,即$t_n = t_0 + nh$。
其中,$n$为正整数。
可以将$t_n$与$y_n$一起存放到两个向量$t$和$y$中。
2. 设定迭代方程。
使用泰勒公式将$y(t + h)$展开,得到$y(t+h) =y(t)+hy'(t)+\frac{h^2}{2}y''(t)+O(h^3)$,由于这是一个微分方程的一阶泰勒公式,$y''$一般很难求得,可以将其忽略得到:$y(t + h) \approx y(t) + hf(t,y(t))$从而,欧拉法的迭代方程就得到了。
可以在Matlab中用一行代码来实现:y(n+1) = y(n) + h*f(t(n),y(n));其中,$t(n)$和$y(n)$表示当前时刻$t$和对应的$y$值,而$f(t(n),y(n))$表示在$t(n)$和$y(n)$处方程的斜率。
3. 进行迭代计算。
根据上述迭代方程循环进行计算即可。
以下是一个示例程序:t0 = 0;y0 = 1;h = 0.1; % 步长tf = 1; % 计算到1sN = round(tf/h)+1; % 总步数t = linspace(t0,tf,N); % 时间向量y = zeros(size(t)); % 初始值向量y(1) = y0;for n = 1:N-1y(n+1) = y(n) + h*func(t(n),y(n));endplot(t,y) % 绘制y-t图像其中,func为微分方程的右端函数。
使用Matlab进行微分方程求解的方法
使用Matlab进行微分方程求解的方法引言微分方程是数学中非常重要的一部分,广泛应用于物理、经济、工程等领域。
对于大部分微分方程的解析解往往难以求得,而数值解法则成为了一种常用的解决手段。
Matlab作为一种强大的科学计算软件,也提供了丰富的工具和函数用于求解微分方程,本文将介绍一些常见的使用Matlab进行微分方程求解的方法。
一、数值求解方法1. 欧拉方法欧拉方法是最简单的一种数值求解微分方程的方法,它将微分方程的微分项用差分的方式进行近似。
具体的公式为:y(n+1) = y(n) + hf(x(n), y(n))其中,y(n)表示近似解在第n个点的值,h为步长,f(x, y)为微分方程的右端项。
在Matlab中使用欧拉方法进行求解可以使用ode113函数,通过设定不同的步长,可以得到不同精度的数值解。
2. 中点法中点法是较为精确的一种数值求解微分方程的方法,它的计算公式为:k1 = hf(x(n), y(n))k2 = hf(x(n) + h/2, y(n) + k1/2)y(n+1) = y(n) + k2中点法通过计算两个斜率的平均值来得到下一个点的值,相较于欧拉方法,中点法能提供更精确的数值解。
3. 4阶龙格库塔法龙格库塔法是一类高阶数值求解微分方程的方法,其中4阶龙格库塔法是最常用的一种。
它的计算公式为:k1 = hf(x(n), y(n))k2 = hf(x(n) + h/2, y(n) + k1/2)k3 = hf(x(n) + h/2, y(n) + k2/2)k4 = hf(x(n) + h, y(n) + k3)y(n+1) = y(n) + (k1 + 2k2 + 2k3 + k4)/64阶龙格库塔法通过计算多个斜率的加权平均值来得到下一个点的值,相较于欧拉方法和中点法,它的精度更高。
二、Matlab函数和工具除了可以使用以上的数值方法进行微分方程求解之外,Matlab还提供了一些相关的函数和工具,方便用户进行微分方程的建模和求解。
二阶微分方程龙格库塔法
二阶微分方程龙格库塔法
1.什么是二阶微分方程?
二阶微分方程是指二阶导数出现的方程,其通用形式为
y''+P(x)y'+Q(x)y=F(x),其中P(x)、Q(x)、F(x)均为已知函数,y是所求函数。
2.为什么要用龙格库塔法?
求解二阶微分方程是数学、物理等领域中常见的问题,然而大多数情况下无法直接解题,所以需要使用数值方法。
龙格库塔法是一种数值方法,被广泛应用于求解微分方程,其优点是精度高、计算速度快。
3.龙格库塔法的原理
龙格库塔法是一种迭代方法,将微分方程看作初值问题,从初始点出发,采用一定的步长h,在每个点上用插值公式逼近y(x+h),以此求得y(x+h)的近似值,一步步逼近所要求的精度。
4.龙格库塔法的步骤
(1)确定步长h和积分区间[a,b]。
(2)用初值y(x0)=y0,y'(x0)=y'0求出y(x0+h)的近似值。
(3)根据龙格库塔公式求得y(x0+2h)的近似值。
(4)对于连续求解的情况,重复以上步骤,直到求得所需的精度或者达到指定的终点。
5.龙格库塔公式
龙格库塔法的精度与所采用的公式有关,一般采用二阶或四阶的龙格库塔公式。
二阶龙格库塔公式为:
y0=y(x0)
k1=h*f(x0,y0)
k2=h*f(x0+h,y0+k1)
y(x0+2h)=y0+1/2(k1+k2)
其中,f(x,y)是待求函数。
6.总结
龙格库塔法是求解微分方程的一种常用数值方法,可以高精度、高效地解决二阶微分方程的问题。
该方法所需的计算量较小,易于编写程序实现,在实际应用中具有广泛的用途。
matlab龙格库塔法程序,给出实例
一、介绍龙格库塔法龙格库塔法(Runge-Kutta method)是一种数值计算方法,用于求解常微分方程的数值解。
它通过多步迭代的方式逼近微分方程的解,并且具有较高的精度和稳定性。
二、龙格库塔法的原理龙格库塔法采用迭代的方式来逼近微分方程的解。
在每一步迭代中,计算出当前时刻的斜率,然后根据这个斜率来求解下一个时刻的值。
通过多步迭代,可以得到微分方程的数值解。
三、龙格库塔法的公式龙格库塔法可以表示为以下形式:k1 = f(tn, yn)k2 = f(tn + h/2, yn + h/2 * k1)k3 = f(tn + h/2, yn + h/2 * k2)k4 = f(tn + h, yn + h * k3)yn+1 = yn + h/6 * (k1 + 2k2 + 2k3 + k4)其中,k1、k2、k3、k4为斜率,h为步长,tn为当前时刻,yn为当前时刻的解,yn+1为下一个时刻的解。
四、使用matlab实现龙格库塔法在MATLAB中,可以通过编写函数来实现龙格库塔法。
下面是一个用MATLAB实现龙格库塔法的简单例子:```matlabfunction [t, y] = runge_kutta(f, tspan, y0, h)t0 = tspan(1);tf = tspan(2);t = t0:h:tf;n = length(t);y = zeros(1, n);y(1) = y0;for i = 1:n-1k1 = f(t(i), y(i));k2 = f(t(i) + h/2, y(i) + h/2 * k1);k3 = f(t(i) + h/2, y(i) + h/2 * k2);k4 = f(t(i) + h, y(i) + h * k3);y(i+1) = y(i) + h/6 * (k1 + 2*k2 + 2*k3 + k4);endend```以上就是一个简单的MATLAB函数,可以利用该函数求解给定的微分方程。
Matlab中龙格-库塔(Runge-Kutta)方法原理及实现
Matlab中龙格-库塔(Runge-Kutta)方法原理及实现龙格-库塔(Runge-Kutta)方法是一种在工程上应用广泛的高精度单步算法。
由于此算法精度高,采取措施对误差进行抑制,所以其实现原理也较复杂。
该算法是构建在数学支持的基础之上的。
龙格库塔方法的理论基础来源于泰勒公式和使用斜率近似表达微分,它在积分区间多预计算出几个点的斜率,然后进行加权平均,用做下一点的依据,从而构造出了精度更高的数值积分计算方法。
如果预先求两个点的斜率就是二阶龙格库塔法,如果预先取四个点就是四阶龙格库塔法。
一阶常微分方程可以写作:y'=f(x,y),使用差分概念。
(Yn+1-Yn)/h= f(Xn,Yn)推出(近似等于,极限为Yn')Yn+1=Yn+h*f(Xn,Yn)另外根据微分中值定理,存在0<t<1,使得Yn+1=Yn+h*f(Xn+th,Y(Xn+th))这里K=f(Xn+th,Y(Xn+th))称为平均斜率,龙格库塔方法就是求得K的一种算法。
利用这样的原理,经过复杂的数学推导(过于繁琐省略),可以得出截断误差为O(h^5)的四阶龙格库塔公式:K1=f(Xn,Yn);K2=f(Xn+h/2,Yn+(h/2)*K1);K3=f(Xn+h/2,Yn+(h/2)*K2);K4=f(Xn+h,Yn+h*K3);Yn+1=Yn+h*(K1+2K2+2K3+K4)*(1/6);所以,为了更好更准确地把握时间关系,应自己在理解龙格库塔原理的基础上,编写定步长的龙格库塔函数,经过学习其原理,已经完成了一维的龙格库塔函数。
仔细思考之后,发现其实如果是需要解多个微分方程组,可以想象成多个微分方程并行进行求解,时间,步长都是共同的,首先把预定的初始值给每个微分方程的第一步,然后每走一步,对多个微分方程共同求解。
想通之后发现,整个过程其实很直观,只是不停的逼近计算罢了。
编写的定步长的龙格库塔计算函数:function [x,y]=runge_kutta1(ufunc,y0,h,a,b,Vg)%参数表顺序依次是微分方程组的函数名称,初始值向量,步长,时间起点,时间终点,发酵罐体积(参数形式参考了ode45函数)n=floor((b-a)/h);%求步数x(1)=a;%时间起点y(:,1)=y0;%赋初值,可以是向量,但是要注意维数for ii=1:nx(ii+1)=x(ii)+h;k1=ufunc(x(ii),y(:,ii),Vg);k2=ufunc(x(ii)+h/2,y(:,ii)+h*k1/2,Vg);k3=ufunc(x(ii)+h/2,y(:,ii)+h*k2/2,Vg);k4=ufunc(x(ii)+h,y(:,ii)+h*k3,Vg);y(:,ii+1)=y(:,ii)+h*(k1+2*k2+2*k3+k4)/6;%按照龙格库塔方法进行数值求解end调用的子函数以及其调用语句:function dy=test_fun(x,y)dy = zeros(3,1);%初始化列向量dy(1) = y(2) * y(3);dy(2) = -y(1) + y(3);dy(3) = -0.51 * y(1) * y(2);对该微分方程组用ode45和自编的龙格库塔函数进行比较,调用如下:[T,F] = ode45(@test_fun,[0 15],[1 1 3]);subplot(121)plot(T,F)%Matlab自带的ode45函数效果title('ode45函数效果')[T1,F1]=runge_kutta1(@test_fun,[1 1 3],0.25,0,15);%测试时改变test_fun的函数维数,别忘记改变初始值的维数subplot(122)plot(T1,F1)%自编的龙格库塔函数效果title('自编的龙格库塔函数')运行结果如下:。
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函数,可以快速求解常微分方程的数值解,并通过绘图来展示结果。
希望本篇文章对读者有所帮助,谢谢阅读。
七、应用场景和优势在实际应用中,迭龙格-库塔法广泛应用于各种科学和工程领域,如物理学、化学、生物学、经济学等。
龙格-库塔法(Runge-Kutta)matlab代码及含义
龙格-库塔法(Runge-Kutta)数值分析中,龙格-库塔法(Runge-Kutta)是用于模拟常微分方程的解的重要的一类隐式或显式迭代法。
这些技术由数学家卡尔·龙格和马丁·威尔海姆·库塔于1900年左右发明。
经典四阶龙格库塔法RK4””或者就是龙格库塔法的家族中的一个成员如此常用,以至于经常被称为“RK4“龙格库塔法”。
令初值问题表述如下。
则,对于该问题的RK4由如下方程给出:其中这样,下一个值(yn+1)由现在的值(yn)加上时间间隔(h)和一个估算的斜率的乘积决定。
该斜率是以下斜率的加权平均:k1是时间段开始时的斜率;k2是时间段中点的斜率,通过欧拉法采用斜率k1来决定y在点tn+h/2的值;k3也是中点的斜率,但是这次采用斜率k2决定y值;k4是时间段终点的斜率,其y值用k3决定。
当四个斜率取平均时,中点的斜率有更大的权值:RK4法是四阶方法,也就是说每步的误差是h5阶,而总积累误差为h4阶。
注意上述公式对于标量或者向量函数(y可以是向量)都适用。
显式龙格库塔法显示龙格-库塔法是上述RK4法的一个推广。
它由下式给出其中(注意:上述方程在不同著述中由不同但却等价的定义)。
要给定一个特定的方法,必须提供整数s(阶段数),以及系数aij(对于1≤j<i≤s),bi(对于i=1,2,2,...,...,s)和ci(对于i=2,3,3,...,...,s)。
这些数据通常排列在一个助记c3a31如果要求方法有精度p则还有相应的条件,也就是要求舍入误差为O(hp+1)时的条件。
这些可以从舍入误差本身的定义中导出。
例如,一个2阶精度的2段方法要求b1+b2=1,b2c2=1/2,以及b2a21=1/2。
matlab用经典龙格库塔法求微分方程组初值问题程序
matlab用经典龙格库塔法求微分方程组初值问题程序经典龙格-库塔法是一种数值求解常微分方程的方法。
以下是一个使用MATLAB实现经典龙格-库塔法求解微分方程组的示例代码:```matlabfunction [t, y] = runge_kutta(f, y0, tspan, N)% f: 微分方程右边的函数句柄% y0: 初始值% tspan: 时间范围 [t0, tf]% N: 步数t = linspace(tspan(1), tspan(2), N+1); % 时间向量y = zeros(size(t)); % 初始化解向量y(1) = y0; % 设置初始值for i = 1:N% 计算四个点上的值k1 = f(t(i), y(i));k2 = f(t(i) + h/2, y(i) + h/2k1);k3 = f(t(i) + h/2, y(i) + h/2k2);k4 = f(t(i) + h, y(i) + hk3);% 更新解向量y(i+1) = y(i) + h/6(k1 + 2k2 + 2k3 + k4);endend```在上述代码中,我们定义了一个名为 `runge_kutta` 的函数,该函数接受微分方程右边的函数句柄 `f`、初始值 `y0`、时间范围 `tspan` 和步数 `N` 作为输入,并返回时间向量 `t` 和解向量 `y`。
在函数内部,我们首先生成时间向量 `t`,然后初始化解向量 `y`,并设置初始值 `y0`。
接下来,我们使用一个循环来迭代计算每个时间点上的值,并使用龙格-库塔公式更新解向量。
最后,我们返回时间向量 `t` 和解向量 `y`。
要使用该函数求解微分方程组,可以按照以下步骤进行:1. 定义微分方程右边的函数句柄 `f`,该函数接受时间和解向量作为输入,并返回微分方程的右侧值。
2. 定义初始值 `y0`。
3. 定义时间范围 `tspan`,该向量包含时间范围的起始和终止值。
数值分析Matlab作业龙格库塔欧拉方法解二阶微分方程
% K3 and L3
K4=RK_z(i)+h*L3; L4=rightf_sys1(x(i)+h,RK_y(i)+h*K3,RK_z(i)+h*L3);% K4and L4
RK_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);
end
plot(x,Euler_y,'r-',x,RK_y,'b-');
[y,T]=max(RK_y);
fprintf('角度峰值等于%d',y)%角度的峰值也就是π
运行第三个程序:在一幅图中显示欧拉法和RK4法,随着截断误差的积累,欧拉法产生了较大的误差
h=0.01
h=0.0001,仍然是开始较为稳定,逐渐误差变大
总结:RK4是很好的方法,很稳定,而且四阶是很常用的方法,因为到五阶的时候精度并没有相应提升。通过这两种方法计算出角度峰值y=3.141593,周期是1.777510。
y(0)=0
z(0)=0
精度随着h的减小而更高,因为向前欧拉方法的整体截断误差与h同阶,(因为是用了泰勒公式)所以欧拉方法的稳定区域并不大。
2.RK4-四阶龙格库塔方法
使用四级四阶经典显式Rungkutta公式
稳定性很好,RK4法是四阶方法,每步的误差是h5阶,而总积累误差为h4阶。所以比欧拉稳定。
MATLAB数值分析实验五(欧拉法,荣格-库塔法解常微分方程)
佛山科学技术学院实 验 报 告课程名称 数值分析 实验项目 常微分方程问题初值问题数值解法 专业班级 姓 名 学 号 指导教师 陈剑 成 绩 日 期一. 实验目的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 xy 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 个点的值,与准确解25031)(x e x y x +=-比较,并列表写出在x=0.2,0.5,0.8处,对于不同步长h 下的误差,讨论同一节点处,误差随步长的变化规律。
(c )用Matlab 绘图函数绘制(2)的精确解和近似解的图形。
四、实验结果 %Euler.mfunction 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+1y (i) = y(i-1)+h*y_(i-1); y_(i) = f_xy(x(i),y(i)); end%Imp_Euler.mfunction 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+1y_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.mfunction 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+1y(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.mfunction y_=f_xy(x,y)%求解第五次作业第一题的点(x,y)处的导数;y_ = 1/(x^2) - y/x;%run521.mclc,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.mfunction y_=f_xy(x,y) %求第二个方程的导数: y_ = -50*y+50*(x^2)+2*x;%run522.mclc,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时,误差就很小了,再缩小一半,误差就更小了。
matlab龙格库塔解微分方程组
matlab龙格库塔解微分方程组在MATLAB中,可以使用ode45函数来求解微分方程组。
首先,将微分方程组定义为一个函数,其输入参数为t和y,其中t表示时间,y表示未知变量向量。
返回值是微分方程组的导数。
例如,假设要求解以下微分方程组:
dy1/dt = f1(t, y1, y2)
dy2/dt = f2(t, y1, y2)
可以将其定义为一个名为myODE函数:
function dydt = myODE(t,y)
dy1dt = f1(t, y(1), y(2));
dy2dt = f2(t, y(1), y(2));
dydt = [dy1dt; dy2dt];
end
其中f1和f2是定义微分方程组的函数。
然后,可以使用ode45函数来求解微分方程组。
例如,假设初始条件为y(0) = [y1(0), y2(0)],求解时间范围为[t0, t1]:
tspan = [t0, t1];
y0 = [y1(0), y2(0)];
[t, y] = ode45(@myODE, tspan, y0);
其中@myODE表示对myODE函数的函数句柄。
通过上述步骤,可以得到微分方程组的数值解。
解向量y中的每一行对应于对应时间点t的未知变量值。
可以通过y(:,1)和y(:,2)来分别获取y1和y2的数值解。
数值分析Matlab作业龙格库塔欧拉方法解二阶微分方程
Matlab 应用使用Euler 和Rungkutta 方法解臂状摆的能量方程背景 单摆是常见的物理模型,为了得到摆角θ的关于时间的函数,来描述单摆运动。
由角动量定理我们知道εJ M =化简得到0sin 22=+θθl g dt d 在一般的应用和计算中,只考虑摆角在5度以内的小摆动,因为可以吧简化为,这样比较容易解。
实际上这是一个解二阶常微分方程的问题。
θ在这里的单摆是一种特别的单摆,具有均匀的质量M 分布在长为2的臂状摆上,使用能量法建立方程W T =h mg ∆=2J 21ω化简得到四阶龙格库塔方法使用四级四阶经典显式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-欧拉方法和龙格库塔方法的小实例
题一:a)y’=y+2x , 欧拉方法:112()2n n h y y k k +=++,12n n k y x =+,2112()n n k y hk x +=++; 龙格-库塔方法:11234(22)6n n h y y k k k k +=++++,12n n k y x =+,12222n n k h k y h x ⎛⎫=+++ ⎪⎝⎭,23222n n k h k y h x ⎛⎫=+++ ⎪⎝⎭,432()n n k y hk x h =+++ 精确解:y=3e x -2x-2。
以步长h=0.1 在0<=x<=1内的计算结果如下所示:0.1000 1.1150 1.1155 1.11550.2000 1.2631 1.2642 1.26420.3000 1.4477 1.4496 1.44960.4000 1.6727 1.6755 1.67550.5000 1.9423 1.9462 1.94620.6000 2.2613 2.2664 2.26640.7000 2.6347 2.6413 2.64130.8000 3.0684 3.0766 3.07660.9000 3.5685 3.5788 3.57881.0000 4.1422 4.1548 4.1548b)文案 编辑词条B 添加义项 ?文案,原指放书的桌子,后来指在桌子上写字的人。
现在指的是公司或企业中从事文字工作的职位,就是以文字来表现已经制定的创意策略。
文案它不同于设计师用画面或其他手段的表现手法,它是一个与广告创意先后相继的表现的过程、发展的过程、深化的过程,多存在于广告公司,企业宣传,新闻策划等。
基本信息中文名称文案外文名称Copy目录1发展历程2主要工作3分类构成4基本要求5工作范围6文案写法7实际应用折叠编辑本段发展历程汉字"文案"(wén àn)是指古代官衙中掌管档案、负责起草文书的幕友,亦指官署中的公文、书信等;在现代,文案的称呼主要用在商业领域,其意义与中国古代所说的文案是有区别的。
四阶龙格库塔方法求解n自由度二阶微分方程
四阶龙格库塔方法求解n自由度二阶微分方程在数值计算中,龙格-库塔方法(Runge-Kutta method)是一种常用的求解常微分方程(ODE)的数值方法。
它是一种多步法(multiple-step method),通过使用不同的近似值来迭代计算ODE 的解。
其中,四阶龙格-库塔方法是最常用的龙格-库塔方法之一,也是一种高阶方法,可用于求解n自由度二阶微分方程。
下面将介绍四阶龙格-库塔方法的原理、步骤和应用。
首先,我们来回顾一下二阶微分方程的一般形式:y''(y)=y(y,y(y),y'(y))这里,y(y,y(y),y'(y))是已知的函数,y(y)是我们要求解的未知函数。
为了求解这个二阶微分方程,我们需要将其转化为一个一阶微分方程的求解问题。
令y(y)=y(y)y(y)=y'(y)这样,我们可以将原始的二阶微分方程转化为如下的一阶微分方程组:y'(y)=y(y)y'(y)=y(y,y(y),y(y))现在,我们可以利用四阶龙格-库塔方法来求解这个一阶微分方程组。
四阶龙格-库塔方法基于泰勒展开的思想,通过使用一系列的近似值来逼近方程的解。
该方法的一般形式为:y1=ℎy(yy,yy)y2=ℎy(yy+ℎ/2,yy+y1/2)y3=ℎy(yy+ℎ/2,yy+y2/2)y4=ℎy(yy+ℎ,yy+y3)yy+1=yy+1/6(y1+2y2+2y3+y4)yy+1=yy+ℎ其中,yy是当前时间步,yy+1是下一个时间步,yy是当前位置的近似解,yy+1是下一个位置的近似解,ℎ是时间步长,y1、y2、y3和y4是中间的近似值。
四阶龙格-库塔方法的步骤如下:Step 1:给定初始条件我们需要提供初始条件,包括初始位置y0和初始速度y0,以及时间步长ℎ、求解的时间区间[y0,yy]和离散时间步数y。
y0=y(y0)y0=y'(y0)Step 2:进行迭代计算从n=0开始,进行y步的迭代计算,其中y=(yy−y0)/ℎ。
四阶龙格库塔解二阶微分方程
四阶龙格库塔解二阶微分方程四阶龙格库塔法是一种常用的数值解微分方程的算法,适用于解一阶、二阶以及高阶微分方程。
本文将围绕“四阶龙格库塔解二阶微分方程”展开,并分步骤进行阐述。
第一步:转换为一阶微分方程组对于二阶微分方程 y''=f(x,y,y'),可以将其转换为一阶微分方程组。
令 u=y',则 y''=du/dx,原方程变为 du/dx=f(x,y,u),整理得到以下一阶微分方程组:dy/dx=udu/dx=f(x,y,u)第二步:确定步长和初始条件在使用四阶龙格库塔法时,需要确定一个步长 h,以及初始条件y0 和 u0。
步长 h 决定了每一步积分时横坐标 x 的变化量。
初始条件 y0 和 u0 分别代表了 x=0 时的纵坐标和导数值。
第三步:进行数值积分按照四阶龙格库塔法的步骤进行数值积分,可得到第 k 步的纵坐标 yk 和导数值 uk:k1 = hf(xk,yk,uk)j1 = hukk2 = hf(xk+h/2,yk+j1/2,uk+k1/2)j2 = h(uk+k1/2)k3 = hf(xk+h/2,yk+j2/2,uk+k2/2)j3 = h(uk+k2/2)k4 = hf(xk+h,yk+j3,uk+k3)j4 = h(uk+k3)yk+1 = yk+(j1+2j2+2j3+j4)/6uk+1 = uk+(k1+2k2+2k3+k4)/6其中,k1 到 k4 和 j1 到 j4 分别为由函数 f(x,y,u) 求得的中间变量。
yk 和 uk 即为求得的第 k 步的纵坐标和导数值,yk+1 和uk+1 分别为求得的第 k+1 步的纵坐标和导数值。
第四步:循环迭代将上述计算步骤循环执行至所需的精度或区间内积分完成为止。
即对于每一步 k,根据当前的 yk 和 uk 求解下一步的 yk+1 和 uk+1,并记录下这些变量的值。
至此,关于“四阶龙格库塔解二阶微分方程”的阐述就结束了。
matlab解二阶微分方程组
matlab解二阶微分方程组在数学和工程领域中,二阶微分方程组是一类常见的问题,它们描述了许多自然现象和工程系统的动力学行为。
在本文中,我们将讨论如何使用Matlab解二阶微分方程组,并探讨其中的一些技巧和注意事项。
让我们来看一个简单的例子。
假设我们有一个二阶微分方程组,描述了一个弹簧-质量-阻尼系统的运动。
我们可以使用Matlab的ode45函数来求解这个方程组,该函数是一种常用的数值求解器,可以有效地解决微分方程组的数值解。
在使用ode45函数时,我们需要定义一个包含微分方程的函数,并将其作为输入传递给ode45函数。
在定义这个函数时,我们需要注意输入参数的顺序和返回值的格式,以确保程序能够正确运行。
我们还需要设置初始条件和求解的时间范围。
通过调用ode45函数并传递这些参数,我们可以得到微分方程组的数值解,并将其存储在一个数组中以供进一步分析和可视化。
当然,对于复杂的二阶微分方程组,可能需要更多的技巧和方法来求解。
在这种情况下,我们可以考虑使用符号计算工具箱来分析微分方程的性质和解析解。
然后,我们可以将这些解析解转化为数值解,并进行比较和验证。
我们还可以利用Matlab的图形化界面工具来直观地展示微分方程组的解,并进行参数的调整和实时可视化。
这种方法可以帮助我们更好地理解系统的动态行为,并优化系统的设计和控制策略。
总的来说,使用Matlab解二阶微分方程组是一种强大而灵活的工具,在数学建模和工程应用中发挥着重要作用。
通过合理地选择数值求解方法、调整参数和优化算法,我们可以高效地求解复杂的微分方程组,并获得准确的数值解。
希望本文能够帮助读者更好地理解和应用Matlab在二阶微分方程组求解中的技巧和方法。
龙格库塔方法及其matlab实现
龙格库塔方法及其m a t l a b实现(总6页)本页仅作为文档页封面,使用时可以删除This document is for reference only-rar21year.March龙格-库塔方法及其matlab实现摘要:本文的目的数值求解微分方程精确解,通过龙格-库塔法,加以利用matlab为工具达到求解目的。
龙格-库塔(Runge-Kutta)方法是一种在工程上应用广泛的高精度单步算法,用于数值求解微分方程。
MatLab软件是由美国Mathworks公司推出的用于数值计算和图形处理的科学计算系统环境。
MatLab是英文MATrix LABoratory(矩阵实验室)的缩写。
在MratLab环境下,用户可以集成地进行程序设计、数值计算、图形绘制、输入输出、文件管理等各项操作。
关键词:龙格-库塔 matlab 微分方程1.前言:知识背景龙格-库塔法(Runge-Kutta)是用于非线性常微分方程的解的重要的一类隐式或显式迭代法。
这些技术由数学家卡尔·龙格和马丁·威尔海姆·库塔于1900年左右发明。
通常所说的龙格库塔方法是相对四阶龙格库塔而言的,成为经典四阶龙格库塔法。
该方法具有精度高,收敛,稳定,计算过程中可以改变步长不需要计算高阶导数等优点,但是仍需计算在一些点上的值,比如四阶龙格-库塔法没计算一步需要计算四步,在实际运用中是有一定复杂性的。
Matlab是在20世纪七十年代后期的事:时任美国新墨西哥大学计算机科学系主任的Cleve Moler教授出于减轻学生编程负担的动机,为学生设计了一组调用LINPACK和EISPACK库程序的“通俗易用”的接口,此即用FORTRAN编写的萌芽状态的MATLAB。
经几年的校际流传,在Little的推动下,由Little、Moler、Steve Bangert合作,于1984年成立了MathWorks公司,并把MATLAB正式推向市场。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
K1=RK_z(i); L1=rightf_sys1(x(i),RK_y(i),RK_z(i));% K1 and L1
K2=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 L2
运行第三个程序:在一幅图中显示欧拉法和RK4法,随着截断误差的积累,欧拉法产生了较大的误差
h=0.01
h=0.0001,仍然是开始较为稳定,逐渐误差变大
总结:RK4是很好的方法,很稳定,而且四阶是很常用的方法,因为到五阶的时候精度并没有相应提升。通过这两种方法计算出角度峰值y=3.141593,周期是1.777510。
RK_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);
end
plot(x,Euler_y,'r-',x,RK_y,'b-');
[y,T]=max(RK_y);
fprintf('角度峰值等于%d',y)%角度的峰值也就是π
Matlab应用
使用Euler和Rungkutta方法解臂状摆的能量方程
背景单摆是常见的物理模型,为了得到摆角θ的关于时间的函数,来描述单摆运动。由角动量定理我们知道
化简得到
在一般的应用和计算中,只考虑摆角在5度以内的小摆动,因为可以吧简化为 ,这样比较容易解。实际上这是一个解二阶常微分方程的问题。
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; L4=rightf_sys1(x(i)+h,RK_y(i)+h*K3,RK_z(i)+h*L3);% K4 and L4
RK_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);
end
plot(x,RK_y,'b+');
xlabel('Variable x');
ylabel('Variable y');
A=[x,RK_y];
龙格库塔方法
先定义函数rightf_sys1.m
functionw=rightf_sys1(x,y,z)
w=7.35499*cos(y);
clear;
clc;
%set(0,'RecursionLimit',500)
h=0.01;
a=0;by(1)=0;%初值
RK_z(1)=0;%初值
三个程序
欧拉法
clear;
clc
h=0.00001;
a=0;b=25;
x=a:h:b;
y(1)=0;
z(1)=0;
fori=1:length(x)-1% 欧拉
y(i+1)=y(i)+h*z(i);
z(i+1)=z(i)+h*7.35499*cos(y(i));
end
plot(x,y,'r*');
xlabel('时间');
fori=1:length(x)-1
K1=RK_z(i); L1=rightf_sys1(x(i),RK_y(i),RK_z(i));% K1 and L1
K2=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);
fprintf('\n')
fprintf('周期等于%d',T*h)%周期
xlabel('时间');
ylabel('角度');
legend('欧拉','RK4');
[y,T]=max(RK_y);
legend('RK4方法');
fprintf('角度峰值等于%d',y)%角度的峰值也就是π
fprintf('\n')
fprintf('周期等于%d',T*h)%周期
两个方法在一起对比
使用跟上一个相同的函数rightf_sys1.m
clear;
clc;%清屏
h=0.0001;
在这里的单摆是一种特别的单摆,具有均匀的质量M分布在长为2的臂状摆上,
使用能量法建立方程
化简得到
重力加速度取9.80665
1使用欧拉法
令 ,这样降阶就把二阶常微分方程转化为一阶微分方程组,再利用向前Euler方法数值求解。
y(i+1)=y(i)+h*z(i);
z(i+1)=z(i)+h*7.35499*cos(y(i));
y(0)=0
z(0)=0
精度随着h的减小而更高,因为向前欧拉方法的整体截断误差与h同阶,(因为是用了泰勒公式)所以欧拉方法的稳定区域并不大。
2.RK4-四阶龙格库塔方法
使用四级四阶经典显式Rungkutta公式
稳定性很好,RK4法是四阶方法,每步的误差是h5阶,而总积累误差为h4阶。所以比欧拉稳定。
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('欧拉');
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);
% K3 and L3
K4=RK_z(i)+h*L3; L4=rightf_sys1(x(i)+h,RK_y(i)+h*K3,RK_z(i)+h*L3);% K4and L4
a=0;b=25;
x=a:h:b;
Euler_y(1)=0;
Euler_z(1)=0;%欧拉的初值
RK_y(1)=0;
RK_z(1)=0;%龙格库塔初值
fori=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));