Gå til innhold
Trenger du skole- eller leksehjelp? Still spørsmål her ×

MATLAB: Trenger hjelp til implemtering av Eulers metode


Gjest Bruker-239845

Anbefalte innlegg

Gjest Bruker-239845

Heisann,

 

Jeg har en oppgave hvor jeg skal plotte en eksakt løsning av en differensiallikning og deretter plotte den numeriske løsningen av samme likning. Ideen er at den numeriske løsningen nærmer seg den eksakte løsningen når steglengden blir mindre og man skal da illustrere dette.

 

Likningen er y' = x + y, y(0).

 

Altså et initialverdiproblem. Eksakt løsning er y =e^x - x - 1.

 

Jeg har ikke tenkt å gjøre så mye ut av det, men problemet er selve plottingen. 

 

Skal jeg bruke samme verdier langs x for begge grafene?

 

Jeg har forsøkt begge deler:

 

1) Bruker egne x og y verdier for den numeriske løsningen. Grafen blir da bare en mengde punkt og ikke en massiv graf. Definerer en egen vektor Z som jeg bruker for x-aksen til den eksakte løsningen. Får da en massiv sort graf.

 

2) Bruker felles x-verdier for den numeriske og eksakte løsningen. Da blir begge grafene "hullete".

 

Noen tips? Det jeg lurer på er altså om jeg har gjort dette rett og om det er noen måte å få den hullete grafen til å bli massiv.

 

Her er koden min:

 

x=0; %Starterdi x = 0
y=0; %...og y(0) = 0 
dx=0.02; % Steglengde
N=100; % Antall steg


format short


for n=1:N
    hold on
    y=(x+y)*dx+y; %Neste y-verdi
    x=x+dx; %Neste x-verdi
    plot(x,y,'r-','linewidth',2) % Plotter den numeriske løsningen
    z=0:0.01:2; % Definerer en vektor z x-aksen til den eksakte løsningen
    g=exp(z)-z-1; % Den eksakte løsningen av oppgave 3c
    plot (z,g,'k-','linewidth',2)
    hold off
end

På forhånd takk! :)

Endret av Bruker-239845
Lenke til kommentar
Videoannonse
Annonse

Lag en vektor, la oss kalle den z, med veldig små steg mellom verdiene. Så regner du ut den sanne funksjonen, la oss kalle den f(z), plott denne og tegn en linje i mellom punktene. Så lager du en x med relativt stor steglengde, bruker Eulers metode og plotter den i samme diagram. Så reduserer du steglengden og plotter på nytt, bruk nye symboler og gjerne nye farger. Gjenta et par ganger. Da viser du at jo kortere steglengde, desto bedre passer Eulers metode.

Lenke til kommentar
Gjest Bruker-239845

Jeg har vel egentlig alt gjort som du sier. :)

 

Men problemet er at jeg ikke får til en 'hel' graf for den numeriske tilnærmingen.

 

I forhold til de ulike steglengdene tenker jeg ikke gjøre mer ut av det enn å ta et par screenshots med ulike steglengder. Oppgavene skal innleveres skriftlig, så det er tiltstrekkelig.

Lenke til kommentar
Gjest Bruker-239845

Se vedlegg av resultatet når jeg kjører skriptet over med steglengde 0.04 og 50 steg (x E 0,2).

 

Grafen til den eksakte løsningen er i sort og fremstår som en hel linje. 

 

Den numeriske løsningen blir bare noen røde punkt som man knapt ser. Altså punkt med 0.04 avstand langs x-aksen. 

 

Hvordan får jeg tegnet dette som en komplett og hellinjet graf og ikke bare punkter?

 

Tar jeg N 1000 for eksempel vil det jo bli en mer heltrukket graf fordi punktene ligger så tett, men da ligger den jo over grafen til den eksakte, så da får jeg ikke vist det jeg skal.

 

Det jeg ikke skjønner er at om jeg for eksempel definerer vektoren z til den eksakte løsningen med steglengde 0.2, så blir det fortsatt en heltrukket graf, selv om den er kantete og "stygg". Hvorfor skjer ikke det samme med den numeriske?

 

