MPZI_vj13_s_izradom

2453 days ago by fresl

Dvostruka petlja for


1. zadatak

Napišite programsku funkciju  umnozak()  koja ima dva parametra, realan broj $r$ i matricu $\mathbf{A}$ s realnim komponentama, a vraća novu matricu koja je umnožak broja $r$ i matrice $\mathbf{A}$. Program izvedite s argumentima  $r=3$  i  $\mathbf{A} = \left[\begin{array}{rr} -1,\!1 & 2 \\ 3  & 1,\!3 \end{array}\right]$.  Trebate dobiti matricu  $\left[\begin{array}{rr} -3,\!3 & 6 \\ 9  & 3,\!9 \end{array}\right]$.

Podsjećamo:

  • ako je  $\mathbf{B} = r\cdot\mathbf{A}$,  onda je  $b_{i,j} = r\cdot a_{i,j}$ ;
  • broj redaka i broj stupaca matrice A dobivaju se pomoću funkcija .nrows() i .ncols();
  • nul–matrica koja ima m redaka i n stupaca, a komponente su joj nule kao realni brojevi, dobiva se pozivom funkcije  zero_matrix (RR, m, n);
  • komponenti u i-tom retku i j-tom stupcu matrice A pristupa se izrazom A[i,j];
  • indeksi komponenata počinju od 0;
  • niz cijelih brojeva  $0,\,1,\,\ldots,\, m\!-\!1$  dobiva se pozivom funkcije srange(m).
       
       
[-3.30000000000000  6.00000000000000]
[ 9.00000000000000  3.90000000000000]
[-3.30000000000000  6.00000000000000]
[ 9.00000000000000  3.90000000000000]


1. zadatak za zadaću

Napišite programsku funkciju  minus_jedan()  koja ima jedan parametar, i to matricu, a vraća novu matricu dobivenu množenjem parametra sa $-1$. Program izvedite s argumentom $\mathbf{A} = \left[\begin{array}{rr} -1,\!1 & 2 \\ 3  & 1,\!3 \end{array}\right]$.  Trebate dobiti matricu $\mathbf{B} = \left[\begin{array}{rr} 1,\!1 & -2 \\ -3  & -1,\!3 \end{array}\right]$.

       

 

2. zadatak za zadaću

Napišite programsku funkciju  zbroj_matrica()  koja će zbrojiti dvije matrice.  Ako je  $\mathbf{C} = \mathbf{A} + \mathbf{B}$,  onda je  $c_{i,j} = a_{i,j} + b_{i,j}$.  Stoga se matrice mogu zbrajati samo ako imaju isti broj redaka i isti broj stupaca, ali u funkciji ne trebate provjeravati tu činjenicu, jer ćemo smatrati da ćemo je upotrebljavati samo u tom slučaju.  Program izvedite s argumentima  $\mathbf{A} = \left[\begin{array}{rr} -1,\!1 & 2 \\ 3  & 1,\!3 \end{array}\right]$  i  $\mathbf{B} = \left[\begin{array}{rr} 1 & 2,\!1 \\ -3  & -1,\!2 \end{array}\right]$;  rezultat je matrica  $\left[\begin{array}{rr} -0,\!1 & 4,\!1 \\ 0  & 0,\!1 \end{array}\right]$.

       

 

2. zadatak

Napišite programsku funkciju  zbroj_pn()  koja će zbrojiti posebno pozitivne, a posebno negativne komponente matrice.  Program izvedite s argumentom  $\mathbf{A} = \left[\begin{array}{rrr} -1 & 2 & 0\\ 3  & 1 & -2 \\ 0,\!5 & 0 & -0,\!1 \end{array}\right]$;  rezultat je par $(6,\!5; -3,\!1)$.

       
       
(6.50000000000000, -3.10000000000000)
(6.50000000000000, -3.10000000000000)


3. zadatak za zadaću

Modificirajte funkciju  zbroj_pn()  iz 2. zadatka tako da dobijete funkciju  umnozak_pn()  koja vraća umnoške pozitivnih i negativnih komponenata matrice.  Za argument $\mathbf{A}$ iz 2. zadatka trebate dobiti par $(3; -0,\!2)$

       

 

4. zadatak za zadaću

Napišite programsku funkciju  najveci()  koje će pronaći najveću komponentu matrice.  Program izvedite za argument  $\mathbf{A} = \left[\begin{array}{rr} -1,\!1 & 2 \\ 3  & 1,\!3 \end{array}\right]$.  Trebate dobiti broj 3.

