how i can to create plastic collsion
    5 views (last 30 days)
  
       Show older comments
    
I have the following code that creates an elastic collision. I would like to add an option to the code that will also provide a solution for a plastic collision, given the initial velocities and masses of the two particles, and given the loss of kinetic energy in the collision. The code will output the velocity of each particle after the collision.
clear;
clc;
%%%collision between two particles%%%
 %vid = VideoWriter('myVideo.avi');
%open(vid)
%The values of one of the particles
x1=-8; y1=0; v1x=3;
v1y=0; m1=2;
% centers = [x1, y1];
%The values of the second particle.
t=0; dt=0.5; x2=0; y2=0;
v2x=0; v2y=0; m2=1;
%According to the change of mass and speed, the collision in the system will change
% centers2 = [x2, y2];
% t=0, plot position of particles
subplot (3, 1, 1)
r1 = rectangle ('Position', [x2,y2,1,1], 'FaceColor', 'g', 'Curvature', [1,1]); %one particle
r2 = rectangle ('Position', [x1,y1,1,1], 'FaceColor', 'b', 'Curvature', [1,1]); %second particle
axis ([-10 10 -10 10]);
title('The Collision')
grid on
% The particles will start moving:
while t < 100
    % Update previous values
    v1xpre = v2x; v2xpre = v1x; v1ypre = v2y; v2ypre = v1y;
    %If the distance between the two particles is greater than 1:
    if 1 < sqrt((x1-x2)^2+(y1-y2)^2) 
        x2 =  x2 + (v2x * dt);
        x1 =  x1 + (v1x * dt);  
        y2 =  y2 + (v2y * dt);
        y1 = y1 + (v1y * dt);
    else   %If the distance between the two particles is lower than 1,
           % so the particles collide and their values will be::
        v2x = ((m2-m1)/(m2+m1))*v1xpre + ((2*m1)/(m2+m1)) * v2xpre;
        v2y = ((m2-m1)/(m2+m1))*v1ypre + ((2*m1)/(m2+m1)) * v2ypre;
        v1x = ((m1-m2)/(m2+m1))*v2xpre + ((2*m2)/(m2+m1)) * v1xpre;
        v1y = ((m1-m2)/(m2+m1))*v2ypre + ((2*m2)/(m2+m1)) * v1ypre;
        x2 =  x2 + (v2x * dt);
        x1 =  x1 + (v1x * dt);  
        y2 =  y2 + (v2y * dt);
        y1 =  y1 + (v1y * dt);
    end
    % The movement that the particles will move after the collision with
    % the 'walls':
            if x2+dt*v2x>10
                v2x= -v2x;
            end
            if x1+dt*v1x>10
                v1x=-v1x;
            end
            if x2+dt*v2x<-10
                v2x=abs(v2x);
            end
            if x1+dt*v1x<-10
                v1x=abs(v1x);
            end
            if y2+dt*v2y>10
                v2y=-v2y;
            end
            if y1+dt*v1y>10
                v1y=-v1y;
            end
            if y2+dt*v2y<-10
                v2y=abs(v2y);
            end
            if y1+dt*v1y<-10
                v1y=abs(v1y);
            end
    %update the position of the rectangles 
    set(r1,'Position', [x2,y2,0.5,2]);
    set(r2,'Position', [x1,y1,0.5,2]);
    %plot the displacement of the particles
    subplot (3, 1, 2)
    plot (t, x2,'go',t,x1,'bs')
    axis([0 100 -10 10])
    xlabel ('Time')
    ylabel ('Position-X')
    grid on
    title('Displacement of the particles')
    %plot the velocity of the particles
    subplot (3, 1, 3)
    plot (t, v2x,'go',t,v1x,'bs')
    axis([0 100 -10 10])
    yticks(-10:2.5:10)
    xlabel ('Time')
    ylabel ('Speed')
    title('velocity of the paritcles')
    grid on
    drawnow
      t= t+ dt;
   %  frame=getframe(gcf);
    %  writeVideo(vid,frame);
end
%close(vid);
0 Comments
Answers (1)
  Ayush
      
 on 5 Feb 2024
        Hi,
