Invalid index error

Hi,

some time ago, ChatGPT generated for me a valid SciLab code for numerical calculation in structural dynamics of a single DOF system. Now I want to go further and solve a steady-state (harmonic vibration) problem involving a cantilever beam (discretized with a single Euler-Bernoulli beam finite element). I gave ChatGPT some reference (Matlab code for free vibration analysis of a beam) and described what I want to change and that I need a Scilab code. In general, the code provided by the AI seems to make sense but, even after many revisions, it keeps failing at the last line. The error message is simply “invalid index”. Here’s the code:

// Clear memory
clear

// Material properties
E = 165.8e9; // Young's modulus (Pa)
I = 1.377e-5; // Second moment of area (m^4)
L = 10; // Length of bar (m)
rho = 13404.106; // Density (kg/m^3)
A = 2.3; // Cross-sectional area (m^2)
rhoA = rho * A; // Mass density times cross-sectional area

// Number of elements
numberElements = 1;
numberNodes = numberElements + 1;

// Generate coordinates
nodeCoordinates = linspace(0, L, numberNodes)';

// Element connectivity
elementNodes = [1:numberElements; 2:numberNodes]';

// Global degrees of freedom
GDof = 2 * numberNodes;

// Stiffness and mass matrices
stiffness = zeros(GDof, GDof);
mass = zeros(GDof, GDof);

for e = 1:numberElements
    indice = elementNodes(e, :);
    elementDof = [2 * (indice(1) - 1) + 1, 2 * indice(1), 2 * (indice(2) - 1) + 1, 2 * indice(2)];
    LElem = nodeCoordinates(indice(2)) - nodeCoordinates(indice(1));
    k1 = E * I / LElem^3 * [12, 6 * LElem, -12, 6 * LElem; 6 * LElem, 4 * LElem^2, -6 * LElem, 2 * LElem^2; -12, -6 * LElem, 12, -6 * LElem; 6 * LElem, 2 * LElem^2, -6 * LElem, 4 * LElem^2];
    stiffness(elementDof, elementDof) = stiffness(elementDof, elementDof) + k1;
    
    k2 = rhoA * LElem / 420 * [156, 22 * LElem, 54, -13 * LElem; 22 * LElem, 4 * LElem^2, 13 * LElem, -3 * LElem^2; 54, 13 * LElem, 156, -22 * LElem; -13 * LElem, -3 * LElem^2, -22 * LElem, 4 * LElem^2];
    mass(elementDof, elementDof) = mass(elementDof, elementDof) + k2;
end

// Boundary conditions
// Clamped-free
fixedNodeU = [1]';
fixedNodeV = [];

prescribedDof = [2 * fixedNodeU - 1; 2 * fixedNodeV];

// Frequency response problem parameters
frequency = 10; // Frequency of harmonic load (Hz)
omega = 2 * %pi * frequency; // Angular frequency
P = 3000; // Magnitude of harmonic load (N)
dampingCoefficient = 0.001; // Rayleigh damping coefficient

// Harmonic load vector
force = zeros(GDof, 1);
force(GDof - 1) = P; // Apply load at the free end

// Solve for steady-state dynamics
K_prescribed = stiffness(prescribedDof, prescribedDof);
M_prescribed = mass(prescribedDof, prescribedDof);

// Calculate eigenvalues and eigenvectors using spec function
[eigenvecs, eigenvals] = spec(K_prescribed, M_prescribed);

// Find modal frequencies (sqrt of eigenvalues)
modalFrequencies = sqrt(eigenvals);

// Calculate frequency response using modal analysis
u_modal = zeros(size(eigenvecs, 1), 1);
for i = 1:length(modalFrequencies)
    u_modal = u_modal + (eigenvecs(:, i)' * force(prescribedDof)) / (eigenvals(i, i) - omega^2 - 2 * %i * omega * dampingCoefficient) * eigenvecs(:, i);
end

// Print displacement (deflection) of the free end
disp("Displacement of the free end:")
disp(abs(u_modal(2 * numberNodes - 1)))

I can’t force ChatGPT to fix this, it just keeps switching between incorrect versions of that last line. Do you know what can be wrong with it (or maybe previous parts of the code should be changed as well)? I’m still a beginner in terms of Scilab syntax.

it seems that chatGPT has problems with ’ Transpose.

I guess that’s because the code I gave him for reference was from Matlab. I asked him to fix this, providing the information about this operator from thr Scilab documentation and he only changed this line:

u_modal = u_modal + (eigenvecs(:, i)' * force(prescribedDof)) / (eigenvals(i, i) - omega^2 - 2 * %i * omega * dampingCoefficient) * eigenvecs(:, i);

to this:

u_modal = u_modal + (eigenvecs(:, i).' * force(prescribedDof)) / (eigenvals(i, i) - omega^2 - 2 * %i * omega * dampingCoefficient) * eigenvecs(:, i);

So apparently he switched from conjugate to non-conjugate transpose. But the error still persists. Further attempts to fix it this way (also with mtlb_t) failed.

This code is important for me so that I can learn how to do such analyses in Scilab. Can you tell me which part of the code should be fixed here?

Hello,

Your program yields

--> u_modal
 u_modal  = 

   0. + 0.i

it explains the error on the last line, since

--> 2 * numberNodes - 1
 ans  =

   3.

You cannot seriously ask chatGPT doing such stuff…

S.

1 Like