WebHU - Programozási kérdések és válaszok

scipy kvadratúra integráció pontossági figyelmeztetés és nan különbség értékek

A függvények bonyolult kombinációját próbálom integrálni a scipy.integration.quadrature használatával, és pontossági figyelmeztetéseket ad, és a „Legújabb különbség” értékei a következők: (gulp) nan:

'C:\Program Files\Anaconda3\lib\site-packages\scipy\integrate\quadrature.py:199: Pontosság Figyelmeztetés: a maxiter (1000) túllépve. Legutóbbi különbség = nan'

A probléma hasonlónak tűnik ehhez a bejegyzéshez, de más integrációs módszerrel, és a paraméterek eltérőek.

SciPy Quad integráció: Pontossági figyelmeztetés

Az eredeti függvénykészlet közzététele helyett itt van egy példa egy egyszerűbb függvényre, amely figyelmeztetést is küld, bár a „legutóbbi különbség” értékek itt valójában definiált számok.

def func(phi):
    return phi**3        

def func2(phi):
    return 1/(phi)


def int(phi):
    return func(phi)/abs(2/func2(phi)**5)

res, err = integrate.quadrature(int, 0, 1, maxiter=10)
print("The numerical result is {:f} (+-{:g})"
.format(res, err))

Kérdés: miért fordul elő ez a viselkedés (figyelmeztetés és értékek)?

Megjegyzem, hogy a maxiter érték itt történő növelése (pl. 10-es hatványokkal) drasztikusan megváltoztatja az eredményt, de a Legutóbbi különbségértékek nőnek - arra utal, hogy az integrál eltér az eredménytől.

Érdekes módon a scipy.integration.quad használata ugyanazokkal a bemenetekkel figyelmeztetést ad: „Az integrál valószínűleg divergens, vagy lassan konvergens. warnings.warn(msg, IntegrationWarning)'. Tehát ez csak egy rossz funkcióválasztás esete az integrációhoz? Vegye figyelembe, hogy ez nem a tényleges funkció, hanem az, amely hasonló (de nem azonos) viselkedést biztosít.

26.03.2018

Válaszok:


1

A figyelmeztetés alapvetően azt jelenti, hogy az iterációk száma nem elegendő a kívánt tűréshatáron belüli megoldás megtalálásához. Tehát az első lépés az iterációk számának növelése. Ez azonban itt nem működik, mert a függvény nem akar (numerikusan) integrálni.

Mi a baj a funkcióval? Íme egy még egyszerűbb funkció, ugyanazzal a viselkedéssel:

def fint(phi):
    return 1/phi

Így a probléma tisztábban látható: van egy pólus (a függvény inf-t ad vissza) a phi=0-nál. Nem számít, hány iterációt használunk, mindig lesznek egyre nagyobb értékek, minél közelebb kerül a 0-hoz.

Ha nem vesszük bele a pólust az integrációs tartományba, akkor nincs figyelmeztetés:

res, err = integrate.quadrature(fint, 0.5, 1, maxiter=100)
print("The numerical result is {:f} (+-{:g})".format(res, err))

A számszerű eredmény: 0,693147 (+-6,53485e-10)

(Nézd, milyen kicsi a hiba?)

Van még egy finomság az eredeti figyelmeztetéssel kapcsolatban: "Legújabb eltérés = nan". Ez azt jelzi, hogy a bonyolult függvényei nan értékeket produkálnak. Ez gyakran a 0/0, inf/inf, inf - inf, ...

Ezt egy másik egyszerű funkcióval reprodukálhatjuk:

def fint(phi):
    return phi/phi

Ez alapvetően egy állandó érték, apró csúnyasággal a phi = 0-nál.

res, err = integrate.quadrature(fint, -1, 1, maxiter=100)
print("The numerical result is {:f} (+-{:g})".format(res, err))

A számszerű eredmény: 2,000000 (+-nan)

RuntimeWarning: érvénytelen érték található a true_divide visszatérési phi/phi-ben

Pontosság Figyelmeztetés: a maxiter (100) túllépve. Legutóbbi különbség = nan

Összefoglalva, nem minden funkció integrálható bármely tartományba. És nem minden integrálható függvény alkalmas numerikus integrációra.

27.03.2018
  • Köszönöm, elkezdek átadni néhány értéket, hogy ellenőrizzem az eredeti függvényeket a problémát okozó bemeneteknél. 27.03.2018
  • Új anyagok

    A rádiógomb ellenőrzött eseményének használata a jQueryben
    Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

    Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
    Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

    Miért érdemes elkezdeni a kódolást 2023-ban?
    01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

    🎙 Random Noise #2  – Örökbefogadás és hit
    az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

    A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
    A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

    5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
    Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

    Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
    A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..