Array indices must be positive integers or logical values.

1 visualización (últimos 30 días)
John
John el 5 de Sept. de 2023
Respondida: Davide Masiello el 5 de Sept. de 2023
nMax = 100; % Maximum value of n
tol = 1e-5; % Tolerance value
% Initialize arrays to store the values of eta
eta1 = zeros(nMax, 1);
eta2 = zeros(nMax, 1);
% Compute the values of eta for different values of n
for n = 1:nMax
% Compute eta for the first sequence
if n == 1
eta1(n) = 0; % Initial condition for eta1
else
eta1(n) = (1/(n+1))*(eta1(n-1)/2 + (n-1)/(n+1)*eta1(n-1) + 1/(n+1)*(1/(n*(n+1)))*1*(eta1(n-1)/4));
end
% Compute eta for the second sequence
if n == 1
eta2(n) = 0; % Initial condition for eta2
else
eta2(n) = (1/(n+1))*(eta2(n-1)/2 + (n-1)/(n+1)*((eta2(n-1)/2)/2) + 1/(n+1)*(1/(n*(n+1)))*1*(eta2(n-1)/4));
end
% Check convergence condition
if norm(eta1(n) - eta1(n-1)) < tol
break;
if norm(eta2(n) - eta2(n-1)) < tol
break; % Convergence reached, stop the loop
end
end
end
% Plot the convergence behavior
plot(1:n, eta1(1:n), '-o', 'LineWidth', 2, 'DisplayName', 'Sequence 1');
hold on;
plot(1:n, eta2(1:n), '-o', 'LineWidth', 2, 'DisplayName', 'Sequence 2');
hold off;
% Add labels and legend
xlabel('n');
ylabel('\eta');
title('Convergence Behavior of Sequences');
legend('Location', 'best');

Respuestas (2)

Dyuman Joshi
Dyuman Joshi el 5 de Sept. de 2023
if norm(eta1(n) - eta1(n-1)) < tol
break;
if norm(eta2(n) - eta2(n-1)) < tol
break; % Convergence reached, stop the loop
end
end
When n==1, n-1==0, which can not be used as an index in MATLAB.
Modified code -
nMax = 100; % Maximum value of n
tol = 1e-5; % Tolerance value
% Initialize arrays to store the values of eta
eta1 = zeros(nMax, 1);
eta2 = zeros(nMax, 1);
%%eta1 and eta2 are preallocated as zeros array, thus assigning 0 for n==1 is redundant
%%Start the loop from n==2, it also takes care of the error
for n = 2:nMax
%%Combine the conditions
% Compute eta for the first sequence
eta1(n) = (1/(n+1))*(eta1(n-1)/2 + (n-1)/(n+1)*eta1(n-1) + 1/(n+1)*(1/(n*(n+1)))*1*(eta1(n-1)/4));
eta2(n) = (1/(n+1))*(eta2(n-1)/2 + (n-1)/(n+1)*((eta2(n-1)/2)/2) + 1/(n+1)*(1/(n*(n+1)))*1*(eta2(n-1)/4));
% Check convergence condition
%%Combine the check for convergence
if norm(eta1(n) - eta1(n-1)) < tol || norm(eta2(n) - eta2(n-1)) < tol
break;
end
end
n
% Plot the convergence behavior
plot(1:n, eta1(1:n), '-o', 'LineWidth', 2, 'DisplayName', 'Sequence 1');
hold on;
plot(1:n, eta2(1:n), '-o', 'LineWidth', 2, 'DisplayName', 'Sequence 2');
hold off;
% Add labels and legend
xlabel('n');
ylabel('\eta');
title('Convergence Behavior of Sequences');
legend('Location', 'best');
However, as the 1st values of eta1 and eta2 are zero, the rest of the values will also be zero, as the value of term n is directly proportional to the value of term (n-1) (observed from the formula/expression above).
Are you sure the inital values of eta1 and eta2 are zero?

Davide Masiello
Davide Masiello el 5 de Sept. de 2023
The problem is in the convergence check step, where you try to evaluate eta at n-1 even when n = 1.
Adding n > 1 as additional statement solves the problem. See below.
nMax = 100; % Maximum value of n
tol = 1e-5; % Tolerance value
% Initialize arrays to store the values of eta
eta1 = zeros(nMax, 1);
eta2 = zeros(nMax, 1);
% Compute the values of eta for different values of n
for n = 1:nMax
% Compute eta for the first sequence
if n == 1
eta1(n) = 0; % Initial condition for eta1
else
eta1(n) = (1/(n+1))*(eta1(n-1)/2 + (n-1)/(n+1)*eta1(n-1) + 1/(n+1)*(1/(n*(n+1)))*1*(eta1(n-1)/4));
end
% Compute eta for the second sequence
if n == 1
eta2(n) = 0; % Initial condition for eta2
else
eta2(n) = (1/(n+1))*(eta2(n-1)/2 + (n-1)/(n+1)*((eta2(n-1)/2)/2) + 1/(n+1)*(1/(n*(n+1)))*1*(eta2(n-1)/4));
end
% Check convergence condition
if n > 1 && norm(eta1(n) - eta1(n-1)) < tol
break;
if n > 1 && norm(eta2(n) - eta2(n-1)) < tol
break; % Convergence reached, stop the loop
end
end
end
% Plot the convergence behavior
plot(1:n, eta1(1:n), '-o', 'LineWidth', 2, 'DisplayName', 'Sequence 1');
hold on;
plot(1:n, eta2(1:n), '-o', 'LineWidth', 2, 'DisplayName', 'Sequence 2');
hold off;
% Add labels and legend
xlabel('n');
ylabel('\eta');
title('Convergence Behavior of Sequences');
legend('Location', 'best');

Categorías

Más información sobre Financial Toolbox en Help Center y File Exchange.

Etiquetas

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by