Every time I run this code, I get "Error using plot Vectors must be the same length.
Show older comments
% 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);
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 Comment
Maximiliano
on 10 Jun 2023
Answers (1)
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 Comment
h1 = 0.5;
h2 = 0.25;
xRange = 0:h1:2
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
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
Categories
Find more on Calculus in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!