Mittelineaarse funktsiooni sobitab (vähimruutude
mõttes) läbi andmepunktide scipy.optimize.curve_fit.
Esmalt tuleb defineerida lähendusfunktsioon ise. Selle esimeseks
argumendiks on sõltumatu muutuja ja ülejäänud argumendid on vabad
parameetrid. Lähendusfunktsioon peab olema vektoriseeritud kujul, st tuleb kasutada moodulist
numpy (ja mitte math) pärinevaid matemaatikafunktsioone.
Üldjuhul vajatakse ka parameetrite alglähendeid. Kõik need andmed (koos katsepunktidega)
edastatakse funktsioonile curve_fit, mis tagastab parameetrite
optimaalsed väärtused vektorina.
Järgmises näites sobitatakse katseandmetega funktsioon $y=ae^{-bx} + c$, kus vabad parameetrid on $a$, $b$ ja $c$.
from scipy.optimize import curve_fit
# mõõdetud
x = np.array((0.00, 0.05, 0.10, 0.15, 0.20, 0.25, 0.30, 0.35, 0.40, 0.45, 0.50))
y = np.array((352.55, 331.85, 319.05, 312.05, 306.55, 303.55, 301.35, 299.95, 298.85, 298.25, 297.75))
# mudelfunktsioon
f = lambda x, a, b, c: a * np.exp(-b * x) + c
# alglähend
a, b, c = 60, 10, 290
# optimeerimine
(a, b, c), cov = curve_fit(f, x, y, (a, b, c))
# tulemused
print(f'Parameetrid: a = {a:.2f}, b = {b:.3f}, c = {c:.2f}')
# teoreetiline kõver
u = np.linspace(0, 0.55, 100)
v = f(u, a, b, c)
#graafik
plot(x, y, 'ro', label='katse')
plot(u, v, 'b-', label='mudel')
grid()
legend()
show()
Piisavalt lihtsa mudelfunktsiooni korral saab parameetrite alglähendid hinnata
katseandmete graafikult. Antud näites $a$ on signaali maksimaalne muut (amplituud), $b$ pöördväärtus on
karakteerne aeg või distants, mille vältel signaali muutus aset leiab, ja
$c$ väljendab funktsiooni asümptootilist väärtust piiril $x\to\infty$.
Keerulisema funktsiooni korral võib alglähendid leida katse-eksituse meetodil,
jälgides teoreetilise kõvera kattuvust katsepunktidega. Selleks tuleb eelnevas koodis
funktsiooni curve_fit sisaldav rida (ajutiselt) välja kommenteerida.
Soovitav on lisada andmepunktidele ka vearistid ja veenduda, et modelleeritud kõver piirvea/määramatuse piires läbib kõiki katsepunkte:
plot(x, y, 'r.', label='katse')
errorbar(x, y, yerr=1.2, fmt='none', ecolor='r', elinewidth=0.75, capsize=2)
plot(ξ, ψ, 'b-', label='mudel')
grid()
legend()
tight_layout()
show()
Lisaks optimeeritud parameetritele tagastab curve_fit ka kovariatsioonimaatriksi (cov), mille kaudu
saab vajadusel parameetrite standardmääramatused:
ua, ub, uc = np.sqrt(np.diag(cov))
print(f'Määramatused: u(a) = {ua:.2f}, u(b) = {ub:.3f}, u(c) = {uc:.2f}')