matlab ode45的使用

一元微分方程

在使用ode45函数时,要先把方程变形一下。
比如方程 x ¨ ( t ) + x ˙ ( t ) + x ( t ) = 0 \ddot{x} \left(t\right)+\dot{x} \left(t\right)+x\left(t\right)=0 x¨(t)+x˙(t)+x(t)=0需要像化成状态方程一样化成 x ¨ ( t ) = − x ˙ ( t ) − x ( t ) \ddot{x} \left(t\right)=-\dot{x} \left(t\right)-x\left(t\right) x¨(t)=x˙(t)x(t) x ( t ) = x 1 x\left(t\right)=x_1 x(t)=x1 x ˙ = x 2 \dot{x} =x_2 x˙=x2 x ¨ = − x 2 − x 1 \ddot{x} =-x_2 -x_1 x¨=x2x1这样在构建function时就比较明了,function构造如下

function dx = myfunc(t,x)
%方程为d2x+dx+x=0
%将其转化为类似状态方程的模型为d2x=-dx-x
%令x=x1,dx=x2
%函数的输入参数为x1和x2的初始值,即x和dx的初始值
dx = zeros(2,1);%dx(1)为dx/dt,dx(2)=d2x/dt2
%dx(1)为当x2传进来之后,计算的下一个步长的x2,dx(2)相当于根据dx(1)和x1算出的d2x
dx(1) = x(2);%x(2) = dx/dt,相当于x2
dx(2) = -dx(1)-x(1);%x(1)是x,相当于x1

输入参数x为x和dx的第一个值(初值),这个数的大小是与ode45的第三个参数决定的,是与他一样的大小。并且含义都是一样的。
dx这里定义为一个初值为0的2维的向量,dx(1)为dx,dx(2)为d2x。这样就可以根据输入的初值进行迭代更新了。
利用另外一个脚本来调用这个函数

t = (0:0.01:10)';
[t,y] = ode45('myfunc',t,[1; 0]);%1是x的初值,0是dx的初值
plot(t,y(:,1),out.tout,out.simout)
legend('数值计算','simulink计算')

这里我用simulink的模块也搭建了相同的微分方程,结果基本是相同的。
在这里插入图片描述

二元微分方程

这里我随便写了一个二元微分方程如下 x ¨ 1 ( t ) + x ˙ 1 ( t ) + x 2 ( t ) = 0 {\ddot{x} }_1 \left(t\right)+{\dot{x} }_1 \left(t\right)+x_2 \left(t\right)=0 x¨1(t)+x˙1(t)+x2(t)=0 x ¨ 2 ( t ) + x ˙ 1 ( t ) + x 1 ( t ) = 0 {\ddot{x} }_2 \left(t\right)+{\dot{x} }_1 \left(t\right)+x_1 \left(t\right)=0 x¨2(t)+x˙1(t)+x1(t)=0将其变形得 X 1 = x 1 X_1 =x_1 X1=x1 X 2 = x ˙ 1 X_2 ={\dot{x} }_1 X2=x˙1 X 3 = − x ˙ 1 − x 2 X_3 = -{\dot{x} }_1-x_2 X3=x˙1x2 Y 1 = x 2 Y_1 =x_2 Y1=x2 Y 2 = x ˙ 2 Y_2 ={\dot{x} }_2 Y2=x˙2 Y 3 = − x ˙ 1 − x 1 Y_3 = -{\dot{x} }_1-x_1 Y3=x˙1x1连理 X 3 X_3 X3 Y 3 Y_3 Y3的两个式子得
在这里插入图片描述

function dx = myfuncs(t,x)
dx = zeros(4,1);
A = [-1 0]; B = [0 -1; -1 0];
dx(1:2) = x(3:4);
dx(3:4) = A*dx(1:2)+B*x(1:2);

这里定义的dx前两个为dx1/dt和dx2/dt,后两个定义的是d2x1/dt和d2x2
x输入进来的向量的前两个是x1和x2,后两个为dx1/dt和dx2/dt
所以这里输入常数矩阵之后,第一步做的就是通过x里面的dx1/dt和dx2/dt更新dx的dx1/dt和dx2/dt,第二步更新加速度也就是dx后两个变量,这里是用dx(3:4)

t = (0:0.01:10)';

[t,y] = ode45('myfuncs',t,[1; 0; 0; 0]);
plot(t,y(:,1),out.tout,out.simout1)
legend('数值计算','simulink计算')

plot(t,y(:,2),out.tout,out.simout2)
legend('数值计算','simulink计算')

对比结果如下
在这里插入图片描述
在这里插入图片描述

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值