Python ile Bulanık Kontrol Örneği

Ahmet Ataşoğlu
4 min readApr 28, 2020

Bu yazıda basit bir kontrol problemi, Scikit-Fuzzy modülü kullanılarak Python üzerinde simüle edilmiştir. Uygulamanın kaynak koduna buradan ulaşabilirsiniz. Bulanık kontrol, Bulanık Mantık temelli bir kontrol yaklaşımıdır. Bulanık Mantığı ilk kez duyuyorsanız, buradaki yazıma göz atabilirsiniz.

görsel: kaynak

Problem

Şuradaki yazıda paylaştığım problem üzerinden gidelim. Problemimiz: Bir helikopterin irtifasının kontrol edilmesi. Aşağıdaki grafikle, helikopter pervanesinin ivmesine göre yer değiştirmesindeki ilişki verilmiş olsun.

Açısal ivme — yer değiştirme ilişkisi.

Grafikteki eğrinin denklemi:

Bu grafiği sistemimizin matematiksel modeli olarak kabul edip, uygulamamıza başlayalım.

  • Öncelikle giriş ve çıkışları belirleyelim. Kontrol sistemimizi belirli bir adım sayısı boyunca, sürekli çevrim halinde çalıştıracağız ve her çevrimde oluşan hatayı gözlemleyeceğiz. Bunun için bir hata girişi oluşturacağız. Hatanın önceki hataya göre negatif veya pozitif değişimi, bize hatanın yönünü — bir başka deyişle, helikopter istediğimiz irtifaya yakınsıyor mu ıraksıyor mu bilgisini —vereceğinden bu bilgiye de ihtiyacımız var. Dolayısıyla hata değişimini de giriş olarak alacağız. Çıkış ise helikopteri yükseltecek ivme olacak.
  • Scikit-Fuzzy modülü ile Hata (err), Hata değişimi (derr) ve açısal ivme (acc) giriş-çıkışlarını şekildeki oluşturduk. Scikit-Fuzzy’nin control sınıfı ile girişler Antecedent, çıkış ise Consequent komutuyla oluşturulabilmektedir. İlk parametre tanım aralığı, ikinci parametre ise giriş veya çıkışın ismidir. Bu uygulamada tanım aralıkları farazi olarak belirlenmiştir. Dolayısıyla sisteme uygun, daha iyi bir tanımlama ile kontrol sisteminin göstereceği başarı arttırılabilir.
  • Giriş-çıkışlara ait bulanık kümeleri ve üyelik fonksiyonlarını şekildeki gibi oluşturduk. Çıkış kümeleri için yamuk üyelik fonksiyonunu, diğer kümeler içinse üçgen üyelik fonksiyonu kullandık. Hata ve hata değişimi kümelerine ait dilsel değerler: Neg (negatif), Zer (sıfır) ve Pos (pozitif) şeklindedir. Çıkış içinse: Low (düşük) ve Hig (yüksek) şeklindedir. Kümelerin grafiği şu şekildedir:
Hata’ya ait bulanık kümeler.
Hatanın Değişimi’ne ait bulanık kümeler.
İvme’ye ait bulanık küme.
  • Son olarak bulanık kontrol sisteminin kurallarını oluşturalım:
  • Scikit-Fuzzy’nin Rule sınıfıyla kurallar kolaylıkla oluşturulabilmektedir. İlk parametre giriş kümelerinden oluşan önermeyi, ikinci parametre ise çıkış kümesini almaktadır. Şekildeki gibi birden fazla giriş kümesini aynı önermede kullanmak için, mantıksal operatörler kullanılabilir. Kuralları oluşturduktan sonra, ControlSystem sınıfına oluşturduğumuz kuralları şekildeki gibi veriyoruz.
  • Bu aşamayla bulanık kontrol tasarımımızı sonlandırdık. Artık sistemi simüle etmeye geçebiliriz. Simülasyon için gerekli nesneyi üretelim ve parametrelerimizi oluşturalım:
  • altitude_sim, oluşturduğumuz bulanık kontrol sistemini tutmaktadır. Ulaşmak istediğimiz irtifayı (ref) 50 m olarak belirledik. Helikopterin ilk yüksekliği (h0) 0 m, çevrim sayısı (step) 30, önceki hata (last_error) 0 ve sistem modelini (sys_model) de şekildeki gibi tanımladık. Çevrim sayısı kadar dönecek bir döngü oluşturalım ve simülasyonu başlatalım:
  • output listesi, helikopterin yeni irtifasını her adımda eklediğimiz listedir. Her çevrimde hatayı ve hata değişimi hesaplıyor, ardından bulanık kontrole giriş değerleri olarak veriyoruz. compute fonksiyonu ile bulanık sistemi çalıştırıp, çıkışı hesaplattıktan sonra x değişkenine şekildeki gibi çıkış değerini atıyoruz. Kontrol sisteminin hesapladığı ivmeyi sistem modeline verip, helikopterin yer değiştirmesini hesaplıyoruz. Ve bu hesapladığımız değere de helikopterin son irtifasını ekleyerek output listesine ekliyoruz.
  • Elde edilen sonuç şu şekildedir:

Görüldüğü gibi helikopterimiz yaklaşık 25 saniyede istediğimiz irtifaya ulaştı. Fakat buradan sonra bir müddet daha yükselmeye devam etti. Bulanık sistemden sıfır değeri gelmediği sürece de yükselmeye devam edecektir. Yani bu durumda, sistemimiz kararlı olmayacaktır.

Son olarak

Sistemi kararlı hale getirmek, yani istediğimiz irtifada uzun süre tutabilmek için, daha iyi tanım aralıkları ve üyelik fonksiyonları tanımlanabilir. Bu uygulamayla, kontrol sistemini başarılı bir şekilde çalıştırmaktan ziyade, temel mantığını anlatmayı amaçladığım için bu noktalar üzerinde durmadık ve yukarıda da belirttiğim gibi, tanımlamaları farazi gerçekleştirdik. Dolayısıyla bu örnek, bulanık kontrolü diğer kontrol sistemleriyle kıyaslamak için pek de uygun bir örnek olmayabilir.

Okuduğunuz için teşekkürler. Bir başka yazıda görüşmek dileğiyle!

--

--