鉴于两个带阻尼器/弹簧的系统:
第一个系统的simulink模型,步长为2,最终值为0.5:
具有相同输入的第二个系统的Simulink:
我必须使用dsolve
和ode45
找到使用Simulink生成相同图表的代码。给定的值是:
m1 = 500
c1 = 1200
k1 = 25000
k2 = 15000
m2 = 50
我试图找到dsolve
,但无法解决它。所以我得使用ode45
,我完全迷失了。
第一个系统的微分方程:
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)
答案 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]
,Dx
,x
和{{1}的初始条件均等于零},根据您的Simulink模型):
Dy
调整y
求解器选项(例如最大步长等等)以获得包含更多数据点的结果。要获得与Simulink模型中相同的绘图,您可以处理[t,X] = ode45(@diff_eqn,[0 20],[0; 0; 0; 0]);
求解器的结果:
ode
其中给出了以下图表,与您的Simulink模型的结果相匹配: