% Skript som plottar retningsfelt for ei gitt 1. ordens diff.-likning
% Skiriptet tar også initialkravet som input og plottar den tilhøyrande 
% løysinga av differensiallikninga saman med retningsfeltet.
%
% Ein del "inputs" er hard-koda. Dette gjeld sjølve diff.-likninga, gitt
% ved funksjonen F(x,y)=y'. Det gjeld også minimal- og maksimal-verdiane 
% til x og y, og det gjeld inndelinga på griddet; kor mange punkt ein skal 
% ta med for x og y.
% Der er ingen garanti for at løysinga av initialverdiproblemet
% vil vere avgrensa av dei gitte grensene for x og y.

% Diff.-likning: y'=F(x,y)
F=@(x,y)  x+y;

%sin(x^2);

% Set opp grid
Xmin=-3; Xmax=3;
Ymin=-2; Ymax=2;
Xsteps=25; Ysteps=Xsteps;
x=linspace(Xmin,Xmax,Xsteps);
y=linspace(Ymin,Ymax,Ysteps);
[X, Y]=meshgrid(x,y);

% Gir initia,lkrav:
x0=input(['Gi x_0 (mellom ',num2str(Xmin),' og ',num2str(Xmax),'): ']);
y0=input(['Gi y_0 (mellom ',num2str(Ymin),' og ',num2str(Ymax),'): ']);
% Sjekkar at x_0 og y_0 ligg i rektangelet definert over
if x0<Xmin || x0>Xmax
    disp(['x_0 må ligge mellom ',num2str(Xmin),' og ',num2str(Xmax),'.'])
    return
elseif y0<Ymin || y0>Ymax
    disp(['y_0 må ligge mellom ',num2str(Ymin),' og ',num2str(Ymax),'.'])
    return
end

% Plottar retningsfeltet
figure(1)
U=F(X,Y);
[n, m]=size(U);
quiver(X,Y,ones(n,m),U)
V=axis;
pause

% Finn numerisk løysing av diff.-likninga og plottar denne
[tt yy]=ode45(F,[x0 Xmax],y0);
figure(1)
hold on
plot(x0,y0,'ro','linewidth',2)
pause
plot(tt,yy,'r')
hold off
axis(V)