Code Matlab
Code Matlab
b1 = y2 - y3; c1 = x3 - x2;
b2 = y3 - y1; c2 = x1 - x3;
b3 = y1 - y2; c3 = x2 - x1;
k_e = t * A * B' * D * B;
b1 = y2 - y3; c1 = x3 - x2;
b2 = y3 - y1; c2 = x1 - x3;
b3 = y1 - y2; c3 = x2 - x1;
epsilon = B * u_e;
sigma = D * epsilon;
stress_xx(e) = sigma(1); % sigma_xx (MPa)
b1 = y2 - y3; c1 = x3 - x2;
b2 = y3 - y1; c2 = x1 - x3;
b3 = y1 - y2; c3 = x2 - x1;
k_e = t * A * B' * D * B;
u = zeros(n_dof, 1);
u(free_dofs) = u_red;
for e = 1:7
n1 = elements(e, 1);
n2 = elements(e, 2);
n3 = elements(e, 3);
x1 = nodes(n1, 1); y1 = nodes(n1, 2);
x2 = nodes(n2, 1); y2 = nodes(n2, 2);
x3 = nodes(n3, 1); y3 = nodes(n3, 2);
b1 = y2 - y3; c1 = x3 - x2;
b2 = y3 - y1; c2 = x1 - x3;
b3 = y1 - y2; c3 = x2 - x1;
epsilon = B * u_e;
sigma = D * epsilon;
stress_xx_all(e, t) = sigma(1);
if t == 1
centroids_x(e) = (x1 + x2 + x3)/3;
end
end
end
[centroids_sorted, idx] = sort(centroids_x);
stress_xx_sorted = stress_xx_all(idx, :);
for t = 1:n_angles
fprintf('\nElement Stresses for theta = %d
deg:\n', theta_deg(t));
for e = 1:7
fprintf('Element %d: sigma_xx = %.4e MPa,
Centroid x = %.2f m\n', ...
e, stress_xx_all(e, t),
centroids_x(e));
end
end
if any(isnan(stress_xx_sorted(:))) ||
any(isinf(stress_xx_sorted(:)))
error('Invalid stress values detected');
end
if isempty(centroids_sorted) ||
isempty(stress_xx_sorted)
error('Stress or centroid arrays are empty');
end
figure;
hold on;
colors = ['b', 'r', 'g', 'k'];
for t = 1:n_angles
plot(centroids_sorted, stress_xx_sorted(:, t),
[colors(t) 'o-'], ...
'LineWidth', 2, 'MarkerSize', 8, ...
'DisplayName', sprintf('theta = %d deg',
theta_deg(t)));
end
hold off;
xlabel('x-coordinate (m)', fontsize=15);
ylabel('Normal Stress \sigma_{xx} (MPa)',
fontsize=15);
title('Stress Distribution along Cantilever Plate',
FontSize=15);
legend('show');
grid on;
max_abs_stress = max(abs(stress_xx_sorted(:)));
if max_abs_stress == 0
max_abs_stress = 1;
end
axis([0 1 -max_abs_stress*1.2 max_abs_stress*1.2]);
b1 = y2 - y3; c1 = x3 - x2;
b2 = y3 - y1; c2 = x1 - x3;
b3 = y1 - y2; c3 = x2 - x1;
k_e = t * A * B' * D * B;
f_y = -rho(e) * g;
F_e = (A * t * f_y / 3) * [0; 1; 0; 1; 0; 1];
F(dof) = F(dof) + F_e;
end
fixed_dofs = [1, 2, 11, 12];
free_dofs = setdiff(1:n_dof, fixed_dofs);
if isempty(free_dofs)
error('No free DOFs to solve');
end
K_red = K(free_dofs, free_dofs);
F_red = F(free_dofs);
cond_K = cond(K_red);
fprintf('Condition number of K_red: %.4e\n',
cond_K);
if cond_K > 1e12
K_red = K_red + 1e-8 * eye(size(K_red));
fprintf('Applied regularization to K_red\n');
end
u_red = K_red \ F_red;
u = zeros(n_dof, 1);
u(free_dofs) = u_red;
fprintf('\nNodal Displacements:\n');
for i = 1:n_nodes
fprintf('Node %d: u_x = %.4e m, u_y = %.4e m\n',
i, u(2*i-1), u(2*i));
end
stress_xx = zeros(7, 1);
centroids_x = zeros(7, 1);
for e = 1:7
n1 = elements(e, 1);
n2 = elements(e, 2);
n3 = elements(e, 3);
b1 = y2 - y3; c1 = x3 - x2;
b2 = y3 - y1; c2 = x1 - x3;
b3 = y1 - y2; c3 = x2 - x1;
epsilon = B * u_e;
sigma = D * epsilon;
stress_xx(e) = sigma(1); % sigma_xx (MPa)