Gjest Bruker-239845 Skrevet 18. april 2015 Del Skrevet 18. april 2015 (endret) 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 18. april 2015 av Bruker-239845 Lenke til kommentar
Gjest Bruker-239845 Skrevet 19. april 2015 Del Skrevet 19. april 2015 Takk for alle svar! Lenke til kommentar
the_last_nick_left Skrevet 19. april 2015 Del Skrevet 19. april 2015 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 Skrevet 19. april 2015 Del Skrevet 19. april 2015 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 Skrevet 20. april 2015 Del Skrevet 20. april 2015 (endret) 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 20. april 2015 av Bruker-239845 Lenke til kommentar
rankine Skrevet 20. april 2015 Del Skrevet 20. april 2015 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 Skrevet 20. april 2015 Del Skrevet 20. april 2015 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
rankine Skrevet 20. april 2015 Del Skrevet 20. april 2015 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 Skrevet 20. april 2015 Del Skrevet 20. april 2015 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
rankine Skrevet 20. april 2015 Del Skrevet 20. april 2015 Du mangler en parentes når du regner ut y(n+1) Lenke til kommentar
Gjest Bruker-239845 Skrevet 20. april 2015 Del Skrevet 20. april 2015 Tusen hjertelig takk for hjelpen! Nå gikk det i boks her. :) Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå