Python işlevinde felaket iptali nasıl önlenir?


13

Bir işlevi sayısal olarak uygulamakta sorun yaşıyorum. Büyük giriş değerlerinde sonucun çok büyük bir sayının çok küçük bir sayının çarpımı olduğu gerçeğinden muzdariptir. Felaket iptalinin doğru terim olup olmadığından emin değilim, lütfen öyleyse düzeltin. Bir şeyin ters gittiğine dair kanıtlar:

resim açıklamasını buraya girin

6'nın daha büyük girdileri için salınımları ve 0.0 değerini atamayı nasıl önleyebilirim?

İşte benim işlevi:

import numpy as np

def func(x):
    t = np.exp(-np.pi*x)
    return 1/t*(1-np.sqrt(1-t**2))

Yanıtlar:


31

t1+1t2.
11t21+1t2

resim açıklamasını buraya girin


Fantastik! Bu tekniklerin ana hatlarıyla açıklandığı böyle bir kitap tavsiye edebilir misiniz?
Dipole

2
@Jack "Sayısal Algoritmaların Doğruluğu ve Kararlılığı" iyi bir üst düzey kitaptır. Herhangi bir giriş ders kitabı da bunu tartışacaktır.
Kirill

Bu grafiği çizmek için Wolfram Mathematica kullanıp kullanmadığınızı bilmek istiyorum.THX :)
xyz

Önem kaybını azaltan matematiksel ifadeleri matematiksel olarak eşdeğer yollarla yeniden yazmak için benzer numaralar toplayan ve / veya tartışan referanslar biliyor musunuz? Higham'ın kitabını okudum, ancak tartışma genel ve sonraki tüm bölümler lineer cebirle ilgili (şu anda benim konumum değil).
becko

@becko Benim deneyimime göre oldukça ad hoc. Formülünüzü doğru cevaplarla test etmenin bir yolu varsa (sadece ekstra hassasiyetli aritmetik ile oluştursanız bile), böylece ilk önce başarısız test durumlarına sahip olmadan sayısal kararsızlık aramaya gitmemeniz çok daha kolaydır. Bilinen tüm girdiler için çalışıyorsa, sayısal dengesizliğin herhangi bir yerde olup olmadığı konusunda gerçek bir sorun yoktur.
Kirill
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.