Asked by wasabiwoman
on 19 Jul 2019

I'm trying to assemble the global matrix, however, it gives me a few numbers at the end and the rest are zeros. There should be values along the diagonal of the matrix is what I'm trying to solve for. I've also attached my code.

%% Assembly

BIGK = zeros(NNODE*NDFPN,NNODE*NDFPN);

for I=1:NNPE % 4 nodes

for J=1:NNPE % 4 nodes

LRR = (I-1)*NDFPN; % 2

LRC = (J-1)*NDFPN;

GRR = (NODES(JE,I)-1)*NDFPN;

GRC = (NODES(JE,J)-1)*NDFPN;

for K=1:NDFPN

for L=1:NDFPN

BIGK(GRR+K,GRC+L) = BIGK(GRR+K,GRC+L)+EK(LRR+K,LRC+L);

end

end

end

end

Answer by infinity
on 19 Jul 2019

Hello,

I have taken a look in your code, I relize that in each element there are four nodes and each node has two degree of freedom. Therefore, the element matrix of each element are 8x8.

To assemble element matrix to your global matrix, you should loop for each elment and just assemble its matrix to the global matrix.

The problem is that you have to find the approriate index to assembe emement matrix of each element. To do this, you can find the index according to the node of each element. For example, in your code the first element is

NODES(1,:)

ans =

1 22 23 2

therefore, the index of this element in the global matrix will be

[2*NODES(1,:)-1 2*NODES(1,:)]

ans =

1 43 45 3 2 44 46 4

when you have found this index, you just assembe to global matrix by

BIGK(INDEX,INDEX) = BIGK(INDEX,INDEX) + EK;

Summary, you could change your code to

%% Assembly

BIGK = zeros(NNODE*NDFPN,NNODE*NDFPN);

% for I=1:NNPE % 4 nodes

% for J=1:NNPE % 4 nodes

% LRR = (I-1)*NDFPN; % 2

% LRC = (J-1)*NDFPN;

% GRR = (NODES(JE,I)-1)*NDFPN;

% GRC = (NODES(JE,J)-1)*NDFPN;

% for K=1:NDFPN

% for L=1:NDFPN

% BIGK(GRR+K,GRC+L) = BIGK(GRR+K,GRC+L)+EK(LRR+K,LRC+L);

% end

% end

% end

% end

for I = 1:NELE

INDEX = [NODES(I,:)*2-1 NODES(I,:)*2];

BIGK(INDEX,INDEX) = BIGK(INDEX,INDEX) + EK;

end

Aslo, at the end of your code in Problem_2.m, you should change

%% Displacement

disp = (BIGK)/force;

to

%% Displacement

disp = (BIGK)\force;

since there is a different between / and \. You can refer more detail of "\" by this link

https://www.mathworks.com/help/matlab/ref/mldivide.html

wasabiwoman
on 20 Jul 2019

Thank you! That was very illuminating and I appreciate it! However, it gives me a warning:

Warning: Matrix is close to singular or badly scaled. Results may be

inaccurate. RCOND = 3.597566e-20.

> In Problem_2 (line 234)

Where line 234 is

disp = (BIGK)\force;

And I do believe the displacement results are on the right track, but not quite correct.

infinity
on 22 Jul 2019

Hello,

This warning might come from the global matrix, which may be not invertible.

There are many possibilities of this behaviour. It could be boundary condition, also from the number of Gauss, and element stiffness matrix. To find out why do you have this behaviour, you could double check the code and the formulation.

I also can suggest you to increase number of elements to see does it increase the accuracy of the displacement.

Sign in to comment.

Opportunities for recent engineering grads.

Apply Today
## 3 Comments

## dpb (view profile)

## Direct link to this comment

https://www.mathworks.com/matlabcentral/answers/472570-assembling-global-stiffness-matrix#comment_726369

## wasabiwoman (view profile)

## Direct link to this comment

https://www.mathworks.com/matlabcentral/answers/472570-assembling-global-stiffness-matrix#comment_726370

## dpb (view profile)

## Direct link to this comment

https://www.mathworks.com/matlabcentral/answers/472570-assembling-global-stiffness-matrix#comment_726375

Sign in to comment.