Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
68
Task/Animate-a-pendulum/MATLAB/animate-a-pendulum.m
Normal file
68
Task/Animate-a-pendulum/MATLAB/animate-a-pendulum.m
Normal file
|
|
@ -0,0 +1,68 @@
|
|||
%This is a numerical simulation of a pendulum with a massless pivot arm.
|
||||
|
||||
%% User Defined Parameters
|
||||
%Define external parameters
|
||||
g = -9.8;
|
||||
deltaTime = 1/50; %Decreasing this will increase simulation accuracy
|
||||
endTime = 16;
|
||||
|
||||
%Define pendulum
|
||||
rodPivotPoint = [2 2]; %rectangular coordinates
|
||||
rodLength = 1;
|
||||
mass = 1; %of the bob
|
||||
radius = .2; %of the bob
|
||||
theta = 45; %degrees, defines initial position of the bob
|
||||
velocity = [0 0]; %cylindrical coordinates; first entry is radial velocity,
|
||||
%second entry is angular velocity
|
||||
|
||||
%% Simulation
|
||||
assert(radius < rodLength,'Pendulum bob radius must be less than the length of the rod.');
|
||||
|
||||
position = rodPivotPoint - (rodLength*[-sind(theta) cosd(theta)]); %in rectangular coordinates
|
||||
|
||||
%Generate graphics, render pendulum
|
||||
figure;
|
||||
axesHandle = gca;
|
||||
xlim(axesHandle, [(rodPivotPoint(1) - rodLength - radius) (rodPivotPoint(1) + rodLength + radius)] );
|
||||
ylim(axesHandle, [(rodPivotPoint(2) - rodLength - radius) (rodPivotPoint(2) + rodLength + radius)] );
|
||||
|
||||
rectHandle = rectangle('Position',[(position - radius/2) radius radius],...
|
||||
'Curvature',[1,1],'FaceColor','g'); %Pendulum bob
|
||||
hold on
|
||||
plot(rodPivotPoint(1),rodPivotPoint(2),'^'); %pendulum pivot
|
||||
lineHandle = line([rodPivotPoint(1) position(1)],...
|
||||
[rodPivotPoint(2) position(2)]); %pendulum rod
|
||||
hold off
|
||||
|
||||
%Run simulation, all calculations are performed in cylindrical coordinates
|
||||
for time = (deltaTime:deltaTime:endTime)
|
||||
|
||||
drawnow; %Forces MATLAB to render the pendulum
|
||||
|
||||
%Find total force
|
||||
gravitationalForceCylindrical = [mass*g*cosd(theta) mass*g*sind(theta)];
|
||||
|
||||
%This code is just incase you want to add more forces,e.g friction
|
||||
totalForce = gravitationalForceCylindrical;
|
||||
|
||||
%If the rod isn't massless or is a spring, etc., modify this line
|
||||
%accordingly
|
||||
rodForce = [-totalForce(1) 0]; %cylindrical coordinates
|
||||
|
||||
totalForce = totalForce + rodForce;
|
||||
|
||||
acceleration = totalForce / mass; %F = ma
|
||||
velocity = velocity + acceleration * deltaTime;
|
||||
rodLength = rodLength + velocity(1) * deltaTime;
|
||||
theta = theta + velocity(2) * deltaTime; % Attention!! Mistake here.
|
||||
% Velocity needs to be divided by pendulum length and scaled to degrees:
|
||||
% theta = theta + velocity(2) * deltaTime/rodLength/pi*180;
|
||||
|
||||
position = rodPivotPoint - (rodLength*[-sind(theta) cosd(theta)]);
|
||||
|
||||
%Update figure with new position info
|
||||
set(rectHandle,'Position',[(position - radius/2) radius radius]);
|
||||
set(lineHandle,'XData',[rodPivotPoint(1) position(1)],'YData',...
|
||||
[rodPivotPoint(2) position(2)]);
|
||||
|
||||
end
|
||||
Loading…
Add table
Add a link
Reference in a new issue