2 puan yazan GN⁺ 2024-10-06 | 1 yorum | WhatsApp'ta paylaş
  • Chebyshev approximation calculator, matematiksel fonksiyon yaklaşıklama kodunu web üzerinde üreten bir araçtır
  • Kullanıcı f(x), x min, x max, Terms ile yaklaştırılacak fonksiyonu, aralığı ve terim sayısını belirleyebilir
  • Match x min x max seçeneği ve Coefficients alanı üzerinden aralık sınırlarını ve katsayı değerlerini görme ya da ayarlama akışı sunar
  • Generated code alanında hesaplama sonucu kod biçiminde gösterilir; örnek ekranda c0 ile c10 arasındaki katsayılar görünür
  • GitHub deposu bağlıdır, bu sayede web aracının uygulama kodu doğrudan incelenebilir

Chebyshev yaklaşıklama kodu üreticisi

  • Chebyshev approximation calculator, matematiksel fonksiyonları verimli biçimde yaklaştırmak için kod üretir
  • Yaklaşıklama koşulları web arayüzünde girilir
    • f(x): Yaklaştırılacak fonksiyon
    • x min: Aralığın en küçük değeri
    • x max: Aralığın en büyük değeri
    • Terms: Kullanılacak terim sayısı
    • Match x min x max: Aralık sınırlarıyla ilgili seçenek

Katsayıları inceleme ve üretilen kod

  • Ekran Coefficients alanı ile Generated code alanına ayrılmıştır
  • Örnek olarak gösterilen katsayılar c0 ile c10 arasında incelenebilir
    • c0 = 0.16793649417016518
    • c1 = -0.12411164956092625
    • c2 = -0.09756341588422193
    • c3 = 0.1800765790518846
    • c4 = -0.06972963647223016
    • c5 = -0.09250127939333941
    • c6 = 0.18076946080324185
    • c7 = 0.15990613621816677
    • c8 = -0.028659588693985123
    • c9 = -0.09494966104347571
    • c10 = -0.04980429834982578
  • Ekranda ayrıca c11 ile c39 arasındaki katsayı öğeleri de gösterilir

Kod deposu

