Matlab-ODE求解2DOF振动系统

Matlab-ODE求解2DOF振动系统,matlab,ode,vibration,Matlab,Ode,Vibration,我目前正在学习Matlab的ODE函数来解决简单的振动问题 例如,mx+cx'+kx=F*sinwt可以使用 function dx = fun(t,x) m=0.02; % Mass - kg k=25.0; % Stiffness - N/m c=0.0125; % System damping - Ns/m f=10; % Frequency F=5; dx= [x(2); (F*sin(2*pi*f*t)-c*x(2)-k*x(1))/m] 然后调用

我目前正在学习Matlab的ODE函数来解决简单的振动问题

例如,mx+cx'+kx=F*sinwt可以使用

function dx = fun(t,x)

m=0.02;     % Mass - kg
k=25.0;     % Stiffness - N/m
c=0.0125;   % System damping - Ns/m
f=10;       % Frequency
F=5;

dx= [x(2); (F*sin(2*pi*f*t)-c*x(2)-k*x(1))/m]
然后调用ode45函数得到位移和速度

[t,x]=ode45(@fun,[0 10],[0.0;0.0])
我的问题,我还没有完全理解搜索网络,是是否有可能使用ODE函数的多自由度系统?例如,如果我们有两个质量,弹簧和阻尼器,我们在质量1时激发它们,我们得到以下方程式:

m1*x1+c1*x1'-c2*x2'+k1+k2*x1-k2*x2=f1t

m2*x2-c2*x1'+c1+c2*x2'-k2*x1+k2*x2=0


在这里,位移x1和x2相互依赖,我的问题是如何在Matlab中求解这些ODE?

没有限制,ODE45求解的函数的输入是标量。只需传入一个输入矩阵,并期望输出矩阵。例如,这里有一个函数,用于求解6杆机构的位置

function zdot = cp_solve(t,z)
%% Constants
g = -9.81;
L1 = .2;
m0 = 0;
I0 = 0;
m1 = 1;
I1 = (1/3) * m1 * L1^2;

%% Inputs
q = z(1:6);
qdot = z(7:12);

%% Mass Matrix
M = zeros(6,6);
M(1,1) = m0;
M(2,2) = m0;
M(3,3) = I0;
M(4,4) = m1;
M(5,5) = m1;
M(6,6) = I1;

%% Constraint Matrix
Phiq = zeros(5,6);
Phiq(1,1) = 1;
Phiq(2,2) = 1;
Phiq(3,3) = 1;
Phiq(4,1) = 1;
Phiq(4,4) = -1;
Phiq(4,6) = (-L1/2)*sin(q(6));
Phiq(5,2) = 1;
Phiq(5,5) = -1;
Phiq(5,6) = (L1/2)*cos(q(6));

%% Generalized Forces
Q = zeros(6,1);
Q(5) = m1 * g;

%% Right Side Vector
rs = zeros(5,1);
rs(4) = (L1/2) * cos(q(6)) * qdot(6)^2;
rs(5) = (L1/2) * sin(q(6)) * qdot(6)^2;

%% Coefficient Matrix
C = [M Phiq'; Phiq zeros(5,5)];
R = [Q; rs];
%% Solution

Sol = C \ R;

zdot = [qdot; Sol(1:6)];
end
输入是构件的位置和速度。输出是新的位置和速度

你使用它的方式与解决任何问题的方式相同。设置初始条件,定义时间并解决问题

%% Constants
L1 = .2;
C1 = L1/2;
theta1 = 30*pi/180;
theta_dot1 = 0;
tspan = 0:.001:2;

%% Initial Conditions
q = zeros(6,1);

q(6) = theta1;
q(4) = C1 * cos(q(6));
q(5) = C1 * sin(q(6));

qdot = zeros(6,1);
qdot(6) = theta_dot1;

z0 = [q; qdot];

%% Solve the problem

options = odeset('RelTol', 1.0e-9, 'AbsTol', 1.0e-6);
[Tout, Zout] = ode45(@cp_solve, tspan, z0, options);

在你的例子中,你有两个方程和两个未知数。将问题设置为矩阵问题,并在函数中同时解决。我会为您的案例推荐模态方法。

谢谢Matt!我对你的评论做了一些修改,我成功了!我通过设置x1=x1,x2=x1',x3=x2,x4=x2',然后从方程中定义x2和x4,基本上解决了我想要做的事情,就像在我的示例中一样,但有两个未知量。dx=[x2;TQ-ct2*x2-kt2*x1-x3/J1;…x4;ct2*x4-kt2*x3-x1/J2];这与我的示例不完全相同,但很相似,因为我想测试它。然而,这里我并没有使用矩阵,所以我想知道是否还有其他方法可以解释你的意思?另外,很抱歉格式错误,不知道如何修复。。。