Every time I run this code, I get "Error using plot Vectors must be the same length.

% a) Solución analítica
syms y(x)
ode = diff(y,x) == y * x^2 - 1.1 * y;
cond = y(0) == 1;
ySol(x) = dsolve(ode, cond);
% b) Método de Euler
h1 = 0.5;
h2 = 0.25;
xRange = 0:h1:2;
yEuler1 = zeros(size(xRange));
yEuler1(1) = 1;
for i = 1:length(xRange)-1
yEuler1(i+1) = yEuler1(i) + h1 * (yEuler1(i) * xRange(i)^2 - 1.1 * yEuler1(i));
end
xRange = 0:h2:2;
yEuler2 = zeros(size(xRange));
yEuler2(1) = 1;
for i = 1:length(xRange)-1
yEuler2(i+1) = yEuler2(i) + h2 * (yEuler2(i) * xRange(i)^2 - 1.1 * yEuler2(i));
end
% c) Método de Heun
h = 0.5;
xRange = 0:h:2;
yHeun = zeros(size(xRange));
yHeun(1) = 1;
for i = 1:length(xRange)-1
k1 = yHeun(i) * xRange(i)^2 - 1.1 * yHeun(i);
k2 = (yHeun(i) + h * k1) * (xRange(i) + h)^2 - 1.1 * (yHeun(i) + h * k1);
yHeun(i+1) = yHeun(i) + h/2 * (k1 + k2);
end
% d) Método del punto medio
h1 = 0.5;
h2 = 0.25;
xRange = 0:h1:2;
yMidpoint1 = zeros(size(xRange));
yMidpoint1(1) = 1;
for i = 1:length(xRange)-1
k1 = yMidpoint1(i) * xRange(i)^2 - 1.1 * yMidpoint1(i);
k2 = (yMidpoint1(i) + h1/2 * k1) * (xRange(i) + h1/2)^2 - 1.1 * (yMidpoint1(i) + h1/2 * k1);
yMidpoint1(i+1) = yMidpoint1(i) + h1 * k2;
end
xRange = 0:h2:2;
yMidpoint2 = zeros(size(xRange));
yMidpoint2(1) = 1;
for i = 1:length(xRange)-1
k1 = yMidpoint2(i) * xRange(i)^2 - 1.1 * yMidpoint2(i);
k2 = (yMidpoint2(i) + h2/2 * k1) * (xRange(i) + h2/2)^2 - 1.1 * (yMidpoint2(i) + h2/2 * k1);
yMidpoint2(i+1) = yMidpoint2(i) + h2 * k2;
end
% e) Gráfica de las soluciones
figure;
plot(xRange, ySol(xRange), 'k', 'LineWidth', 2);
hold on;
plot(xRange, yEuler1, 'r', 'LineWidth', 1.5);
Error using plot
Vectors must be the same length.
plot(xRange, yEuler2, 'g', 'LineWidth', 1.5);
plot(xRange, yHeun, 'b', 'LineWidth', 1.5);
plot(xRange, yMidpoint1, 'm', 'LineWidth', 1.5);
plot(xRange, yMidpoint2, 'c', 'LineWidth', 1.5);
xlabel('x');
ylabel('y');
title('Comparación de métodos numéricos para la EDO');
legend('Solución analítica', 'Euler (h = 0.5)', 'Euler (h = 0.25)', 'Heun (h = 0.5)', 'Punto medio (h = 0.5)', 'Punto medio (h = 0.25)');

Antworten (1)

VBBV
VBBV am 10 Jun. 2023
Bearbeitet: VBBV am 10 Jun. 2023
x1Range = 0:h1:2; % yEuler1 & yMidpoint1 vectors 
x2Range = 0:h2:2; % yEuler2 & yMidpoint2 vectors 
x3Range = 0:h:2;% yHuen 

Change the variable name with xRange to the above since it has been used several times with different step lengths. And you try to plot all of them with xRange corresponding to last step size.

1 Kommentar

h1 = 0.5;
h2 = 0.25;
xRange = 0:h1:2
xRange = 1×5
0 0.5000 1.0000 1.5000 2.0000
yEuler1 was evaluated with length of above xRange,
h1 = 0.5;
h2 = 0.25;
%xRange = 0:h1:2;
% yMidpoint1 = zeros(size(xRange));
% yMidpoint1(1) = 1;
% for i = 1:length(xRange)-1
% k1 = yMidpoint1(i) * xRange(i)^2 - 1.1 * yMidpoint1(i);
% k2 = (yMidpoint1(i) + h1/2 * k1) * (xRange(i) + h1/2)^2 - 1.1 * (yMidpoint1(i) + h1/2 * k1);
% yMidpoint1(i+1) = yMidpoint1(i) + h1 * k2;
% end
xRange = 0:h2:2
xRange = 1×9
0 0.2500 0.5000 0.7500 1.0000 1.2500 1.5000 1.7500 2.0000
however when you try to plot yEuler1 using the following they it will throw such error
plot(xRange, yEuler1, 'r', 'LineWidth', 1.5);
The solution would be to plot the vectors using uniform step sizes

Melden Sie sich an, um zu kommentieren.

Gefragt:

am 10 Jun. 2023

Kommentiert:

am 13 Feb. 2024

Community Treasure Hunt

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

Start Hunting!

Translated by