Question
You must modify this code so that it works for any truss that the user wishes to analyze, whether 2-D or 3-D. Therefore, after your
You must modify this code so that it works for any truss that the user
wishes to analyze, whether 2-D or 3-D.
Therefore, after your code is modified, all trusses should be assumed as
3-D Space Trusses.
For 2-D planar trusses, the z-coordinate of each joint should be zero
and the e3 magnitude of all external forces and reactions should be zero.
.M file given that must be modify
% Units used:
LUnit = 'ft'; % Length = ft or m
FUnit = 'lb'; % Force = lb or kip or N or kN
%.. Input problem data
nNodes = 8; % Number of nodes (pin joints) in the truss
nMembers = 11; % Number of members
nReactions = 2; % Number of force vector reactions
nLoads = 3; % Number of externally applied loads
nDim = 3; % Dimensions 2=2D, 3=3D
% *** Once your code is modified and tested, nDim must always equal 3 and
% the variable nDim cannot be used in your code.
nDOF = nDim * nNodes; % Number of degrees of freedom
tol = 1.e-8; % Remainder tolerance on norm of residual force
% Input coordinates of each node
x(1,:) = [0,0,0]; % A
x(2,:) = [3,3,3]; % B
x(3,:) = [6,6,6]; % C
x(4,:) = [9,9,9]; % D
x(5,:) = [18, 0]; % G
x(6,:) = [9, 0,0]; % H
x(7,:) = [12, 6,3]; % E
x(8,:) = [15, 3,3]; % F
% Input member connections
%.. First input is the start node; Second input is the end node
Member(1,:) = [1,2]; % AB
Member(2,:) = [1,6]; % AH
Member(3,:) = [2,6]; % BH
Member(4,:) = [2,3]; % BC
Member(5,:) = [3,6]; % CH
Member(6,:) = [3,4]; % CD
Member(7,:) = [4,6]; % DH
Member(8,:) = [4,5]; % DG
Member(9,:) = [5,6]; % GH
Member(10,:) = [7,6]; % EH
Member(11,:) = [8,6]; % FH
% Input support reactions
%.. First input is the node number
%.. Second input is resistance in the e1 direction
%.. Third input is resistance in the e2 direction
%.. Fourth input is resistance in the e3 direction (zero for 2-D trusses)
%*** 1 for resistance in that direction, 0 for no resistance ***
Reaction(1,:) = [1, 1, 1]; % Pin at Node 1
Reaction(2,:) = [5, 0, 1]; % Roller at Node 5
% Input externallly applied loads
%.. First input is the node number, remaining inputs are the magnitude of
%.. the force in the e1, e2 and e3 directions, respectively.
Load(1,:) = [2, 500, -866.025]; % 1000 lb load at Node 2
Load(2,:) = [3, 866.025, -500]; % 1000 lb load at Node 3
Load(3,:) = [4, 1000, 0]; % 1000 lb load at Node 4
% End of Input Section for Assessment 04 16Sp.(2-D).......
% ************************************************************************
%% Compute the unit vector (direction) for every member
PosVec = zeros(nMembers, 2); %Initialize Position Vector matrix
UnVec = zeros(nMembers, 2); %Initialize Unit Vector matrix
OppUnVec = zeros(nMembers, 2); %Initialize opposite direction matrix
for i = 1 : nMembers
SN = Member(i,1);
EN = Member(i,2);
% ***** This section is where your CP3 code should go. *****
%% ---------------------------------------------------------------
%....
%.... PART 1
%.... PLANAR Truss
%....
%-----------------------------------------------------------------
%.... problem data
nNodesP = 12; %number of nodes
nMembersP = 21; %number of members
NodePoly = zeros(nNodesP, 3); %Initialize memory storage
MemberPoly = zeros(nMembersP, 2);
%.... node coordinates
NodePoly(1,:) = [0,0,0]; %Node 1
NodePoly(2,:) = [2,0,0]; %NOde 2
NodePoly(3,:) = [4,0,0]; %Node 3
NodePoly(4,:) = [6,0,0]; %Node 4
NodePoly(5,:) = [8,0,0]; %Node 5
NodePoly(6,:) = [10,0,0]; %Node 6
NodePoly(7,:) = [12,0,0]; %Node 7
NodePoly(8,:) = [10,3/2,0]; %Node 8
NodePoly(9,:) = [8,3,0]; %Node 9
NodePoly(10,:) = [6,3,0]; %Node 10
NodePoly(11,:) = [4,3,0]; %Node 11
NodePoly(12,:) = [2,3/2,0]; %Node 12
%.... member connections
MemberPoly(1,:) = [1,2];
MemberPoly(2,:) = [2,3];
MemberPoly(3,:) = [3,4];
MemberPoly(4,:) = [4,5];
MemberPoly(5,:) = [5,6];
MemberPoly(6,:) = [6,7];
MemberPoly(7,:) = [8,7];
MemberPoly(8,:) = [8,6];
MemberPoly(9,:) = [9,8];
MemberPoly(10,:) = [9,6];
MemberPoly(11,:) = [9,5];
MemberPoly(12,:) = [10,9];
MemberPoly(13,:) = [10,5];
MemberPoly(14,:) = [10,4];
MemberPoly(15,:) = [10,3];
MemberPoly(16,:) = [11,10];
MemberPoly(17,:) = [11,3];
MemberPoly(18,:) = [11,2];
MemberPoly(19,:) = [12,11];
MemberPoly(20,:) = [12,2];
MemberPoly(21,:) = [1,12];
%% .. Use a for loop to compute the position vector between connected
PosVecP = zeros(nMembersP, 3); %Initialize memory storage
UnitVecP = zeros(nMembersP, 3); %unit vector
OppPosVecP = zeros(nMembersP, 3);
for (j = 1 : nMembersP)
SN = MemberPoly(j,1); %SN = start node
EN = MemberPoly(j,2); %EN = end node
PosVec(j,:) =NodePoly(EN,:)-NodePoly(SN,:);
UnitVecP(j,:)=PosVecP(j,:)/norm(PosVecP(j,:));
PosVecP(j,:)=-PosVecP(j,:)/norm(PosVecP(j,:));
end % for j (members)
%% .Create output for command window
fprintf('%s ' , '----------------------------------------')
fprintf('%s ' , '-------------Planar Truss---------------')
fprintf('%s ' , '----------------------------------------')
for (i = 1 : nNodesP)
fprintf('%s%8i%8.3f%8.3f%8.3f ',' Node: ',i, NodePoly(i,:)')
end
fprintf(' ')
for (i = 1 : nMembersP)
fprintf('%s%8i%8.3f%8.3f%8.3f ',' Unit Vector: ',i, UnitVecP(i,:)')
end
fprintf(' ')
%% .Create the plot
fig1 = figure(1); clf; grid on; axis equal; hold on;
xlabel('X'); ylabel('Y'); title('Planar Truss');
for m = 1 : nMembersP
SN = MemberPoly(m,1);
EN = MemberPoly(m,2);
X = [NodePoly(SN,1); NodePoly(EN,1)];
Y = [NodePoly(SN,2); NodePoly(EN,2)];
Z = [NodePoly(SN,3); NodePoly(EN,3)];
p = plot(X,Y);
set(p, 'Color', 'k', 'LineWidth', 2);
end % for m, nMembersP
scatter(NodePoly(:,1),NodePoly(:,2),'fill','red');
%% ---------------------------------------------------------------
%....
%.... PART 1b
%.... SPACE Truss
%....
%-----------------------------------------------------------------
%....truss data
nNodesS = 7; %number of nodes
nMembersS = 15; %number of members
NodeS = zeros(nNodesS, 3); %Initialize memory storage
nMemberS = zeros(nMembersS, 2);
%.... node coordinates
NodeS(1,:) = [2,-3,0]; %Node 1
NodeS(2,:) = [2,3,0]; %Node 2
NodeS(3,:) = [-4,3,0]; %Node 3
NodeS(4,:) = [1,-3/2,6]; %Node 4
NodeS(5,:) = [1,3/2,6]; %Node 5
NodeS(6,:) = [-2,3/2,6]; %Node 6
NodeS(7,:) = [0,0,12]; %Node 7
%.... members coordinates
MemberS(1,:) = [1,2];
MemberS(2,:) = [2,3];
MemberS(3,:) = [2,4];
MemberS(4,:) = [2,5];
MemberS(5,:) = [1,3];
MemberS(6,:) = [1,4];
MemberS(7,:) = [3,6];
MemberS(8,:) = [3,5];
MemberS(9,:) = [3,4];
MemberS(10,:) = [5,4];
MemberS(11,:) = [5,6];
MemberS(12,:) = [6,4];
MemberS(13,:) = [4,7];
MemberS(14,:) = [5,7];
MemberS(15,:) = [6,7];
%% .. Use a for loop to compute the position vector between connected
PosVecPoly = zeros(nMembersS, 3); %Initialize memory storage
UnitVecPoly = zeros(nMembersS, 3); %unit vector
OppPosVecPoly = zeros(nMembersS, 3); %negative position vector
for (j=1:nMemberS)
SN=MemberS(j,1); %start node
EN=MemberS(j,2); %end node
PosVecPoly(j,:)=NodeS(EN,:)-NodeS(SN,:); %compute position vector
UnitVecPoly(j,:)=PosVecPoly(j,:)/norm(PosVecPoly(j,:)); %compute unit vector
OppPosVecPoly(j,:)=-PosVecPoly(j,:)/norm(PosVecPoly(j,:)); %compue negative position vector
end
%% ..Create output for command window
fprintf('%s ' , '---------------------------------------')
fprintf('%s ' , '-------------Space Truss---------------')
fprintf('%s ' , '---------------------------------------')
for (i = 1 : nNodesS)
fprintf('%s%8i%8.3f%8.3f%8.3f ',' Node: ',i, NodeS(i,:)')
end
fprintf(' ')
for (i = 1 : nMembersS)
fprintf('%s%8i%8.3f%8.3f%8.3f ',' Unit Vector: ',i, UnitVecPoly(i,:)')
end
fprintf(' ')
%% .Create the plot
fig2 = figure(2); clf; grid on; axis equal; hold on;
xlabel('X'); ylabel('Y'); zlabel('Z');title('Space Truss');
for m = 1 : nMembersS
SN = MemberS(m,1);
EN = MemberS(m,2);
X = [NodeS(SN,1); NodeS(EN,1)];
Y = [NodeS(SN,2); NodeS(EN,2)];
Z = [NodeS(SN,3); NodeS(EN,3)];
p = plot3(X,Y,Z);
set(p, 'Color', 'k', 'LineWidth', 2);
end % for m, nMemberS
scatter3(NodeS(:,1),NodeS(:,2),NodeS(:,3),'fill','blue');
%% ---------------------------------------------------------------
%....
%.... PART 2
%.... Polygon
%....
%-----------------------------------------------------------------
%.... Input problem data (radius, # of points, # of members, theta)
r = 10; %Radius
nNodesPoly = 6;
nMembersPoly = nNodesPoly - 1;
theta = pi/nMembersPoly; %a semi-circular arch
%% .. Use a for loop to compute the x, y and z coordinates of each point and
for (i=1:nNodesPoly)
x(i)=[r*cos((i-1)*theta)]; %x as a function of r and theta
y(i)=[r*sin((i-1)*theta)]; %y as a function of r and theta
z(i)=[0]; %z as a function of r and theta
end
NodePoly=[x;y;z]';
%.... Use a for loop to compute the members or connections and the unit
%.... vector for each member.
PosVecPoly = zeros(nMembersPoly, 3); %Initialize memory storage
UnitVecPoly = zeros(nMembersPoly, 3);
OppPosVecPoly = zeros(nMembersPoly, 3);
for j=1:nMembersPoly
MemberPoly(j,:) = [j,j+1];
SN=MemberPoly(j,1); %Start node
EN=MemberPoly(j,2); %End node
PosVecPoly(j,:)=NodePoly(EN,:)-NodePoly(SN,:);
UnitVecPoly(j,:)=PosVecPoly(j,:)/norm(PosVecPoly(j,:));
OppPosVecPoly(j,:)=-PosVecPoly(j,:)/norm(PosVecPoly(j,:));
end
%% .Create output for command window
fprintf('%s ' , '---------------------------------------')
fprintf('%s ' , '--------------Polygon------------------')
fprintf('%s ' , '---------------------------------------')
for (i = 1 : nNodesPoly)
fprintf('%s%8i%8.3f%8.3f%8.3f ',' Node: ', NodePoly(i,:)')
end
fprintf(' ')
for i = 1 : nMembersPoly
fprintf('%s%8i%8.3f%8.3f%8.3f ',' Unit Vector: ',i, UnitVecPoly(i,:)')
end
fprintf(' ')
%% ..Create the plot
fig3 = figure(3); clf; grid on; axis equal; hold on;
xlabel('X'); ylabel('Y'); title('Polygon Truss');
p = plot(NodePoly(:,1), NodePoly(:,2));
set(p,'Color','red','LineWidth',2);
scatter(NodePoly(:,1), NodePoly(:,2),'fill','green');
% End of Program
OppUnVec(i,:) = -PosVec(i,:) / norm(PosVec(i,:));
end
%% The coefficient matrix, C, contains the unit vectors (direction vectors)
% for each member force associated with each node. The unit vectors are
% then separated into e1, e2, e3 components and placed in separate rows.
% Therefore, each node has 2 rows (for 2-D) or 3 rows (for 3-D) associated
% with it; one for each of the e1, e2, e3 components.
% This corresponds with the Degrees of Freedom, nDOF, which is 2*nNodes
% for 2-D or 3*nNodes for 3-D.
% So the coefficient matrix has 2 or 3 rows for each node and one column
% for each member force.
C = zeros(2*nNodes, nMembers); %Initialize coefficient matrix
% Loop through all nodes, create the vector force equation for that node
% and store it in the proper row of the coefficient matrix, C.
for i = 1 : nNodes
for j = 1 : nMembers
SN = Member(j,1);
EN = Member(j,2);
if (SN == i) % If member j starts at node i
C(2*i-1, j) = UnVec(j,1);
C(2*i, j) = UnVec(j,2);
elseif (EN == i) % If member j ends at node i
C(2*i-1, j) = OppUnVec(j,1);
C(2*i, j) = OppUnVec(j,2);
end % if SN
end % for nMembers
end % for nNodes
%% The External Force matrix, F, contains the magnitude of all externally
% applied loads, (input as e1, e2, e3 components), stored in the
% proper rows to corespond with the node it is applied at.
% Therefore, the F matrix has 2 or 3 rows for each node and one column.
F = zeros(3*nNodes, 1); %Initialize External Force matrix
% Loop through all externally applied loads and place each component of the
% load (e1, e2, e3) in the proper rows in the external load matrix, F.
for i = 1 : nLoads
j = Load(i,1); % Which node, j is the load i on
F(3*j-1) = Load(i,2);
F(3*j) = Load(i,3);
end % for i,nLoads
%% The Restraint matrix, Crest, contains the unit vectors (directions)
% for each member force associated with those nodes that are restrained by
% external supports.
% The Crest matrix has one row for each reaction component and one column
% for each member.
%.... Loop through all nodes and determine if there is a reaction at that
%.... node and seperate the reaction node equations from the force load
%.... equations.
nReaction = 1; %Used to count the number of reaction equations
%.... The nReactionEquation vector determines if a row should be put in the
%.... Crest matrix or the Cfree matrix
nReactionEquation = zeros(1, 2*nNodes);
for (j = 1 : nReactions)
for (i = 1 : nNodes)
if (Reaction(j,1) == i)
if (Reaction(j,2) == 1)
Crest(nReaction,:) = C(2*i-1,:);
nReactionEquation(2*i-1) = 1;
% If nReactionEquation is 1 it should be in the Crest
% matrix and not the Cfree matrix.
nReaction = nReaction+1;
end
if (Reaction(j,3) == 1)
Crest(nReaction,:) = C(2*i,:);
nReactionEquation(2*i) = 1;
% If nReactionEquation is 1 it should be in the Crest
% matrix and not the Cfree matrix.
nReaction = nReaction+1;
end
end
end
end
nForce = 1; %Used to count the number of Cfree equations
for (i = 1 : 2*nNodes)
if (nReactionEquation(i) == 1)
else
Cfree(nForce,:) = C(i,:);
Ffree(nForce) = F(i);
nForce = nForce + 1;
end
end
%% Solve first for the member forces and then solve for the support
% reactions.
% All of the values in the Cfree and Ffree matrices are known so you can
% now solve for the T matrix, which is the tension force in each member.
T = % finish this equation
% Since all values in the Crest and T matrices are now known, you can solve
% for the support reactions.
Reactions = % finish this equation
% Calculate the residual to find the amount of error and ensure that
% equilibrium was satisfied.
Residual1 = (Cfree * T + Ffree');
Residual2 = (Crest * T + Reactions);
Res = norm(Residual1) + norm(Residual2);
% Create the support reaction matrix.
nReaction = 1;
for (i = 1 : nNodes)
if (nReactionEquation(2*i-1) == 1)
SupportReaction(i,1) = i;
SupportReaction(i,2) = Reactions(nReaction);
nReaction = nReaction+1;
end
if (nReactionEquation(2*i) == 1)
SupportReaction(i,1) = i;
SupportReaction(i,3) = Reactions(nReaction);
nReaction = nReaction+1;
end
end
%% Create output for command window
fprintf('%s ' , '----------------------------------------')
fprintf('%s ' , '------------- Truss --------------')
fprintf('%s ' , '----------------------------------------')
fprintf('%s',' Node Coordinates (', LUnit, ')')
fprintf (' ')
for i = 1 : nNodes
fprintf('%s%4i%8.3f%8.3f%8.3f ',' Node: ', i, x(i,:)')
end % for i, nNodes
fprintf (' ')
fprintf('%s',' Member Forces (', FUnit, ')')
fprintf (' ')
for i = 1 : nMembers
fprintf('%s%4i%12.3f ',' Member Force: ',i, T(i))
end % for i, nMembers
fprintf (' ')
for i = 1 : nReactions
for j = 1 : nNodes
if (Reaction(i,1) == j)
fprintf('%s%s%s%4i%12.3f%12.3f%12.3f ',...
' Support Reaction (',FUnit,') at Node ',...
SupportReaction(j,:))
fprintf (' ')
end % if Reaction
end % for j, nNodes
end % for i, nReactions
fprintf(' %s%8.3f ',' Residual Error: ', Res)
fprintf(' ')
%% Create the plot............................................
% Once your code is modified the plot will be 3-D and so you may need the
% "Rotate 3D" command to view the truss figure properly.
%.. Plot members with color indicating tension or compression
Marker = ceil(25 / sqrt(nNodes));
fig1 = figure(1); clf; grid on; axis equal;
hold on;
xlabel(cat(2, 'X (',LUnit,')' ));
ylabel(cat(2, 'Y (',LUnit,')' ));
title('Truss Analysis');
small = max(T)*tol;
for m = 1 : nMembers
if (T(m) < -small)
MColor = 'b'; % Color compression members blue
elseif (T(m) > small)
MColor = 'r'; % Color tension members red
else
MColor = 'k'; % Color "zero force members" black
end % if T
SN = Member(m,1);
EN = Member(m,2);
X = [x(SN,1); x(EN,1)];
Y = [x(SN,2); x(EN,2)];
p = plot(X,Y);
set(p, 'Color', MColor, 'LineWidth', 6/nDim);
end % for m, nMembers
%.. Plot external reaction forces
Rlength = 0.1 * max(max(x)); % establish size of line
e = [ 1, 0, 0 ; 0, 1, 0 ; 0, 0, 1];
for i = 1 : nReactions
for j = 1 : nNodes
if (Reaction(i,1) == j)
for k = 1 : 2
if(Reaction(i, k+1) == 1)
xR(1,:) = x(j,:);
xR(2,:) = x(j,:) - Rlength * e(k, 1:nDim);
p = plot(xR(:,1),xR(:,2));
set(p,'Color','g','LineWidth',8/nDim);
end % if Reaction == 1
end % for k
end % if Reaction == j
end % for j, nNodes
end % for i, nReactions
%.. Plot loads
Llength = 0.1 * max(max(x)); % establish size of line
Fmax = max(max(abs(Load))); % establish maximum force level
e = [ 1, 0, 0 ; 0, 1, 0 ; 0, 0, 1];
for i = 1 : nLoads
for j = 1 : nNodes
if (Load(i,1) == j)
for k = 1 : 2
F = Load(i, k+1) / Fmax;
xL(1,:) = x(j,:);
xL(2,:) = x(j,:) + Llength * F * e(k, 1:nDim);
p = plot(xL(:,1), xL(:,2));
set(p,'Color','c','LineWidth',8/nDim);
end % for k
end % if Load == j
end % for j, nNodes
end % for i, nLoads
%.. Plot nodes
plot(x(:,1), x(:,2), 'o', 'LineWidth', 2,...
'MarkerFaceColor','w',...
'MarkerEdgeColor','k',...
'MarkerSize',Marker);
view(2);
% End of Program
Step by Step Solution
There are 3 Steps involved in it
Step: 1
The question is incomplete because it requires a code modification without providing the full origin...Get Instant Access to Expert-Tailored Solutions
See step-by-step solutions with expert insights and AI powered tools for academic success
Step: 2
Step: 3
Ace Your Homework with AI
Get the answers you need in no time with our AI-driven, step-by-step assistance
Get Started