monitor("lezione17-03-21.txt","io"); /////////////////////////////////////////////////////////////////// // Moltiplicatori di Lagrange, esempio [CLO, p. 99, 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; ideal sJ = std(J); // base di Groebner per trovare i punti critici della lagrangiana // "a mano" dim(sJ); sJ; factorize(sJ[1]); // per trovare le coordinate z dei punti critici, // 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"; solve(sJ,6,0); 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]),size(l));}; // ciclo for per elencare i valori di f nei punti critici l; setring R; subst(f,x,-2/3,y,1/3,z,2/3); // 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(""); quit;