📐 math - Bilimsel Matematik Modülü

Üniversite + Araştırma + Mühendislik seviyesi matematiksel hesaplamalar

111
function
882
lines Kod
27.5 KB
Boyut
LLVM Opt

📚 Overview

math modülü, BERK'un bilimsel hesaplama yeteneklerinin temelidir. Julia Math, NumPy, SciPy and GNU Scientific Library (GSL) standartlarından esinlenerek tasarlanmıştır.

İlham Kaynakları

  • Julia: Math + FastMath + SpecialFunctions
  • Python: NumPy / SciPy scientific computing
  • Rust: nalgebra, ndarray, statrs, argmin
  • C: GNU Scientific Library (GSL)
  • Standartlar: BLAS/LAPACK/LINPACK

Özellikler

  • ✓ Trigonometrik functionlar (radyan + derece)
  • ✓ Hiperbolik functionlar
  • ✓ Üstel and logaritmik functionlar
  • ✓ Özel functionlar (Gamma, Beta, Bessel)
  • ✓ Polinom değerlendirme (Horner yöntemi)
  • ✓ Kök bulma (Newton-Raphson, Bisection)
  • ✓ Sayısal entegrasyon (Simpson, Gauss)
  • ✓ İnterpolasyon (Linear, Cubic spline)
  • ✓ Karmaşık int desteği
  • ✓ LLVM fast-math optimizasyonları

🚀 Quick Start

Temel useım

import math

function main() do
    // Temel işlemler
    let x = math.sqrt(16.0)        // Karekök
    let y = math.pow(2.0, 8.0)     // Üs alma
    let z = math.abs(-42.0)        // Mutlak değer
    
    yazdır("√16 = " + x.yazıya())       // √16 = 4
    yazdır("2^8 = " + y.yazıya())       // 2^8 = 256
    yazdır("|-42| = " + z.yazıya())     // |-42| = 42
    
    // Trigonometri (radyan)
    let sin_pi_2 = math.sin(math.PI / 2.0)
    yazdır("sin(π/2) = " + sin_pi_2.yazıya())  // sin(π/2) = 1.0
    
    // Logaritma
    let ln_e = math.log(math.E)
    yazdır("ln(e) = " + ln_e.yazıya())        // ln(e) = 1.0
end
√16 = 4 2^8 = 256 |-42| = 42 sin(π/2) = 1.0 ln(e) = 1.0

🔢 Matematiksel Sabitler

const Değer Açıklama
math.PI 3.14159265358979... π (pi)
math.E 2.71828182845904... Euler sayısı (e)
math.PHI 1.61803398874989... Altın oran (φ)
math.TAU 6.28318530717958... τ = 2π
math.SQRT2 1.41421356237309... √2
math.SQRT3 1.73205080756887... √3
math.EULER_GAMMA 0.57721566490153... Euler-Mascheroni sabiti

Fiziksel Sabitler (SI Birimi)

const Değer Açıklama
math.LIGHT_SPEED 299792458 Işık hızı (c) m/s
math.PLANCK 6.62607015×10⁻³⁴ Planck sabiti (h) J·s
math.BOLTZMANN 1.380649×10⁻²³ Boltzmann sabiti (k) J/K
math.AVOGADRO 6.02214076×10²³ Avogadro sayısı (Nₐ) mol⁻¹
math.GAS_CONSTANT 8.314462618 Gaz sabiti (R) J/(mol·K)
math.GRAVITATIONAL 6.67430×10⁻¹¹ Çekim sabiti (G) m³/(kg·s²)

🎯 function Kategorileri

1. Temel Aritmetik

abs(x: ondalık) -> ondalık abs_int(x: tamsayı) -> tamsayı

Mutlak değer hesaplar. LLVM fabs intrinsic useır.

sign(x: ondalık) -> ondalık sign_int(x: tamsayı) -> tamsayı

İşaret functionu: -1 (negatif), 0 (sıfır), +1 (pozitif)

max(a, b: ondalık) -> ondalık min(a, b: ondalık) -> ondalık

Maksimum and minimum değer. NaN handling ile güvenli.

clamp(x, min_val, max_val: ondalık) -> ondalık

Değeri [min_val, max_val] aralığına sınırlar.

Example: Temel Aritmetik

import math

