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('Parameetrid: a = %.2f, b = %.3f, c = %.2f' % (a, b, c))

# 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('Määramatused: u(a) = %.2f, u(b) = %.3f, u(c) = %.2f' % (ua, ub, uc))

Vaata lisaks

Sisukord