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,
İ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önder