Every time I run this code, I get "Error using plot Vectors must be the same length.
Afficher commentaires plus anciens
% 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 commentaire
Maximiliano
le 10 Juin 2023
Réponses (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 commentaire
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
Catégories
En savoir plus sur Calculus dans Centre d'aide et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!