Har prøvd tusen ting og googlet meg halvt ihjel, men skjønner ikke hva jeg gjør galt. :(

untitled.bmp

Endret av Bruker-239845
Lenke til kommentar

Grunnen til at den eksakte løsningen blir heltrukket er at her plotter du hele løsningen (for alle x-verdier) for hver hver iterasjon av for-løkken. Du gjør altså samme jobben N ganger.

 

Dette er også grunnen til at den numeriske løsningen består av enkeltpunkter, du plotter ett og ett punkt for hver iterasjon. 

 

Det du bør gjøre er å regne ut alle y-verdiene ved å bruke Eulers metode, og legge disse verdiene inn i en vektor. Utenfor for-løkken kan du da plotte x-vektoren og y-vektoren for å få den sammenhengende numeriske løsningen. Den eksakte løsningen kan du regne ut som du gjør nå, men dette skal du gjøre utenfor for-løkken

Lenke til kommentar
Gjest Bruker-239845

Grunnen til at den eksakte løsningen blir heltrukket er at her plotter du hele løsningen (for alle x-verdier) for hver hver iterasjon av for-løkken. Du gjør altså samme jobben N ganger.

 

Sikker? Jeg har nemlig definert en egen vektor Z = 0:0.01:2 for den eksakte løsningen. Denne har jeg nå utenfor løkken alt i siste utkast. Men tar jeg steglengde 0.2 for eksempel får jeg fortsatt en heltrukket graf. Den er bare "grovere".

 

 

 

Dette er også grunnen til at den numeriske løsningen består av enkeltpunkter, du plotter ett og ett punkt for hver iterasjon. 

 

Skjønner ikke forskjellen på dette og det jeg gjør for den eksakte løsningen.

 

Det du bør gjøre er å regne ut alle y-verdiene ved å bruke Eulers metode, og legge disse verdiene inn i en vektor. Utenfor for-løkken kan du da plotte x-vektoren og y-vektoren for å få den sammenhengende numeriske løsningen. Den eksakte løsningen kan du regne ut som du gjør nå, men dette skal du gjøre utenfor for-løkken

 

 

Er ikke det det jeg alt gjør i for-løkken? Tilordner x og y verdiene i en vektor? Om ikke, hvordan gjør jeg det? Prøvde å ta plottingen utenfor for-løkken nå, men får samme resultat.

 

Her er siste koden:

 

x=0; %Startverdi x = 0
y=0; %...og y(0) = 0 
dx=0.04; % Steglengde
N=50; % Antall steg


format short


for n=1:N
    hold on
    y=(x+y)*dx+y %Neste y-verdi
    x=x+dx %Neste x-verdi
    plot(x,y,'r-','linewidth',2) % Plotter den numeriske løsningen
end


z=0:0.01:2; % Definerer en vektor z for x-aksen til den eksakte løsningen
g=exp(z)-z-1; % Den eksakte løsningen av oppgave 3c
plot (z,g,'k-','linewidth',2)


hold off
Lenke til kommentar

 

Grunnen til at den eksakte løsningen blir heltrukket er at her plotter du hele løsningen (for alle x-verdier) for hver hver iterasjon av for-løkken. Du gjør altså samme jobben N ganger.

 

Sikker? Jeg har nemlig definert en egen vektor Z = 0:0.01:2 for den eksakte løsningen. Denne har jeg nå utenfor løkken alt i siste utkast. Men tar jeg steglengde 0.2 for eksempel får jeg fortsatt en heltrukket graf. Den er bare "grovere".

 

Det var ikke feil sånn du hadde gjort det, du bare gjorde det mange ganger. Slik du gjør det nå blir helt riktig. Og grunnen til at den blir kontinuerlig er fordi både z og g er vektorer.

 

 

 

Det du bør gjøre er å regne ut alle y-verdiene ved å bruke Eulers metode, og legge disse verdiene inn i en vektor. Utenfor for-løkken kan du da plotte x-vektoren og y-vektoren for å få den sammenhengende numeriske løsningen. Den eksakte løsningen kan du regne ut som du gjør nå, men dette skal du gjøre utenfor for-løkken

 

Er ikke det det jeg alt gjør i for-løkken? Tilordner x og y verdiene i en vektor? Om ikke, hvordan gjør jeg det? Prøvde å ta plottingen utenfor for-løkken nå, men får samme resultat.

 

Nei, x og y er skalarer, kun enkle tall. Derfor blir det enkeltpunkter når du plotter. For hver iterasjon mister du all informasjonen fra tidligere, siden du overskriver variablene.

 

x=0;
y=0;

for n=1:N
    y(n+1)=(x(n)+y(n))*dx+y(n) %Neste y-verdi
    x(n+1)=x+dx %Neste x-verdi
end
Nå vil x og y være vektorer. x(1) og y(1) er første verdi, y(2) er neste osv opp til N+1.
Lenke til kommentar
Gjest Bruker-239845

Takker og bukker, men er fortsatt noe som blir feil her. :)

 

Ser ut som om y-verdiene blir helt hinsides. Får dog nå heltrukket graf. :)

 

Siste kode:

 

x=0; %Startverdi x = 0
y=0; %...og y(0) = 0 
dx=0.004; % Steglengde
N=500; % Antall steg


format short


for n=1:N
    hold on
    y(n+1)=x(n)+y(n)*dx+y(n); %Neste y-verdi
    x(n+1)=x(n)+dx; %Neste x-verdi
end




plot(x,y,'r-','linewidth',2) % Plotter den numeriske løsningen


z=0:0.01:2; % Definerer en vektor z for x-aksen til den eksakte løsningen
g=exp(z)-z-1; % Den eksakte løsningen av oppgave 3c
plot (z,g,'k-','linewidth',2)


hold off
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...