4 svar
140 visningar
Svalan behöver inte mer hjälp
Svalan 25
Postad: 8 mar 2021 17:37

Eulers formel - Lösning och jämförelse med exakt svar

Jag försöker lösa diffekvationen y6y'=cos(x) y(0)=1/5

Först löser jag ekvationen förhand och får y=546875*sin(x)+17/5  som jag ska jämföra min Euler lösning med .

För att stoppa in diffekvationen i matlab skrev jag om den på formeln y'=cos(x)·y-6

Just nu har jag kommit så här långt i matlab:

a=0; b=2;		% Intervall jag är intreserad av
ya=0.2; 		% Startvärde
f=@(x,y) cos(x).*y^(-6) % Ekvationen jag vill använda eulermetoden på
M=100;			% Antal indelningar på x axeln
x=linspace(a,b,M);      
y=euler(x,ya,f); 	% Annropar lösaren
y_ex=@(x) nthroot(546875.*sin(x)+1,7)./5 % den exakta lösninen jag ska gämföra med
xe=linspace(a,b,1000); 	% antalet punkter för den exakta lösningen
plot(x,y,xe,y_ex(xe)) 	% Plottar eulerlösningen och den exackta lösningen i samma graf

lösaren:

function y=euler(x,y0,f)
y=zeros(size(x)); % y en vektor med nollor, lika lång som x vektorn.
                  % i denna vektor ska y-värdena läggas in, ett och ett
                  % det blir en loop
y(1)=y0;          % lägger in begynnelsevärdet på första position.

for i=1:length(x)-1
y(i+1)=y(i)+f(x(i),y(i));
end

Just nu ser graferna helt olika ut och ligger inte ens i närheten av varandra så något måste vara fel. Jag har suttit länge och försökt testa olika saker, men då jag är ny med matlab och inte ens fått en introduktion vet jag inte ens vart jag ska börja. Någon som kan se var det blir fel, eller om jag måste tänka om allt? 

Laguna Online 30497
Postad: 8 mar 2021 18:01

Borde du inte multiplicera med steglängden?

Svalan 25
Postad: 8 mar 2021 19:29
Laguna skrev:

Borde du inte multiplicera med steglängden?

Ja jag hade helt missat lägga dit steglängden. Så här gjorde jag:

function y=euler(x,y0,f)
y=zeros(size(x)); % y en vektor med nollor, lika lång som x vektorn.
                  % i denna vektor ska y-värdena läggas in, ett och ett
                  % det blir en loop
y(1)=y0;          % lägger in begynnelsevärdet på första position.

a=0;
b=1.5;
M=1000;

h = (b - a) / M;

for i=1:length(x)-1
y(i+1)=y(i)+h*f(x(i),y(i));
end

Enda jobbiga nu är att jag måste ändra a,b och M i lösningsdelen varje gång, men det fungerar i alla fall. Tack för hjälpen! 

Laguna Online 30497
Postad: 8 mar 2021 19:41

h borde kunna vara x(i+1)-x(i).

Svalan 25
Postad: 8 mar 2021 20:25

Det fungerade jättebra!

Svara
Close