Etiket: Matlab

  • KÖK BULMA NÜMERİK YÖNTEMLERİ (MATLAB)

    KÖK BULMA NÜMERİK YÖNTEMLERİ (MATLAB)

    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

    [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]