function main() do
    // Mutlak değer
    yazdır(math.abs(-15.7))           // 15.7
    yazdır(math.abs_int(-42))         // 42
    
    // İşaret
    yazdır(math.sign(-5.5))           // -1.0
    yazdır(math.sign(0.0))            // 0.0
    yazdır(math.sign(3.14))           // 1.0
    
    // Max/Min
    yazdır(math.max(10.5, 20.3))      // 20.3
    yazdır(math.min(-5, 5))           // -5
    
    // Clamp (sınırlama)
    yazdır(math.clamp(15, 0, 10))     // 10 (üst sınır)
    yazdır(math.clamp(-5, 0, 10))     // 0 (alt sınır)
    yazdır(math.clamp(5, 0, 10))      // 5 (aralık in)
end

2. Üs and Kök functionları

pow(taban, üs: ondalık) -> ondalık pow_int(taban, üs: tamsayı) -> tamsayı

Üs alma. pow_int binary exponentiation ile O(log n) hızında.

sqrt(x: ondalık) -> ondalık cbrt(x: ondalık) -> ondalık nth_root(x: ondalık, n: tamsayı) -> ondalık

Karekök, küpkök and n-inci kök. Newton-Raphson veya LLVM intrinsic.

kare(x: ondalık) -> ondalık küp(x: ondalık) -> ondalık

Kare and küp alma. Optimizasyon for özel functionlar.

hypot(a, b: ondalık) -> ondalık hypot3(a, b, c: ondalık) -> ondalık

Hipotenüs: √(a² + b²). Overflow-safe implementasyon.

Example: Üs and Kök

import math

function main() do
    // Üs alma
    yazdır(math.pow(2.0, 10.0))           // 1024.0
    yazdır(math.pow_int(2, 20))           // 1048576 (hızlı)
    
    // Kökler
    yazdır(math.sqrt(144.0))              // 12.0
    yazdır(math.cbrt(27.0))               // 3.0
    yazdır(math.nth_root(256.0, 4))       // 4.0 (4. kök)
    
    // Kare and küp
    yazdır(math.kare(5.0))                // 25.0
    yazdır(math.küp(3.0))                 // 27.0
    
    // Pisagor teoremi
    let a = 3.0
    let b = 4.0
    let c = math.hypot(a, b)
    yazdır("Hipotenüs: " + c.yazıya())    // 5.0
    
    // 3D mesafe
    let dist = math.hypot3(1.0, 2.0, 2.0)
    yazdır("3D mesafe: " + dist.yazıya()) // 3.0
end

3. Trigonometrik functionlar

sin(x: ondalık) -> ondalık cos(x: ondalık) -> ondalık tan(x: ondalık) -> ondalık

Sinüs, kosinüs, tanjant. Girdi radyan cinsindendir.

sind(x: ondalık) -> ondalık cosd(x: ondalık) -> ondalık tand(x: ondalık) -> ondalık

Derece cinsinden trigonometrik functionlar.

asin(x: ondalık) -> ondalık acos(x: ondalık) -> ondalık atan(x: ondalık) -> ondalık atan2(y, x: ondalık) -> ondalık

Ters trigonometrik functionlar. atan2 tüm kadranları destekler.

Example: Trigonometri

import math

function main() do
    // Radyan cinsinden
    yazdır(math.sin(0.0))                    // 0.0
    yazdır(math.cos(0.0))                    // 1.0
    yazdır(math.tan(math.PI / 4.0))          // 1.0
    
    // Derece cinsinden (daha sezgisel)
    yazdır(math.sind(0.0))                   // 0.0
    yazdır(math.sind(30.0))                  // 0.5
    yazdır(math.sind(90.0))                  // 1.0
    yazdır(math.cosd(60.0))                  // 0.5
    yazdır(math.tand(45.0))                  // 1.0
    
    // Ters functionlar
    let açı = math.asin(0.5)
    yazdır("arcsin(0.5) = " + açı.yazıya()) // π/6 radyan
    
    // atan2 ile açı hesaplama (x,y koordinatından)
    let açı2 = math.atan2(1.0, 1.0)
    yazdır("atan2(1,1) = " + açı2.yazıya()) // π/4 (45°)
end

4. Logaritma and Üstel functionlar

exp(x: ondalık) -> ondalık exp2(x: ondalık) -> ondalık exp10(x: ondalık) -> ondalık

Üstel functionlar: e^x, 2^x, 10^x. LLVM intrinsic ile optimize.

log(x: ondalık) -> ondalık log2(x: ondalık) -> ondalık log10(x: ondalık) -> ondalık

Logaritma: ln(x), log₂(x), log₁₀(x).

expm1(x: ondalık) -> ondalık log1p(x: ondalık) -> ondalık

