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:
|
[-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,1−2−3−1,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,1−3−1,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=[−12031−20,50−0,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=p−1∑k=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,1−2−3−1,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,1−3−1,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) |
|