Eulers formel - Lösning och jämförelse med exakt svar
Jag försöker lösa diffekvationen
Först löser jag ekvationen förhand och får 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
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?
Borde du inte multiplicera med steglängden?
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!
h borde kunna vara x(i+1)-x(i).
Det fungerade jättebra!