Every time I run this code, I get "Error using plot Vectors must be the same length.
Mostra commenti meno recenti
% 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 Commento
Maximiliano
il 10 Giu 2023
Risposte (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 Commento
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
Categorie
Scopri di più su Calculus in Centro assistenza e File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!
