Dah önce Sabit Kesen Yöntemi (False position) ve Bisection (İkiye Bölme) Yöntemi ile bir fonksiyonun köklerini nasıl bulabileceğimizi işlemiştik. Bu yazımızda da Newton Yöntemini (Newton-Raphson yöntemi olarak da bilinir) göreceğiz ve MATLAB uygulamasını göstereceğiz.
Yazı İçeriği
Newton-Raphson Yöntemi nedir? Nasıl çalışır?
Newton-Raphson Yöntemi'nde tahmin aralığında bir nokta seçilir ve bu noktaya kesen doğrunun eğiminin (yani fonksiyonun o noktadaki türevinin) x-eksenini kestiği nokta bir sonraki nokta olarak seçilir. Aynı şekilde diğer noktalar da bu şekilde seçilmeye devam eder.
Örnek:
MATLAB Uygulaması
1) Fonksiyon dosyalarını oluşturalım
Hesaplama sırasında kökünü bulmak istediğimiz fonksiyonave bu fonksiyonun türevine ihtiyacımız olacak. Bu yüzden fonksiyonumuzu ve onun türevini iki ayrı MATLAB fonksiyonu olarak oluşturmamız gerekiyor. Öncelikle fonksiyonum isminde, kökünü bulmak istediğimiz fonksiyonu içeren bir m dosyası oluşturarak kaydediyoruz.
function [y]=fonksiyonum(x) y = 4*x.^4 + 6*x.^3 + 10*x-20;
Daha sonra da fonksiyonumuzun türevini içeren turev.m dosyamızı aşağıdaki gibi bir MATLAB fonksiyonu olarak oluşturuyoruz:
function [y]=turev(x) y=16*x.^3 + 18*x.^2 + 10;
2) Newton Raphson Yöntemini Uygulayalım
Başlangıç koşullarımızı kodlayalım:
clear all; clc; L=0; %Alt değer U=10; %Üst değer hata=1e-9; %Hata kriteri n=20; %Maksimum iterasyon sayısı hata = 1e-10; %Hata değeri
Bir başlangıç noktası olarak kökü arayacağımız aralığın orta değerini başlangıç noktası olarak seçelim:
x(1)=(L+U)/2;
Şimdi de Newton-Raphson Algoritmamızı for döngüsü ile çalıştıralım. Eğer döngü boyunca hata kriteri sağlanırsa döngü sonlansın ve sonuçlarımız ekrana basılsın:
for i=1:n %Newton Raphson hesaplaması x(i+1) = x(i) - fonksiyonum(x(i)) / turev(x(i)); %Hata hesabı if (i>1) && (abs(x(i+1)-x(i))<hata) break end [adinserter block="2"] fx(i)=fonksiyonum(x(i)); end
Son olarak da sonuçlarımızı komut penceresine bastıralım:
%Sonuçları bastıralım fx(i+1)=fonksiyonum(x(i+1)); step=[1:i+1]; x=x(1,1:i+1); fx=fx(1,1:i+1); table=[step;x;fx]; fprintf('\nIter. \t x \t f(x) \n') fprintf('%2.0f \t %2.7f \t %2.15f \n',table)
Sonuç:
Algoritmamız sadece 11 iterasyon sonunda
Iter. x f(x)
1 5.0000000 3280.000000000000000
2 3.6666667 1035.456790123457000
3 2.6717438 324.962764334533860
4 1.9392378 99.718819049122914
5 1.4262178 28.218778435209508
6 1.1228905 6.083213635740638
7 1.0129845 0.578449023272654
8 1.0001591 0.007003495368266
9 1.0000000 0.000001063609350
10 1.0000000 0.000000000000000
11 1.0000000 0.000000000000000