Ana Sayfa / Yazılar / Savunabileceğiniz Hesaplar HES-04
Sessizce Yanlış Sonuç Veren Çözücüler
Bu sitenin beş farklı hesap motoru, çözümü olmayan bir problem verildiğinde hata vermek yerine bir sonuç döndürüyordu: 10¹¹ mertebesinde yer değiştirmeler, dengeyi bozan tepkiler. Bu yazı, neden olduğunu, nasıl düzeltildiğini ve düzeltmelerin kendisinin nasıl hata yaptığını anlatıyor.
1. Çökmeyen bir program
Bir hesap programının çökmesi kötüdür; ama çökmeden yanlış bir sayı göstermesi çok daha kötüdür. Çöken program kullanıcıyı durdurur; yanlış sayı gösteren program ise kullanıcıyı yanlış bir karara yürütür. Ekim 2026'daki denetimlerde archi-civil.com'un beş farklı motorunda aynı kalıp bulundu: Çözülemeyen bir problem verildiğinde motor hata vermek yerine bir sonuç döndürüyordu.
2. Beş motor, tek kalıp
| Fonksiyon | Bulundu | Girdi | Çıktı | Kök neden |
|---|---|---|---|---|
| dynamics.eigenSolve | v584 | Köşegen olmayan kütle matrisi | İlk özdeğer 0,879 (doğrusu 0,649, +%35) | Varsayım bir yorum satırındaydı, kodda korunmuyordu |
| statics.gaussElim (kafes) | v585 | İki kayıcı mesnet + yatay yük | Makul görünen çubuk kuvvetleri; ΣFx = 3, ΣFy = −1,17, ΣM = 8,66 | Tekillik denetimi yoktu |
| statics.solve3x3 | v585 | 10⁻⁵ ölçekli iyi koşullu sistem | "Tekil matris" — sağlıklı sistem reddedildi | Mutlak eşik birime bağlıydı |
| fem2d.solveDense | v586 | Mesnetlenmemiş eleman | ~10¹⁴ yer değiştirme | Eşik 10⁻³⁰⁰: yalnız tam sıfırı yakalıyordu |
| frame-solver.solveLinear | v588 | Eğik eleman + tek mafsal | 6,3·10¹¹ yer değiştirme, dengesiz tepkiler | Mutlak eşik 10⁻¹⁴; eksene paralel durumda yakalanıyordu, eğikte yakalanmıyordu |
Beşinin ortak noktası şu: Hiçbiri, gerçekten çözümü olmayan bir girdiyle karşılaştığında bunu fark etmiyordu. Kararsız bir kafesin, mesnetlenmemiş bir sonlu eleman modelinin ya da yalnızca bir mafsalla tutulan bir çerçevenin denge denklemleri tekildir: Bu yapıların çözümü yoktur, çünkü yük altında sonsuz yer değiştirirler. Doğru davranış "bu yapı kararsız" demektir.
3. Neden sıfır, sıfır değildir?
Bir denklem sistemi tekilse, Gauss eliminasyonunda bir pivot sıfır olur. Ama bilgisayar gerçek sayılarla değil, sınırlı hassasiyetli kayan noktalı sayılarla çalışır. Kuramsal olarak sıfır olan bir pivot, hesapta 10⁻⁹ ya da 10⁻¹² gibi küçük bir yuvarlama artığı olarak çıkar. Bu artığa bölmek, dev ama sonlu sayılar üretir: 10¹¹, 10¹⁴. Program çökmez, çünkü teknik olarak sıfıra bölmemiştir.
Çerçeve çözücüsündeki örnek bunu çok net gösteriyor. Aynı mekanizma, eleman eksenlere paralel kurulduğunda yakalanıyordu: Matris terimleri tam sıfır çıkıyor ve pivot da tam sıfır oluyordu. Eleman eğik kurulduğunda ise sinüs ve kosinüs çarpımları yuvarlama artığı üretiyor ve aynı mekanizma sessizce "çözülüyordu". Basit, eksenlere paralel test örnekleri bu hatayı hiçbir zaman göremezdi.
4. Mutlak eşik: iki yönde de yanlış
Üç motor tekilliği mutlak bir sayıyla denetliyordu: pivot 10⁻¹⁴'ten, 10⁻¹²'den ya da 10⁻³⁰⁰'den küçükse tekil. Bu yaklaşım iki yönde birden başarısız olur:
- Büyük ölçekte kaçırır. Çerçeve rijitlikleri 10⁶–10⁹ mertebesindedir; yuvarlama artığı da bu ölçekle büyür ve 10⁻¹⁴'ün çok üstünde kalır. Tekil sistem geçer.
- Küçük ölçekte yanlış alarm verir. Küçük denklem çözücüsü, birimleri 10⁻⁵ ölçeğinde olan tamamen sağlıklı bir sistemi "tekil" diye reddediyordu; çünkü determinant ölçeğin küpüyle küçülür.
Doğrusu, eşiği matrisin kendi ölçeğine göre göreli tanımlamaktır: pivot, matrisin en büyük teriminin küçük bir kesrinden küçükse tekil. Böylece aynı sistem metre ya da milimetre ile yazılsa da aynı kararı verir. Denetimde bu, 10⁻⁶'dan 10⁶'ya beş ölçekte 200 rastgele sistemle sınandı.
5. Fizik bir kâhindir: denge denetimi
Göreli eşik bile her durumu yakalamayabilir. Bu yüzden kafes ve çerçeve çözücülerine ikinci bir katman eklendi: Çözümden sonra genel denge denetlenir. Doğru bir statik çözüm ΣFx = 0, ΣFy = 0 ve ΣM = 0 koşullarını sağlamak zorundadır. Bu denetim, çözücünün nasıl yazıldığından tamamen bağımsızdır; tekillik denetimi bir durumu kaçırsa bile yakalar. İki kayıcı mesnetli kafes örneğinde eski çözücünün çıktısı üç denge koşulunun üçünü de bozuyordu.
6. Düzeltmeler de hata yapar
Bu denetimlerin en öğretici kısmı, düzeltmelerin kendisinde çıkan hatalardır:
- Yuvarlanmış sayılarla denge denetimi: Kafes çözücüsü için yazılan ilk denge denetimi, çıktıda dört ondalığa yuvarlanmış tepkileri kullanıyordu. Yuvarlama artığı moment koluyla çarpılınca toleransı aşıyor ve kararlı, doğru çözülmüş kafesler reddediliyordu. Bunu rastgele üretilmiş kafeslerle yapılan bir sınama yakaladı. Doğru çözüm toleransı gevşetmek değil, denetimi yuvarlanmamış değerlerle yapmaktı. Son hâliyle 2000 rastgele kararlı kafeste yanlış ret sıfır.
- Öğretici bir hatayı da "düzeltmek": Sonlu eleman çözücüsü için yazılan ilk koruma, sitedeki kum saati modunu bilerek gösteren bir testi kırdı: O gösterim, tekile yakın bir sistemin dev yer değiştirmelerinin biçimini kullanıyordu. Çözüm, iki durumu ayırmaktı: Normal kullanımda açık hata; indirgenmiş integrasyonda çözüm döner, ama "tekile yakın" diye işaretlenir ve bir uyarı taşır.
7. Hiç çalışmayan testler
Aynı kalıbın bir de doğrulamanın kendisinde görülen hâli var. Denetimler boyunca her turda "yeni başarısızlık yok" denildi; karşılaştırma, başlangıçta zaten başarısız görünen 49 testlik bir listeye göre yapılıyordu. İnceleme, bunların 45'inin bir kütüphane eksikliği nedeniyle daha ilk satırda çöktüğünü, yani hiç çalışmadığını gösterdi. Eksik kütüphane kurulunca hepsi geçti; ama o ana kadar verilen güvence, o testlerin kapsadığı araçlar için sahteydi. Sessizce yanlış sonuç veren bir çözücü ile sessizce hiçbir şey denetlemeyen bir test aynı sorunun iki yüzüdür.
8. Kurallar
- Çözülemeyeni çözmeye çalışma. Tekil bir sistem bir sonuç değil, bir teşhistir: "Yapı kararsız."
- Eşikler göreli olmalı. Mutlak bir eşik birime bağlıdır ve iki yönde de yanılır.
- Varsayımlar kodda korunmalı. Bir yorum satırındaki varsayım ("M köşegen") hiçbir şeyi engellemez.
- Fiziksel bir kâhin ekle. Denge, enerji, simetri: koddan bağımsız gerçekler.
- Düzeltmeyi de sına. Rastgele, geniş aralıklı girdilerle yanlış alarm oranını ölç; bilerek yapılan gösterimleri kırma.
- Testin çalıştığını doğrula. Başarısız bir testin nedenini bilmeden ona göre "yeni başarısızlık yok" deme.
Kaynaklar
- archi-civil.com sürüm notları (README) ve docs/MOTOR-DENETIM-KAYDI.md, v584–v588: her hatanın girdisi, çıktısı, düzeltmesi ve testleri. docs/TEST-ORTAMI.md (v587).
- Higham, N. J. (2002). Accuracy and Stability of Numerical Algorithms, 2. baskı, Bölüm 9 (Gauss eliminasyonu, pivotlama). SIAM.
- Golub, G. H. ve Van Loan, C. F. (2013). Matrix Computations, 4. baskı, Bölüm 3 ve 5 (koşul sayısı, sayısal rank). Johns Hopkins University Press.
Yazıdaki sayılar sitenin motorlarıyla üretilmiştir; yönetmelik değerleri kaynak madde numarasıyla verilmiştir.