Matlab ODE 用于求解 2DOF 振动系统



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

例如,mx''+cx'+kx=F*sin(wt( 可以使用

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 = F1(T(

M2*x2''-C2*

X1'+(C1+C2(*X2'-K2*X1+K2*X2 = 0

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

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

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

输入是成员的位置和速度。 输出是新的位置和速度。

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

%% 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);

在您的情况下,您有 2 个方程和 2 个未知数。 将问题设置为矩阵问题,并在函数中同时求解。 我会为您的情况推荐模态方法。

最新更新