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)');

답변 (1개)

VBBV
VBBV 2023년 6월 10일
편집: VBBV 2023년 6월 10일
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

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

댓글을 달려면 로그인하십시오.

카테고리

태그

질문:

2023년 6월 10일

댓글:

2024년 2월 13일

Community Treasure Hunt

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

Start Hunting!

Translated by