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.