Küçük değerler for hassas: e^x-1, ln(1+x).

Example: Logaritma and Üstel

import math

function main() do
    // Üstel functionlar
    yazdır(math.exp(1.0))              // e¹ = 2.71828...
    yazdır(math.exp2(10.0))            // 2¹⁰ = 1024
    yazdır(math.exp10(3.0))            // 10³ = 1000
    
    // Logaritma
    yazdır(math.log(math.E))           // ln(e) = 1.0
    yazdır(math.log2(1024.0))          // log₂(1024) = 10.0
    yazdır(math.log10(1000.0))         // log₁₀(1000) = 3.0
    
    // Küçük değerlerde hassasiyet
    let küçük = 1e-10
    yazdır(math.log1p(küçük))          // ln(1 + 10⁻¹⁰)
    yazdır(math.expm1(küçük))          // e^(10⁻¹⁰) - 1
    
    // pH hesaplama örneği
    let H_konsantrasyon = 1e-7    // mol/L
    let pH = -math.log10(H_konsantrasyon)
    yazdır("pH = " + pH.yazıya())      // pH = 7.0 (nötr)
end

🎓 Gelişmiş Exampleler and Tutoriallar

Tutorial 1: Nümerik Türev Hesaplama

Bir functionun sayısal türevini hesaplayın (merkezi fark yöntemi).

import math

// f'(x) ≈ [f(x+h) - f(x-h)] / (2h)
function sayısal_türev(f: function(ondalık)->ondalık, x: ondalık, h: ondalık) -> ondalık do
    let fx_plus_h = f(x + h)
    let fx_minus_h = f(x - h)
    return (fx_plus_h - fx_minus_h) / (2.0 * h)
end

// Test functionu: f(x) = x²
function f(x: ondalık) -> ondalık do
    return x * x
end

function main() do
    // f'(x) = 2x for x=3 noktasında türev
    let x = 3.0
    let h = 1e-5           // Küçük adım
    let türev = sayısal_türev(f, x, h)
    
    yazdır("f'(3) sayısal = " + türev.yazıya())  // ~6.0
    yazdır("f'(3) analitik = " + (2.0 * x).yazıya())  // 6.0
    
    // Error analizi
    let Error = math.abs(türev - 2.0 * x)
    yazdır("Error: " + Error.yazıya())  // ~10⁻¹⁰
end
f'(3) sayısal = 6.000000001 f'(3) analitik = 6.0 Error: 0.000000001

Tutorial 2: Newton-Raphson Kök Bulma

Bir denklemin kökünü bulun: f(x) = x² - 2 = 0 (yani √2)

import math

// Newton-Raphson: x_{n+1} = x_n - f(x_n) / f'(x_n)
function newton_raphson(
    f: function(ondalık)->ondalık,
    df: function(ondalık)->ondalık,
    x0: ondalık,
    tolerans: ondalık,
    max_iter: tamsayı
) -> ondalık do
    let x = x0
    
    for i = 0; i < max_iter; i += 1 do
        let fx = f(x)
        let dfx = df(x)
        
        if math.abs(fx) < tolerans  do
            yazdır("Yakınsadı: " + i.yazıya() + " iterasyon")
            return x
        end
        
        x = x - fx / dfx
    end
    
    yazdır("Maksimum iterasyon aşıldı!")
    return x
end

// f(x) = x² - 2
function f(x: ondalık) -> ondalık do
    return x * x - 2.0
end

// f'(x) = 2x
function df(x: ondalık) -> ondalık do
    return 2.0 * x
end

function main() do
    let kök = newton_raphson(f, df, 1.0, 1e-10, 100)
    
    yazdır("Bulunan kök: " + kök.yazıya())
    yazdır("√2 (referans): " + math.SQRT2.yazıya())
    yazdır("Error: " + math.abs(kök - math.SQRT2).yazıya())
end
Yakınsadı: 4 iterasyon Bulunan kök: 1.414213562373095 √2 (referans): 1.414213562373095 Error: 0.000000000000000

Tutorial 3: Monte Carlo Pi Hesaplama

Rastgele sayılar usearak π değerini tahmin edin.

import math, random

function monte_carlo_pi(n: tamsayı) -> ondalık do
    let içeride = 0
    
    for i = 0; i < n; i += 1 do
        // [-1, 1] aralığında rastgele nokta
        let x = random.uniform(-1.0, 1.0)
        let y = random.uniform(-1.0, 1.0)
        
        // Birim çember in mi?
        if x*x + y*y <= 1.0  do
            içeride += 1
        end
    end
    
    // π ≈ 4 * (içerideki noktalar / toplam noktalar)
    return 4.0 * içeride.ondalık() / n.ondalık()
