Engineering 6 Lab 1:
Concurrent Force Equilibrium in 3-D
Paul Agyiri, Aron Dobos
13 February 2005
Abstract
In this lab, the weight of a mass hanging in equilibrium from three cords was determined, as well as the friction coefficients of the three pulleys involved. From the collective class data, the average weight was determined to be 1077 grams, with an error of approximately ± 2.5%. The average friction coefficients for the pulleys 1, 2, and 3 were determined to be 0.208, 0.131, and 0.158, with standard deviations of 0.008, 0.004, and 0.003, respectively. The efficiencies of the three pulleys were calculated to be 96%, 97.5%, and 96.7%, respectively.
Procedure
Three pulleys were set up as shown in the sketch of the apparatus with an unknown weight being supported at the point where the three ropes that hung from each pulley met. This setup was done above a floor with and x-y grid on it. The values of three specific weights were recorded and these weights were hung on the pulleys, with one weight hanging from each pulley. The unknown weight was pulled down and slowly allowed to reach equilibrium position from the bottom (that is slowly allowed to come to rest). The x, y and z positions of the unknown weight were measured and recorded. Using the same set of weights, the unknown weight was raised up slightly and slowly guided downwards until it came to equilibrium again. The new x, y and z coordinates were measured and recorded. A diagram of the pulley-weight configuration is shown below in Figure 1.
Figure 1. Setup
Free Body Analysis
The displacement vectors from the junction coordinate to each of the three pulleys is calculated by subtracting the respective X, Y, and Z components of the junction from the pulley coordinates. The Z coordinate was adjusted to account for the radius of the pulley.
The first step in the free body analysis is to adjust for the actual Z coordinate using the known radius of the pulley. The actual distance from the junction to the pulley sheave in the X-Y plane is calculated using the equation below.
Given this distance, the angle phi can be calculated with the Pythagorean Theorem, as well as the hypotenuse H of the smaller right triangle. With H and R, the angles theta and alpha are determined to be
,
and Zact is given by
.
To calculate the weight of the hanging object, it is assumed that the pulleys are frictionless and thus the weight at the end of each cord is equal to the tension in that cord. Given the adjusted three dimensional displacement vectors, the Z component of each cord tension can directly be determined by multiplying the cord tension by the normalized Z component vector. Summing the Z components of each of the three tensions gives the weight of the hanging objects, since the sum of the forces in the Z direction must be zero:
where is the normalized ith displacement vector in the z direction.
An estimate for the actual weight is determined by averaging the weight from the ‘above’ run with the weight obtained from the below run.
Given the average mass, the friction can be calculated for approaching equilibrium from above and below.
Diagram For Calculating Friction Force
Taking the difference between AverageMass and MassAbove (or MassBelow) gives the difference in the Z-component of the tension between the actual and friction-less tension. The actual tension is thus given by
The friction force is determined by summing torques around the pulley center.
The normal force vector to the friction force from the weight junction is readily obtained by the Pythagorean Theorem.
The coefficient of friction and the pulley efficiency are given by the following relationships below.
Results
The data and results obtained for each ‘above’ and ‘below’ run is included below in Table 1. The results were calculated automatically by the runall.m and calcforces.m MATLAB scripts.
Table 1. Collective Class Weight, Above/Below XYZ
Data with Calculated Results for each run.
Run |
Wt 1 |
Wt 2 |
Wt 3 |
AX |
AY |
AZ |
BX |
BY |
BZ |
Mass |
P1 Mu |
P2 Mu |
P2 Mu |
1 |
683 |
748 |
729 |
-1 |
38.3 |
78.4 |
-1.9 |
39.5 |
75 |
1070.02 |
0.1193 |
0.0869 |
0.1177 |
2 |
894 |
948 |
488 |
-16 |
4.2 |
79.8 |
-17.1 |
4.8 |
77.4 |
1162.04 |
0.091 |
0.0461 |
0.1433 |
3 |
604 |
552 |
785 |
5.6 |
29.4 |
77.2 |
3.5 |
30.6 |
72.2 |
1052.51 |
0.1671 |
0.1398 |
0.1453 |
4 |
763 |
749 |
995 |
7.5 |
26.8 |
88.5 |
6.1 |
27.9 |
86.6 |
1075.29 |
0.0612 |
0.0452 |
0.0573 |
5 |
328 |
878 |
655 |
7.5 |
78 |
65.8 |
7 |
77 |
60.2 |
1098.33 |
0.2813 |
0.1239 |
0.1491 |
6 |
432 |
692 |
787 |
12.2 |
41 |
72 |
10.2 |
44.6 |
67.6 |
1065.79 |
0.1587 |
0.0886 |
0.1021 |
7 |
627 |
512 |
550 |
-7.4 |
34.6 |
64.1 |
-8.9 |
35.5 |
57.4 |
1054.49 |
0.1845 |
0.1775 |
0.2074 |
8 |
456 |
693 |
814 |
12 |
39.1 |
74.8 |
10.5 |
40.5 |
70.1 |
1066.08 |
0.1921 |
0.1091 |
0.1274 |
9 |
379 |
308 |
875 |
24.6 |
12.5 |
76 |
21.5 |
15.8 |
67.6 |
1059.44 |
0.1847 |
0.1733 |
0.1119 |
10 |
379 |
705 |
494 |
2.1 |
69.4 |
49.4 |
0.8 |
70 |
40.3 |
1081.26 |
0.3005 |
0.1694 |
0.2357 |
11 |
503 |
576 |
624 |
1.6 |
41.1 |
61.5 |
0.8 |
41.8 |
55.8 |
1066.87 |
0.1817 |
0.1367 |
0.1545 |
12 |
433 |
482 |
567 |
3.1 |
40.8 |
48 |
1.4 |
41.4 |
34.8 |
1064.36 |
0.3506 |
0.2748 |
0.275 |
13 |
324 |
848 |
416 |
0.6 |
96.6 |
56.5 |
0.1 |
94.8 |
46.6 |
1096.19 |
0.3077 |
0.1518 |
0.2428 |
14 |
324 |
744 |
867 |
18.3 |
43.5 |
76.3 |
16.8 |
46.4 |
68.6 |
1052.91 |
0.4456 |
0.1687 |
0.1945 |
15 |
703 |
903 |
596 |
-6.3 |
57.4 |
75.4 |
-7.5 |
58.3 |
72.6 |
1090.55 |
0.0955 |
0.0707 |
0.1118 |
Table 2. Summary of Pulley Friction Coefficients, Standard
Deviations, and Efficiencies.
Pulley |
Mu |
StdDev |
Efficiency
(%) |
1 |
0.2081 |
0.008 |
96.05 |
2 |
0.1308 |
0.0043 |
97.54 |
3 |
0.1584 |
0.0033 |
96.77 |
Table 3. Final Mass and Error Estimates
Object Mass |
Approx. Error |
1077.1 |
~ 4 - 6% |
Error Considerations
We can calculate the approximate error in the weight of the hanging mass by considering the difference between the weight obtained from ‘below’ runs and ‘above’ runs, and comparing them to the average weight. This gives an estimate of the spread of the weight values obtained, and clearly includes the uncertainties resulting from the friction in the pulleys.
Error in the weight due to friction =
(weight from below – weight from above)/2
average weight
(1128.4 –
1078.7)/2
(1128.4 + 1078.7)/2
= 2.25%
Another approximate measure of the error can be obtained from the sum of forces in the X and Y directions. Ideally, these forces should sum to 0, since the hanging mass is in equilibrium. Taking the root mean square (RMS) of the X and Y tension sums gives an estimate of the total XY error, and dividing this error value by the Z tension results in a value that represents the total error in the measurement of the Z tension. Averaging all of these error values together gives an error of approximately 7 % from all the ‘above’ and ‘below’ runs. This error is much greater than the error estimate obtained from the much simpler calculation described above. A possible reason is that in this case, the error in each individual force equilibrium calculation is a greater percentage, whereas when all of the ‘above’ and ‘below’ runs are averaged, the result evens out and represents a smaller spread of values, even though the actual error invovled in calculating the final averages might have been greater.
If the total spread of the ‘above’ and ‘below’ runs is considered instead of just the difference between the mean weight value, the basic error calculation gives 2*2.25 = 4.5 % error, which seems more reasonable next to the XY error calculation. Given these various methods of calculating error, it is probably safe to conclude that the final error in the weight of the hanging mass is approximately between 4 and 6 percent.
Discussion
The frictional forces in the pulleys produced a difference in the unknown weight which was calculated to be a percentage error of approximately 4-6%. This is a relatively small error, and as a result it is probably safe to assume for most applications that the pulley is indeed frictionless. If more precision is required in obtaining weight values of hanging masses, the friction in the pulleys probably should not be neglected. Knowing how the friction affects tests reaching equilibrium from above and from below, it should be enough to do both tests and average the values, as the frictional effects should cancel out and give an accurate value for the weight of the hanging mass.
MATLAB CODE
runall.m
% runall.m
% Aron
Dobos, Spring 2006
%
% Calculates all the masses, pulley frictions, and average XY
errors,
% and
averages them. The variable AllData must be in the workspace.
% It is just a big table contain all the data points in the
following
%
format. The table can have
as many rows as needed.
%
% [
Weights ] [ FromAboveXYZ
] [ FromBelowXYZ
]
%
% 763
749 995 7.5
26.8 88.5 6.1
27.9 86.6
% 328
878 655 7.5
78 65.8 7
77 60.2
% 432
692 787 12.2
41 72 10.2
44.6 67.6
% 627
512 550 -7.4
34.6 64.1 -8.9
35.5 57.4
% 456
693 814 12
39.1 74.8 10.5
40.5 70.1
% 379
308 875 24.6
12.5 76 21.5
15.8 67.6
%
[M N] = size(AllData);
fp = fopen('mresults.txt', 'w');
Weights = zeros(M, 3);
Above = zeros(M, 3);
Below = zeros(M, 3);
XYError = 0;
AllMus = zeros(M, 3);
AvgMus = zeros(3, 1);
AvgEff = zeros(3, 1);
MuStdDev = zeros(3,1);
AverageMass = 0;
AvgFrictionForce = 0;
for I=1:M
Weights(I,:) = AllData(I, 1:3) / 1000;
% weights in kilograms
Above(I,:) = AllData(I, 4:6) / 39.3700787; %
locations in meters
Below(I,:) = AllData(I, 7:9) / 39.3700787; %
locations in meters
% calculate all values for the I-th run using the calcforces
function
calcs
= calcforces(Weights(I,:), Above(I,:), Below(I,:));
for K=1:3
AllMus(M,K) = calcs.PulleyMuAvg(K);
AvgMus(K) = AvgMus(K) + calcs.PulleyMuAvg(K);
AvgEff(K) = AvgEff(K) + calcs.PulleyEffAvg(K);
end
% average the friction forces
AvgFrictionForce
= AvgFrictionForce + calcs.AvgFriction;
% average the masses
AverageMass = AverageMass + calcs.ActualMass;
% average the RMS errors from 0,0 for the XY coordinate tensions
XYError = XYError + calcs.AvgErrXY;
fprintf(fp, '%d\t%d\t%d\t', Weights(I,1), Weights(I,2), Weights(I,3));
fprintf(fp, '%.1f\t%.1f\t%.1f\t', Above(I,1),
Above(I,2), Above(I,3));
fprintf(fp, '%.1f\t%.1f\t%.1f\t', Below(I,1),
Below(I,2), Below(I,3));
fprintf(fp, '%.2f\t%.4f\t%.4f\t%.4f\n', calcs.ActualMass, calcs.PulleyMuAvg(1),
calcs.PulleyMuAvg(2), calcs.PulleyMuAvg(3));
end
AvgFrictionForce = AvgFrictionForce
/ M;
AverageMass = AverageMass / M;
XYError = XYError / M;
% average
all the frictions and efficiencies for each pulley
for K=1:3,
AvgMus(K) = AvgMus(K) / M;
AvgEff(K) = AvgEff(K) / M;
end
%
calculate the standard deviations for the pulley frictions
for K=1:3
fsum
= 0;
for I=1:M
fsum
= ( AllMus(M,K) - AvgMus(K)
)^2;
end
MuStdDev(K) = sqrt(fsum)
/ (M-1);
end
fclose(fp);
% display the results.
AverageMass
XYError
AvgMus
MuStdDev
AvgEff
AvgFrictionForce
calcforces.m
function [ret] = calcforces(hanging_weights, above_data, below_data)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% calcforces.m
% Matlab script to calculate tensions, weights, and frictions
% Units are inches, grams
% Aron
Dobos, Spring 2005
%
% PFromAbove = [7.5 78 65.8];
% PFromBelow = [7 77 60.2];
%
% usage: calcforces(hanging_weights[1x3], above_data[1x3],
below_data[1x3])
%
% Example:
% > PFromAbove = [7.5 78 65.8];
% > PFromBelow = [7 77 60.2];
% >
Weights = [328 878 655];
% > calcforces(Weights,
PFromAbove, PFromBelow);
% ABOVE:
tension 1: Alpha=28.374703 degrees, Z=120.704820
% ABOVE:
tension 2: Alpha=40.355489 degrees, Z=120.968397
% ABOVE:
tension 3: Alpha=32.473082 degrees, Z=120.778002
% Mass for
run ABOVE=1091.953522 grams
% BELOW:
tension 1: Alpha=31.051536 degrees, Z=120.750897
% BELOW:
tension 2: Alpha=42.729991 degrees, Z=121.042040
% BELOW:
tension 3: Alpha=35.270283 degrees, Z=120.837251
% Mass for
run BELOW=1161.211849 grams
% ABOVE
Pulley 1 Mu=0.269096
% ABOVE
Pulley 2 Mu=0.122617
% ABOVE
Pulley 3 Mu=0.145532
% BELOW
Pulley 1 Mu=0.286309
% BELOW
Pulley 2 Mu=0.126376
% BELOW
Pulley 3 Mu=0.152947
%
% ans =
%
% AverageMass:
1.1266e+003
% PulleyMuAvg:
[0.2777 0.1245 0.1492]
% data: [1x2 struct]
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Weights = hanging_weights;
data(1).Junction = above_data;
data(1).RunName = 'ABOVE';
data(2).Junction = below_data;
data(2).RunName = 'BELOW';
% Define
the known data points
SnapWeight = 9 / 1000; % in kilograms
JunctionSnapWeight = 13 / 1000; % in
kilograms
% pulley
locations in meters
P1 = [-60 0 119]
/ 39.3700787;
P2 = [0 144 119]
/ 39.3700787;
P3 = [48 0 119]
/ 39.3700787;
PRadius = 1.5 / 39.3700787; % pulley radius
AxleRadius = 0.1875 / 39.3700787; % axle
radius
Pullies = [ P1; P2; P3 ];
Weights =
Weights + SnapWeight; % add the snap weight
% get the forces (frictionless cable tensions) in newtons
WeightForces = Weights * 9.81;
ret.AverageMass = 0;
ret.AvgErrXY = 0;
% iterate
through the 'above' run and the 'below' run
for D=1:2
% initialize
some variables for the data set.
data(D).Displace =
zeros(3,3);
data(D).Normalized
= zeros(3, 3);
data(D).D_JP =
zeros(3,1);
data(D).H =
zeros(3,1);
data(D).Zact = zeros(3,1);
data(D).D_JP_act = zeros(3,1);
data(D).Alpha =
zeros(3,1);
data(D).Phi =
zeros(3,1);
data(D).Theta =
zeros(3,1);
for I=1:3
% calculate the displacement
vectors for this run
data(D).Displace(I,:)
= Pullies(I,:) - data(D).Junction;
% calculate the distance from the
junction to the pulley
data(D).D_JP(I) = sqrt(
data(D).Displace(I,1)^2 + data(D).Displace(I,2)^2 );
% adjust the distance to get the
actual distance from the junction
% to the center of the pulley
sheave
data(D).D_JP_act(I) = data(D).D_JP(I) - PRadius;
% calculate the hypotenuse of the the triangle whose base is the
% distance from J to the pulley
sheave and height is the delta Z.
data(D).H(I) = sqrt(
data(D).D_JP_act(I)^2 + data(D).Displace(I,3)^2 );
% calculate the Phi angle in the
triangle (See drawing)
data(D).Phi(I)
= atan2(data(D).Displace(I,3), data(D).D_JP_act(I)) *
180/pi;
% likewise calculate theta for the
smaller triangle
data(D).Theta(I)
= asin( PRadius /
data(D).H(I) ) * 180/pi;
% determine alpha which is the
actual angle the cord makes with the
% horizontal axis
data(D).Alpha(I)
= data(D).Phi(I) + data(D).Theta(I);
% from alpha calculate the actual
Z
data(D).Zact(I) = data(D).D_JP_act(I)*tan(data(D).Alpha(I)*pi/180);
disp( sprintf('%s: tension %d: Alpha=%f degrees, Z=%f', data(D).RunName, I, data(D).Alpha(I), data(D).Zact(I)+data(D).Junction(3)));
% update the displacement vector
with the actual Z coordinate
data(D).Displace(I,3)
= data(D).Zact(I);
% normalize to obtain unit vectors
for the displacements
data(D).Normalized(I,:) =
data(D).Displace(I,:) / norm(data(D).Displace(I,:));
end
data(D).TSumX = 0;
data(D).TSumY = 0;
data(D).TSumZ = 0;
% sum the force components in the X Y and Z directions
assuming no
%
friction.
for I=1:3
data(D).TSumX = data(D).TSumX + WeightForces(I)*data(D).Normalized(I,1);
data(D).TSumY = data(D).TSumY + WeightForces(I)*data(D).Normalized(I,2);
data(D).TSumZ = data(D).TSumZ + WeightForces(I)*data(D).Normalized(I,3);
end
% take
the RMS (root-mean-square) of the X and Y sums (which should be
% zero) to get an estimate of the
error
data(D).ErrXY = sqrt(data(D).TSumX^2 +
data(D).TSumY^2);
% now take obtain the percentage
error from the Z sum to get an idea of
% how off the Z sum could be
data(D).ErrXYPercentOfZ = data(D).ErrXY /
data(D).TSumZ * 100;
disp(sprintf('XYZ sums: %f %f %f (RMS %f err %f)', data(D).TSumX, data(D).TSumY, data(D).TSumZ, data(D).ErrXY, data(D).ErrXYPercentOfZ));
ret.AvgErrXY = ret.AvgErrXY + data(D).ErrXYPercentOfZ;
% the mass is just the sum of the
Z components of the tensions
% divided by gravitational
acceleration
data(D).Mass =
data(D).TSumZ / 9.81;
ret.AverageMass =
ret.AverageMass + data(D).Mass;
disp(sprintf('Mass for run
%s=%f grams', data(D).RunName, data(D).TSumZ));
end
%
determine the average mass
ret.AverageMass = ret.AverageMass
/ 2;
ret.AvgErrXY = ret.AvgErrXY
/ 2;
% now
calculate all the pulley frictions from both above and below runs
for D=1:2
% initialize
the friction variables
data(D).Frictions
= zeros(3,1);
data(D).Normals = zeros(3,1);
data(D).PulleyMu = zeros(3,1);
data(D).Tensions =
zeros(3,1);
data(D).Efficiency
= zeros(3,1);
data(D).MassDiff = abs(data(D).Mass - ret.AverageMass);
for I=1:3
% calculate the actual tension in
the cord by using the mass
% difference from the run and the
average
data(D).Tensions(I)
= WeightForces(I) - 9.81*data(D).MassDiff
* data(D).Normalized(I,3);
% determine the friction force by
summing torques around the pulley
% wheel, accounting for the sheave
radius and outer radius
data(D).Frictions(I)
= 9.81*data(D).MassDiff * data(D).Normalized(I,3) * PRadius / AxleRadius;
% calculate the magnitude of the
sheave normal vector by
% the pythagorean theorem
data(D).Normals(I)
= sqrt( (data(D).Tensions(I)*data(D).Normalized(I,3)
+ WeightForces(I))^2 - data(D).Frictions(I)^2);
% determine Mu
= mag(F)
/ mag(N)
data(D).PulleyMu(I) = data(D).Frictions(I) / data(D).Normals(I);
% determine the efficiency of each
pulley
data(D).Efficiency(I) = 1 - data(D).MassDiff*9.81 * data(D).Normalized(I,3) / ((WeightForces(I)+data(D).Tensions(I))/2);
disp(sprintf('%s Pulley %d Mu=%f Eff=%f Friction=%f', data(D).RunName,
I, data(D).PulleyMu(I), data(D).Efficiency(I),
data(D).Frictions(I) ));
end
end
% average
the mu values for each pulley resulting from the
% above
and below runs
ret.AvgFriction = 0;
for I=1:3
ret.PulleyMuAvg(I) = 0;
ret.PulleyEffAvg(I) = 0;
for D=1:2
ret.PulleyMuAvg(I) = ret.PulleyMuAvg(I) +
data(D).PulleyMu(I);
ret.PulleyEffAvg(I) = ret.PulleyEffAvg(I) +
data(D).Efficiency(I);
ret.AvgFriction
= ret.AvgFriction + data(D).Frictions(I);
end
ret.PulleyMuAvg(I) = ret.PulleyMuAvg(I) / 2;
ret.PulleyEffAvg(I) = ret.PulleyEffAvg(I) / 2;
end
ret.AvgFriction = ret.AvgFriction
/ 6;
% subtract
the known snap weight from the averaged mass
ret.ActualMass = ret.AverageMass
- JunctionSnapWeight;
% return all calculated data values
ret.data = data;