Cél: Az egyenlet megoldása, ahol adott, szép tulajdonságú (pl. folytonosan deriválható) függvény, azaz keressük az függvény gyökeit/zérushelyeit. Ekvivalensen megoldása az függvényre alkamazott gyökkereséssel.
Intervallumfelezés
Tegyük fel, hogy tudjuk, hogy egy adott intervallumon a függvényünknek van egy gyöke; például ezt onnan tudhatjuk, hogy a végpontokban különböző előjelű a függvény, pontosabban: . Tegyük fel, hogy ez fennáll és hogy . Ez utóbbi nem megszorítás, mert és gyökei ugyanott vannak.
Alapgondolat: Vizsgáljuk meg a függvény előjelét az pontban! Ha itt pozitív, az azt jelenti, hogy a keresett zérushely az intervallumban van, azaz itt érdemes folytatni a keresést. Ugyanakkor ha itt negatív, akkor a zérushely az intervallumban található, és itt kell tovább keresnünk. Ezt követően az előbbi gondolatot folytatjuk az új, kisebb intervallumokon, azaz vagy az , vagy a pontban vizsgáljuk a előjelet, és így tovább.
Az algoritmus addig fut, amíg értéke a vizsgált pontban nulla nem lesz (ez programok esetén a gépi hibák miatt ritkán következik be), vagy amikor a vizsgált intervallum már nagyon kicsi/rövid, de természetesen megadhatunk maximális lépésszámot is, amely után álljon le mindenképpen a program. Határértékben ez a módszer mindenképpen megtalál egy zérushelyet (ha több is van, akkor a zérushelyek közül valamelyiket).
1. Feladat
Fibonacci egyik cikkében szerepel az alábbi állítás: az
egyenlet gyöke Ellenőrizzük le az intervallumfelezéses módszerrel, hogy jól számolt-e!
Megoldás: Legyen a toleranciánk és indítsuk az iterációt az intervallumon!
Megoldás:
halving.py
def f(x):
return x*x*x + 2*x*x + 10*x - 20
def halving(f, a, b, tolerance):
assert f(a) * f(b) < 0
if f(a) > 0:
f = -f
while a - b > tolerance:
half = (a + b) / 2
if f(half) < 0:
a = half
else:
b = half
return a, b
print(halving(f, 1, 2, 1e-10))
$ python3 halving.py
> (1.3688081077998504, 1.368808107858058)
Fixpont-iteráció
Emlék: A Banach-féle fixponttétel következtében ha Banach-tér és kontrakció együtthatóval, akkor van fixpontja, amire ; továbbá az sorozat tetszőleges -beli pontból indítva -hoz fog tartani; továbbá választással látható, hogy
és
Emlék: Legyen végesdimenziós valós vektortér, nyílt halmaz, folytonosan differenciálható és legyen olyan, hogy az , azaz az -ből induló végű szakasz része -nak; ekkor
Ebből kapjuk a középérték-tétel magasabbdimenziós változatát:
Ha és kompakt, akkor
választással esetén ha az és pontok által határolt szakasz -ban van (pl. ha konvex), akkor
Ha (hívjuk ezt ráképezésnek) és , akkor kontrakció. Mivel teljes tér zárt részhalmaza teljes, ezért teljes, tehát -ra is alkalmazható a Banach-féle fixponttétel. Érdemes lehet megjegyezni, hogy általában nem vektortér, azonban az eredeti tér normája által generált metrikával a halmaz teljes metrikus tér, tehát a Banach-féle fixponttétel valóban alkalmazható.
2. Feladat
Oldjuk meg a egyenletet a valós számok halmazán. Keressünk alkalmas halmazon alkalmas kontrakciót, majd írjunk kódot amivel addig iteráljunk, míg két szomszédos lépés távolsága nem lesz -nél kisebb.
Megoldás:
Kell egy Lipschitz fuggveny mely megadja a egyenlet megoldasat.
Erre lehet hasznalni fixpont iteraciot, mert kontrakcio intervallumon
iteration.py
from math import cos
def fix_point_iteration(start, f, max_steps, tolerance):
x = start
step_counter = 1
while step_counter < max_steps:
change = f(x) - x
x = f(x)
if abs(change) < tolerance:
break
step_counter += 1
return f"Ended after {steps} iteration with value = {x}"
print(fix_point_iteration(0, cos, 100, 1e-5))
$ python3 iteration.py
> Ended after 30 iteration with value = 0.7390822985224023
A lineáris esettel analóg módon bizonyos feltételek mellett fixpontiterációt készíthetünk az alábbi átalakítással:
Az iterációt ugyanolyan módon el tudjuk végezni mint a lineáris esetben, amíg kontrakció. Ha nem az, akkor valamely megválasztása mellett még lehet esélyünk arra, hogy az függvény kontrakció legyen, a kérdés, hogy ezt hogy válasszuk meg.
Egy lehetséges választ kaphatunk erre a kérdésre az alábbi gradiens-módszerre vonatkozó tételben, mely analóg lesz a lineáris esetnél látottakkal, melyek szerint a Richardson iteráció tulajdonképpen egy állandó lépésközű Gradiens-ereszkedésnek felelt meg.
Gradiens-módszer
A gradiens-módszert is tudjuk alkalmazni nemlineáris feladatokra. A következő tételt alkalmazhatjuk speciális leképezések esetén. A tételt általános esetben mondjuk ki, egy Hilbert-tér operátor esetén, az egyenletre.
Tétel: Legyen valós Hilbert-tér (gondolhatunk -re is az Euklideszi skalárszorzattal ellátva) és legyen deriválható minden pontban, azaz létezik az lineáris operátor. Legyen önadjungált minden esetén. Tegyük fel, hogy léteznek állandók, hogy
Ekkor létezik olyan funkcionál, amelyre teljesül, hogy , és a funkcionál szigorúan konvex, továbbá, mint a lineáris esetben láthattuk:
pontosan akkor áll fenn, ha , azaz ha minimumhelye az leképezésnek. Ekkor tetszőleges esetén az
sorozat konvergál az -hoz, mellett.
Megjegyzés: Feladattól függően nem állandó lépésköz is választható, ezt azonban most nem tárgyaljuk.
Ez a tétel valamilyen értelemben analóg a lineáris esetben tanultakkal: a feltételek miatt létezik az egyenletben adott monoton függvény “primitív függvénye”, ami konvex is, így az erre felírt minimalizási feladat az eredeti feladatunk egyértelmű megoldása lesz.
3. Feladat
Gondoljuk meg mit jelentenek a tétel feltételei esetén, illetve azt is hogy a képletben milyen dimenziójú objektumok szerepelnek. Gondoljuk meg, hogy a tétel visszaadja a lineáris esetnél látottakat.
Megoldás:
4. Feladat
Legyen . Ellenőrizzük, hogy ha teljesülnek az előbbi tétel -ra vonatkozó feltételei, akkor kontrakció. Mutassuk meg, hogy bármely választás jó.
Megoldás:
Kell:
tudjuk:
sajatertekei: , ahol az sajaterteke.
Kell, hogy ez legyen, ehez eleg hogy
Tehat belattuk a feladat allitasat, hogy valasztas jo.
5. Feladat
Legyen olyan függvény amelyre léteznek valamely invertálható mátrixok, amelyekre SZPD mátrix minden esetén, egy alkalmas esetén, ahol (vagyis ráképezés -n). Ennek segítségével hogyan tudjuk megoldani az feladatot iterációval?
Próbáljuk megoldani az
feladatot.
Megoldás:
6. Feladat
Keressük meg az egyenlet gyökét, ha valahonnan sejtjük, hogy a intervallumban van. Alkalmazzunk fixpont-iterációt és addig iteráljunk, míg a szomszédos iteráltak távolsága alá nem csökken.
Megoldás:
7. Feladat
Tekintsük az alábbi függvényt, ahol :
Keressük a függvény zérushelyét fixpont iteráció segítségével! Írjuk fel alkalmas függvényt, és bizonyítsuk be, hogy valóban konvergál minden esetén! Hová fog tartani?
Megoldás:
Kiegészítés lineáris egyenletrendszerek megoldására: Konjugált gradiens módszer
Emlék előadásról: A gradiens módszer helyett, gyakran a konjugált gradiens módszert használjuk, ha lineáris egyenletendszert szeretnénk megoldani. A módszer gyorsabban konvergál és elméletben véges lépés után visszakapjuk a pontos megoldást. A módszer lépései:
- Adott a kezdeti megoldás és a kezdeti gradiens , ahol a mátrix és a vektor a lineáris egyenletrendszerben.
- Ha és ismert
8. Feladat
Írjunk programot, amely megold egy egyenletrendszert a konjugált gradiens módszerrel, amelynek bemenetei , és az iterácók száma, majd oldjuk meg az alábbi egyenletet. Próbáljuk ki úgy is, hogy , illetve iterációs lépést teszünk.
Megoldás:
related: NumMod 1