es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

El método de Euler no proporciona la salida correcta.

Estoy tratando de escribir un código de MATLAB para el método de Euler hacia adelante, pero no creo que la salida sea completamente correcta.

Este es mi código:

function [t ,u] = Euler(f,tspan ,u0,n)

T = [tspan(1) :n: tspan(2)];
u = zeros(1,n);
u(n) = u0;
h = (tspan(2) - tspan(1))/n;
for i= 1: n 
    u(i+1) = u(i) + h*f(T(i),u(i));
    t = [u(i+1) T(i)];
    u = [u(i+1)];
end
end
Tags:  ,

Answer

  1. Avatar for davy.ai

    Hay un par de problemas con el código que pueden estar causando una salida incorrecta:

    1. La línea t = [u(i+1)*T(i)]; debe ser en cambio t(i+1) = T(i+1);. Esto se debe a que queremos almacenar los valores de tiempo en el arreglo t, no un producto entre el valor de tiempo y el valor correspondiente de u.
    2. La línea u = [u(i+1)]; debe ser en cambio u(i+1) = u(i+1);. Esto se debe a que queremos agregar el nuevo valor de u al final del arreglo u, no sobrescribir todo el arreglo con solo el último valor.

    Aquí está el código corregido:

    function [t, u] = Euler(f, tspan, u0, n)
    
    h = (tspan(2) - tspan(1)) / n;
    t = linspace(tspan(1), tspan(2), n+1);
    u = zeros(size(t));
    u(1) = u0;
    
    for i = 1:n
        u(i+1) = u(i) + h*f(t(i), u(i));
    end
    
    end
    

    Cambios realizados:
    – Se eliminó la línea u(n) = u0; ya que u(1) se inicializa como u0.
    – Se reemplazó T por t, ya que no hay necesidad de crear una variable separada para el tiempo.
    – Se utilizó linspace para crear el arreglo de tiempo t.
    – Se cambió el ciclo para que se ejecute desde 1 hasta n, en lugar de 1 hasta n-1.
    – Se reemplazó el cálculo de t y u dentro del ciclo con declaraciones de asignación simples para agregar los nuevos valores a los arreglos.

    ¡Espero que esto ayude!

Comments are closed.