弹簧/阻尼器计算&绘制

时间:2018-01-03 10:34:47

标签: matlab plot simulink ode45 dsolve

鉴于两个带阻尼器/弹簧的系统:

Systems

第一个系统的simulink模型,步长为2,最终值为0.5:

enter image description here

First system

具有相同输入的第二个系统的Simulink:

enter image description here

Second system

我必须使用dsolveode45找到使用Simulink生成相同图表的代码。给定的值是:

m1 = 500
c1 = 1200
k1 = 25000
k2 = 15000
m2 = 50

我试图找到dsolve,但无法解决它。所以我得使用ode45,我完全迷失了。

第一个系统的微分方程:

First system DE

syms x(t) y(t) 
Dy = diff(y,t); 
Dx = diff(x,t); 
D2x = diff(x,2,t); 
cond = [x(0)==0, y(0)==0, Dy(0)==0, Dx(0)==5]; 
eqn33 = D2x + (2*0.2121*0.1414*Dx) + (0.1414^2)*x==2*0.2121*0.1414*Dy+(0.1414^2)*y; 
sol33 = dsolve(eqn33,cond) 
pretty(sol33)

1 个答案:

答案 0 :(得分:1)

已更新答案以匹配Simulink模型实施

要使用ode45,首先需要编写一个函数来计算输入向量的导数(即微分方程),并将该函数存储在一个单独的文件中,其函数名称为文件名。请注意,ode求解器只能求解一阶微分方程,所以首先需要做一些工作才能将二阶微分方程转换为一阶微分方程。有关详细信息,请参阅documentation on ode45

根据您在Simulink模型中所做的工作,D2y已知t的所有值(它是步进输入),因此我们需要将其与时间相关联以获得{ {1}}和Dy。所以我们的状态向量是y,我们的函数看起来像(存储在X = [x; Dx; y; Dy]中):

diff_eqn.m

function dX = diff_eqn(t,X) m1=500; c=1200; k1=25000; dX(1) = X(2); % Dx dX(2) = -(1/m1)*(c*(X(2)-X(4)/m1) + k1*(X(1)-X(3)/m1));; % D2x dX(3) = X(4); % Dy if t<2 dX(4) = 0; % D2y else dX(4) = 0.5; end

在您的脚本或MATLAB命令窗口中,您可以调用ode求解器(dX = [Dx; D2x; Dy; D2y]Dxx和{{1}的初始条件均等于零},根据您的Simulink模型):

Dy

调整y求解器选项(例如最大步长等等)以获得包含更多数据点的结果。要获得与Simulink模型中相同的绘图,您可以处理[t,X] = ode45(@diff_eqn,[0 20],[0; 0; 0; 0]); 求解器的结果:

ode

其中给出了以下图表,与您的Simulink模型的结果相匹配:

enter image description here