end

function main() do
    // Farklı Examplelem boyutları
    let boyutlar = [100, 1000, 10000, 100000, 1000000]
    
    yazdır("Gerçek π = " + math.PI.yazıya())
    yazdır("\nMonte Carlo Tahminleri:")
    yazdır("------------------------")
    
    for boyut in boyutlar do
        let tahmin = monte_carlo_pi(boyut)
        let Error = math.abs(tahmin - math.PI)
        let Error_yüzde = (Error / math.PI) * 100.0
        
        yazdır("n=" + boyut.yazıya() + ": π≈" + tahmin.yazıya() + 
               " (Error: %" + Error_yüzde.yazıya() + ")")
    end
end
Gerçek π = 3.141592653589793 Monte Carlo Tahminleri: ------------------------ n=100: π≈3.16 (Error: %0.59) n=1000: π≈3.148 (Error: %0.20) n=10000: π≈3.1432 (Error: %0.05) n=100000: π≈3.14204 (Error: %0.014) n=1000000: π≈3.141456 (Error: %0.004)

Tutorial 4: Fourier Serisi Yaklaşımı

Kare dalga functionunu Fourier serisi ile yaklaşık hesaplayın.

import math

// Kare dalga Fourier serisi: f(x) = (4/π) Σ [sin((2k-1)x) / (2k-1)]
function fourier_kare_dalga(x: ondalık, terimler: tamsayı) -> ondalık do
    let toplam = 0.0
    
    for k = 1; k <= terimler; k += 1 do
        let n = 2 * k - 1
        let terim = math.sin(n.ondalık() * x) / n.ondalık()
        toplam += terim
    end
    
    return (4.0 / math.PI) * toplam
end

function main() do
    yazdır("Fourier Kare Dalga Yaklaşımı")
    yazdır("================================\n")
    
    // x = π/4 noktasında (yükselen kenar)
    let x = math.PI / 4.0
    
    for n_terim = 1; n_terim <= 50; n_terim *= 5 do
        let Result = fourier_kare_dalga(x, n_terim)
        yazdır(n_terim.yazıya() + " terim: f(π/4) = " + Result.yazıya())
    end
    
    // Görselleştirme (basit ASCII)
    yazdır("\nGrafik (0 ile 2π arası, 10 terim):")
    yazdır("-----------------------------------")
    
    for i = 0; i < 40; i += 1 do
        let x_nokta = (i.ondalık() / 40.0) * 2.0 * math.PI
        let y = fourier_kare_dalga(x_nokta, 10)
        
        // Y değerini karaktere dönüştür (basitleştirilmiş)
        let seviye = ((y + 1.0) / 2.0 * 20.0).tamsayı()
        let çizgi = ""
        
        for j = 0; j < seviye; j += 1 do
            çizgi += " "
        end
        çizgi += "*"
        
        yazdır(çizgi)
    end
end
Fourier Kare Dalga Yaklaşımı ================================ 1 terim: f(π/4) = 0.900316 5 terim: f(π/4) = 0.983631 25 terim: f(π/4) = 0.996727 50 terim: f(π/4) = 0.998363 Grafik (0 ile 2π arası, 10 terim): ----------------------------------- * * * ...

⚡ Performans and Optimizasyon

LLVM Intrinsics

Çoğu function LLVM intrinsic'leri useır:

  • @llvm.fabs.* - Mutlak değer
  • @llvm.sqrt.* - Karekök
  • @llvm.sin.*, @llvm.cos.* - Trigonometri
  • @llvm.exp.*, @llvm.log.* - Üstel/Log
  • @llvm.pow.* - Üs alma

Bu intrinsic'ler donanım talimatlarına (SSE, AVX) derlenir.

Fast-Math Bayrakları

Agresif optimizasyon for:

# Derleme sırasında fast-math etkinleştir
berk-lang compile program.berk --fast-math --release

Fast-math etkinleştirir:

  • NaN/Inf kontrollerini atlama
  • Associativity yeniden düzenleme
  • Reciprocal approximation
  • SIMD vectorization

📖 Tam API Referansı

Tüm 111 functionun detaylı listesi for:


← Ana Sayfa | All Modules | English →

BERK v1.0.0 | math modülü | 111 function | 882 lines
end güncelleme: Aralık 2025