Hlavní navigace

Numerické řešení nelineárních rovnic

2. 11. 2023 1:21 (aktualizováno) Calculon

Pro složitější matematické výpočty na strojích od kalkulátorů po superpočítače se používají metody numerické matematiky. Například pro výpočet převrácené hodnoty c lze použít tuto iterační funkci:

g(x) = x * (3 - 3 * c * x + c^2 * x^2)

Tato funkce má kubickou konvergenci, přesný výsledek lze tedy dostat velmi rychle:

def inv_iterform (c : Float) (x : Float) : Float := x * (3 - 3 * c * x + c^2 * x^2)

def main : IO Unit := do
  let g := inv_iterform 7
  let mut x := 0.01
  for _ in [:5] do
    x := g x
  IO.println s!"{x} = {1/7.0}"

Výše uvedená iterační funkce závisí parametricky na c, je proto nutné získat iterační funkci jedné proměné pomocí curryingu.

Iterační funkci lze často odvodit snadno. Pro výpočet odmocniny ze dvou musíme například vyřešit rovnici

f(x) = x^2 - 2 = 0

Tedy

x^2 = 2

Což je

x = 2/x
2x = x + 2/x
x = 0.5 * (x +2/x)

Obdobně jako v příkladu výše vypočítáme iterativně výsledek:

def sqrt_iterform (x : Float) : Float := 0.5 * (x + 2 / x)

def main : IO Unit := do
  let g := sqrt_iterform
  let mut x := 1
  for _ in [:5] do
    x := g x
  IO.println s!"{x} = {Float.sqrt 2}"

Výsledek je opět spočítán velmi rychle. Dvě kontrolní otázky:

  1. Jak je třeba zvolit počáteční odhad?
  2. Jak lze analyticky ověřit, že výpočet konverguje?

Sdílet