//---Robot dell'esempio 2, [CLO, p. 274] // con l2 = l3 = 1 e 1 <= l4 <= 2 //---Risolviamo il problema cinematico inverso, cioe' // dato il posizionamento della mano (a,b,c,s) = (2.5,0,1,0) // troviamo (c2,s2,c1,s1,l4) ring r = 0,(c2,s2,c1,s1,l4),lp; option(redSB); ideal id=l4+(c1*c2-s1*s2)+c1-5/2, (c1*s2+c2*s1)+s1, c1^2+s1^2-1, c2^2+s2^2-1; ideal gid = std(id); dim(gid); 1 gid; gid[1]=32*s1^2*l4-80*s1^2+8*l4^3-60*l4^2+118*l4-45 gid[2]=8*c1*l4-20*c1+4*l4^2-20*l4+25 gid[3]=c1^2+s1^2-1 gid[4]=2*s2-2*s1*l4+5*s1 gid[5]=8*c2-4*l4^2+20*l4-17 //---non c'e' il tempo per discutere il sistema //---poniamo l4 = 1.5 ideal ids = subst(id, l4, 3/2); ids; ids[1]=c2*c1-s2*s1+c1-1 ids[2]=c2*s1+s2*c1+s1 ids[3]=c1^2+s1^2-1 ids[4]=c2^2+s2^2-1 ring r2 = 0,(c2,s2,c1,s1),lp; ideal ids2 = imap(r,ids); ids2; ids2[1]=c2*c1-s2*s1+c1-1 ids2[2]=c2*s1+s2*c1+s1 ids2[3]=c1^2+s1^2-1 ids2[4]=c2^2+s2^2-1 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(ids2,6,0); [1]: [1]: -0.5 [2]: 0.866025 [3]: 0.5 [4]: -0.866025 [2]: [1]: -0.5 [2]: -0.866025 [3]: 0.5 [4]: 0.866025 // '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; monitor("");