Newton – Raphson ile kök bulma
20 Aralık 2021Diferansiyel denklemler doğayı anlamamızı ve modellememizi sağlarlar. Bilinen en basit diferansiyel denklem, birinci mertebeden (türev derecesi 1), lineer (bağımlı değişken denklemde skaler bir sayı ile orantılıdır), sabit katsayılı (parametreleri değişmeyen), adi (tek değişkeni olan) ve otonom (dışarıdan bozucu etki olmayacak) bir denklemdir. Bu denklem, tavşanların bir ekosistemde çoğalmasından tutun da radyoaktif bir elementin doğada bulunma oranının zamanla değişimine kadar bir çok matematiksel modelde kullanılır. Aşağıda bu denklem verilmiştir, buyurunuz:
\dot x(t)= a \cdot x(t), \newline x(0)=x0
Yukarıdaki denklem bu tanıma uymakta. Denklemde en yüksek türev mertebesi 1 olduğundan 1. mertebe, x bağımlı değişkeni sadece a dediğimiz bir skalerle çarpılmış (x^2 ya da sin(x) gibi fonksiyonlar yok), a parametresi zamanla değişmiyor yani bir sabit. Zaman demişken, bu örnekteki parantez içinde verildiği üzere bağımsız değişkenimiz zaman yani t. Adi bir diferansiyel denklem, çünkü bağımsız değişken sayısı 1 ve o da zaman. 1. mertebe bir denklem olduğu için mutlaka bir başlangıç koşulu gerekir, o da x(0)=x0 olarak verilmiş. Otonom, çünkü denklemde herhangi bir zamanla giren bir dış etki yok. Olsaydı denklem aşağıdaki gibi olurdu:
\dot x(t)= a \cdot x(t)+b \cdot u(t) \newline x(0)=x0
Şimdi bu diferansiyel denklemi sayısal yöntemle Kalkülüs derslerinden öğrendiğimiz Taylor serisi yardımı ile fark denklemi halinde yazalım. Kullandığımız yöntem ileri fark yöntemi:
\frac {x_{i+1}-x_{i}}{ dt} = a \cdot x_{i} \newline x(0)=x0
Düzenlersek:
{x_{i+1}}=x_{i} (1+a\cdot dt)
İşte bu kadar basit. En basit diferansiyel denklemin fark denklemleri ile formülize edilmesi de çok basit. Zaten bu denklemin analitik çözümü de değişkenlerine ayırma yöntemi ile kolayca elde edilebilir bilindiği gibi:
x(t)=x0\cdot e^ {a\cdot t}
Analitik çözümden de görüldüğü gibi a parametresine göre çözüm değişiyor. Örneğin, a pozitif ise tavşanların çoğalma problemine, negatifse radyoaktif bir elementin yarılanma problemlerine uydurulmuş modeller olabilir.
Konumuza dönelim ve bu fark denklemi yardımı ile bu basit diferansiyel denklemi çözen bir kod yazalım. Kodlamada Python kullanalım. Öncelikle fonksiyonu tanıtan bir kod yazmalıyız. O halde bu kod aşağıdaki gibi olurdu:
def ileri_fark_cozucu(t_ilk,tson,dt,baslangic_kosulu,parametre): x=np.zeros(int((t_son-t_ilk)/dt)) x[0]=baslangic_kosulu for i in range(0,int((t_son-t_ilk)/dt)-1): x[i+1]=x[i]+dt*(parametre*x[i]) return x
Daha sonra en çok kullanılan numpy ve matplotlib.pyplot kütüphanelerini koda çağıralım. Zaman adımı, başlangıç ve bitiş süreleri, parametre seçimi, başlangıç değeri ve de en önemlisi x ve t değişkenlerinin boyutlarını tanımlayalım:
import matplotlib.pyplot as plt import numpy as np dt=0.01 t_ilk=0.0 t_son=5.0 a=-2 #başlangıç koşulu x0=3 # plot için t=np.arange(t_ilk,t_son,dt) x=np.arange(t_ilk,t_son,dt)
Son olarak çözümümüzü grafiksel olarak elde eden kodu yazalım:
x=ileri_fark_cozucu(t_ilk,t_son,dt,x0,a) plt.plot(t,x,color='black') plt.ylabel("metre (m)") plt.xlabel("zaman (s)") plt.grid(True) plt.title("ileri fark")
Kodu çalıştırdığımızda başlangıç değeri 3 olan ve a=-2 parametresi ile eksplonansiyel azalan bir x değeri aşağıdaki gibi elde edilecektir.
sıra sizde. Kodla oynayın. Mesela, ileri fark yerine geriye fark ya da merkezi fark algoritmaları ile birinci türevi elde ederek kodunuzu revize edin. Denkleme dışarıdan zamanla değişen bir u girişi ekleyin ve çözümü gözlemleyin.