1 yorum

 
GN⁺ 2024-10-06
Hacker News yorumları
  • Harika. 1974 civarında IBM 360 assembly ile karekök hesaplayan bir fonksiyon yazıp karşılığında para almıştım
    Lisansın son yılındaydım ve mümkün olduğunca verimli yapmam istenmişti. Girdiyi 0 ile 1 arasına ölçekledikten sonra ilk tahmin için Chebyshev yaklaşımı kullandım, ardından çözümü bulmak için Newton yönteminin açılmış 2 mi 3 mü yinelemesini uyguladım. Kod yazarak kazandığım ilk paraydı

    • Böyle hikâyeleri seviyorum. Sayısal analizdeki ilk dersimde hesaplamanın potansiyelini ilk kez gerçekten fark edip gözümün açıldığı anı hâlâ hatırlıyorum
  • Gerçekten iyi yapılmış. Bu tür yaklaşımların ne kadar verimli olduğuna hayran kaldım; 8 bit bilgisayarlarda trigonometrik fonksiyonların veya başka matematik fonksiyonlarının neden o şekilde uygulandığını da çok daha iyi anladım
    BBC Research Department'ın 1969'da bu yaklaşımın neden harika olduğunu ele alan güzel bir özgün belgesi de var: https://downloads.bbc.co.uk/rd/pubs/reports/1969-10.pdf
    Yalnızca Taylor yaklaşımı gördüyseniz başta biraz sihir gibi görünebilir

    • Evet. Matematiksel tarafı da öyle; pratikte birkaç satır koda indirgenmesi de epey sihirli hissettiriyor
  • Daha önce Sollya ile iyi sonuçlar almıştım: https://www.sollya.org/
    Ancak sonuçlar iyi olsa da yazılımın kendisini kullanmak biraz zahmetli

    • Sollya muhtemelen bu iş için modern araçların en iyisi. İçeride Remez yaklaşımı yapıp sonra LLL ile kayan noktaya niceliyor; Chebyshev'i doğrudan kullanmıyor
  • Math.sin(x)/x, yani sinc fonksiyonunu [-3,3] aralığında 7 terimle yaklaştırınca c0...c6 katsayılarının hepsi NaN oluyor. Bu bir bug mı?
    Geçici çözüm olarak x 0'a yakınsa doğrudan 1.0'a zorluyorum
    if(Math.abs(x) > 1e-8 ){ Math.sin(x)/x } else { 1.0 }

    • Tam olarak bug demek zor. Kod muhtemelen Chebyshev katsayılarını bulmak için fonksiyonu x_j = (xmin) + (xmax - xmin)/2(1 + cos(pi[0..j-1]/(j-1)) gibi ızgara noktalarında değerlendiriyordur; bunlardan biri tam olarak 0 olursa Math.sin(0)/0 hesaplanır ve NaN çıkar
      Başka bir geçici çözüm de [-3,+3.0000001] gibi hafif asimetrik bir aralık kullanmak
    • Buradaki sorun, ilk ifadenin x=0 noktasında iyi tanımlı olmaması ve yaklaşım kodunun orada düşmesi gibi görünüyor. Kod biraz üzücü
    • Evet, bu bir bug. Fonksiyon tüm Chebyshev düğümlerinde tanımlı değilse uygulama hata göstermeli. Zaten bulduğunuz gibi şimdilik kolayca etrafından dolaşılabiliyor
  • Chebyshev polinomları yaklaşımda o kadar güçlü ve çok yönlü ki insanlar fazla iyi olduğu için dolandırıcılık gibi sanıp kullanmıyor
    İlk denenecek yöntem Chebyshev olmalı. Sinir ağları son çare olarak kullanılmalı

  • Harika. Yakın zamanda böyle bir şey yapmak istemiştim; yaklaşımı hesaplayan kod bulmanın şaşırtıcı derecede zor olduğunu gördüm
    Bir dahaki sefere bir fonksiyonu hızlıca yaklaştırmam gerektiğinde kullanmak için yer imlerine ekledim

    • Gerçekten çalışan Chebyshev yaklaşım kodu bulmanın ben de şaşırtıcı derecede zor olduğunu gördüm. Umarım bu proje bunu değiştirir
  • Chebyshev kara büyü gibi. Lisansüstü bir derste türetimini görmüş olmama rağmen hâlâ öyle geliyor

  • Nick Trefethen ve diğerlerinin Chebfun'ından da mutlaka bahsetmek gerek. Bu konuyu akla gelebilecek neredeyse her yöne genişleten bir araç
    Chebfuns, gerçek matematiksel sayılar için kayan noktalı sayıların karşılığı gibi, fonksiyonlar için bir karşılık olarak görülebilir. Gerçekten etkileyici bir yazılım
    https://www.chebfun.org

    • Katılıyorum. O taraftaki yöntemler çok güçlü ve hızlı. Chebyshev ve ultraküresel fonksiyon tabanlı tekniklerle çoğu fonksiyon çok hızlı biçimde makine hassasiyeti düzeyinde yaklaştırılabiliyor; ardından bu temsil daha kolay manipüle edilebiliyor
      Bu sayede diferansiyel-cebirsel denklem çözümlerini makine hassasiyetinde bulmak veya tek değişkenli bir fonksiyonun global minimumunu/maksimumunu bulmak gibi çeşitli yöntemler mümkün oluyor
      Bildiğim kadarıyla şu anda başka algoritmalar kullanıyorlar, ancak Chebfun'ın eskiden kullandığı temel metodoloji Trefethen'in Spectral Methods in Matlab kitabının 6. bölümünde görülebilir. Ultraküresel fonksiyonları kullanan daha yeni metodoloji Olver ve Townsend'ın SIAM Review makalesi A Fast and Well-Conditioned Spectral Method içinde yer alıyor
  • Merak ettiğim bir şey var, burada sormam uygun mu bilmiyorum. Eskiden Nintendo 64'ün sinüs fonksiyonunu hesaplayacak gücü olmadığı için 0'dan 2π'ye kadar bir arama tablosu kullandığını ve tablo boyutunu küçültmek için akıllıca teknikler de kullandığını anlatan bir video izlemiştim
    Bir sinir ağını eğitip ağırlıkları saklamak ya da bir fonksiyon oluşturup katsayıları saklayarak sinüs·kosinüs hesaplamak da mümkün olur muydu?

    • Sinir ağları içeride çoğu zaman trigonometrik fonksiyonlar kullanır; bu yüzden gerekenden çok daha fazla hesaplama gerektirirdi
      Biraz CPU döngüsü kalıyorsa, seyrek bir arama tablosu değerlerini ilk tahmin olarak alıp sayısal yaklaşım tekniklerini birkaç kez yineleyen hibrit yaklaşım kullanılabilir. Ya da asıl yazıdaki gibi polinom yaklaşımının baştaki birkaç katsayısını saklamak yeterli olur
    • Aşina değilseniz CORDIC'e bakmanız iyi olur. Eskiden yaygın bir trigonometrik fonksiyon numarasıydı; bugün de gömülü tarafta bir ölçüde kullanılıyor
      Sinir ağları, bir fonksiyonun örneklerine sahip olup nasıl yaklaştıracağınızı bilmediğinizde faydalı olabilir; ama burada durum bu değil
    • Herhangi bir fonksiyonu hesaplatmak için sinir ağı eğitmek elbette mümkün, ama sinüs gibi iyi bilinen bir fonksiyon için hiç mantıklı değil
      Sinir ağları, matematiksel olarak analiz etmesi kolay olmayan şeyleri değerlendirmek gerektiğinde harika bir çözüm; ancak trigonometrik fonksiyonları hesaplamak ve yaklaştırmak için zaten bilinen birçok teknik var
      Sinüsü hesaplamak için sinir ağı eğitmek, bir string'i ters çevirmek için LLM kullanmanın matematik versiyonu gibi. Yapılabilir, ama ancak problemin daha doğrudan bir yaklaşımla özünde çözülebileceğini bilmediğinizde akla gelecek bir fikir
      AI/ML tekniklerini kullanmadan önce matematikçilerin zaten bir çözümü olup olmadığına bakmak her zaman değerli. Günümüzde, geliştiricinin bilmediği ama zaten bilinen, verimli ve hatta optimal çözümleri olan problemlere AI/ML uygulamak için çok çaba harcanıyor olması muhtemel
    • Sinir ağları özünde eğri uydurma olduğundan mümkün. Bu video yardımcı olabilir: https://www.youtube.com/watch?v=FBpPjjhJGhk But what is a neural network REALLY?
      Sinir ağlarının asıl gücü, giriş sayısı birkaç tane değil çok fazla olduğunda ortaya çıkar. sin(x) kadar basit bir durumda, burada paylaşılan araç gibi başka yöntemler var
    • Genelde kullanılan tasarruf tekniği, yalnızca 0'dan π/2'ye kadar olan kısmı tabloda saklayıp 2 ek indeks biti ile kalan üç çeyreği üretmektir
  • Çok hoş. Merak edip iyi yaklaştırılamayan bir fonksiyonu ne kadar hızlı oluşturabileceğimi görmek istedim
    Şimdiye kadarki en iyisi Math.cos(x * Math.exp(Math.cos(x * x))) oldu. Çok fazla bileşim içerdiği için hızlı salınımlar ve dik eğimler oluşuyor; bu da Chebyshev ile kolay yaklaştırmayı zorlaştırıyor