Gewone differentiaalvergelijkingen: Lijnelementveld en oplossingskrommen met MATLAB
Tekenen van een lijnelementenveld<br> [MATLAB uitwerking]
We bekijken de differentiaalvergelijking \[\frac{\dd y}{\dd t}=1-2t y\]
Deel 1
In het eerste deel van de opdracht moeten we het lijnelementenveld van de bovenstaande differentiaalvergelijking plotten door gebruik te maken van grafische elementen zoals lijnen. We hebben hiervoor een functie geschreven die LijnelementVeld_GDV_Orde1
heet. De code staat hieronder. In onderstaande code is ervoor gekozen om een meshgrid te maken met de coördinaten, maar er zijn natuurlijk meerdere manieren om dit probleem op te lossen.
function [ output_args ] = Lijnelementenveld_GDV_Orde1(range_t , range_y , lengte_lijnen)
% Lijnelementenveld_GDV_Orde1 geeft het lijnelementenveld van de
% differentiaalvergelijking y'= 1-2ty voor t waarden in range_t en y waarden
% in range_y.
% De ranges moeten van de vorm startpunt : stapgrootte : eindpunt zijn.
% Bijvoorbeeld Lijnelementenveld_GDV_Orde1(0:0.1:2 , 0:0.1:2 , 0.1)
% resulteert in het lijnelementenveld in het gebied tussen t = 0 t/m 2 en
% y = 0 t/m 2 waarbij er stapjes van 0.1 worden genomen in beide richtingen.
% De lengte van de lijnen die getekend moeten worden is in dit geval 0.1.
% Een meshgrid maken met alle t en y waarden en de bijbehorende helling
% bepalen:
[t,y] = meshgrid(range_t,range_y);
helling = 1 - 2*t.*y;
% De bijbehorende hoek en start/eindpunten berekenen met de gewenste lengte
% van de lijnen:
hoek = atan(helling);
dt = lengte_lijnen * cos(hoek);
dy = lengte_lijnen * sin(hoek);
start_t = t + dt;
eind_t = t - dt;
start_y = y + dy;
eind_y = y - dy;
% De lijnen tekenen door te loopen over de coördinaten in alle roosters waar
% de verschillende eigenschappen in opgeslagen zijn:
figure('Color','White')
title(strcat('Lijnelementenveld bij y',char(39),' = 1 - 2ty'),'Color','Blue')
box on
for rij = 1:length(range_y)
for kolom = 1:length(range_t)
curr_start_t = start_t(kolom,rij);
curr_eind_t = eind_t(kolom,rij);
curr_start_y = start_y(kolom,rij);
curr_eind_y = eind_y(kolom,rij);
line([curr_start_t,curr_eind_t],[curr_start_y,curr_eind_y],'Color','Blue','LineWidth',1)
hold on
end
end
% Een horizontale en verticale lijn toevoegen door de oorsprong
% (ter verduidelijking):
line([xlim],[0,0],'Color','Black','LineWidth',1)
line([0,0],[ylim],'Color','Black','LineWidth',1)
xlabel('t');
ylabel('y');
end
Na het uitvoeren van het commando:
>> Lijnelementenveld_GDV_Orde1(0:0.2:2 , 0:0.2:2 , 0.1)
is het resultaat:
Deel 2
In het tweede deel van de opdracht passen we het programma zo aan dat er \(2000\) willekeurige coördinaten worden gerandomiseerd op het gebied \(0\le t\le 2, 0\le y\le 2, \). Daarna tekenen we op dezelfde manier als hiervoor de lijnen op deze coördinaten. Hieronder staat een voorbeeld van de code:
function [ output_args ] = Lijnelementenveld_GDV_Orde1_rand(range_t , range_y , lengte_lijnen)
% Lijnelementenveld_GDV_Orde1_rand geeft het lijnelementenveld van de
% differentiaalvergelijking y'= 1-2ty voor 2000 coördinaten in het gebied
% opgespannen door range_t en range_y in respectievelijk de t en de y
% richting.
% De ranges moeten van de vorm startpunt : eindpunt zijn.
% Bijvoorbeeld Lijnelementenveld_GDV_Orde1_rand(0:2 , 0:2 , 0.1)
% resulteert in het lijnelementenveld in het gebied tussen t = 0 t/m 2 en y
% = 0 t/m 2 waarbij er 2000 willekeurige coördinaten worden bepaald. De
% lengte van de lijnelementen is in dit geval 0.1.
% 2000 random coördinaten bepalen in het gebied opgespannen door range_t en
% range_y:
t = range_t(1) + (-range_t(1) + range_t(end))*rand(1,2000);
y = range_y(1) + (-range_y(1) + range_y(end))*rand(1,2000);
helling = 1 - 2*t.*y;
% De bijbehorende hoek en start/eindpunten berekenen met de gewenste lengte
% van de lijnen:
hoek = atan(helling);
dt = lengte_lijnen * cos(hoek);
dy = lengte_lijnen * sin(hoek);
start_t = t + dt;
eind_t = t - dt;
start_y = y + dy;
eind_y = y - dy;
% Alle lijnen tekenen door te lopen over de coördinaten in alle roosters met
% informatie:
figure('Color','White')
title("Lijnelementenveld bij y' = 1 - 2ty",'Color','Blue')
box on
for coord_nr = 1:length(t)
curr_start_t = start_t(1,coord_nr);
curr_eind_t = eind_t(1,coord_nr);
curr_start_y = start_y(1,coord_nr);
curr_eind_y = eind_y(1,coord_nr);
line([curr_start_t,curr_eind_t],[curr_start_y,curr_eind_y],'Color','Blue','LineWidth',1)
hold on
end
% Een horizontale en verticale lijn toevoegen door de oorsprong
% (ter verduidelijking):
line([xlim],[0,0],'Color','Black','LineWidth',1)
line([0,0],[ylim],'Color','Black','LineWidth',1)
end
Na het uitvoeren van het commando:
>> Lijnelementenveld_GDV_Orde1_rand(0:2, 0:2, 0.1)
is het resultaat: