用matlab中的Runge Kutta方法求解强制质量弹簧 - 阻尼系统

时间:2014-02-04 12:20:59

标签: matlab

我正在尝试使用Runge-Kutta方法在matlab中解决强制质量弹簧阻尼系统。 目前,代码使用系统输入的常量值,但我想将矢量作为输入。例如,我想用矢量值替换力幅F0。

我应该使用for循环还是最简单的方法?

function O = MSDSRK(m,b,k,F0,w,x0,v0) 

% ----- Input argument -----
% m: mass for particle 
% b: damping coefficient 
% k: spring constant 
% F0: amplitude of external force 
% w: angular freuency of external force 
% x0: initial condition for the position x(0)
% v0: initial condition for the velocity v(0)

dt=0.1;

options=odeset('InitialStep',dt,'MaxStep',dt);

td=[0:dt:50];

% Solve differential equation with Runge-Kutta solver 

[t,x]=ode45(@(t,X)MSD(t,X,m,b,k,F0,w),td,[x0;v0],options);

% Extract only particle position trajectory

O=[t x(:,1)];

end


function dX=MSD(t,X,m,b,k,F0,w)

% With two 1st order diffeential equations,
% obtain the derivative of each variables
% (position and velocity of the particle)

dX(1,1)=X(2,1); 

dX(2,1)=(1/m)*(F0*sin(w*t)-b*X(2,1)-k*X(1,1)); 
end

1 个答案:

答案 0 :(得分:0)

for - 循环肯定会起作用,但这不是我在这种情况下建议的。这种方法的缺点是让你以某种方式思考,即你只是多次解决一个简单的一维系统。

for - 循环方法并不比你已经知道如何做的更多地教你。你肯定会得到及格分数。但是如果你想 excell ,不仅在这里,而且在未来的课程中(更重要的是,在你以后的工作中),你必须做更多。你只能通过以不同的方式思考这个简单的问题来学习如何解决更复杂的问题,即作为一个多维质量/弹簧/阻尼系统,其中所有发生的组件是解耦并且所有发生以具有相同的初始值。

对于这样的系统,矢量化和矩阵操作确实是要走的路。这就是1D / 2D / 3D系统向任意D系统的推广。矩阵操作和纹理化,这正是MATLAB最擅长的。这确实是你在这里可以学到的。

以下是如何根据您的情况进行操作。我的范围有点小,但原则保持不变:

function O = MSDSRK

    % Assign some random scalar values to all parameters, but 
    % a *vector* to the force amplitudes 
    [m,b,k,F0,w,x0,v0] = deal(...
        1,0.2,3,  rand(13,1),  2,0,0);

    % We need to simulate as many mass-spring-damper systems as there are
    % force amplites, so replicate the initial values
    x0 = repmat(x0, numel(F0),1);
    v0 = repmat(v0, numel(F0),1);

    % The rest is the same as before
    dt = 0.1;
    options = odeset('InitialStep', dt,'MaxStep', dt);

    td = 0:dt:50;

    [t,x] = ode45(@(t,X) MSD(t,X,m,b,k,F0,w), td, [x0;v0], options);

    % The output is now: 
    %
    % x(:,1)  position of mass in system with forcing term F0(1)
    % x(:,2)  position of mass in system with forcing term F0(2)
    % ...
    % x(:,14) speed of mass in system  with forcing term F0(1)
    % x(:,15) speed of mass in system  with forcing term F0(2)
    % ...    
    O = [t x(:,1:numel(F0))];

    % And, to make the differences more clear:
    plot(t, x(:,1:numel(F0)))

end


function dX = MSD(t,X,m,b,k,F0,w)

    % Split input up in position and velocity components
    x = X(1:numel(X)/2);
    v = X(numel(X)/2+1:end);

    % Compute derivative
    dX = [
        v
        (F0*sin(w*t) - b*v - k*x)/m
    ];
end