It seems you are trying to make changes in the given code to simulate a plastic collision and add an option to give a solution for both scenarios.
To do so, you can add a conditional statement in the "while" loop when the velocity for particles is calculated. In the conditional, calculate the velocity of the particle based on the type of collision given by the user. To simulate particles for plastic collision, you can make use of the momentum conservation equation to find velocity:
v = (m1u1 + m2u2)/(m1+m2)
Refer to the modified code below for a better understanding:
%%%collision between two particles%%%
%vid = VideoWriter('myVideo.avi');
%open(vid)
%The values of one of the particles
x1 = -8; y1 = 0; v1x = 3;
v1y = 0; m1 = 2;
% The values of the second particle.
t = 0; dt = 0.5; x2 = 0; y2 = 0;
v2x = 0; v2y = 0; m2 = 1;
% Collision type ('elastic' or 'plastic')
collisionType = 'plastic'; % Change this to 'elastic' for elastic collision
% t=0, plot position of particles
subplot(3, 1, 1)
r1 = rectangle('Position', [x2, y2, 1, 1], 'FaceColor', 'g', 'Curvature', [1, 1]); % one particle
r2 = rectangle('Position', [x1, y1, 1, 1], 'FaceColor', 'b', 'Curvature', [1, 1]); % second particle
axis([-10 10 -10 10]);
title('The Collision')
grid on
% The particles will start moving:
while t < 100
    % Update previous values
    v1xpre = v2x; v2xpre = v1x; v1ypre = v2y; v2ypre = v1y;
    % If the distance between the two particles is greater than 1:
    if sqrt((x1 - x2)^2 + (y1 - y2)^2) > 1
        x2 = x2 + (v2x * dt);
        x1 = x1 + (v1x * dt);  
        y2 = y2 + (v2y * dt);
        y1 = y1 + (v1y * dt);
    else % If the distance between the two particles is lower than 1, so the particles collide
        if strcmp(collisionType, 'elastic')
            % Elastic collision equations
            v2x = ((m2 - m1) / (m2 + m1)) * v1xpre + ((2 * m1) / (m2 + m1)) * v2xpre;
            v2y = ((m2 - m1) / (m2 + m1)) * v1ypre + ((2 * m1) / (m2 + m1)) * v2ypre;
            v1x = ((m1 - m2) / (m2 + m1)) * v2xpre + ((2 * m2) / (m2 + m1)) * v1xpre;
            v1y = ((m1 - m2) / (m2 + m1)) * v2ypre + ((2 * m2) / (m2 + m1)) * v1ypre;
        elseif strcmp(collisionType, 'plastic')
            % Plastic collision equations
            vFinalX = (m1 * v1xpre + m2 * v2xpre) / (m1 + m2);
            vFinalY = (m1 * v1ypre + m2 * v2ypre) / (m1 + m2);
            v1x = vFinalX;
            v2x = vFinalX;
            v1y = vFinalY;
            v2y = vFinalY;
        end
        % Update positions after collision
        x2 = x2 + (v2x * dt);
        x1 = x1 + (v1x * dt);  
        y2 = y2 + (v2y * dt);
        y1 = y1 + (v1y * dt);
    end
    % The movement that the particles will move after the collision with the 'walls':
    if x2 + dt * v2x > 10
        v2x = -v2x;
    end
    if x1 + dt * v1x > 10
        v1x = -v1x;
    end
    if x2 + dt * v2x < -10
        v2x = abs(v2x);
    end
    if x1 + dt * v1x < -10
        v1x = abs(v1x);
    end
    if y2 + dt * v2y > 10
        v2y = -v2y;
    end
    if y1 + dt * v1y > 10
        v1y = -v1y;
    end
    if y2 + dt * v2y < -10
        v2y = abs(v2y);
    end
    if y1 + dt * v1y < -10
        v1y = abs(v1y);
    end
    % Update the position of the rectangles
    set(r1, 'Position', [x2, y2, 0.5, 2]);
    set(r2, 'Position', [x1, y1, 0.5, 2]);
    % Plot the displacement of the particles
    subplot(3, 1, 2)
    plot(t, x2, 'go', t, x1, 'bs')
    axis([0 100 -10 10])
    xlabel('Time')
    ylabel('Position-X')
    grid on
    title('Displacement of the particles')
    % Plot the velocity of the particles
    subplot(3, 1, 3)
    plot(t, v2x, 'go', t, v1x, 'bs')
    axis([0 100 -10 10])
    yticks(-10:2.5:10)
    xlabel('Time')
    ylabel('Speed')
    title('Velocity of the particles')
    grid on
    drawnow
    % Update time
    t = t + dt;
    % frame = getframe(gcf);
    % writeVideo(vid, frame);
end
% close(vid);
0 Comments
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!