Problema (de programación) con Función [en Matlab]

Buenas, como trabajo para clase de programación tengo que llevar una función hecha en Matlab, el caso es que todo va bien, pero por alguna razón tiende a infinito y por supuesto se queda eternamente pensando, a ver si alguien me encuentra el bug de la función. Gracias.

Enunciado:
Construye una función que reciba 4 valores c,g,d,v, tal que c es la carga de combustible total del barco (suponemos el depósito lleno), g el gasto de combustible que tiene, expresado en metros recorridos por cada litro avanzado, d la distancia a la meta y v la velocidad máxima a la que podrá ir el barco y supondremos que irá (constante).
Esta función ha de devolver el tiempo que tarda en llegar a la meta en caso de que llegue, si el combustible se agota antes, debe devolver también la distancia restante hasta la meta, (aparte del tiempo que ha tardado en llegar hasta ahí).
En caso de que si que llegue a la meta debe devolver además del tiempo, el combustible restante.
Sabemos que en un barco cuando queda un cuarto del combustible inicial la velocidad máxima se reduce a la mitad.

Función:

function t=barcos(c,g,d,v)
% C=Carga de combustible.
% g=Gasto de combustible en metros por cada litro.
% d=Distancia a la meta.
% v=Velocidad máxima (la que llevará).

x=c/4;
x=floor(x); % por si c no es múltiplo de 4.
% x=Momento en que la velocidad máxima v se reducirá a v=v/2.

i=0;
% i=Distancia recorrida desde el inicio.
j=c;
% j=carga de combustible que irá gastando.
t=0;
% t=Tiempo que tarda.
while d>i
while j>x
if mod(i,g)==0 %Porque avanza g(metros) en 1(litro) g(metros/litro)
j=j-1; %cuando el resto sea 0 es que la distancia r ha
%ha alcanzado la distancia g en la que gasta 1 litro.

end
i=i+v; %Ha recorrido lo que lleva + lo que se mueve en un segundo.
t=t+1; %Como se mueve v en un segundo, el tiempo suma 1 segundo.
end
V=v/2;%Ahora le sumo la mitad de la velocidad, la llamo V.
while j<=x && j>0
if mod(i,g)==0
j=j-1;
end
i=i+V;
t=t+1;
end
if j==0
Distancia_restante=d-i %Distancia que faltaba hasta la meta.
end
end

if d==i
Combustible_restante=c-j
end
function t=barcos(c,g,d,v)
% C=Carga de combustible.
% g=Gasto de combustible en metros por cada litro.
% d=Distancia a la meta.
% v=Velocidad máxima (la que llevará).
x=c/4;
x=floor(x); % por si c no es múltiplo de 4.
% x=Momento en que la velocidad máxima v se reducirá a v=v/2.
i=0;
% i=Distancia recorrida desde el inicio.
j=c;
% j=carga de combustible que irá gastando.
t=0;
% t=Tiempo que tarda.
while d>i
    while j>x
        if mod(i,g)==0 %Porque avanza g(metros) en 1(litro) g(metros/litro)
            j=j-1; %cuando el resto sea 0 es que la distancia r ha
                   %ha alcanzado la distancia g en la que gasta 1 litro.
        end
        i=i+v; %Ha recorrido lo que lleva + lo que se mueve en un segundo.
        t=t+1; %Como se mueve v en un segundo, el tiempo suma 1 segundo.
    end
    V=v/2;%Ahora le sumo la mitad de la velocidad, la llamo V.
    while j<=x && j>0
        if mod(i,g)==0
            j=j-1;
        end
        i=i+V;
        t=t+1;
    end
   if j==0
       display Sin_combustible.
       Distancia_restante=d-i %Distancia que faltaba hasta la meta.
   end
end
if d==i
    Display objetivo_logrado.
    Combustible_restante=c-j
end
uf :S la verdad es que no acabo de entender bien tu método...
yo lo haría de otra forma:
-primero calculo la distancia total que puede recorrer con ese combustible:
dist = c*g;

-luego calculo la distancia que recorre con deposito > 1/4 (velocidad v)
dist_rapida = (3/4)*c*g;

y la que recorre con deposito <1/4 (velocidad v/2)
dist_lenta = (1/4)*c*g;

- ahora, si dist_rapida+dist_lenta > d, (quiere decir, si no se agota combustible)
pueden pasar dos cosas.
· que dist_rapida >= d, entonces tiempo = d/v , porque todo el rato va a tope de velocidad
· que dist_rapida+dist_lenta >= d, entonces tiempo = dist_rapida/v + (d-dist_rapida)/(v/2) , esto es, el tiempo que va a velocidad maxima mas el trozo de tiempo que va a velocidad lenta.
en ambos casos, el combustible sobrante sería combustible_restante = (d-(dist_rapida-dist_lenta))/g

- por último, si dist_rapida+dist_lenta < d (se queda sin gasofa) entonces tiempo = dist_rapida/v + dist_lenta/(v/2)
la distancia restante aquí sería dist_restante = d-(dist_rapida+dist_lenta)

creo que en este caso es mejor hacerlo así, repasa si hay alguna cosa chunga y me comentas. de la forma que tu la haces me da la impresion que pretendes ir gastando litros, comprobando como va el nivel y viendo si aún queda combustible, pero no me parece lo más lógico, ya que en caso de que haya decimales se puede quedar colgado (a lo mejor ese es el problema) y ya redondeas a la baja en la primera cuenta, que si el resultado es 1.9 por ejemplo ya tienes casi un 50% de error así de buenas a primeras.
tampoco veo muy coherente lo de que el barco recorra una distancia fija por combustible pero con velocidad variable y esas dos entradas no estén ligadas, pero bueno, supongo que será un ejercicio de programación.

por cierto, me encanta matlab :)

un saludo.
1 respuesta