10 Temmuz 2017 Pazartesi

Düzeltilmiş Euler Metodu ile Diferansiyel Denklem Çözümü


n. mertebeye kadar türevlenebilir ve her türevi, tanım aralığında sürekli olan bir f fonksiyonu için, tanımlı olduğu bir x noktası civarında Taylor açılımı yazılacak olursa:
İfadesi elde edilir.
Birinci mertebeden bir diferansiyel denklem:
İle veriliyor olsun. Taylor açılımı ile birleştirilecek olursa:
Elde edilir.
Şayet,
Şeklinde başlangıç koşulu biliniyor ise,  ile çok küçük bir artış için
İle bir sonraki x değerine karşılık y=f(x) değeri hatalı olarak elde edilebilir. H, küçüldükçe hata azalacaktır çünkü:
Limit sonsuz konumunda paydayı 0’a yakınsatacak bir değer yoktur. H->0 durumunda hata sıfıra yakınsar. İfade daha genel olarak verilirse euler metodu:
İle hesaplanır. Bu hesap oldukça hatalıdır. Bu hatayı düzeltmek için şu yapılabilir:
Y1c değeri, gerçek y değerine y1p değerinden daha yakındır. Bu işlem ile hata bir nebze düzeltilmiş olur.
Şimdi, çözümü cebirsel olarak bilinen bir birinci mertebeden diferansiyel denklem için bunu uygulayalım.
Ayrıştırılabilir birinci mertebeden diferansiyel denklemin çözümü:
‘tir.  Tek bir döngü ile iki metodu da uygulayalım. Her hangi i. İnci bir terim için ifadeleri genelleştirelim:
Euler Metodu
Düzeltilmiş Euler Metodu



x1 = x(i)+h;
x(i+1) = x1;

y1c = y(i)+h*F(y(i), x(i));

d0 = F(y(i), x(i));
y1p = y(i)+h*d0;
y1c = y(i)+h/2*(d0+F(y1p, x1));

y(i+1) = y1c;


Şeklinde programa dönüştürebiliriz.

%% BAŞLANGIÇ ŞARTLARI
X0 = 0;
Y0 = 1;
%%

%% ARALIK VE ADIM
h = 0.5;
n = 10;
%%

%% DENKLEM
F = @(y,x) y;
%%

Özel çözüm için gerekli bilgileri bu şekilde tanımlayalım ve h aralığında n adımda çözüm yapalım.
%% DÖNGÜ
x = zeros([1 n]); x(1) = X0;
y = zeros([1 n]); y(1) = Y0;    %Düzeltilmiş Euler İçin
yC = zeros([1 n]); yC(1) = Y0;  %Normal Euler İçin
for i = 1:n-1;   
    x1 = x(i)+h;   
    x(i+1) = x1;
    yC(i+1) = yC(i)+h*F(yC(i), x(i));
      
    d0 = F(y(i), x(i));
    y1p = y(i)+h*d0;
    y1c = y(i)+h/2*(d0+F(y1p, x1));
    y(i+1) = y1c; 
end
clear x1 y1p d0 y1c i;
%%
Bu şekilde tablodaki değerleri her adım için hesaplamış oluruz. Sonuçları çizdirelim.
plot(x, y, x, yC, x, exp(x));
legend('Düzeltilmiş Euler', 'Euler', 'Gerçek');
title([ 'Çözüm, h = ' num2str(h)] );
xlabel('X');
ylabel('Y');

ve böylece elde edilen grafik:
Şimdi düzeltilmiş euler metodunu ikinci mertebe diferansiyel denklemlere uygulayalım.
Şeklinde verilen ikinci mertebeden bir diferansiyel denklem için başlangıç değerleri x0, y0, y’0 biliniyor olsun.
Dönüşümü yapılarak,
Şeklinde iki tane birinci mertebeden başlangıç değerleri bilinen diferansiyel denklem elde edilir. Bu denklemlerin, kendisini ilgilendiren başlangıç değerleri ile eş zamanlı olarak çözülmesi ile x,y ikilileri sayısal olarak elde edilir.



Tablodaki gibi eş zamanlı olarak çözülerek c indisli değerler bir sonraki adımın y ve u değerleri olur.
clear all;

%% BAŞLANGIÇ ŞARTLARI
X0 = 0;
Y0 = pi/10;
U0 = 0;
%%

%% ARALIK VE ADIM
h = 0.5;           %aralık
xN = 10;             %x son
n = (xN-X0)/h;      %adım sayısı
%n = 1000;
%%

%% DENKLEM
fun = @(u,y,x) -u-y;
%%

%% DÜZELTİLMİŞ EULER
x = zeros([1 n]); x(1) = X0;
y = zeros([1 n]); y(1) = Y0;
u = zeros([1 n]); u(1) = U0;
for i = 1:n-1;
    x1 = x(i)+h;
    du0 = fun(u(i), y(i), x(i));
    u1p = u(i)+h*du0;
    y1c = y(i)+h*(u(i)+u1p)/2;
    u1c = u(i)+h*(du0+fun(u1p, y1c, x1))/2;
   
    x(i+1) = x1;
    y(i+1) = y1c;
    u(i+1) = u1c;
end
clear x1 y1p du0 u1p y1c u1c i;
%%

syms z(t);
solve = dsolve('D2z + Dz + z = 0', 'z(0)=pi/10', 'Dz(0)=0');
realf = symfun(solve, t);

plot(x, y, x, realf(x));
xlabel('X');
ylabel('Y');
legend('Düzeltilmiş Euler', 'Gerçek')
title(['Çözüm h: ' num2str(h)]);

Çizim sonucu:
Burada gerçek çözüm,
>> syms z(t);
solve = dsolve('D2z + Dz + z = 0', 'z(0)=pi/10', 'Dz(0)=0');
realf = symfun(solve, t);
>> realf
realf(t) =
(pi*exp(-t/2)*cos((3^(1/2)*t)/2))/10 + (3^(1/2)*pi*exp(-t/2)*sin((3^(1/2)*t)/2))/30
Komutları ile çözüldü.

Hiç yorum yok:

Yorum Gönderme