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

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

У претходном делу смо се упознали са неким основним деловима библиотеке коју ћемо користити. Та основа није довољна без доброг разумевања математичке теорије. Ово није потребно само ради разумевања процеса и метода које ћемо описати, већ и због тога што се многе ствари не могу урадити без доброг математичког алата.

Вектор

Постоји доста дефиниција векторa – наравно, све су еквивалентне. Ради бољег разумевања метода које ћемо користити, изабрали смо дефиницију која најбоље леже уз структуру података помоћу које ћемо представљати векторе. Вектор је низ бројева и може представљати коначан број података. Например, тачка на равни се може представити вектором тако што ћемо навести њене координате. Те координате не морају бити уобичајене координате које познајемо, односно не морају бити координате у Декартовом правоуглом координатном систему. Други пример био би, рецимо, скуп неких мерења. Например, желимо да измеримо висину на узорку од 100 људи; то мерење можемо записати као вектор (низ) од 100 елемената. Овде морамо пазити да је редослед битан – јер, ако променимо редослед елементима, то више није вектор.

Векторе ћемо представљати на следећи начин:

Oво је вектор од н чланова. Приметите да смо почели са индексирањем од нуле. Ову конвенцију користимо како бисмо се лакше могли пребацити на конкретну имплементацију касније.

Следи пример како векторе користимо у Пајтону, уз библиотеку НумПај (енг. NumPy)

>>> import numpy as np
>>> a = np.array([1,2,3])
>>> a
array([1, 2, 3])
>>> b = np.zeros(50)
>>> b
array([ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.])
>>> c = np.ones(10)
>>> c
array([ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.])
>>>

Приметите да функцијама np.zeros(…) и np.ones(…) додељујемо број елемената колико желимо да тај вектор има. У овом контексту, вектор и низ су исти.

Сабирање и одузимање вектора се врши тако што саберемо и одузмемо елемент по елемент. Tачније:

ако је онда за и=ти елемент важи:

а у коду бисмо то овако имплементирали:

>>> a = np.array([1,2,3])
>>> b = np.array([0,2,1])
>>> c = a - b
>>> c
array([1, 0, 2])

Потребно је приметити да вектори морају имати исту величину, односно број елемената.

Такође, могуће је и множење по елементу, односно и-ти елемент новог вектора је једнак производу и-тих елемената ова два вектора. У коду се то имплементира исто јако једноставно:

>>> d = a*b
>>> d
array([0, 4, 3])

Слично је и за дељење по елементу.

Имамо још две операције које не постоје када причамо о скаларима (појединачним бројевима), а то су скаларни и векторски производ.

Скаларни производ као резултат не даје вектор, већ скалар, односно број:

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

Последња операција са векторима коју ћемо обрадити је векторски производ:

који као резултат даје вектор. Засада нећемо улазити у детаље како се ова операција врши, јер нам тренутно није потребна.

Матрице

Друга структура која ће нам бити потребна јесу матрице. Оне могу представљати линеарну трансформацију, тачније трансформацију једног вектора у други. Матрице ћемо обележавати великим словима.

Као што смо рекли, матрице представљају трансформацију вектора због операције множења матрица која је дефинисана на следећи начин:

ако је онда елемент на позицији (i,j) има следећу вредност:

Ово може деловати компликовано, па је најбоље да то погледамо кроз пример:

>>> A = np.array([[1,2,3], [4,5,6], [7,8,9]])
>>> A
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])
>>> B = np.array([[1,7,8], [8,2,1], [1,5,10]])
>>> B
array([[ 1,  7,  8],
       [ 8,  2,  1],
       [ 1,  5, 10]])
>>> C = np.dot(A,B)
>>> C
array([[ 20,  26,  40],
       [ 50,  68,  97],
       [ 80, 110, 154]])
>>>

Потребно је приметити како се дефинише матрица: као аргумент np.array(…) методе убацујемо групу витичастих заграда, па у њих више група витичастих заграда у којима наводимо елементе. Прва група означава први ред, друга група је други, итд.

Ако желимо да задамо матрицу нула, то можемо урадити на следећи начин:

>>> Z = np.zeros([5,5])
>>> Z
array([[ 0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.]])
>>>

Дакле, као аргумент наводимо вектор у којем су димензије матрице.

Код производа две матрице је битно напоменути две ствари:

1. Број колона прве матрице мора бити једнак броју редова друге матрице.

2. Из горњег услова лако је закључити да не важи правило комутативности, тачније: .

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

array([[ 1.,  0.,  0.,  0.,  0.],
       [ 0.,  1.,  0.,  0.,  0.],
       [ 0.,  0.,  1.,  0.,  0.],
       [ 0.,  0.,  0.,  1.,  0.],
       [ 0.,  0.,  0.,  0.,  1.]])
>>>

Како ова матрица има једнак број колона и редова, довољно је као аргумент навести само број који означава број редова (колона).

Сада се поставља питање да ли постоје матрице тако да је

Одговор је: и да и не. Не постоје увек, али кад постоје, те две матрице су инверзне једна другој. Инверзну матрицу ћемо обележавати са -1у експоненту, тако да важи за дату матрицу. Матрице које немају свог инверзног партнера зовемо неинвертабилне матрице.

Сада вектор можемо посматрати и као матрицу која има Н редова и једну колону. У том случају производ матрице и вектора даје нам вектор на следећи начин где је

Последња ствар коју би требало да појаснимо пре него што пређемо на нешто конкретније – јесте транспоновање матрица. Ова операција је врло једноставна – она само „ротира матрицу”, тј. ако је онда . У коду то изгледа овако:

>>> A = np.array([[1,2,3], [4,5,6], [7,8,9]])
>>> A
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])
>>> A.T
array([[1, 4, 7],
       [2, 5, 8],
       [3, 6, 9]])
>>>

За размишљање

У наредном броју крећемо конкретније да се бавимо самом темом овог серијала. Надамо се да ћете нас читати. До тада, остављамо вас да размислите како да скаларни производ два вектора представите у матричној нотацији користећи производ матрица који смо описали, и транспоновање. Хинт: вектори се исто могу транспоновати.

Оставите одговор

Ваша адреса е-поште неће бити објављена. Неопходна поља су означена *

Time limit is exhausted. Please reload CAPTCHA.