/////////////////////////////////////////////////////////////////// // Moltiplicatori di Lagrange, esempio [CLO, p. 97, Example 3] // /////////////////////////////////////////////////////////////////// ring R = 0, (lambda,x,y,z), lp; // ordine lessicografico lambda > x > y > z option(redSB); poly f = x^3 + 2*x*y*z - z^2; // obiettivo poly g = x^2 + y^2 + z^2 - 1; // vincolo poly L = f - lambda * g; // lagrangiana ideal J = jacob(L); // ideale generato dalle derivate parziali della lagrangiana J; J[1]=-x^2-y^2-z^2+1 J[2]=-2*lambda*x+3*x^2+2*y*z J[3]=-2*lambda*y+2*x*z J[4]=-2*lambda*z+2*x*y-2*z ideal sJ = std(J); // base di Groebner per trovare i punti critici della lagrangiana // "a mano" dim(sJ); 0 sJ; sJ[1]=1152*z^7-1763*z^5+655*z^3-44*z sJ[2]=118*y*z^3-118*y*z-1152*z^6+1605*z^4-453*z^2 sJ[3]=3835*y^2*z-6912*z^5+10751*z^3-3839*z sJ[4]=3835*y^3+3835*y*z^2-3835*y-9216*z^5+11778*z^3-2562*z sJ[5]=3835*x*z+3835*y*z^2-1152*z^5-1404*z^3+2556*z sJ[6]=3835*x*y-19584*z^5+25987*z^3-6403*z sJ[7]=x^2+y^2+z^2-1 sJ[8]=7670*lambda-11505*x-11505*y*z-335232*z^6+477321*z^4-134419*z^2 factorize(sJ[1]); // per trovare le coordinate z dei punti critici, [1]: _[1]=1 _[2]=z-1 _[3]=z _[4]=128*z^2-11 _[5]=3*z+2 _[6]=3*z-2 _[7]=z+1 [2]: 1,1,1,1,1,1,1 // le coordinate y si trovano utilizzando sJ[2], sJ[3], sJ[4], // le x con sJ[5], sJ[6], sJ[7]; //////////////////////////////////////////////////////////////////////////// // I 10 punti critici si trovano piu' comodamente con il comando solve: // //////////////////////////////////////////////////////////////////////////// LIB "solve.lib"; // ** loaded /usr/bin/../share/singular/LIB/solve.lib (4.0.0.0,Jun_2013) // ** loaded /usr/bin/../share/singular/LIB/ring.lib (4.0.0.0,Jun_2013) // ** loaded /usr/bin/../share/singular/LIB/primdec.lib (4.0.2.0,Apr_2015) // ** loaded /usr/bin/../share/singular/LIB/absfact.lib (4.0.0.0,Jun_2013) // ** loaded /usr/bin/../share/singular/LIB/matrix.lib (4.0.0.0,Jun_2013) // ** loaded /usr/bin/../share/singular/LIB/nctools.lib (4.0.0.0,Jun_2013) // ** loaded /usr/bin/../share/singular/LIB/random.lib (4.0.0.0,Jun_2013) // ** loaded /usr/bin/../share/singular/LIB/poly.lib (4.0.0.0,Jun_2013) // ** loaded /usr/bin/../share/singular/LIB/elim.lib (4.0.0.1,Jan_2014) // ** loaded /usr/bin/../share/singular/LIB/general.lib (4.0.0.1,Jan_2014) // ** loaded /usr/bin/../share/singular/LIB/inout.lib (4.0.0.0,Jun_2013) // ** loaded /usr/bin/../share/singular/LIB/triang.lib (4.0.0.0,Jun_2013) solve(sJ,6,0); [1]: [1]: -1 [2]: 0 [3]: 0 [4]: -1 [2]: [1]: -1 [2]: 0 [3]: 0 [4]: 1 [3]: [1]: -1.333333 [2]: -0.666667 [3]: -0.333333 [4]: -0.666667 [4]: [1]: 0.125 [2]: -0.375 [3]: 0.879453 [4]: -0.293151 [5]: [1]: 0.125 [2]: -0.375 [3]: -0.879453 [4]: 0.293151 [6]: [1]: -1.333333 [2]: -0.666667 [3]: 0.333333 [4]: 0.666667 [7]: [1]: 0 [2]: 0 [3]: -1 [4]: 0 [8]: [1]: 0 [2]: 0 [3]: 1 [4]: 0 [9]: [1]: -1.5 [2]: -1 [3]: 0 [4]: 0 [10]: [1]: 1.5 [2]: 1 [3]: 0 [4]: 0 // 'solve' created a ring, in which a list SOL of numbers (the complex solutions) // is stored. // To access the list of complex solutions, type (if the name R was assigned // to the return value): setring R; SOL; // characteristic : 0 (complex:6 digits, additional 6 digits) // 1 parameter : i // minpoly : (i^2+1) // number of vars : 4 // block 1 : ordering lp // : names lambda x y z // block 2 : ordering C def S = _; setring S; poly fS = imap(R,f); list l; // crea una lista vuota l int i; for (i=1; i<=10; i=i+1) {l=insert(l,subst(fS,x,SOL[i][2],y,SOL[i][3],z,SOL[i][4]));}; // ciclo for per elencare i valori di f nei punti critici (alla rovescia) l; [1]: 1 [2]: -1 [3]: 0 [4]: 0 [5]: -1.037037 [6]: 0.0546875 [7]: 0.0546875 [8]: -1.037037 [9]: -1 [10]: -1 setring R; subst(f,x,-2/3,y,1/3,z,2/3); -28/27 // vediamo che // min: f(-2/3,1/3,2/3) = f(-2/3,-1/3,-2/3) = -28/27, max: f(1,0,0) = 1 monitor(""); /////////////////////////////////////////////////////// // Punti singolari di curve, esempio [CLO, p. 141] // /////////////////////////////////////////////////////// ring R = 0, (x,y), lp; option(redSB); poly f = -1156+688*x^2-191*x^4+16*x^6+544*y+30*x^2*y-40*x^4*y+225*y^2 -96*x^2*y^2+16*x^4*y^2-136*y^3-32*x^2*y^3+16*y^4; // trovare i punti singolari della curva affina piana V(f) ideal F = f; ideal J = jacob(f); ideal I = F + J; // V(I) = unione dei punti singolari, il "luogo singolare" ideal sI = std(I); size(sI); 3 // dimensione del luogo singolare: dim(sI); 0 sI; sI[1]=16384y7-45056y6-89088y5-281344y4+753344y3+659568y2+918892y-3157937 sI[2]=4096xy6+6144xy5+3840xy4-54016xy3-41232xy2-10344xy+185761x sI[3]=311040x2+4096y6-14336y5-21760y4-66816y3+508528y2-45304y-1023859 factorize(sI[1]); // per trovare le ordinate dei punti singolari [1]: _[1]=1 _[2]=64y3+48y2+12y-431 _[3]=4y-17 [2]: 1,2,1 diff(_[1][2],y); 192y2+96y+12 _/192; y2+1/2y+1/16 // Poiche' la derivata del il secondo fattore di sI[1] e' non negativa, // il secondo fattore di sI[1] ha una sola radice reale. ////////////////////////////////////////////////// // Altro metodo: utilizzare il comando solve. // ////////////////////////////////////////////////// LIB "solve.lib"; // ** loaded /usr/bin/../share/singular/LIB/solve.lib (4.0.0.0,Jun_2013) // ** loaded /usr/bin/../share/singular/LIB/ring.lib (4.0.0.0,Jun_2013) // ** loaded /usr/bin/../share/singular/LIB/primdec.lib (4.0.2.0,Apr_2015) // ** loaded /usr/bin/../share/singular/LIB/absfact.lib (4.0.0.0,Jun_2013) // ** loaded /usr/bin/../share/singular/LIB/matrix.lib (4.0.0.0,Jun_2013) // ** loaded /usr/bin/../share/singular/LIB/nctools.lib (4.0.0.0,Jun_2013) // ** loaded /usr/bin/../share/singular/LIB/random.lib (4.0.0.0,Jun_2013) // ** loaded /usr/bin/../share/singular/LIB/poly.lib (4.0.0.0,Jun_2013) // ** loaded /usr/bin/../share/singular/LIB/elim.lib (4.0.0.1,Jan_2014) // ** loaded /usr/bin/../share/singular/LIB/general.lib (4.0.0.1,Jan_2014) // ** loaded /usr/bin/../share/singular/LIB/inout.lib (4.0.0.0,Jun_2013) // ** loaded /usr/bin/../share/singular/LIB/triang.lib (4.0.0.0,Jun_2013) solve(sI,6,0); [1]: [1]: 0 [2]: 4.25 [2]: [1]: -0.936845 [2]: 1.639882 [3]: [1]: 0.936845 [2]: 1.639882 [4]: [1]: (-2.543378+i*1.132524) [2]: (-1.194941-i*1.636685) [5]: [1]: (2.543378-i*1.132524) [2]: (-1.194941-i*1.636685) [6]: [1]: (-2.543378-i*1.132524) [2]: (-1.194941+i*1.636685) [7]: [1]: (2.543378+i*1.132524) [2]: (-1.194941+i*1.636685) // 'solve' created a ring, in which a list SOL of numbers (the complex solutions) // is stored. // To access the list of complex solutions, type (if the name R was assigned // to the return value): setring R; SOL; // characteristic : 0 (complex:6 digits, additional 6 digits) // 1 parameter : i // minpoly : (i^2+1) // number of vars : 2 // block 1 : ordering lp // : names x y // block 2 : ordering C // Ci sono 7 punti singolari di cui (i primi) 3 reali. ////////////////////////////////////////////////////////// // Altro metodo ancora: utilizzare il comando slocus. // ////////////////////////////////////////////////////////// LIB "sing.lib"; // ** loaded /usr/bin/../share/singular/LIB/sing.lib (4.0.0.0,Jun_2013) // si ricordi che F = ideale generato da f che definisce la curva // V(slocus(F)) e' il luogo singolare della curva solve(slocus(F),6,0); [1]: [1]: 0 [2]: 4.25 [2]: [1]: -0.936845 [2]: 1.639882 [3]: [1]: 0.936845 [2]: 1.639882 [4]: [1]: (-2.543378+i*1.132524) [2]: (-1.194941-i*1.636685) [5]: [1]: (2.543378-i*1.132524) [2]: (-1.194941-i*1.636685) [6]: [1]: (-2.543378-i*1.132524) [2]: (-1.194941+i*1.636685) [7]: [1]: (2.543378+i*1.132524) [2]: (-1.194941+i*1.636685) // 'solve' created a ring, in which a list SOL of numbers (the complex solutions) // is stored. // To access the list of complex solutions, type (if the name R was assigned // to the return value): setring R; SOL; // characteristic : 0 (complex:6 digits, additional 6 digits) // 1 parameter : i // minpoly : (i^2+1) // number of vars : 2 // block 1 : ordering lp // : names x y // block 2 : ordering C monitor(""); ////////////////////////////////////////////////////////////////////// // Inviluppo di una famiglia di curve, esempio [CLO, pp. 147-152] // ////////////////////////////////////////////////////////////////////// ring R = 0, (t,x,y), lp; //ordine lessicografico t > x > y option(redSB); poly F = (x - t)^2 + (y - t^2)^2 - 4; // F definisce una famiglia di circonferenze coi centri lungo una parabola. ideal I = F, diff(F,t); ideal g = std(I); // inviluppo della famiglia F = {(x,y)| esiste un numero reale t con (x,y,t) in V(I)} g; g[1]=16x6+16x4y2-40x4y-191x4-32x2y3-96x2y2+30x2y+688x2+16y4-136y3+225y2+544y-1156 g[2]=256ty4-896ty3-768ty2-1928ty+7327t+128x5y+224x5+128x3y3-224x3y2-1480x3y-2946x3-384xy4-544xy3-792xy2+2922xy+6929x g[3]=64txy3+48txy2+12txy-431tx-32x4y+16x4-32x2y3+32x2y2+214x2y+159x2-32y4+80y3+366y2-320y-952 g[4]=288tx2-64ty3+336ty2-108ty-697t-32x5-32x3y2+112x3y+174x3+96xy3-32xy2-322xy-23x g[5]=135t2+32txy2+40txy+26tx-16x4-16x2y2+8x2y+111x2-16y3+32y2+64y-128 // L'inviluppo e' contenuto nella curva V(g[1]). // Poiche' il coefficiente pricipale di t in g[5] e' costante = 135, // segue dal teorema di estensione che ogni soluzione (x,y) si estende // a una soluzione (x,y,t) del sistema g (con t un numero complesso!) // e al massimo a due soluzioni (il grado di g[5] in t e' due). // Utilizzando g[2]=A2(x,y)*t+B2(x,y), g[3]=A3(x,y)*t+B3(x,y), g[4]=A4(x,y)*t+B4(x,y), // si trova che t = -B2/A2 = -B3/A3 = -B4/A4 e' reale. // Calcoliamo le A: poly A2 = diff(g[2],t); poly A3 = diff(g[3],t); poly A4 = diff(g[4],t); ideal A = A2, A3, A4; // V(A) = luogo nel piano x,y, dove le A si annullano simultaneamente. // Vedremo che V(A) = luogo singolare di V(g[1]) = V(g[1],diff(g[1],x),diff(g[1],y)). ideal sA = std(A); // Infatti, g[1], diff(g[1],x) e diff(g[1],y) sono in A: reduce(g[1],sA); 0 reduce(diff(g[1],x),sA); 0 reduce(diff(g[1],y),sA); 0 // D'altra parte, A2^2, A3^2, A4^2 sono nell'ideale generato // da g[1],diff(g[1],x),diff(g[1],y): ideal G = g[1],diff(g[1],x),diff(g[1],y); ideal sG = std(G); reduce(A2^2,sG); 0 reduce(A3^2,sG); 0 reduce(A4^2,sG); 0 monitor("");