Provedite potrebne promjene u programskoj funkciji  najveci()  tako da nova funkcija vraća najmanju komponentu matrice; novu funkciju nazovite  najmanji().  Za argument $\mathbf{A}$ trebate kao rezultat dobiti $-1,\!1$.

       

 

5. zadatak za zadaću

Promijenite funkciju  najveci()  iz 4. zadatka za zadaću tako da umjesto najveće komponente vraća indekse retka i stupca u kojima se ta komponenta nalazi; funkciju nazovite  indeksi_najvecega().  Ako program izvedete za argument  $\mathbf{A} = \left[\begin{array}{rr} -1,\!1 & 2 \\ 3  & 1,\!3 \end{array}\right]$,  trebate kao rezultat dobiti par brojeva $(1, 0)$.

Provedite promjene analogne promjenama iz drugoga dijela 4. zadatka za zadaću.

       

 

Dodatak:  Množenje matrica ili trostruka petlja for

Umnožak  $\mathbf{C} = \mathbf{A\,B}$  dviju matrica $\mathbf{A}$ i $\mathbf{B}$ definiran je ako (i samo ako) je broj stupaca prve jednak broju redaka druge.  Ako matrica $\mathbf{A}$ ima $m$ redaka i $p$ stupaca, a matrica $\mathbf{B}$  $p$ redaka i $n$ stupaca, matrica $\mathbf{C}$ imat će $m$ redaka i $n$ stupaca, njezine su komponente određene izrazom  $c_{i,j} = \displaystyle\sum_{k = 0}^{p - 1} a_{i,k}\,b_{k,j}$.  (Preglednosti ispisa radi, programsku ćemo funkciju napisati za matrice s racionalnim komponentama ($\mathbb{Q}$, to jest QQ).)

       
       
[   2   -1]
[ 1/2    0]
[   0 -1/2]
[   2   -1]
[ 1/2    0]
[   0 -1/2]
       
[1/2   0  -1   2]
[  0   2   0  -1]
[1/2   0  -1   2]
[  0   2   0  -1]
       
[   1   -2   -2    5]
[ 1/4    0 -1/2    1]
[   0   -1    0  1/2]
[   1   -2   -2    5]
[ 1/4    0 -1/2    1]
[   0   -1    0  1/2]

