четвртак, 25 априла, 2024
Како да...?

Нумеричка обрада и симулације (5. део)

Аутор: Стефан Ножинић

У претходном делу смо објаснили операције са векторима и њихову употребу у нашем развојном окружењу. Библиотека Нумпај (енг. NumPy) коју користимо, поред ових основних операција, поседује и много сложеније операције и функције које нам могу помоћи. Сложићете се да су операције са векторима тривијалне за имплементацију и да нам не треба библиотека за тако нешто. Постоји више разлога зашто је важно користити сву функционалност коју нам нуди библиотека Нумпај. Један од њих је једноставност, а други је брзина. Наиме, Пајтон јако споро извршава for циклусе и једини начин да се то убрза јесте да се дата функција имплементира у програмском језику Ц, а то је управо оно што Нумпај ради.

Линеарни системи једначина

Један од основних метода који ћемо користити у нашим примерима се своди на решавање линеарних једначина. Можда су вам оне деловале непрактично док сте их обрађивали током формалног образовања, али, верујте нам, оне су кључне за нумеричку обраду података.

Многе друге једначине се апроксимирају на линеарне и тако решавају. Разлог за ово је једноставност решавања линеарних једначина.

Ове једначине су облика $$ Ax = b $$ где је А матрица са коефицијентима, x је непознати вектор, а b је десна страна једначине (вектор).

Решење ове једначине се може записати као $$ x = A^{-1}b $$ што значи да је вектор са десне стране помножен инверзном матрицом матрице коефицијената. Иако Нумпај поседује метод за израчунавање инверзне матрице, треба нагласити да је то израчунавање сувишно и да одузима време. Систем линеарних једначина се може решити Гаусовом елиминацијом и то је управо оно што нам Нумпај омогућава позивом само једне методе.

Ево како би то изгледало у коду:

>>> import numpy as np 
>>> import numpy.linalg as la 
>>> A = np.array([[1, 1], [1, -1]])
>>> A
array([[ 1,  1],
       [ 1, -1]])
>>> b = np.array([4, 2])
>>> x = la.solve(A, b)
>>> x
array([ 3.,  1.])
>>> A.dot(x) 
array([ 4.,  2.])

Дакле, позивом solve функције, решавамо систем у једној линији кода. Ово је брз и једноставан начин да се реши систем линеарних једначина.

Ако нам затреба инверзна матрица, то можемо лако израчунати:

>>> A_inverse = la.inv(A)
>>> A_inverse
array([[ 0.5,  0.5],
       [ 0.5, -0.5]])

Апроксимација функција

Друга корисна ствар коју нуди овај модул јесте апроксимација функција. Замислимо да имамо неколико тачака и да желимо да пронађемо функцију $$ f(x) = ax^2 + b $$ тако да збир квадрата грешака буде минималан, односно да нађемо коефицијенте за ову функцију тако да она што боље описује дате тачке. Ово можемо урадити методом најмањих квадрата. Наиме, ако направимо матрицу где сваки ред представља тачку а свака колона дати сабирак без коефицијента, можемо искористити Нумпај метод за апроксимацију функције који ће нам вратити потребне коефицијенте. На пример, ако желимо да апроксимирамо функције $$ f(x) = ax^2 + b $$ са тачкама (2, 5), (3, 10) и (4, 17), то можемо урадити овако:

>>> A = np.array([[4, 1], [9, 1], [16, 1]])
>>> A
array([[ 4,  1],
       [ 9,  1],
       [16,  1]])
>>> y = np.array([5, 10, 17])
>>> k, r, rank, s = la.lstsq(A, y)
>>> k
array([ 1.,  1.])

Потребно је приметити да смо намерно дали тачке које пролазе кроз функцију $$ f(x) = x^2 + 1 $$, међутим, то не мора да буде испуњено увек:

>>> y = np.array([4, 7, 16])
>>> k, r, rank, s = la.lstsq(A, y)
>>> k
array([ 1.01834862, -0.8440367 ])

Остале функције модула за линеарну алгебру

Такозвани „linalg” је подмодул библиотеке Нумпај и садржи доста функција које нам могу помоћи у даљем раду. Ту се, између осталог налазе функције за декомпозицију на својствене вредности и својствене векторе, разне норме и израчунавање кондиционих бројева. Предлажемо да погледате документацију за овај модул ако вас занима детаљно које су вам све функције на располагању.

Шта следи?

У наредном броју ћемо направити неке графике на екрану, да прикажемо оно што смо научили и да то визуелно дочарамо.