1 Sustavi linearnih jednadžbi
1. zadatak
(%i1) | linsolve([2*x+3*y+z=2, x-3*y+2*z=6, -2*x+6*y-z=3], [x,y,z]); |
matrica sustava
(%i2) | M: coefmatrix([2*x+3*y+z=2, x-3*y+2*z=6, -2*x+6*y-z=3], [x,y,z]); |
proširena matrica sustava (pazite: ovdje daje zadnji stupac slobodnih članova kako on izgleda s lijeve strane jednadžbe, a mi smo ga unosili onako kako izgleda s desne strane jednadžbe).
No, to je stvar dogovora i nema utjecaja na Kronecker-Capellijev teorem.
(%i3) | Mp: augcoefmatrix([2*x+3*y+z=2, x-3*y+2*z=6, -2*x+6*y-z=3], [x,y,z]); |
Rang matrice sustava jednak je rangu proširene matrice sustava i taj rang je baš jednak broju varijabli.
Prema Kronecker-Capellijevom teoremu sustav ima jedinstveno rješenje.
(%i4) | [rank(M),rank(Mp)]; |
2. zadatak
(%i5) | sustav: [x+y+2*z+3*u=6,x-4*y+2*z-3*u=-4,7*y+2*z+5*u=12,x+3*y+4*z+2*u=8]; |
varijabla u je parametar i pripadno bazično rješenje
(%i6) | rj1:linsolve(sustav,[x,y,z,u]); |
(%i7) | %rnum_list; |
(%i8) | subst(0,%rnum_list[1],rj1); |
varijabla z je parametar i pripadno bazično rješenje
(%i9) | rj2: linsolve(sustav,[x,y,u,z]); |
(%i10) | %rnum_list; |
(%i11) | subst(0,%rnum_list[1],rj2); |
varijabla y je parametar i pripadno bazično rješenje
(%i12) | rj3:linsolve(sustav,[x,z,u,y]); |
(%i13) | %rnum_list; |
(%i14) | subst(0,%rnum_list[1],rj3); |
varijabla x je parametar i pripadno bazično rješenje
(%i15) | rj4:linsolve(sustav,[y,z,u,x]); |
(%i16) | %rnum_list; |
(%i17) | subst(0,%rnum_list[1],rj4); |
ako ne želimo uvoditi nova slova za parametre
(%i18) | linsolve_params: false$ |
varijabla u je parametar
(%i19) | r1:linsolve(sustav,[x,y,z,u]); |
pripadno bazično rješenje (sada nigdje ne piše u=0 jer je slovo u ujedno i parametar, ali znamo da smo uvrstili u=0 u opće rješenje)
(%i20) | subst(0,u,r1); |
varijabla z je parametar
(%i21) | r2:linsolve(sustav,[x,y,u,z]); |
pripadno bazično rješenje (sada nigdje ne piše z=0 jer je slovo u ujedno i parametar, ali znamo da smo uvrstili z=0 u opće rješenje)
(%i22) | subst(0,z,r2); |
varijabla y je parametar
(%i23) | r3:linsolve(sustav,[x,z,u,y]); |
pripadno bazično rješenje (sada nigdje ne piše y=0 jer je slovo u ujedno i parametar, ali znamo da smo uvrstili y=0 u opće rješenje)
(%i24) | subst(0,y,r3); |
varijabla x je parametar
(%i25) | r4:linsolve(sustav,[y,z,u,x]); |
pripadno bazično rješenje (sada nigdje ne piše x=0 jer je slovo u ujedno i parametar, ali znamo da smo uvrstili x=0 u opće rješenje)
(%i26) | subst(0,x,r4); |
matrica sustava
(%i27) | M: coefmatrix(sustav,[x,y,z,u]); |
proširena matrica sustava
(%i28) | Mp: augcoefmatrix(sustav,[x,y,z,u]); |
Rang matrice sustava jednak je rangu proširene matrice sustava i taj rang je manji od broja varijabli.
Prema Kronecker-Capellijevom teoremu sustav ima beskonačno mnogo rješenja.
(%i29) | [rank(M),rank(Mp)]; |
uvjet pod kojim je suma komponenata rješenja pozitivna ako uzmemo opće rješenje u kojemu je varijabla y parametar
(%i30) | r3; |
suma komponenata rješenja (dva načina - ručno ispisivanje ili korištenje naredbe sum)
naredba rhs nam daje desnu stranu u jednakosti, a naredba lhs daje lijevu stranu u jednakosti
(%i31) | [r3[1],lhs(r3[1]),rhs(r3[1])]; |
(%i32) | rhs(r3[1])+rhs(r3[2])+rhs(r3[3])+y; |
(%i33) | nejednakost:sum(rhs(r3[i]),i,1,3)+y; |
rješavanje nejednadžbe - dva načina:
1. način: pomoću naredbe to_poly_solve
2. način: pomoću naredbe fourier_elim koju najprije treba učitati pomoću naredbe load
(%i34) | to_poly_solve(nejednakost>0,y); |
(%i35) | load(fourier_elim)$ |
(%i36) | fourier_elim([nejednakost>0],[y]); |
3. zadatak
(%i37) | sustav2: [2*x1+3*x2+2*x3+6*x4=1,-2*x1+3*x2-6*x3+12*x4=-19,2*x1+6*x2+15*x4=-8]; |
pazite: već ranije smo bili stavili linsolve_params: false$ pa se neće uvoditi nova slova za parametre osim ako ponovo ne stavimo vrijednost spomenute varijable na true
varijable x3 i x4 su parametri i pripadno bazično rješenje
(%i38) | r34:linsolve(sustav2,[x1,x2,x3,x4]); |
(%i39) | subst([x3=0,x4=0],r34); |
varijable x1 i x2 su parametri i pripadno bazično rješenje
(%i40) | r12:linsolve(sustav2,[x3,x4,x1,x2]); |
(%i41) | subst([x1=0,x2=0],r12); |
varijable x1 i x3 su parametri i pripadno bazično rješenje
(%i42) | r13:linsolve(sustav2,[x2,x4,x1,x3]); |
(%i43) | subst([x1=0,x3=0],r13); |
varijable x1 i x4 su parametri i pripadno bazično rješenje
(%i44) | r14:linsolve(sustav2,[x2,x3,x1,x4]); |
(%i45) | subst([x1=0,x4=0],r14); |
varijable x2 i x3 su parametri i pripadno bazično rješenje
(%i46) | r23:linsolve(sustav2,[x1,x4,x2,x3]); |
(%i47) | subst([x2=0,x3=0],r23); |
varijable x2 i x4 su parametri i pripadno bazično rješenje
(%i48) | r24:linsolve(sustav2,[x1,x3,x2,x4]); |
(%i49) | subst([x2=0,x4=0],r24); |
matrica sustava
(%i50) | M:coefmatrix(sustav2,[x1,x2,x3,x4]); |
proširena matrica sustava
(%i51) | Mp:augcoefmatrix(sustav2,[x1,x2,x3,x4]); |
Rang matrice sustava jednak je rangu proširene matrice sustava i taj rang je manji od broja varijabli.
Prema Kronecker-Capellijevom teoremu sustav ima beskonačno mnogo rješenja.
(%i52) | [rank(M),rank(Mp)]; |
4. zadatak - kontradiktorni sustav
(%i53) | sustav3:[x1-4*x2+5*x3=6,-3*x2+2*x3=-12,2*x1+7*x2=35]$ |
(%i54) | linsolve(sustav3,[x1,x2,x3]); |
matrica sustava
(%i55) | M:coefmatrix(sustav3,[x1,x2,x3]); |
proširena matrica sustava
(%i56) | Mp:augcoefmatrix(sustav3,[x1,x2,x3]); |
Rang matrice sustava je različit od ranga proširene matrice sustava.
Prema Kronecker-Capellijevom teoremu sustav je kontradiktoran.
(%i57) | [rank(M),rank(Mp)]; |
5. zadatak
(%i58) | sustav4:[-4*x1-3*x2-4*x3=-1,x1+x2+x3=1,14*x1+11*x2+14*x3=5,11*x1+9*x2+11*x3=5]$ |
varijabla x3 je parametar i pripadno bazično rješenje
(%i59) | r1:linsolve(sustav4,[x1,x2,x3]); |
(%i60) | subst([x3=0],r1); |
varijabla x1 je parametar i pripadno bazično rješenje
(%i61) | r2:linsolve(sustav4,[x3,x2,x1]); |
(%i62) | subst([x1=0],r2); |
matrica sustava
(%i63) | M:coefmatrix(sustav4,[x1,x2,x3]); |
proširena matrica sustava
(%i64) | Mp:augcoefmatrix(sustav4,[x1,x2,x3]); |
Rang matrice sustava jednak je rangu proširene matrice sustava i taj rang je manji od broja varijabli.
Prema Kronecker-Capellijevom teoremu sustav ima beskonačno mnogo rješenja.
(%i65) | [rank(M),rank(Mp)]; |
2 Nejednadžbe
rješavanje nejednadžbe - dva načina:
1. način: pomoću naredbe to_poly_solve
2. način: pomoću naredbe fourier_elim koju najprije treba učitati pomoću naredbe load
(%i66) | load(fourier_elim)$ |
1. zadatak
(%i67) | to_poly_solve(2*x-3/5>(5*x-3)/2,x); |
(%i68) | fourier_elim([2*x-3/5>(5*x-3)/2],[x]); |
2. zadatak
(%i69) | to_poly_solve(-4*x^2+12*x+40<=0,x); |
(%i70) | fourier_elim([-4*x^2+12*x+40<=0],[x]); |
(%i71) | wxplot2d([-4*x^2+12*x+40], [x,-5,8],[axes,true])$ |
(%i72) |
plot2d([-4*x^2+12*x+40], [x,-5,8], [gnuplot_preamble, "set grid;"])$ |
(%i73) | to_poly_solve(-4*x^2+12*x+40>0,x); |
(%i74) | fourier_elim([-4*x^2+12*x+40>0],[x]); |
3. zadatak
(%i75) | load("draw")$ |
(%i76) | to_poly_solve([3*x1-4*x2<=6,3*x1+4*x2<=12,2*x1-x2>=0],[x1,x2]); |
(%i77) | fourier_elim([3*x1-4*x2<=6,3*x1+4*x2<=12,2*x1-x2>=0],[x1,x2]); |
(%i78) |
wxdraw2d(grid=true, x_voxel=80, y_voxel=80,fill_color = cyan, region(3*x-4*y<=6 and 3*x+4*y<=12 and 2*x-y>=0, x,-2,4, y,-3,3)); |
4. zadatak
(%i79) | to_poly_solve([-12*x1+3*x2<=3,4*x1-10*x2<=5,x1>=0],[x1,x2]); |
(%i80) | fourier_elim([-12*x1+3*x2<=3,4*x1-10*x2<=5,x1>=0],[x1,x2]); |
(%i81) |
wxdraw2d(grid=true, x_voxel=80, y_voxel=80,fill_color = cyan, region(-12*x+3*y<=3 and 4*x-10*y<=5 and x>=0, x,-1,5, y,-1,5)); |
5. zadatak
(%i82) | to_poly_solve([3*x+2*y>2,3*x+2*y<=6],[x,y]); |
(%i83) | fourier_elim([3*x+2*y>2,3*x+2*y<=6],[x,y]); |
(%i84) | wxdraw2d(grid=true, fill_color = cyan, region(3*x+2*y>2 and 3*x+2*y<=6, x,-3,3, y,-5,5))$ |
3 Linearno programiranje
(%i85) | load(simplex)$ |
1. zadatak: Draguljar - prstenje i privjeski
(%i86) | maximize_lp(8*x+10*y,[4*x+2*y<=40, 0.2*x+0.4*y<=5.6]), nonegative_lp=true; |
(%i87) | wxdraw2d(grid=true,fill_color=cyan, region(4*x+2*y<=40 and 0.2*x+0.4*y<=5.6, x,0,11, y,0,15)); |
2. zadatak - generator i dvije vrste goriva
(%i88) | minimize_lp(3*x+2.5*y, [x+y>=4, 3*x+5*y<=15]), nonegative_lp=true; |
(%i89) |
wxdraw2d(grid=true,x_voxel=100, y_voxel=100, xtics=[0,0.5,6], fill_color=cyan, region(x+y>=4 and 3*x+5*y<=15, x,0,6, y,0,2)); |
3. zadatak - prehrana životinja s dvije vrste stočne hrane
(%i90) | minimize_lp(2.5*x+3*y, [20*x+30*y>=18, 10*x+30*y>=12, 80*x+60*y>=48]), nonegative_lp=true; |
maksimum ne postoji
(%i91) | maximize_lp(2.5*x+3*y, [20*x+30*y>=18, 10*x+30*y>=12, 80*x+60*y>=48]), nonegative_lp=true; |
(%i92) |
wxdraw2d(grid=true,fill_color=cyan, xtics=[0,0.2,2], ytics=[0,0.2,2], region(20*x+30*y>=18 and 10*x+30*y>=12 and 80*x+60*y>=48, x, 0, 2, y, 0, 2)); |