我是靠谱客的博主 专一小蝴蝶,最近开发中收集的这篇文章主要介绍matlab ode45的使用一元微分方程二元微分方程,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一元微分方程

在使用ode45函数时,要先把方程变形一下。
比如方程 x ¨ ( t ) + x ˙ ( t ) + x ( t ) = 0 ddot{x} left(tright)+dot{x} left(tright)+xleft(tright)=0 x¨(t)+x˙(t)+x(t)=0需要像化成状态方程一样化成 x ¨ ( t ) = − x ˙ ( t ) − x ( t ) ddot{x} left(tright)=-dot{x} left(tright)-xleft(tright) x¨(t)=x˙(t)x(t) x ( t ) = x 1 xleft(tright)=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(tright)+{dot{x} }_1 left(tright)+x_2 left(tright)=0 x¨1(t)+x˙1(t)+x2(t)=0 x ¨ 2 ( t ) + x ˙ 1 ( t ) + x 1 ( t ) = 0 {ddot{x} }_2 left(tright)+{dot{x} }_1 left(tright)+x_1 left(tright)=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计算')

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

最后

以上就是专一小蝴蝶为你收集整理的matlab ode45的使用一元微分方程二元微分方程的全部内容,希望文章能够帮你解决matlab ode45的使用一元微分方程二元微分方程所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部