Processing math: 100%

MPZI_vj13_s_izradom

2387 days ago by fresl

Dvostruka petlja for


1. zadatak

Napišite programsku funkciju  umnozak()  koja ima dva parametra, realan broj r i matricu A s realnim komponentama, a vraća novu matricu koja je umnožak broja r i matrice A. Program izvedite s argumentima  r=3  i  A=[1,1231,3].  Trebate dobiti matricu  [3,3693,9].

Podsjećamo:

  • ako je  B=rA,  onda je  bi,j=rai,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,,m1  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 A=[1,1231,3].  Trebate dobiti matricu B=[1,1231,3].

       

 

2. zadatak za zadaću

Napišite programsku funkciju  zbroj_matrica()  koja će zbrojiti dvije matrice.  Ako je  C=A+B,  onda je  ci,j=ai,j+bi,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  A=[1,1231,3]  i  B=[12,131,2];  rezultat je matrica  [0,14,100,1].

       

 

2. zadatak

Napišite programsku funkciju  zbroj_pn()  koja će zbrojiti posebno pozitivne, a posebno negativne komponente matrice.  Program izvedite s argumentom  A=[1203120,500,1];  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 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  A=[1,1231,3].  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 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  A=[1,1231,3],  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  C=AB  dviju matrica A i B definiran je ako (i samo ako) je broj stupaca prve jednak broju redaka druge.  Ako matrica A ima m redaka i p stupaca, a matrica B  p redaka i n stupaca, matrica C imat će m redaka i n stupaca, njezine su komponente određene izrazom  ci,j=p1k=0ai,kbk,j.  (Preglednosti ispisa radi, programsku ćemo funkciju napisati za matrice s racionalnim komponentama (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 B ima 4 stupca, a matrica A  3 retka, umnožak  BA  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 A=[1,1231,3].  Trebate dobiti matricu B=[1,1231,3].

       
       
[ 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  C=A+B,  onda je  ci,j=ai,j+bi,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  A=[1,1231,3]  i  B=[12,131,2];  rezultat je matrica  [0,14,100,1].

       
       
[-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 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  A=[1,1231,3].  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 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 A=[1,1231,3],  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)