error with matrix for truss code
Show older comments
HI Guys,
I am working on code to analize a truss and I am getting an error with one of my matrixis
I have shown the line "%index error in this line<---------"
any help would be very appreciated!
Thanks!!!
% Define the structure properties
num_nodes = 4; % number of nodes
num_members = 3; % number of members
E = 200e9; % Young's modulus of elasticity (Pa)
A = 0.01; % cross-sectional area of each member (m^2)
L = [2 2 2]; % length of each member (m)
node_coords = [0 0; 2 0; 2 2; 0 2]; % node coordinates (m)
% Define the connectivity matrix
connectivity_matrix = [1 2; 2 3; 3 4];
% Define the external forces acting on the structure
external_forces = zeros(num_nodes, 2); % initialize to zero
external_forces(4,:) = [-5000 0]; % force of 5000 N acting on node 4 in x-direction
% Define the boundary conditions
displacement = zeros(num_nodes, 2); % initialize to zero
displacement(1,:) = [0 0]; % node 1 is fixed
% Assemble the global stiffness matrix
K_global = zeros(num_nodes); % initialize to zero K_global = zeros(2*num_nodes);
for i = 1:num_members
member_nodes = connectivity_matrix(i,:);
member_coords = node_coords(member_nodes,:);
member_length = L(i);
member_stiffness = (E*A/member_length)*[1 0 -1 0;0 0 0 0; -1 0 1 0; 0 0 0 0]
member_dofs = [2*member_nodes(1)-1 2*member_nodes(1) 2*member_nodes(2)-1 2*member_nodes(2)]
K_global(member_dofs,member_dofs) = K_global(member_dofs,member_dofs) + member_stiffness;%index error in this line<---------
end
% Apply the boundary conditions
free_dofs = setdiff(1:2*num_nodes, [1 2]); % exclude the fixed degrees of freedom
K_reduced = K_global(free_dofs, free_dofs);
external_forces_reduced = external_forces(free_dofs,:);
displacement_reduced = displacement(free_dofs,:);
% Solve for the nodal displacements
nodal_displacements_reduced = K_reduced \ (external_forces_reduced' - K_global(free_dofs,1:2)*displacement_reduced');
% Reassemble the nodal displacements
nodal_displacements = displacement;
nodal_displacements(free_dofs,:) = nodal_displacements_reduced';
% Compute the member forces
member_forces = zeros(num_members,1);
for i = 1:num_members
member_nodes = connectivity_matrix(i,:);
member_coords = node_coords(member_nodes,:);
member_length = L(i);
member_stiffness = (E*A/member_length)*[1 -1; -1 1];
member_dofs = [2*member_nodes(1)-1 2*member_nodes(1) 2*member_nodes(2)-1 2*member_nodes(2)];
member_displacements = nodal_displacements(member_dofs,:);
member_forces(i) = member_stiffness*(member_displacements(2,:) - member_displacements(1,:))';
end
% Display the results
disp('Nodal displacements (m):');
disp(nodal_displacements);
disp('Member forces (N):');
disp(member_forces);
2 Comments
I don't understand how you want to save the 4x4 matrices "member_stiffness" in the big num_nodes x num_nodes matrix K_global. Maybe something like
K_global(i:i+3,i:i+3) = member_stiffness
?
V Sairam Reddy
on 20 Apr 2023
Hi Jamie,
The global stiffness matrix 'K_global' is of size 4 X 4 which is 'num_nodes X num_nodes' but however the variable 'member_dofs' is having thevalues [3, 4, 5, 6].
Hence when trying to index the 'K_global' variable with 'member_dofs' variable as rows, it is exceeding the size of 'K_global' which results in the error encountered.
Please provide more context to what you are trying to achieve so that we can help you better.
Answers (0)
Categories
Find more on Structural Analysis in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!