sandbox/easystab/stab2014/two_vibrating_strings_one_mass.m

    Vibrating string

    We use the code of the vibrating string and adapt the matrix to add one string and one mass.

    To run the code you may need Chebychev differentiation matrices, available here

    clear all; clf
    
    % parameters
    N=100; % number of gridpoints per string
    L=10; % strings length
    c1=0.3; % wave velocity string 1
    c2=1; % wave velocity string 2
    dt=0.1; % time step
    tmax=60; % final time
    mass=4; % mass
    t1=0.2; %  string 1 tension
    t2=1; %  string 2 tension
    
    % differentiation matrices
    scale=-2/L;
    [x,DM] = chebdif(N,2); 
    dx=DM(:,:,1)*scale;    
    dxx=DM(:,:,2)*scale^2;    
    x=(x-1)/scale; 
    Z=zeros(N,N); ZZ=zeros(2*N,2*N);
    I=eye(N); II=eye(2*N);I4=eye(4*N+2);
    

    System matrices

    each strings follows the same equation, v_t=c^2 f_{xx} and the mass follows its own equation, m v_t=-t_1 (\partial_x f_1)|_L + t_2 (\partial_x f_2)|_0. With, for each string and the mass, f_t=v .Thus the new array representation for the system is \displaystyle Eq_t=Aq with the state matrices E and A and the state q defined as \displaystyle \left( \begin{array}{cccccc} I & & & & & \\ & I & & & & \\ & & I & & & \\ & & & I & & \\ & & & & m & \\ & & & & & 1\\ \end{array}\right) \left(\begin{array}{c} v1_t \\ f1_t \\ v2_t \\ f2_t \\ vm_t \\ fm_t \\ \end{array}\right)= \left( \begin{array}{cc} 0 & c_{1}^2\partial_{xx} & 0 & 0 & 0 & 0 \\ I & 0 & 0 & 0 & 0 & 0\\ 0 & 0 & 0 & c_{2}^2\partial_{xx} & 0 & 0\\ 0 & 0 & I & 0 & 0 & 0\\ 0 & -t_1 \partial_x|_L & 0 & t_2 \partial_x|_0 & 0 & 0\\ 0 & 0 & 0 & 0 & 1 & 0\\ \end{array}\right) \left(\begin{array}{c} v1 \\ f1 \\ v2 \\ f2 \\ vm \\ fm \\ \end{array}\right)

    % locations in the state
    v1=1:N;
    f1=N+1:2*N;
    v2=2*N+1:3*N;
    f2=3*N+1:4*N;
    vm=4*N+1;
    fm=4*N+2;
    
    for i=1:3 % A loop is used to operate the validation on iterations 2 and 3.
              
        if i==2
           c1=1;c2=1;t1=1;t2=1;mass=0; %specific parameters for null mass validation
        elseif i==3
           c1=1;c2=1;t1=1;t2=1;mass=1000000; %specific parameters for infinite mass validation
        end
    
    % system matrices
    A1=[Z,c1^2*dxx; I, Z]; A2=[Z,c2^2*dxx; I, Z];
    E=eye(fm);
    E(vm,vm)=mass;
    A=[A1,ZZ,ZZ(:,[1,2]) ; ...
        ZZ,A2,ZZ(:,[1,2]) ; ...
        Z(1,:),-t1*dx(N,:),Z(1,:),t2*dx(1,:),0,0 ; ...
        ZZ(1,:),ZZ(1,:),1,0];
    

    Boundary conditions

    We consider that the two strings are fixed at their extremity, f_1|_0=0=f_2|_L, and they are connected to the mass, f_1|_L=f_2|_0=f_m.

    The boundary condition can thus be expressed Cq=0 with the state q and the constraint matrix C \displaystyle Cq=0=\begin{pmatrix} 0&I|_0&0&0&0&0\\ 0&I|_L&0&0&0&-1\\ 0&0&0&I|_0&0&-1\\ 0&0&0&I|_L&0&0\\ \end{pmatrix} \begin{pmatrix} v_1\\f_1\\v_2\\f_2\\vm\\fm \end{pmatrix},

    % boundary conditions
    loc=[f1(1),f1(N),f2(1),f2(N)];
    E(loc,:)=0; 
    A(loc,:)=I4(loc,:);
    A(f1(N),fm)=-1;
    A(f2(1),fm)=-1;
    

    Initial condition

    At initial time we say here that the string is initially deformed as a sinus (this satisfies the boundary conditions), and that the velocity is zero.

    % initial condition
    if i==1
        q=[zeros(N,1) ; sin(pi*x/L) ; zeros(N,1) ; sin(pi*x/L) ; 0 ; 0]; 
    elseif i ==2
        q=[zeros(N,1) ; sin(pi*x/L/2) ; zeros(N,1) ; sin(pi*(x+L)/L/2) ; 0 ; 0];% initial conditions for null mass
    elseif i==3
        q=[zeros(N,1) ; sin(pi*x/L) ; zeros(N,1) ; sin(pi*x/L) ; 0 ; 0];% initial conditions for infinite mass
    end
    

    March in time

    % march in time matrix 
    M=(E-A*dt/2)\(E+A*dt/2);
    
    % unified parameters
    f=[f1,f2];
    v=[v1,v2];
    x2=[x;L+x];
    
    % marching loop
    tvec=dt:dt:tmax; 
    Nt=length(tvec);
    for ind=1:Nt    
        q=M*q; % one step forward
        
        % plotting
        
        if i==1 % plotting general case
        plot(x2,q(f),'b',x2,q(v),'r--',L,q(fm),'blacko');    
        axis([0,2*L,-2,2]);xlabel('x');ylabel('f');
        title('strings and mass movements');
        
        elseif i==2 % plotting validation for null mass
        figure(2);subplot(211);
        plot(x2,q(f),'.b',x,cos(c1*pi/L/2*ind/Nt*tmax)*sin(x*pi/L/2),'r',x+L,cos(c1*pi/L/2*ind/Nt*tmax)*sin((x+L)*pi/L/2),'r');
        title('2 identical strings and a null mass');
        axis([0,2*L,-1.2,1.2]);
        
        else % ploting validaiton for infinite mass
        figure(2);subplot(212);
        plot(x2,q(f),'.b',x,cos(c1*pi/L*ind/Nt*tmax)*sin(x*pi/L),'r',x+L,cos(c1*pi/L*ind/Nt*tmax)*sin(x*pi/L),'r');
        title('2 identical strings and an infinite mass');
        axis([0,2*L,-1.2,1.2]);
        end
        drawnow
        
    end
    
    % Legends are displayed after calculation as they strongly slow down dynamical graphics
        if i==1
            figure(1);legend('position','speed');
        elseif i==2
            figure(2);subplot(211);legend('numerical solution','theorical solution','location','ne');
        else
            legend('numerical solution','theorical solution','location','s');
        end
    end
    

    Here is the final result of the strings position (blue) and speed (red) with 2 different strings

    Validation

    Null mass
    We first test the code with a null mass and 2 identical strings ( velocity and tension ). We expect to find the same behaviour than a single 2L length string. We know the theorical solution for mode 1 with homogenous Dirichlet conditions and adapted initial conditions : \displaystyle f(x,t)=sin(\pi x/L)*cos(ct \pi /L) We plot the solution at tmax below
    Infinite mass
    Now we test with an infinite mass. It is supposed to behave as a fixed point, thus we should see 2 independant L length strings vibrating. In mode 1 with adapted boundary and initial conditions, each one should follow this equation \displaystyle f(x,t)=sin(\pi x/2L)*cos(ct \pi /2L) Plotting at tmax :

    %}