GHA1 num und ana richtig. Tests nach Beispielen aus Panou 2013
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
def verfahren(funktionen: list, startwerte: list, weite: float, schritte: int) -> list:
|
||||
def verfahren(funktionen: list, startwerte: list, weite: float, schritte: int, fein: bool = True) -> list:
|
||||
"""
|
||||
Runge-Kutta-Verfahren für ein beliebiges DGLS
|
||||
:param funktionen: Liste mit allen Funktionen
|
||||
@@ -14,19 +14,21 @@ def verfahren(funktionen: list, startwerte: list, weite: float, schritte: int) -
|
||||
zuschlaege_grob = zuschlaege(funktionen, werte[-1], h)
|
||||
werte_grob = [werte[-1][j] if j == 0 else werte[-1][j] + zuschlaege_grob[j - 1]
|
||||
for j in range(len(startwerte))]
|
||||
if fein:
|
||||
zuschlaege_fein_1 = zuschlaege(funktionen, werte[-1], h / 2)
|
||||
werte_fein_1 = [werte[-1][j] + h/2 if j == 0 else werte[-1][j]+zuschlaege_fein_1[j-1]
|
||||
for j in range(len(startwerte))]
|
||||
|
||||
zuschlaege_fein_1 = zuschlaege(funktionen, werte[-1], h / 2)
|
||||
werte_fein_1 = [werte[-1][j] + h/2 if j == 0 else werte[-1][j]+zuschlaege_fein_1[j-1]
|
||||
for j in range(len(startwerte))]
|
||||
zuschlaege_fein_2 = zuschlaege(funktionen, werte_fein_1, h / 2)
|
||||
werte_fein_2 = [werte_fein_1[j] + h/2 if j == 0 else werte_fein_1[j]+zuschlaege_fein_2[j-1]
|
||||
for j in range(len(startwerte))]
|
||||
|
||||
zuschlaege_fein_2 = zuschlaege(funktionen, werte_fein_1, h / 2)
|
||||
werte_fein_2 = [werte_fein_1[j] + h/2 if j == 0 else werte_fein_1[j]+zuschlaege_fein_2[j-1]
|
||||
for j in range(len(startwerte))]
|
||||
werte_korr = [werte_fein_2[j] if j == 0 else werte_fein_2[j] + 1/15 * (werte_fein_2[j] - werte_grob[j])
|
||||
for j in range(len(startwerte))]
|
||||
|
||||
werte_korr = [werte_fein_2[j] if j == 0 else werte_fein_2[j] + 1/15 * (werte_fein_2[j] - werte_grob[j])
|
||||
for j in range(len(startwerte))]
|
||||
|
||||
werte.append(werte_korr)
|
||||
werte.append(werte_korr)
|
||||
else:
|
||||
werte.append(werte_grob)
|
||||
return werte
|
||||
|
||||
|
||||
@@ -60,3 +62,23 @@ def zuschlaege(funktionen: list, startwerte: list, h: float) -> list:
|
||||
k_ = [(k1[i] + 2 * k2[i] + 2 * k3[i] + k4[i]) / 6 for i in range(len(k1))]
|
||||
|
||||
return k_
|
||||
|
||||
def rk_chat(F, v0: list, weite: float, schritte: int):
|
||||
h = weite/schritte
|
||||
v = v0
|
||||
werte = [v]
|
||||
|
||||
for _ in range(schritte):
|
||||
k1 = F(v)
|
||||
k2 = F([v[i] + 0.5 * h * k1[i] for i in range(6)])
|
||||
k3 = F([v[i] + 0.5 * h * k2[i] for i in range(6)])
|
||||
k4 = F([v[i] + h * k3[i] for i in range(6)])
|
||||
|
||||
v = [
|
||||
v[i] + (h / 6) * (k1[i] + 2 * k2[i] + 2 * k3[i] + k4[i])
|
||||
for i in range(6)
|
||||
]
|
||||
|
||||
werte.append(v)
|
||||
|
||||
return werte
|
||||
Reference in New Issue
Block a user