//---Robot dell'esempio 1, [CLO, p. 273] ring r=(0,l3,l2,a,b),(c2,s2,c1,s1),lp; option(redSB); ideal id=l3*(c1*c2-s1*s2)+l2*c1-a, l3*(c1*s2+c2*s1)+l2*s1-b, c1^2+s1^2-1,c2^2+s2^2-1; ideal j=std(id); //--- base di Groebner dell'ideale id j; j[1]=(4*l2^2*a^2+4*l2^2*b^2)*s1^2+(4*l3^2*l2*b-4*l2^3*b-4*l2*a^2*b-4*l2*b^3)*s1+(l3^4-2*l3^2*l2^2-2*l3^2*a^2-2*l3^2*b^2+l2^4-2*l2^2*a^2+2*l2^2*b^2+a^4+2*a^2*b^2+b^4) j[2]=(2*l2*a)*c1+(2*l2*b)*s1+(l3^2-l2^2-a^2-b^2) j[3]=(2*l3*l2*a)*s2+(2*l2*a^2+2*l2*b^2)*s1+(l3^2*b-l2^2*b-a^2*b-b^3) j[4]=(2*l3*l2)*c2+(l3^2+l2^2-a^2-b^2) //---Pomiamo l2 = l3 =1 ideal ids=subst(id,l3,1,l2,1); ids; ids[1]=c2*c1-s2*s1+c1+(-a) ids[2]=c2*s1+s2*c1+s1+(-b) ids[3]=c1^2+s1^2-1 ids[4]=c2^2+s2^2-1 //--- base di Groebner dell'ideale ids ideal gids = std(ids); gids; gids[1]=(4*a^2+4*b^2)*s1^2+(-4*a^2*b-4*b^3)*s1+(a^4+2*a^2*b^2-4*a^2+b^4) gids[2]=(2*a)*c1+(2*b)*s1+(-a^2-b^2) gids[3]=(2*a)*s2+(2*a^2+2*b^2)*s1+(-a^2*b-b^3) gids[4]=2*c2+(-a^2-b^2+2) //--- per discutere il caso a = 0 bisogna ricalcolare // la base di Groebner ideal ida0 = subst(ids,a,0); ida0; ida0[1]=c2*c1-s2*s1+c1 ida0[2]=c2*s1+s2*c1+s1+(-b) ida0[3]=c1^2+s1^2-1 ida0[4]=c2^2+s2^2-1 std(ida0); _[1]=2*s1+(-b) _[2]=4*c1^2+(b^2-4) _[3]=s2+(-b)*c1 _[4]=2*c2+(-b^2+2) //---Risolviamo il problema cinematico inverso, // cioe' dato il posizionamento della mano // (a,b) calcoliamo (c2,s2,c1,s1)=: elenco l. 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.1.2,Jan_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) list l=solve(ids,6,0); ring re=(real,6),(c2,s2,c1,s1),lp; ideal reids = imap(r,ids); //--- bisogna fare il passaggio in due passi ring re=(real,6),(c2,s2,c1,s1,l3,l2,a,b),lp; // ** redefining re ** ideal re_ids = imap(r,ids); ids; setring r; ids; ids[1]=c2*c1-s2*s1+c1+(-a) ids[2]=c2*s1+s2*c1+s1+(-b) ids[3]=c1^2+s1^2-1 ids[4]=c2^2+s2^2-1 ring re=(real,6),(c2,s2,c1,s1,l3,l2,a,b),lp; // ** redefining re ** ideal re_ids = imap(r,ids); ideal id2 = c2*c1-s2*s1+c1+(-a), c2*s1+s2*c1+s1+(-b),=c1^2+s1^2-1,c2^2+s2^2-1; skipping text from `c1` ideal id2 = c2*c1-s2*s1+c1+(-a), c2*s1+s2*c1+s1+(-b),c1^2+s1^2-1,c2^2+s2^2-1; ring re2=(real,6),(c2,s2,c1,s1,a,b),lp; ideal id3 = imap(re,id2); ideal id4 = a-1, b-1; ideal id5 = id3 + id4; list l=solve(id5,6,0); // ** redefining l ** [1]: [1]: 0 [2]: 1 [3]: 1 [4]: 0 [5]: 1 [6]: 1 [2]: [1]: 0 [2]: -1 [3]: 0 [4]: 1 [5]: 1 [6]: 1 // '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; //---Robot dell'esempio 2, [CLO, p. 274] ring r=(0,l4,l3,l2,a,b,c,s),(c2,s2,c1,s1),lp; // ** redefining r ** option(redSB); ideal id=l4*c+l3*(c1*c2-s1*s2)+l2*c1-a, l4*s+l3*(c1*s2+c2*s1)+l2*s1-b, c1^2+s1^2-1,c2^2+s2^2-1; id; id[1]=(l3)*c2*c1+(-l3)*s2*s1+(l2)*c1+(l4*c-a) id[2]=(l3)*c2*s1+(l3)*s2*c1+(l2)*s1+(l4*s-b) id[3]=c1^2+s1^2-1 id[4]=c2^2+s2^2-1 monitor("");