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:
- 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.
- 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.
- 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
[cc lang=”matlab”]
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
[/cc]
Regula Falsi Yöntemi
[cc lang=”matlab”]
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
[/cc]
Bisection Yöntemi
[cc lang=”matlab”]
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
[/cc]
Secant Yöntemi
[cc lang=”matlab”]
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
[/cc]