Ölçen alet de yanılır
Hubble, 1990 — hassas olan her zaman doğru olan değildir
Hassas ölçmek ile doğru ölçmek arasındaki farkı görmek, ve bir ölçüm aletini nasıl test edeceğini öğrenmek.
Ne oldu?
Nisan 1990. Hubble Uzay Teleskobu fırlatıldı. Yıllarca beklenmiş, bir milyar dolardan pahalı bir teleskop. Atmosferin üstünden, hiçbir teleskobun görmediği netlikte görecekti.
İlk fotoğraflar geldi. Bulanıktı.
Teleskobun ana aynası yanlış şekilde parlatılmıştı. Kenarları olması gerekenden çok az fazla düzdü. Fark bir saç telinden onlarca kat inceydi — ama bir teleskobu bulanıklaştırmaya yetiyordu.
Nasıl kaçtı?
Ayna yapılırken defalarca ölçülmüştü. Ölçüm aleti "ayna mükemmel" diyordu.
Sorun ölçüm aletinin kendisindeydi. İçindeki bir mercek, olması gereken yerden 1,3 milimetre kaymıştı. Alet yanlış kurulduğu için, yanlış bir aynayı doğru gösteriyordu. Ayna, aletin "doğru" dediği şekle göre parlatıldı.
Hikâyenin en önemli kısmı şu: o yıllarda başka, daha basit test aletleri bir şeylerin yolunda gitmediğini göstermişti. Ama ekip onlara güvenmedi. Ana alet çok daha hassastı. Hassas olan haklıdır, diye düşünüldü.
1993'te astronotlar uzaya çıkıp teleskoba düzeltici bir optik taktılar — bir çeşit gözlük. Hubble ondan sonra tarihin en önemli uzay fotoğraflarından bazılarını çekti.
İki farklı kelime
Bu görevde iki kelimeyi ayırmayı öğreneceksin:
| Ne demek | Hedef tahtası düşün | |
|---|---|---|
| Hassas | Her seferinde neredeyse aynı sonuç | Bütün oklar birbirine çok yakın |
| Doğru | Sonuç gerçeğe yakın | Oklar tam ortada |
Bir alet hassas ama yanlış olabilir: bütün oklar birbirine yapışık, ama hepsi tahtanın köşesinde. Hubble'ın ölçüm aleti tam olarak buydu.
Senin kartında
Aynı nesneyi iki aletle ölçüyoruz. Gerçek uzunluk 250 milimetre — ama aletler bunu bilmiyor.
const float GERCEK = 250.0; // gercek uzunluk (mm)
// Hassas alet: her seferinde neredeyse ayni sonuc
float hassasOlc(float uzunluk) {
float kayma = 1.3; // ornek: aletin kendi hatasi
return uzunluk + kayma + random(-1, 2) * 0.01;
}
// Basit alet: daginik olcer, ama kaymasi yok
float basitOlc(float uzunluk) {
return uzunluk + random(-30, 31) * 0.1;
}
void setup() {
Serial.begin(9600);
Serial.println("hassas basit");
for (int i = 0; i < 5; i++) {
Serial.print(hassasOlc(GERCEK));
Serial.print(" ");
Serial.println(basitOlc(GERCEK));
}
float toplamH = 0;
float toplamB = 0;
for (int i = 0; i < 100; i++) {
toplamH = toplamH + hassasOlc(GERCEK);
toplamB = toplamB + basitOlc(GERCEK);
}
Serial.print("100 olcum ortalamasi -> hassas: ");
Serial.print(toplamH / 100);
Serial.print(" basit: ");
Serial.println(toplamB / 100);
}
void loop() {
}
random(a, b) a ile b arasında rastgele bir tam sayı verir — b hariç. Gerçek ölçümlerdeki küçük titremeyi taklit ediyor.
Çalıştı mı?
Sayılar her kartta biraz farklı çıkabilir ama şekil hep aynı olacak:
hassas basit
251.29 248.70
251.30 252.10
251.31 250.40
...
100 olcum ortalamasi -> hassas: 251.30 basit: 250.08
Hassas alete bak: sayıları birbirine çok yakın. Güven veriyor. Basit alet ise her seferinde farklı bir şey söylüyor.
Ama ortalamaya bak. Basit alet gerçeğe yakın. Hassas alet, her seferinde aynı yanlışı tekrar ediyor.
Şimdi sen yaz
İki adım.
1. Uyuşmazlığı yakala. İki aletin ortalaması 0,5 mm'den fazla farklıysa ekrana ALETLER UYUSMUYOR! yaz. İki ölçüm uyuşmuyorsa, bu bir alarmdır — görmezden gelinecek bir gürültü değil.
2. Hangisi yanlış? Uzunluğunu kesin olarak bildiğin bir nesneyi ölç — bir referans. Diyelim elinde tam 100 mm olduğu bilinen bir parça var. İki aletle de ölç. Hangisi 100'den uzaklaşıyorsa, hatalı olan o.
// ŞİMDİ SEN YAZ:
// 1) ortalamalar 0.5'ten fazla farkliysa uyari yaz.
// 2) 100 mm'lik referansi iki aletle de 100 kez olc,
// ortalamalarini yazdir.
🔍 İpucu 1
Birinci adım: iki ortalamanın farkını al. Ama fark eksi de çıkabilir — abs() fonksiyonu bir sayının işaretini atar. abs(-3.2) sonucu 3.2.
🔍 İpucu 2
İkinci adım: yukarıdaki 100 ölçümlük döngünün aynısı, sadece GERCEK yerine 100.0 yazıyorsun.
✅ Cevap
float ortH = toplamH / 100;
float ortB = toplamB / 100;
if (abs(ortH - ortB) > 0.5) {
Serial.println("ALETLER UYUSMUYOR!");
}
float refH = 0;
float refB = 0;
for (int i = 0; i < 100; i++) {
refH = refH + hassasOlc(100.0);
refB = refB + basitOlc(100.0);
}
Serial.print("referans (100 mm) -> hassas: ");
Serial.print(refH / 100);
Serial.print(" basit: ");
Serial.println(refB / 100);
Sonuç: hassas alet referansı 101.30 ölçüyor, basit alet 100'e yakın. Hassas aletin kendisinde 1,3 mm'lik bir kayma var.
Buna kalibrasyon deniyor: bir ölçüm aletini, cevabını önceden bildiğin bir şeyle test etmek. Hubble ekibinin yapması gereken tam olarak buydu — iki alet uyuşmadığında hassas olana inanmak yerine, ikisini de bilinen bir referansla sınamak.
Bir şey daha: kaymayı bulduktan sonra, hassas aleti çöpe atmana gerek yok. Her ölçümden 1,3 çıkarırsan, hem hassas hem doğru bir alete sahip olursun. Hubble'a takılan "gözlük" de tam olarak bunu yaptı.
📄 Görevin tam kodu
const float GERCEK = 250.0;
float hassasOlc(float uzunluk) {
float kayma = 1.3;
return uzunluk + kayma + random(-1, 2) * 0.01;
}
float basitOlc(float uzunluk) {
return uzunluk + random(-30, 31) * 0.1;
}
void setup() {
Serial.begin(9600);
float toplamH = 0;
float toplamB = 0;
for (int i = 0; i < 100; i++) {
toplamH = toplamH + hassasOlc(GERCEK);
toplamB = toplamB + basitOlc(GERCEK);
}
float ortH = toplamH / 100;
float ortB = toplamB / 100;
Serial.print("250 mm -> hassas: ");
Serial.print(ortH);
Serial.print(" basit: ");
Serial.println(ortB);
if (abs(ortH - ortB) > 0.5) {
Serial.println("ALETLER UYUSMUYOR!");
}
float refH = 0;
float refB = 0;
for (int i = 0; i < 100; i++) {
refH = refH + hassasOlc(100.0);
refB = refB + basitOlc(100.0);
}
Serial.print("referans (100 mm) -> hassas: ");
Serial.print(refH / 100);
Serial.print(" basit: ");
Serial.println(refB / 100);
}
void loop() {
}
Olmadıysa
| Ne görüyorsun | Ne yap |
|---|---|
| Hassas alet hep tam aynı sayı | Normal. random(-1, 2) sadece −1, 0, 1 veriyor, fark çok küçük |
| Basit aletin ortalaması 250'den 1'den fazla uzak | 100 yerine 5 ölçüm almış olabilirsin. Az ölçümde ortalama da dağınık olur |
| Uyarı hiç çıkmıyor | > yerine < yazmışsın, ya da abs kullanmayı unuttun |
abs tuhaf bir sonuç veriyor |
Bazı kartlarda abs tam sayı içindir. fabs(ortH - ortB) dene |
Kendini test et
Soru: Hubble'daki asıl hata neydi: aynanın yanlış parlatılması mı, yoksa başka bir şey mi?
Cevabı gör
Ayna yanlış parlatıldı, evet. Mercek 1,3 mm kaydı, evet. Ama bunlar her projede olabilecek kazalar.
Asıl hata, iki alet farklı şey söylediğinde, daha çok güvenilen aletin cevabını seçmekti. Uyuşmazlık bir uyarıydı. Görmezden gelindi.
Ders şu: bir ölçümün sonucunu beğenmen, onu doğru yapmaz. Bir alet ne kadar hassas, ne kadar pahalı, ne kadar güvenilir görünürse görünsün, onu bilinen bir şeyle test etmeden ona inanma.
Bitirdin.
Beş olay, beş ders:
| Olay | Ders |
|---|---|
| Ariane 5 | Kopyaladığın kodun varsayımlarını da kopyalarsın |
| Mars sondası | Sayı tek başına anlam taşımaz, birimini adına yaz |
| Linux gizli kapısı | Hatayı yapmamaya güvenme, yapılamaz hale getir |
| 49,7 gün | Her sayaç bir gün dolar, kodunu ona göre yaz |
| Hubble | Hassas olan her zaman doğru olan değildir |
Bu hataları sen de yapacaksın. Herkes yapıyor. Fark, artık onları tanıyacak olman — ve bir şey ters gittiğinde nereye bakacağını bilmen.
Bunları gerçek bir sistemde dene
Bu eğitimdeki her ders, kitlerin içinde gerçek bir donanımla karşına çıkıyor:
- Akıllı sera — sensörün sayısına anlam vermek,
millis()ile beklemek - Ev güvenlik — yetki kontrolünde
==, kilidin zamanlaması - Afet haberleşme ağı — 16 bitlik ivme ölçümleri, bir istasyonun sessizce bozulduğunu fark etmek
Ekranda gördüğün hatayı bir pompanın, bir kilidin, bir telsizin üzerinde görmek bambaşka bir şey.
Takıldın, hata tablosu da yetmedi mi?
WhatsApp'tan sor — hangi görevdesin, ekranda ne yazıyor, devrenin fotoğrafı.
Şimdi gerçek bir sistem kur
Buraya kadar yazdığın kod ekranda kaldı. Kitlerde aynı kod bir sensöre, bir motora, bir kilide bağlanıyor — çalıştığını gözünle görüyorsun.