Budući da matrica $\mathbf{B}$ ima 4 stupca, a matrica $\mathbf{A}$  3 retka, umnožak  $\mathbf{B\,A}$  nije definiran.

       
Traceback (click to the left of this block for traceback)
...
IndexError: matrix index out of range
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "_sage_input_8.py", line 10, in <module>
    exec compile(u'open("___code___.py","w").write("# -*- coding: utf-8 -*-\\n" + _support_.preparse_worksheet_cell(base64.b64decode("dW1ub3pha19tYXRyaWNhIChCLCBBKQ=="),globals())+"\\n"); execfile(os.path.abspath("___code___.py"))
  File "", line 1, in <module>
    
  File "/tmp/tmpNcZaZk/___code___.py", line 2, in <module>
    exec compile(u'umnozak_matrica (B, A)
  File "", line 1, in <module>
    
  File "/tmp/tmpL10Eng/___code___.py", line 10, in umnozak_matrica
    C[i,j] += A[i,k] * B[k,j]
  File "sage/matrix/matrix0.pyx", line 932, in sage.matrix.matrix0.Matrix.__getitem__ (build/cythonized/sage/matrix/matrix0.c:6849)
IndexError: matrix index out of range

SageMath je ispisao poruku o greški i prekinuo izvođenje.  Greška je, međutim, u pristupu nepostojećoj komponenti matrice, što je tek posredno povezano s definicijom umnoška matrica, tako da je prekid izvođenja u stvari slučajan.  Za matrice s nekim drugim brojem redaka ili stupaca do greške i prekida izvođenja ne mora doći, ali dobiveni rezultat ipak neće biti ispravan (zato što umnožak tih matrica ne postoji): 

       
[  0   1]
[ -2   1]
[ -2  -2]
[  0 1/2]
[  0   1]
[ -2   1]
[ -2  -2]
[  0 1/2]
       
[   0    0    0]
[   1 -1/2  1/2]
[   0    0    0]
[   1 -1/2  1/2]
       
[   0    0]
[   0 -1/2]
[   0    0]
[   0 -1/2]

U funkciju umnozak_matrica() uključit ćemo stoga provjeru ispunjenosti uvjeta za postojanje umnoška:

       
       
Umnozak matrica: broj stupaca prve matrice mora biti jednak broju redaka druge!
Umnozak matrica: broj stupaca prve matrice mora biti jednak broju redaka druge!
       
[   1 -1/2  1/2]
[   1 -1/2  1/2]
[  -2    1   -1]
[ 1/2 -1/4  1/4]
[   1 -1/2  1/2]
[   1 -1/2  1/2]
[  -2    1   -1]
[ 1/2 -1/4  1/4]

 

 

 

 

 

 

 

 

 

 

 

Rješenje 1. zadatka za zadaću

Napišite programsku funkciju  minus_jedan()  koja ima jedan parametar, i to matricu, a vraća novu matricu dobivenu množenjem parametra sa $-1$. Program izvedite s argumentom $\mathbf{A} = \left[\begin{array}{rr} -1,\!1 & 2 \\ 3  & 1,\!3 \end{array}\right]$.  Trebate dobiti matricu $\mathbf{B} = \left[\begin{array}{rr} 1,\!1 & -2 \\ -3  & -1,\!3 \end{array}\right]$.

       
       
[ 1.10000000000000 -2.00000000000000]
[-3.00000000000000 -1.30000000000000]
[ 1.10000000000000 -2.00000000000000]
[-3.00000000000000 -1.30000000000000]

 Budući da već imamo, u 1. zadatku, definiranu funkciju  umnozak()  funkciju  minus_jedan()  možemo napisati i ovako:

       
       
[ 1.10000000000000 -2.00000000000000]
[-3.00000000000000 -1.30000000000000]
[ 1.10000000000000 -2.00000000000000]
[-3.00000000000000 -1.30000000000000]


Rješenje 2. zadatka za zadaću

Napišite programsku funkciju  zbroj_matrica()  koja će zbrojiti dvije matrice.  Ako je  $\mathbf{C} = \mathbf{A} + \mathbf{B}$,  onda je  $c_{i,j} = a_{i,j} + b_{i,j}$.  Stoga se matrice mogu zbrajati samo ako imaju isti broj redaka i isti broj stupaca, ali u funkciji ne trebate provjeravati tu činjenicu, jer ćemo smatrati da ćemo je upotrebljavati samo u tom slučaju.  Program izvedite s argumentima  $\mathbf{A} = \left[\begin{array}{rr} -1,\!1 & 2 \\ 3  & 1,\!3 \end{array}\right]$  i  $\mathbf{B} = \left[\begin{array}{rr} 1 & 2,\!1 \\ -3  & -1,\!2 \end{array}\right]$;  rezultat je matrica  $\left[\begin{array}{rr} -0,\!1 & 4,\!1 \\ 0  & 0,\!1 \end{array}\right]$.

       
       
[-0.100000000000000   4.10000000000000]
[ 0.000000000000000  0.100000000000000]
[-0.100000000000000   4.10000000000000]
[ 0.000000000000000  0.100000000000000]


Rješenje 3. zadatka za zadaću

Modificirajte funkciju  zbroj_pn()  iz 2. zadatka tako da dobijete funkciju  umnozak_pn()  koja vraća umoške pozitivnih i negativnih komponenata matrice.  Za argument $\mathbf{A}$ iz 2. zadatka trebate dobiti par $(3; -0,\!2)$

       
       
(3.00000000000000, -0.200000000000000)
(3.00000000000000, -0.200000000000000)


Rješenje 4. zadatka za zadaću

Napišite programsku funkciju  najveci()  koje će pronaći najveću komponentu matrice.  Program izvedite za argument  $\mathbf{A} = \left[\begin{array}{rr} -1,\!1 & 2 \\ 3  & 1,\!3 \end{array}\right]$.  Trebate dobiti broj 3.

       
       
3.00000000000000
3.00000000000000

Provedite potrebne promjene u programskoj funkciji  najveci()  tako da nova funkcija vraća najmanju komponentu matrice; novu funkciju nazovite  najmanji().  Za argument $\mathbf{A}$ trebate kao rezultat dobiti $-1,\!1$.

       
       
-1.10000000000000
-1.10000000000000


Rješenje 5. zadatka za zadaću

Promijenite funkciju  najveci()  iz 4. zadatka za zadaću tako da umjesto najveće komponente vraća indekse retka i stupca u kojima se ta komponenta nalazi; program nazovite  indeksi_najvecega().  Ako program izvedete za argument $\mathbf{A} = \left[\begin{array}{rr} -1,\!1 & 2 \\ 3  & 1,\!3 \end{array}\right]$,  trebate kao rezultat dobiti par brojeva $(1, 0)$.

       
       
(1, 0)
(1, 0)

Provedite promjene analogne promjenama iz drugoga dijela 4. zadatka za zadaću.

       
       
(0, 0)
(0, 0)