KÖK BULMA NÜMERİK YÖNTEMLERİ VE MATLAB ALGORİTMALARI

Lisans hayatım boyunca en anlaşılır ve en başarılı kitabın Chapra’nın “Mühendisler için Sayısal Yöntemler” kitabı olduğunu düşünürdüm. Bu kitap kütüphanemin en gözde yerinde hâlen durur. Nitekim MATLAB öğrenmeye çalıştığım şu zamanlarda, nümerik yöntemleri hatırlamaya (yeniden öğrenmeye) çalışırken bu kitaptan ziyadesiyle faydalanıyorum.

Nümerik (sayısal) yöntemleri eskisinden daha iyi anladığımı söyleyebilirim, herhalde insanın 20 yaşındayken ve bir şeyi kendi arzusuyla değil de ders zoruyla öğrenirken bu kadar motive olmamasından olsa gerek.

Her yeni dili öğrenirken her şey birbirine giriyor. Mantıkları aynı olsa da yazım kuralları, değişken türleri ve bunlarla yapabildikleri özel işlemler değişiyor. Başka bir dile çok alışkınsanız yenisine geçmek zor oluyor. Programcı değilim, bugüne kadar ihtiyaç duyduğum zaman ihtiyacımı giderecek kadar öğrendim. 2 ay öncesine dek R kastığım ve arada biraz Octave’a göz attığım için MATLAB ilk başta öcü gibi geldi. Ama şimdilerde aramız iyi…

İşi düşünce arayan kolay bulsun, algoritmaların ve sayısal yöntemlerin çalışma mantığını anlasın diye, bazı kök bulma yöntemleri için hazırladığım fonksiyonları meraklısıyla paylaşmak istiyorum. Bir kaç küçük şart ve uyarıyla:

  1. Eğer öğrenciyseniz ve ödev için kullanacaksanız, bu fonksiyonları alıp direkt kullanmanızın hiçbir faydası yok. Kendiniz öğrenmek zorundasınız. Bu yüzden mutlaka anlamaya çalışın.
  2. Diğer kullanıcılar için: Elimdeki fonksiyonları çözmede işe yaradı. Başka tür problemlerde ne tür bir hatayla karşılaştığınızı yorum kısmına yazarsanız tartışabiliriz.
  3. Uyarı: Fonksiyonları nümerik tanımlamanız gerekiyor (f = @(x)…) ile. Newton Raphson’da türevlendirirken semboliğe fonksiyon dönüştürecektir. Diğerlerinde zaten nümerik işlem yapılıyor.

 

Buyrunuz kodlar…


Newton Raphson Yöntemi

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
function[sonuc] = newrap (a,fx, tol)
% a: Initial Value (İlk Değer)
% fx: Numerical equation (Nümerik denklem)
% tol: Error Tolerance (Hata Töleransı) olmak üzere...

s_fx = sym(fx); %Converting to symbolic expression to take derivative / Türevini alabilmek için sembolik ifadeye çeviriyorum.
d_fx=diff(s_fx); %Derivation / Türev

for m= 1:10000
kub = vpa(subs(s_fx, a)); % Equation value at point a (a noktasında denklemin değeri)
tof = vpa(subs(d_fx, a)); % Slope value at point a (a noktasında denklemin eğimi)

x1 = a - kub/tof; % Iteration
fprintf('Iteration number:%d, X1=%.10f\n', m, double(x1));

if abs(double(subs(a-x1))) < tol % Error
sonuc = single(x1);
break
end

a = x1;

end

end

Regula Falsi Yöntemi

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function [sonuc] = regulafalsi(c, d ,fx, tol)
% c,d: Initial Values (Başlangıç değerleri)
% fx: Numerical equation (Nümerik denklem)
% tol: Error Tolerance (Hata Töleransı) olmak üzere...

for m= 1:1000
x1 = (c*fx(d)-d*fx(c)) / (fx(d)-fx(c));
fprintf('Iteration number:%d, X1=%.10f\n', m, double(x1));

if abs(x1-d) < tol
break
end

c = d;
d = x1;

end

sonuc = x1;

end

Bisection Yöntemi

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
function [sonuc] = bisection(a,u,fx, tol)
% a=alt sınır, u=üst sınır
% fx: Numerical equation (Nümerik denklem)
% tol: Error Tolerance (Hata Töleransı) olmak üzere...

if fx(a)*fx(u) > 0
fprintf('There is no root between these limits.\n');

else

for m= 1:10000

r = (a+u)/2;
fprintf('Iteration number:%d, X1=%.10f\n', m, double(r));

if fx(a)*fx(r) < 0
if abs(a-r) < 1e-5
break
end
u = r;
elseif fx(a)*fx(r) > 0
if abs(u-r) < 1e-5

break
end
a = r;
end

end

end

sonuc = r;

end

Secant Yöntemi

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function [sonuc] = secant(c, d ,fx, tol)
% c,d: Initial Values (Başlangıç değerleri)
% fx: Numerical equation (Nümerik denklem)
% tol: Error Tolerance (Hata Töleransı) olmak üzere...

for m= 1:1000

x1 = d - ((fx(d)*(c-d)) / (fx(c)-fx(d)));
fprintf('Iteration number:%d, X1=%.10f\n', m, double(x1));

if abs(x1-d) < tol % Error
break
end

c = d;
d = x1;

end

sonuc = double(x1);

end

Yazar Hakkında: Tevfik Uyar


Uçak Mühendisi, Sosyolog ve MBA. Organizasyonel davranış ve örgüt psikolojisi üzerine çalışmıştır. Aynı sahada doktora eğitimine devam eden Uyar, ödüllü bir bilimkurgu yazarıdır.

Yorum yapın (Facebook ya da Twitter profilinizle de yorum yapabilirsiniz...)

%d blogcu bunu beğendi: