Kui tundmatu avaldamine võrrandist on võimatu (või äärmiselt tülikas), saab võrrandi lahendada numbriliselt. Lihtsamate võrrandite korral võib püüda lahendi leida ka sümbolarvutuse abiga.

Näitena, olgu meil võrrand $a\sin(\phi) + b\cos(\phi)=c$, kus $a$, $b$ ja $c$ on teada ning tuleb leida nurk $\phi$. Viimase saaks küll avaldada, aga see nõuab hulk tööd ja viib ruutvõrrandi lahendamiseni, seega katsume selle leida numbriliselt. Nimetatud võrrandi lahendi leidmine on ilmselt ekvivalentne funktsiooni $f(\phi) = a\sin(\phi) + b\cos(\phi) - c$ nullkoha leidmisega. Sobiva iteratiivse meetodi selle ülesande lahendamiseks realiseerib scipy.optimize.brentq. Numbrilised meetodid vajavad reeglina mõistlikku alglähendit (või vahemikku, kust lahendit otsida). Hindame, et otsitav nurk $20^\circ <\phi<50^\circ$.

from scipy.optimize import brentq
from scipy.constants import degree as deg

a = 5.4
b = 3.2
c = 5.9
f = lambda φ: a * sin(φ) + b * cos(φ) - c
φ = brentq(f, 20 * deg, 50 * deg)
print(f'{φ / deg :.1f}°')

See väljastab ekraanile 39.4°.

Nagu öeldud, saab antud võrrandist siiski $\phi$ avaldada. Kasutame selleks sümbolarvutust, kus me jällegi otsime funktsiooni $f(\phi)$ nullkohta:

from sympy import *
init_printing()
var('a,b,c,phi', positive=True)
lahend = solve(a * sin(phi) + b * cos(phi) - c, phi)

Kui väljastada lahend ekraanile, saame $$\displaystyle \left[ 2 \operatorname{atan}{\left(\frac{a - \sqrt{a^{2} + b^{2} - c^{2}}}{b + c} \right)}, \ 2 \operatorname{atan}{\left(\frac{a + \sqrt{a^{2} + b^{2} - c^{2}}}{b + c} \right)}\right]$$ Nagu näha, mittelineaarsetel võrranditel (nagu ruutvõrrand) võib lahendeid olla rohkem kui üks. Valime neist ühe, näiteks lahend[0]. Nüüd Pythoni koodi kujul saame tulemuse kätte käsuga print(lahend[0]):
2*atan((a - sqrt(a**2 + b**2 - c**2))/(b + c))
Võttes funktsioonid atan ja sqrt moodulist math (või numpy), olemegi saanud avaldise $\phi$ väärtuse arvutamiseks.

Vaata lisaks

Sisukord