matlab 数值计算课 二阶微分方程-龙格库塔方法 & ODE45

详见mathworks

龙格库塔方法

在这里插入图片描述
写成矩阵(状态方程)的形式更简洁一点(其实这两种方法结果是一样的,如果C是[1,0,0]的话,就很明显了)
在这里插入图片描述
例如:求系统在0-5s内的单位阶跃相应,已知传递函数:
在这里插入图片描述
状态方程:
在这里插入图片描述

clear
%状态方程
A=[0,1
    -100,-10];
B=[0;
    1];
C=[100,0];
%初值
x=[0;0];y=0;t0=0;tf=5;  
h=0.05;%步长
t=t0;%从t0开始迭代,储存时间
N=round((tf-t0)/h);     %迭代步数
r=1;%单位阶跃输入
for i=1:N   
    k1=A * x+B*r;
    k2=A * (x+h*k1/2)+B*r;
    k3=A * (x+h*k2/2)+B*r;
    k4=A * (x+h*k3)+B*r;
    x=x+h*(k1+2*k2+2*k3+k4)/6;                    %采用四阶龙格库塔法
    y=[y,C*x];                                    %输出值
    t=[t,t(i)+h];
end
plot(t,y);

结果:
在这里插入图片描述

  • matlab中传函转化状态空间方程的函数

构造传函:

M=100;%分子
N=[1,10,100];%分母
G=tf(M,N);%传函

转换:

    g=ss(G);%状态方程
    A=g.A;%各个系数矩阵
    B=g.B;
    C=g.C;

ODE45

  • 函数句柄的创建

1、 直接@

A=@sin(x);
A(pi)

2、创建匿名函数

%定义函数f(x)=x^2
f = @(x) x^2;
f(2)
  • ODE45使用
    [t,y] = ode45(odefun,tspan,y0)
    t:自变量
    y(t):因变量
    odefun:函数句柄(自动y’=)
    tspan:t的范围,如[0,10]
    y0:初值

1、一阶方程
在这里插入图片描述

a=@(t,y) 2*t;
[t,y] = ode45(a, [0 5], 0);
plot(t,y)

2、二阶方程
在这里插入图片描述
先转化为两个一阶微分:
在这里插入图片描述
创建m文件:

function dydt = vdp1(t,y)
dydt = [y(2); 
		(1-y(1)^2)*y(2)-y(1)];%括号不可省,不是变量,y是2x1列向量

调用ode45

[t,y] = ode45(@vdp1,[0 20],[2; 0]);
plot(t,y)

输出y两列,分别为y(1)和y(2)

  • 28
    点赞
  • 222
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
龙格-库塔法(Runge-Kutta method)是一种常用的数值微分方程方法之一,可以应用于一阶常微分方程和高阶常微分方程。在MATLAB中,可以使用以下步骤来实现龙格-库塔微分方程: 1. 定义微分方程: 首先,将微分方程表示为一阶形式:dy/dx = f(x, y),其中,f是一个关于x和y的函数。 2. 设定初始条件: 确定初始条件,如y(x0) = y0,其中x0是初始点,y0是初始值。 3. 设置步长和迭代次数: 定义步长h,即每次迭代的x的增量,以及迭代次数n。 4. 实现龙格-库塔法: 按照以下公式进行迭代计算: k1 = h * f(x, y) k2 = h * f(x + h/2, y + k1/2) k3 = h * f(x + h/2, y + k2/2) k4 = h * f(x + h, y + k3) y = y + (k1 + 2*k2 + 2*k3 + k4)/6 x = x + h 5. 循环迭代: 使用上述步骤中的公式,将x的值依次增加h,重复执行迭代计算n次。 下面是一个使用龙格-库塔微分方程的示例MATLAB代码: ```matlab function y = runge_kutta(f, x0, y0, h, n) % f: 微分方程函数 % x0: 初始点 % y0: 初始值 % h: 步长 % n: 迭代次数 x = x0; y = y0; for i = 1:n k1 = h * f(x, y); k2 = h * f(x + h/2, y + k1/2); k3 = h * f(x + h/2, y + k2/2); k4 = h * f(x + h, y + k3); y = y + (k1 + 2*k2 + 2*k3 + k4)/6; x = x + h; end end % 示例:微分方程 dy/dx = x^2,初始条件为 y(0) = 0,步长为0.1,迭代10次 f = @(x, y) x^2; x0 = 0; y0 = 0; h = 0.1; n = 10; y = runge_kutta(f, x0, y0, h, n); ``` 在这个示例中,我们定义了一个匿名函数f(x, y)来表示微分方程 dy/dx = x^2。然后,设置了初始条件x0和y0,步长h,以及迭代次数n。最后调用runge_kutta函数来求微分方程,并将结果保存在变量y中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值