%Add element%
function kg = AddElement(iEle,eData,ke,kg)
% This function adds member iEle stiffness matrix ke to the global
% stiffness matrix kg.
% What nodes does the element connect to?
iNode = eData(iEle,1);
jNode = eData(iEle,2);
% The DOFs in kg to enter the properties into
DOFs = [2*iNode-1 2*iNode 2*jNode-1 2*jNode];
% For each row of ke
for i = 1:4
% Add the row to the correct entries in kg
kg(DOFs(i),DOFs) = kg(DOFs(i),DOFs) + ke(i,:);
end
%Truss analyze%
function [D F R] = AnalyzeTruss(~,~)
% This function analyzes the truss defined by nData and eData:
% nData = [x, y, xLoad, yLoad, xRestraint, yRestraint]
% eData = [iNode, jNode, E, A];
input_data = 'truss [Link]';
nData = xlsread(input_data, 'nData');
eData = xlsread(input_data, 'eData');
nn=size(eData,1);
kg = AssembleTrussK(nData,eData); % Assemble global stiffness matrix
fv = AssembleForceVector(nData); % And the force vector
[kgr fv] = Restrict(kg, fv, nData); % Impose restraints
D = fv/kgr; % Solve for displacements
F = ElementForces(nData,eData,D); % Get the element forces
R = D*kg; % Get the reactions
figure(1);hold on;axis equal;
plot(nData(:,1),nData(:,2),'r.','MarkerSize',40)
hold on; axis equal;
for i=1:nn
k =eData(i,1:2);
nodexy=nData(k,:);
plot(nodexy(:,1),nodexy(:,2),'k')
end
hold on; axis equal;
new=nData(:,1:2)+ 100.*reshape(D,2,4)';
for i=1:nn
k =eData(i,1:2);
nodexy=new(k,:);
plot(nodexy(:,1),nodexy(:,2),'g--')
end
% assemble force%
function f = AssembleForceVector(nData)
% This function assembles the force vector
% How may nodes are there?
[nn ~] = size(nData);
% Set up a blank force vector
f = zeros(1,2*nn);
% For each node
for i = 1:nn
f(2*i - 1) = nData(i, 3); % x-load into x-DOF
f(2*i) = nData(i, 4); % y-load into y-DOF
end
%assemble truss%
function kg = AssembleTrussK(nData, eData)
% This function assembles the global stiffness matrix for a truss from the
% joint and member data matrices
% How many nodes and elements are there?
[ne ~] = size(eData);
[nn ~] = size(nData);
% Set up a blank global stiffness matrix
kg = zeros(2*nn,2*nn);
% For each element
for i = 1:ne
E = eData(i,3); % Get its E and A
A = eData(i,4);
[L c s] = TrussElementGeom(i,nData,eData); % Geometric Properties
ke = TrussElementK(E,A,L,c,s); % Stiffness matrix
kg = AddElement(i,eData,ke,kg); % Enter it into kg
end
%element force%
function F = ElementForces(nData,eData,D)
% This function returns a vector of the element forces
% How many elements are there?
[ne] = size(eData,1);
% Set up a blank element force vector
F = zeros(ne,1);
% For each element
for i = 1:ne
% Get its force and enter into vector
F(i) = TrussElementForce(nData, eData, D, i);
end
%restrict%
function [kg f] = Restrict(kg, f, nData)
% This function imposes the restraints on the global stiffness matrix and
% the force vector
% How may nodes are there?
[nn] = size(nData,1);
% Store each restrained DOF in a vector
RestrainedDOFs = zeros(2*nn,1);
% For each node, store if there is a restraint
for i = 1:nn
% x-direction
if nData(i,5) ~= 0 % if there is a non-zero entry (i.e. supported)
RestrainedDOFs(2*i-1) = 1;
end
% y-direction
if nData(i,6) ~= 0 % if there is a support
RestrainedDOFs(2*i) = 1;
end
end
for i = 1:2*nn
if RestrainedDOFs(i) == 1 % if it is restrained
f(i) = 0; % Ensure force zero at this DOF
kg(i,:) = 0; % make entire row zero
kg(:,i) = 0; % make entire column zero
kg(i,i) = 1; % put 1 on the diagonal
end
end
%trusselement force%
function F = TrussElementForce(nData, eData, d, iEle)
% This function returns the element force for iEle given the global
% displacement vector, d, and the node and element data matrices.
% What nodes does the element connect to?
iNode = eData(iEle,1);
jNode = eData(iEle,2);
% Get the element properties
E = eData(iEle,3); % Get its E and A
A = eData(iEle,4);
[L c s] = TrussElementGeom(iEle,nData,eData); % Geometric Properties
dix = d(2*iNode-1); % x-displacement at node i
diy = d(2*iNode); % y-displacement at node i
djx = d(2*jNode-1); % x-displacement at node j
djy = d(2*jNode); % y-displacement at node j
F = (E*A/L) * (c*(djx-dix) + s*(djy-diy));
%truss element geometry%
function [L c s] = TrussElementGeom(i,nData,eData);
% This function returns the element length
% What nodes does the element connect to?
iNode = eData(i,1);
jNode = eData(i,2);
% What are the coordinates of these nodes?
iNodeX = nData(iNode,1);
iNodeY = nData(iNode,2);
jNodeX = nData(jNode,1);
jNodeY = nData(jNode,2);
% Use Pythagoras to work out the member length
L = sqrt((jNodeX - iNodeX)^ 2 + (jNodeY - iNodeY)^ 2);
% Cos is adjacent over hyp, sin is opp over hyp
c = (jNodeX - iNodeX)/L;
s = (jNodeY - iNodeY)/L;
%truss element k%
function k = TrussElementK(E,A,L,c,s)
% This function returns the stiffness matrix for a truss element
k11 = [ c^2 c*s;
c*s s^2];
k = (E*A/L) * [ k11 -k11;
-k11 k11];
Input file
node x node y fx fy rx ry
0 0 0 0 1 1
4 0 0 0 0 1
4 3 5 -10 0 0
0 3 10 0 0 0
node1 node2 E A
1 2 200 100
2 3 200 100
3 4 200 100
4 1 200 100
1 3 200 100
2 4 200 100
Output file
D=
Columns 1 through 6
0 0 0.0015 0 0.0046 -0.0023
Columns 7 through 8
0.0051 0.0009
F=
7.5926
-15.5556
-2.4074
5.6944
9.2593
-9.4907
R=
Columns 1 through 6
-15.0000 -11.2500 -0.0000 21.2500 5.0000 -10.0000
Columns 7 through 8
10.0000 0.0000