Matlab 弹簧/减振器的计算和安装;策划

Matlab 弹簧/减振器的计算和安装;策划,matlab,plot,simulink,ode45,dsolve,Matlab,Plot,Simulink,Ode45,Dsolve,给定两个带减震器/弹簧的系统: 第一个系统的simulink模型,步长时间为2,最终值为0.5: 具有相同输入的第二个系统的Simulink: 我必须使用dsolve和ode45找到代码,以使用Simulink生成相同的图形。给定值为: m1 = 500 c1 = 1200 k1 = 25000 k2 = 15000 m2 = 50 我试图找到dsolve,但它无法解决它。所以我使用了ode45,我完全迷路了 第一个系统的微分方程: 更新答案以匹配Simulink模型实施 要使用o

给定两个带减震器/弹簧的系统:

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

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

我必须使用
dsolve
ode45
找到代码,以使用Simulink生成相同的图形。给定值为:

m1 = 500
c1 = 1200
k1 = 25000
k2 = 15000
m2 = 50
我试图找到
dsolve
,但它无法解决它。所以我使用了
ode45
,我完全迷路了

第一个系统的微分方程:


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

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

根据您在Simulink模型中所做的工作,
D2y
对于
t
的所有值都是已知的(这是阶跃输入),因此我们需要根据时间对其进行积分,以获得
Dy
y
。所以我们的状态向量是
X=[X;Dx;y;Dy]
,我们的函数看起来像(存储在
diff_eqn.m
中):

调整
ode
解算器选项(例如最大步长等),以获得具有更多数据点的结果。要获得与Simulink模型中相同的绘图,您可以处理来自
ode
解算器的结果:

D2x = diff(X(:,2))./diff(t);
D2x = [0; D2x];
D2y = zeros(size(D2x));
D2y(t>=2) = 0.5;
plot(t,[D2y 500*D2x])
grid on
xlabel('Time [s]')
legend('D2y','m1*D2x','Location','NorthEast')
根据Simulink模型的结果,绘制出以下曲线图:

[t,X] = ode45(@diff_eqn,[0 20],[0; 0; 0; 0]);

问题是什么?如何解决这个问题?这不是一个编程问题。
dsolve
无法解决它的原因是因为有两个微分变量(
x
y
),但只有一个微分方程。问题是,我必须找到两个系统的位移图,与simulink模型相同。条件可能会有所不同。你能发布Simulink模型的屏幕截图吗?当然。刚刚上传的EDI使用dsolve clc,清除所有m1=500;m2=50;c=1200 k1=25000;k2=15000;wn=sqrt(k1/m1);z=c/2*sqrt(k1*m1);syms x t eqn1=dsolve('D2x+2*zwnDx+xwn^2','Dx(0)=0','D(0)=0')pretty(eqn1)syms y t eqn2=dsolve('2*zwnDy+ywn^2','Dy(0)==0')pretty(eqn2)但我不知道如何将这两种解决方案结合起来,并绘制出图形请参阅我编辑过的答案。但是它假设
x
y
之间的两个方程是解耦的,这是不正确的。问题的根源在于,您没有足够的变量数量方程。编辑了基于Simulink实现的答案,但有些地方不正确,因此您没有告诉我们所有内容。很抱歉,您的评论太晚了,对于四个积分器块,这些都是零,y和Dy的增益块是1/500,这与您的符号尝试不匹配,但我将更新我的答案。结果现在与Simulink模型匹配。基于你的不完整问题,我还将删除我答案的前一部分,因为它们是不相关的。
[t,X] = ode45(@diff_eqn,[0 20],[0; 0; 0; 0]);
D2x = diff(X(:,2))./diff(t);
D2x = [0; D2x];
D2y = zeros(size(D2x));
D2y(t>=2) = 0.5;
plot(t,[D2y 500*D2x])
grid on
xlabel('Time [s]')
legend('D2y','m1*D2x','Location','NorthEast')