From 3b0674f72d538da91145680d3d6a70a6c2b5df8f Mon Sep 17 00:00:00 2001 From: "M. Serdar Karaman" Date: Wed, 27 May 2026 08:13:12 +0300 Subject: [PATCH] =?UTF-8?q?Yeni=20yaz=C4=B1:=20Fault=20Tree=20Analizi=20ve?= =?UTF-8?q?=20Minimal=20Cut=20Set=20Hesab=C4=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Boole sadeleştirme, MOCUS algoritması, common-cause modellemesi ve REA/MCUB ile niceliksel hesap. Çalışan Python örneği (cutsets PyPI paketi) ve Fussell-Vesely importance tablosu içerir. ARP4761A (Aralık 2023), IEC 61025:2006 ve NUREG-0492 referans alınmıştır. Co-Authored-By: Claude Opus 4.7 --- ...5-27-fault-tree-analizi-minimal-cut-set.md | 340 ++++++++++++++++++ agent/topics.md | 82 +++-- 2 files changed, 385 insertions(+), 37 deletions(-) create mode 100644 _posts/2026-05-27-fault-tree-analizi-minimal-cut-set.md diff --git a/_posts/2026-05-27-fault-tree-analizi-minimal-cut-set.md b/_posts/2026-05-27-fault-tree-analizi-minimal-cut-set.md new file mode 100644 index 00000000..6db5016b --- /dev/null +++ b/_posts/2026-05-27-fault-tree-analizi-minimal-cut-set.md @@ -0,0 +1,340 @@ +--- +title: "Fault Tree Analizi ve Minimal Cut Set Hesabı: Boole Cebriyle Sahaya İnmek" +subtitle: "Fault Tree Analysis and Minimal Cut Sets: From Boolean Algebra to Quantitative Safety" +background: "/img/posts/6.webp" +date: '2026-05-27 09:00:00' +layout: post +lang: tr +mermaid: true +--- + +Aviyonik sertifikasyon dünyasında "10⁻⁹ per flight hour" cümlesi çok rahat söylenir. *Catastrophic* sınıfı bir kaybın uçuş saati başına olasılığının bu mertebenin altında kalması beklenir; gereksinim seviyesi olan **Development Assurance Level A** da büyük ölçüde bu sayıdan türetilir. Peki bir mühendis, henüz uçmamış bir sistemin "uçuş saati başına 10⁻⁹" olasılıkta arızalandığını gerçekten **nasıl** gösterir? + +Cevap büyük ölçüde tek bir yöntemin etrafında döner: **Fault Tree Analysis (FTA)**. Ve FTA'nın kalbi, yıllardır kazandığım izlenime göre Türkçe kaynaklarda neredeyse hiç anlatılmayan bir adımdır — **minimal cut set** hesabı. Bu yazıda fault tree'nin niteliksel iskeletini hızlıca kurup büyük bölümü minimal cut set'lerin Boole cebriyle nasıl çıkarıldığına, MOCUS algoritmasının nasıl ilerlediğine ve "rare event" yaklaşımının nerede çuvalladığına ayıracağız. Somut bir örnek üzerinde elle ve `pip install cutsets` ile sayısal olarak doğrulayacağız. + +--- + +## FTA Neden Bir "Yöntem", Bir "Şema" Değildir? + +Çok kişi fault tree'yi sadece "ters çevrilmiş bir akış şeması" olarak görüyor: en üstte istenmeyen olay, altında AND/OR kapıları, en altta temel olaylar. Bu görüntü doğru ama eksiktir; çünkü FTA aslında dört aşamanın birleşimidir: + +1. **Top event** tanımı — analiz edilen *belirli* bir sistem arızası. *"Uçak düşer"* değil, *"otomatik pilot tüm uçuş kontrol yüzeylerini eşzamanlı olarak komutlayamaz"* gibi mühendislik düzeyinde tanımlanmış bir olay. +2. **Niteliksel inşa** — top event'i AND/OR kapıları ve ara olaylarla temel olaylara kadar parçalamak. Burada amaç hiyerarşi değil, *mantıksal yeterlilik*: her ara olay, hemen üstündeki olayı tek başına (OR) veya birlikte (AND) tetiklemeye yetmeli. +3. **Niteliksel çözümleme** — ağacın eşdeğer bir Boole ifadesine indirgenmesi ve buradan **minimal cut set**'lerin çıkarılması. +4. **Niceliksel çözümleme** — temel olayların olasılık veya hata oranlarının cut set'ler üzerinden top event olasılığına çevrilmesi. + +Aviyonik tarafta üst kaynak **SAE ARP4761A (Aralık 2023)** ve onun EUROCAE eşdeğeri **ED-135**'tir; ARP4761A, ARP4754B ile birlikte kullanılır ve FHA → PSSA → SSA zincirinin omurgasını çizer. Süreç bağımsız jenerik referans olarak **IEC 61025:2006 Ed. 2.0** kullanılır; sembol ve kapı tanımları oradaki kanonik şemadır. Yöntemin "kuramsal kitabı" hâlâ NRC'nin **NUREG-0492 Fault Tree Handbook (Ocak 1981, Vesely-Goldberg-Roberts-Haasl)** klasiğidir — 170 sayfalık bu doküman alanda hâlâ atıf alır, çünkü temeli oturtan kitap odur. + +Bu yazıda standartların yorumuna girmeyeceğim — onlar uzun başka bir yazı konusu. Asıl ilgi alanım 3. ve 4. adımlar: ağaç çizildikten *sonra* ne oluyor? + +--- + +## Niteliksel İskelet: Küçük Bir Örnek + +İki kanallı bir aviyonik fonksiyon hayal edelim. İki bağımsız hesap kanalı (`Ch1`, `Ch2`) aynı veriyi üretir, bir voter (`V`) sonucu seçer ve aktüatöre gönderir. Voter ve onun güç kaynağı (`P`) tek noktalardır. + +```mermaid +flowchart TD + T["Top: Aktüatöre yanlış komut"] --> O1{{OR}} + O1 --> A1{{AND}} + O1 --> V["V: voter arızası"] + O1 --> P["P: voter güç kaynağı arızası"] + A1 --> Ch1["Ch1: kanal-1 yanlış hesap"] + A1 --> Ch2["Ch2: kanal-2 yanlış hesap"] +``` + +Niteliksel okuma sezgisel: + +- Tek bir hesap kanalının arızalanması yetmez (AND). Yanlış komut için **iki kanal birlikte** hata yapmalı. +- Voter arızası tek başına yeter (OR). +- Voter besleme kaybı da tek başına yeter (OR). + +Bu üç dal, sistemin **kuvveti**ni ve **zayıflığını** belirleyen üç farklı **cut set**'tir. Cut set, gerçekleştiğinde top event'i tetiklemeye yeten temel olay kümesidir. Minimal cut set ise, içinden herhangi bir olay çıkarıldığında artık top event'i tetiklemeye yetmeyen, *en küçük* böyle kümedir. Yukarıdaki örnekte üç adettir: `{Ch1, Ch2}`, `{V}`, `{P}`. + +İki gözlem önemli: + +1. **Cut set boyutu, sistemin kırılganlığını tek bir sayıya indirir.** Tek elemanlı bir cut set, single point of failure demektir. ARP4761A çerçevesinde *Catastrophic* sınıfı bir fonksiyon için tek elemanlı bir cut set görüldüğü an analiz durur; tasarım değişmek zorundadır. +2. **Voter dalı, çoğunlukla *common cause* analiziyle birlikte değerlendirilir.** İki kanal "bağımsız" diye işaretlendiğinde gerçekten bağımsız olduklarını kanıtlamak başka bir iştir — ARP4761A'nın CCA (Common Cause Analysis) bölümünün varlık sebebi tam olarak budur. + +Niteliksel düzeyde ilerlemek görece kolay. Asıl iş, ağaç birkaç düzine kapıdan oluştuğunda başlıyor: minimal cut set'leri *insan gözü* artık çıkaramaz. + +--- + +## Boole Cebrine Çevirmek + +FTA'nın matematiksel iskeleti, aslında basit bir gözleme dayanır: her fault tree, yapraklardaki temel olayların boole değişkenleri (`1 = oldu`, `0 = olmadı`) olduğu bir **Boole ifadesi**dir. AND kapısı çarpım (·), OR kapısı toplam (+), NOT seyrektir ama vardır. Top event'in fonksiyonu T(b₁, …, bₙ) olarak yazılır. + +Yukarıdaki örnek için: + +$$ +T \;=\; (Ch_1 \cdot Ch_2) \;+\; V \;+\; P +$$ + +Bu ifadeyi **DNF**'e (disjunctive normal form — birleşim toplamı olarak çarpımlar) indirgemek FTA'nın çekirdek operasyonudur. Çünkü DNF terimleri tam olarak cut set'lerdir; ve **absorpsiyon** ile **idempotans** uygulayarak fazla terimleri attığımızda elimizde kalan minimal cut set'lerdir. + +İki temel kural: + +- **Absorpsiyon:** `A + A·B = A`. Eğer A tek başına top event'i tetikliyorsa, A ile birlikte bir başka olay gerektiren terim gereksizdir. +- **İdempotans:** `A·A = A` ve `A + A = A`. Tekrarlanan temel olaylar bir kez sayılır. + +Üçüncü kural, çoğu pratik fault tree'nin "soğanı"nı kaldırır: **dağılım (distribution).** `A·(B + C) = A·B + A·C`. AND içine giren OR'lar, kombinasyon patlamasını üreten asıl mekanizmadır. + +Bir senaryo deneyelim. Voter'ın iki ayrı arıza modu olsun: `V = V_hw + V_sw` (donanım veya yazılım arızası). Güç kaynağı yedekli olsun: `P = P_a · P_b` (her iki güç kanalı birden gitmeli). Ağaç şimdi: + +$$ +T \;=\; Ch_1 \cdot Ch_2 \;+\; (V_{hw} + V_{sw}) \;+\; P_a \cdot P_b +$$ + +Bu ifade zaten DNF'tedir. Minimal cut set'ler: + +$$ +\{Ch_1, Ch_2\}, \;\{V_{hw}\}, \;\{V_{sw}\}, \;\{P_a, P_b\} +$$ + +Şimdi senaryoyu biraz daha "kirli" yapalım. Diyelim ki yazılım voter'ı `V_sw`, kanal yazılımlarındaki ortak bir kütüphane hatasından (`L`) tetiklenebiliyor; ve kanal hesaplarının "yanlış" olması da aynı kütüphane çağrısını içeriyor olabilir. Bağımsızlık artık görünüştedir. Modeli güncellersek: + +$$ +Ch_1 = h_1 + L, \quad Ch_2 = h_2 + L, \quad V_{sw} = v_{sw} + L +$$ + +Burada `h_1`, `h_2`, `v_{sw}` her bileşene özgü "bağımsız" hatalar, `L` ise üçünü de etkileyen ortak nedendir. Substitüsyon: + +$$ +T = (h_1 + L)(h_2 + L) + V_{hw} + (v_{sw} + L) + P_a P_b +$$ + +Birinci terimi açarsak: + +$$ +(h_1 + L)(h_2 + L) = h_1 h_2 + h_1 L + L h_2 + L \cdot L +$$ + +İdempotansla `L·L = L`. Absorpsiyonla `h_1 L + L h_2 + L = L (h_1 + h_2 + 1) = L`. Yani: + +$$ +(h_1 + L)(h_2 + L) = h_1 h_2 + L +$$ + +Tüm ifade: + +$$ +T = h_1 h_2 + L + V_{hw} + v_{sw} + L + P_a P_b +$$ + +Tekrarlı `L`'lerden biri düşer. Sonuçta minimal cut set listesi: + +$$ +\{h_1, h_2\}, \;\{L\}, \;\{V_{hw}\}, \;\{v_{sw}\}, \;\{P_a, P_b\} +$$ + +Sistemde **tek elemanlı üç cut set** belirdi: `{L}`, `{V_{hw}}`, `{v_{sw}}`. Bir saniye önce "iki kanal bağımsız" göründüğü için göğsümüzü kabartan tasarım, kütüphane modellendiğinde tek noktalı bir hataya dönüştü. *Bu* sebeple FTA, sertifikasyon ekibi tarafından çizilen şema değil **bağımsızlık varsayımlarının test edildiği** yöntemdir. + +--- + +## MOCUS: İnsan Eli Pes Edince + +Yukarıdaki örnek küçük olduğu için Boole sadeleştirmesi elle yapılabildi. Gerçek bir aviyonik fault tree binlerce yaprağa, on binlerce ara olaya çıkar. 1972'de Fussell ve Vesely bu işi otomatize eden **MOCUS** (*Method of Obtaining Cut Sets*) algoritmasını önerdiler; bugün hâlâ ticari araçların (Isograph, ITEM Toolkit, RiskSpectrum, OpenFTA) çekirdeğinde MOCUS veya türevi vardır. + +Temel fikir tek satıra sığar: + +> **OR kapıları cut set sayısını çoğaltır; AND kapıları cut set boyutunu büyütür.** + +MOCUS yukarıdan aşağı çalışır. Top event'i tek satırlı, tek elemanlı bir "matris"e koyar: + +``` +Satır 1: [T] +``` + +Sonra her satırda en sondaki olayı, onu üreten kapıya göre genişletir. Kural: + +- **OR kapısı:** girdiğin satırı, kapının her bir girdisi için bir satıra **böl**. +- **AND kapısı:** girdiğin satıra, kapının tüm girdilerini **ekle**. + +Önceki örneğimizdeki (basit, common cause'suz) ağaç için adım adım: + +``` +[T] # T = (Ch1·Ch2) + V + P, OR ile genişlet +[Ch1·Ch2], [V], [P] # birinci satırı AND'le genişlet +[Ch1, Ch2], [V], [P] # zaten yapraklar, dur. +``` + +Sonuç üç satır: `{Ch1, Ch2}`, `{V}`, `{P}`. Bunlar **cut set**'lerdir. Minimallik için son bir geçiş yaparız: hiçbir cut set başka bir cut set'in **süperseti** olmamalı; varsa atılır. (Örnekte yok.) + +Common-cause'lu sürümü deneyelim. `Ch1 = h_1 + L`, `Ch2 = h_2 + L` olduğunu hatırlayalım: + +``` +[T] +[Ch1·Ch2], [V], [P_a·P_b] +[Ch1, Ch2], [V_hw], [V_sw], [P_a, P_b] +[h_1·L? hayır, OR] genişlet: [h_1, Ch2], [L, Ch2], [V_hw], [V_sw], [P_a, P_b] +sonra Ch2'yi genişlet: [h_1, h_2], [h_1, L], [L, h_2], [L, L], [V_hw], [V_sw], [P_a, P_b] +``` + +Şimdi minimalizasyon — `L·L = L` indirgemesi cut set'i `{L}`'ye düşürür; ve `{L} ⊂ {h_1, L}` olduğu için `{h_1, L}` atılır; aynı şekilde `{L, h_2}` da atılır. Geriye kalan: + +$$ +\{h_1, h_2\}, \;\{L\}, \;\{V_{hw}\}, \;\{V_{sw}\}, \;\{P_a, P_b\} +$$ + +Boole cebriyle elle yaptığımızla bire bir aynı. Algoritmanın güzelliği, bu mekanik adımları kapı sayısı ne olursa olsun çalıştırabilmesidir. Çirkin yanıysa **kombinatoryel patlama**: OR'ların altındaki AND'ler iç içe geçtiğinde satır sayısı `O(2^n)` mertebesinde büyür. Bu yüzden modern araçlar saf MOCUS yerine **BDD** (Binary Decision Diagrams), **ZBDD** (Zero-suppressed BDD) ve **SAT** tabanlı modern varyantlar kullanır; ancak çıktısı hâlâ "minimal cut set listesi"dir. + +--- + +## Niceliksel Adım: Olasılığa Geçiş + +Cut set'leri çıkardığımıza göre asıl soruyu sorabiliriz: top event olasılığı nedir? + +Top event T, cut set'lerinin **birleşimi**dir: + +$$ +T = C_1 \cup C_2 \cup \cdots \cup C_m +$$ + +Her cut set ise, içindeki olayların **kesişimi**dir. Olaylar bağımsız varsayılırsa: + +$$ +P(C_i) = \prod_{e \in C_i} P(e) +$$ + +Top event olasılığı için tam ifade *inclusion-exclusion* formülüdür: + +$$ +P(T) = \sum_i P(C_i) - \sum_{i