Design of a moving 7-bar mechanism ================================== Laurent polynomial systems are systems that have negative exponents. In this section, we consider a Laurent system with one irreducible component of degree three and six isolated points. A reference for the general case is the paper by Carlo Innocenti: **Polynomial solution to the position analysis of the 7-line Assur kinematic chain with one quaternary link**, in *Mech. Mach. Theory*, Vol. 30, No. 8, pages 1295-1303, 1995. The special case was introduced in the paper with title: **Numerical decomposition of the solution sets of polynomial systems into irreducible components**, *SIAM J. Numer. Anal.* 38(6):2022-2046, 2001, by Andrew Sommese, Jan Verschelde, and Charles Wampler. This special sevenbar mechanism has 6 isolated solutions and a cubic curve." SymPy is used to define the equations, with complex arithmetic. :: from cmath import exp from sympy import var From ``phcpy``, the following functions are imported: :: from phcpy.solutions import coordinates, diagnostics, condition_tables from phcpy.solver import solve from phcpy.sets import double_laurent_membertest from phcpy.cascades import double_laurent_top_cascade from phcpy.cascades import double_laurent_cascade_filter from phcpy.factor import double_monodromy_breakup a Laurent polynomial system --------------------------- The code in this section defines the Laurent polynomial system for a generic instance of the parameters. :: def symbolic_equations(): """ Returns the symbolic equations, with parameters a1, a2, a3, a4, a5, a6 b0, b2, b3, b4, b5, and c0, with variables t1, t2, t3, t4, and t5. """ a0, a1, a2, a3, a4, a5, a6 = var('a0, a1, a2, a3, a4, a5, a6') b0, b2, b3, b4, b5, c0 = var('b0, b2, b3, b4, b5, c0') t1, t2, t3, t4, t5, t6 = var('t1, t2, t3, t4, t5, t6') eq1 = a1*t1 + a2*t2 - a3*t3 - a0 eq2 = b2*t2 + a3*t3 - a4*t4 + a5*t5 - b0 eq3 = a4*t4 + b5*t5 - a6*t6 - c0 return [eq1, eq2, eq3] Then the symbolic equations are computed via :: eqs = symbolic_equations() for equ in eqs: print(equ) with output in :: -a0 + a1*t1 + a2*t2 - a3*t3 a3*t3 - a4*t4 + a5*t5 - b0 + b2*t2 a4*t4 - a6*t6 + b5*t5 - c0 A generic instance of the problem is defined in the following function: :: def generic_problem(eqs): """ Given the symbolic equations in eqs, defines the equations for a generic problem, as a Laurent polynomial system. The system is returned as a list of string representations, suitable for input to the solve of phcpy. """ i = complex(0, 1) subdict = {a0: 0.7 + 0.2*i, b0: 0.6, c0: 0.5 - 0.5*i, \ a1: 0.7, a2: 0.8, b2: 0.6 + 0.5*i, a3: 0.4, a4: 0.6, \ a5: 0.8, b5: 0.4 + 0.3*i, a6: 0.9} print(subdict) conjugates = {a0: 0.7 - 0.2*i, b0: 0.6, c0: 0.5 + 0.5*i, \ a1: 0.7, a2: 0.8, b2: 0.6 - 0.5*i, a3: 0.4, a4: 0.6, \ a5: 0.8, b5: 0.4 - 0.3*i, a6: 0.9} print(conjugates) result = [] for equ in eqs: pol = equ.subs(subdict) result.append(str(pol) + ';') for equ in eqs: pol = str(equ.subs(conjugates)) pol = pol.replace('t1', 't1**(-1)') pol = pol.replace('t2', 't2**(-1)') pol = pol.replace('t3', 't3**(-1)') pol = pol.replace('t4', 't4**(-1)') pol = pol.replace('t5', 't5**(-1)') pol = pol.replace('t6', 't6**(-1)') result.append(pol + ';') return result Then the system is constructed symbolically via :: T1, T2, T3, T4, T5, T6 = var('T1, T2, T3, T4, T5, T6') generic = generic_problem(eqs) for equ in generic: print(equ) with output :: 0.7*t1 + 0.8*t2 - 0.4*t3 - 0.7 - 0.2*I; t2*(0.6 + 0.5*I) + 0.4*t3 - 0.6*t4 + 0.8*t5 - 0.6; 0.6*t4 + t5*(0.4 + 0.3*I) - 0.9*t6 - 0.5 + 0.5*I; 0.7*t1**(-1) + 0.8*t2**(-1) - 0.4*t3**(-1) - 0.7 + 0.2*I; t2**(-1)*(0.6 - 0.5*I) + 0.4*t3**(-1) - 0.6*t4**(-1) + 0.8*t5**(-1) - 0.6; 0.6*t4**(-1) + t5**(-1)*(0.4 - 0.3*I) - 0.9*t6**(-1) - 0.5 - 0.5*I; Observe the negative exponents. Now, let us call the blackbox solver: :: sols = solve(generic) print('found', len(sols), 'solutions') which prints ``found 18 solutions``. A condition table is a frequency table of the ``err``, ``rco``, and ``res`` fields of the solutions. :: condition_tables(sols) with output in :: ([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 2], [3, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 7]) The first and third row indicate that the forward and backward errors of the solutions were all very small. The second row indicates that the estimates for the condition numbers were also in the good range. So, 18 solutions are well conditioned. a special problem ----------------- As we have as many equations as variables, for general coefficients, we will have only isolated solutions. For special parameters, the system has an irreducible cubic as a solution set. :: def special_parameters(): """ Returns a dictionary with special values for the parameters for the Assur7c in Roberts Cognate pattern. Before calling this function, the symbolic_equations() must have defined the variables for the parameters. """ i = complex(0, 1) # start with the independent parameters result = {b0: 0.0, c0: 1.2, a2: 0.46, \ b2: -0.11 + 0.49*i, a5: 0.41} theta4 = 0.6 + 0.8*i theta3 = exp(1.8*i) # add the derived parameters result[a3] = result[a5] beta = result[b2]/result[a2] result[a0] = result[c0]/beta result[b5] = result[a5]*beta result[a4] = abs(result[b2]) result[a1] = abs(result[a0] + result[a3]*theta3 - result[a4]*theta4/beta) result[a6] = abs(result[a4]*theta4 - result[b5]*theta3-result[c0]) return result :: def conjugates(dic): """ Given on input a dictionary with variables as keys and complex numbers as values. Returns a dictionary with the same keys, but with values replaced by complex conjugates. """ result = {} for key in list(dic.keys()): result[key] = dic[key].conjugate() return result :: def special_problem(eqs): """ Given the symbolic equations in eqs, replaces the parameters with special values. """ pars = special_parameters() conj = conjugates(pars) result = [] for equ in eqs: pol = equ.subs(pars) result.append(str(pol) + ';') for equ in eqs: pol = str(equ.subs(conj)) pol = pol.replace('t1', 't1**(-1)') pol = pol.replace('t2', 't2**(-1)') pol = pol.replace('t3', 't3**(-1)') pol = pol.replace('t4', 't4**(-1)') pol = pol.replace('t5', 't5**(-1)') pol = pol.replace('t6', 't6**(-1)') result.append(pol + ';') return result Constructing the polynomials of the special problem :: special = special_problem(eqs) for equ in special: print(equ) leads to :: 0.710358341606049*t1 + 0.46*t2 - 0.41*t3 + 0.240761300555115 + 1.07248215701824*I; t2*(-0.11 + 0.49*I) + 0.41*t3 - 0.502195181179589*t4 + 0.41*t5; 0.502195181179589*t4 + t5*(-0.0980434782608696 + 0.436739130434783*I) - 0.775518556663656*t6 - 1.2; 0.710358341606049*t1**(-1) + 0.46*t2**(-1) - 0.41*t3**(-1) + 0.240761300555115 - 1.07248215701824*I; t2**(-1)*(-0.11 - 0.49*I) + 0.41*t3**(-1) - 0.502195181179589*t4**(-1) + 0.41*t5**(-1); 0.502195181179589*t4**(-1) + t5**(-1)*(-0.0980434782608696 - 0.436739130434783*I) - 0.775518556663656*t6**(-1) - 1.2; Running the ``solve`` of the ``solver`` module and printing the number of solutions :: sols = solve(special) print('found', len(sols), 'solutions') shows ``found 6 solutions``. Let us look at all solutions, executing :: for (idx, sol) in enumerate(sols): print('Solution', idx+1, ':') print(sol) which gives the output :: Solution 1 : t : 1.00000000000000E+00 0.00000000000000E+00 m : 1 the solution for t : t1 : -5.66058532229597E-01 -3.67759063106022E-01 t2 : 5.87958784214731E-01 -2.31024744989669E-01 t3 : 2.66141319725173E-01 1.71943916132782E+00 t4 : 2.42136902539446E-01 1.56435563278512E+00 t5 : -8.79136932379914E-02 -5.67977370543055E-01 t6 : -1.05957839449340E+00 1.03531112257767E+00 == err : 3.073E-15 = rco : 3.135E-02 = res : 9.853E-16 = Solution 2 : t : 1.00000000000000E+00 0.00000000000000E+00 m : 1 the solution for t : t1 : 3.53717078322846E-01 -5.30879118400565E-01 t2 : -5.99365365166588E-01 -1.57888836421937E+00 t3 : 5.27607584716191E-01 -7.54168308853111E-02 t4 : 5.86169848996842E-01 -8.37877878416834E-02 t5 : -1.85739737768408E+00 2.65498503011424E-01 t6 : -1.08247082572556E+00 -1.13383016827930E+00 == err : 2.542E-15 = rco : 3.053E-02 = res : 4.510E-16 = Solution 3 : t : 1.00000000000000E+00 0.00000000000000E+00 m : 1 the solution for t : t1 : 8.69193907041793E-01 -1.30453665759482E+00 t2 : -2.10146778358548E-01 -5.53582709999063E-01 t3 : 1.85739737768408E+00 -2.65498503011422E-01 t4 : 1.67183103323242E+00 -2.38973437749056E-01 t5 : -5.27607584716191E-01 7.54168308853116E-02 t6 : -4.40509781239126E-01 -4.61410384022367E-01 == err : 8.299E-16 = rco : 2.577E-02 = res : 4.302E-16 = Solution 4 : t : 1.00000000000000E+00 0.00000000000000E+00 m : 1 the solution for t : t1 : -5.45421549881402E-01 -8.38161877518281E-01 t2 : -5.49340801920855E-01 -8.35598398361888E-01 t3 : -9.74098087752273E-01 2.26125884049935E-01 t4 : 1.78912046655936E-01 -9.83865071827120E-01 t5 : 4.72153176961024E-02 -9.98884734979395E-01 t6 : -8.74935009483375E-01 -4.84240363022669E-01 == err : 2.024E-15 = rco : 1.693E-01 = res : 6.661E-16 = Solution 5 : t : 1.00000000000000E+00 0.00000000000000E+00 m : 1 the solution for t : t1 : -1.24225818334613E+00 -8.07075027813303E-01 t2 : 1.47332994921904E+00 -5.78910775622768E-01 t3 : 8.79136932379908E-02 5.67977370543054E-01 t4 : 9.66290808831226E-02 6.24284218493861E-01 t5 : -2.66141319725174E-01 -1.71943916132781E+00 t6 : -4.82817017275396E-01 4.71759173981634E-01 == err : 2.046E-15 = rco : 3.752E-02 = res : 9.992E-16 = Solution 6 : t : 1.00000000000000E+00 0.00000000000000E+00 m : 1 the solution for t : t1 : 2.80836878017556E-01 -9.59755514673061E-01 t2 : -9.99161738567148E-01 4.09367827689738E-02 t3 : -4.72153176961015E-02 9.98884734979395E-01 t4 : 9.35633636119240E-01 -3.52972660360954E-01 t5 : 9.74098087752273E-01 -2.26125884049935E-01 t6 : -9.37276397924231E-01 3.48587082225057E-01 == err : 1.949E-15 = rco : 1.566E-01 = res : 7.910E-16 = The output of :: condition_tables(sols) is :: ([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1], [2, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6]) The ``solve`` of the solver module misses the component, but finds all isolated solutions. a numerical irreducible decomposition ------------------------------------- A numerical irreducible decomposition for this system augments the system with a linear equation and adds one slack variable. A cascade of homotopies find generic points on all positive dimensional components of the solution set. The cascade is wrapped in the following function :: def embed_and_cascade(pols, topdim): """ Computes and solves an embedding at top dimension topdim of the Laurent polynomials in pols, before running one step in the cascade homotopy. Returns the embedded system, the three generic points, and the filtered solutions at the end of the cascade. """ (embpols, sols0, sols1) \ = double_laurent_top_cascade(len(pols), topdim, pols, 1.0e-08) print('the top generic points :') for (idx, sol) in enumerate(sols0): print('Solution', idx+1, ':') print(sol) print('the nonsolutions :') for (idx, sol) in enumerate(sols1): print('Solution', idx+1, ':') print(sol) print('... running cascade step ...') (embdown, nsols1, sols2) = double_laurent_cascade_filter(1, embpols, \ sols1, 1.0e-8) filtsols2 = [] for (idx, sol) in enumerate(nsols1): err, rco, res = diagnostics(sol) if res < 1.0e-8 and rco > 1.0e-8: _, point = coordinates(sol) crdpt = [] for pt in point: crdpt.append(pt.real) crdpt.append(pt.imag) onset = double_laurent_membertest(embpols, sols0, 1, crdpt) if not onset: filtsols2.append(sol) print('... after running the cascade ...') for (idx, sol) in enumerate(filtsols2): print('Solution', idx+1, ':') print(sol) print('found %d isolated solutions' % len(filtsols2)) return (embpols, sols0, filtsols2) Running the code in :: (embpols, sols0, isosols) = embed_and_cascade(special, 1) produces the following output: :: the top generic points : Solution 1 : t : 1.00000000000000E+00 0.00000000000000E+00 m : 1 the solution for t : t1 : -1.38546903964616E-01 -6.90082116709782E-01 t2 : 1.73335780614296E+00 -1.87923014523194E+00 t3 : 2.29192181084370E+00 -6.88217799479036E-01 zz1 : 6.81370071005700E-17 1.65228741665612E-16 t4 : 1.45392357364500E+00 2.10288883797136E+00 t5 : -2.29192181084370E+00 6.88217799479037E-01 t6 : -7.03671420729004E-01 -1.59719770241003E-02 == err : 1.018E-14 = rco : 7.104E-03 = res : 1.619E-15 = Solution 2 : t : 1.00000000000000E+00 0.00000000000000E+00 m : 1 the solution for t : t1 : 9.95322784254993E-01 2.68098302301308E-02 t2 : -2.29577075969873E-01 -2.62541647600257E-01 t3 : 2.05412606828065E+00 2.36770142844668E+00 zz1 : 7.58249556746807E-16 -7.20127010307089E-16 t4 : 3.06452334567059E-01 -1.66495396855090E-01 t5 : -2.05412606828065E+00 -2.36770142844668E+00 t6 : 2.44172639794733E-01 -9.65280235905487E-01 == err : 3.577E-15 = rco : 2.031E-02 = res : 1.998E-15 = Solution 3 : t : 1.00000000000000E+00 0.00000000000000E+00 m : 1 the solution for t : t1 : -2.82166573126121E-01 3.94770824953965E-01 t2 : -1.34882663123749E-01 -2.78088349356538E+00 t3 : -5.29856181081608E-02 1.79767069529071E-01 zz1 : 2.43319655939393E-15 2.43565365274284E-15 t4 : 2.74289769478703E+00 4.77512904043170E-01 t5 : 5.29856181081606E-02 -1.79767069529072E-01 t6 : 3.23379011328058E-01 3.61784458285676E-01 == err : 6.752E-15 = rco : 2.149E-03 = res : 2.746E-15 = the nonsolutions : Solution 1 : t : 1.00000000000000E+00 0.00000000000000E+00 m : 1 the solution for t : t1 : 2.06608664978716E-01 -5.16879012501813E-01 t2 : -2.63044555866456E+00 -3.32754563190078E+00 t3 : 2.63517362859822E-02 -3.68638950244269E-01 zz1 : 2.85704892320864E-01 -1.03310141444983E+00 t4 : 3.69849125743338E+00 -3.24986222144375E-01 t5 : 2.43555779349728E+00 2.20779169965979E+00 t6 : -9.87691023055072E-01 2.23467268352943E+00 == err : 3.403E-15 = rco : 2.764E-02 = res : 1.561E-15 = Solution 2 : t : 1.00000000000000E+00 0.00000000000000E+00 m : 1 the solution for t : t1 : 3.09054535971898E-01 3.45124987046649E-02 t2 : -2.62571332002632E-01 3.96698883381851E-02 t3 : 4.32699725536785E+00 5.00970765602759E+00 zz1 : 2.88323234772462E-01 -1.68997834567399E+00 t4 : -1.07803480589631E+00 -1.04944159716503E+00 t5 : -1.51252934187501E+00 -6.41341577084612E+00 t6 : 1.32322533488782E+00 1.47762805502765E+00 == err : 6.549E-15 = rco : 1.025E-02 = res : 3.109E-15 = Solution 3 : t : 1.00000000000000E+00 0.00000000000000E+00 m : 1 the solution for t : t1 : -4.38810628559853E-02 -3.73466290987713E-01 t2 : 1.41948412243664E+00 2.64381540059301E-01 t3 : -1.51714321706050E-01 2.82809534841746E+00 zz1 : 5.80561465793845E-01 7.55877838451024E-01 t4 : 6.84618807253357E-01 -1.45281628643651E-01 t5 : 2.97376151600431E-01 -2.76806627220378E+00 t6 : -3.91051079512042E-01 -5.02441609168954E-01 == err : 3.533E-15 = rco : 1.180E-02 = res : 1.086E-15 = Solution 4 : t : 1.00000000000000E+00 0.00000000000000E+00 m : 1 the solution for t : t1 : -5.56053317223021E-01 -1.10476501709143E+00 t2 : 1.08198361813419E+00 -6.10107625522898E-01 t3 : 1.63797645826712E+00 2.65500692732987E-01 zz1 : -3.75750870070081E-02 -3.41463274433182E-01 t4 : 1.13327119828200E+00 1.00882972129605E+00 t5 : 8.79031826440765E-02 -8.01012123191631E-01 t6 : -2.97523163734206E-01 1.24044339222691E+00 == err : 1.312E-15 = rco : 2.758E-02 = res : 1.305E-15 = Solution 5 : t : 1.00000000000000E+00 0.00000000000000E+00 m : 1 the solution for t : t1 : 1.42858931075131E-01 4.57096616580137E-01 t2 : -1.11064648867271E-01 -1.72825737676934E-01 t3 : 2.13308888441550E+00 1.81873215330586E+00 zz1 : -7.57293747789502E-01 -3.06703567333995E-01 t4 : 2.49672678368341E-01 -1.36328639570869E-01 t5 : -1.84534929207840E+00 -3.88014927109987E+00 t6 : 2.03214759107748E+00 -3.03532919113466E-01 == err : 7.406E-15 = rco : 6.149E-03 = res : 1.971E-15 = Solution 6 : t : 1.00000000000000E+00 0.00000000000000E+00 m : 1 the solution for t : t1 : -4.75108750576191E-02 -1.75815265025158E-02 t2 : -3.39314399121161E+00 1.41556569134256E+01 t3 : -8.54021034392022E+00 -1.38811633117136E+01 zz1 : -1.13042166796985E+01 7.26160237898825E+00 t4 : 4.31260891858428E-03 -2.20764606490238E-02 t5 : 1.89710631587227E-02 -1.71967991631555E-02 t6 : 1.24227998831989E+01 -1.02611559314054E+01 == err : 1.583E-14 = rco : 1.029E-05 = res : 1.698E-14 = Solution 7 : t : 1.00000000000000E+00 0.00000000000000E+00 m : 1 the solution for t : t1 : 9.24280274976326E-01 -1.03328843987402E+00 t2 : -5.37485466298478E-01 -6.93996812904627E-01 t3 : 2.16870928120656E+00 3.05270120118574E-01 zz1 : 1.72164678001449E-03 -2.61490044232207E-01 t4 : 1.12688433550202E+00 6.04135856872397E-01 t5 : -1.14709448190074E+00 7.21699657198301E-01 t6 : -1.06009576375345E+00 -9.36416226240182E-03 == err : 1.235E-15 = rco : 1.803E-02 = res : 1.473E-15 = Solution 8 : t : 1.00000000000000E+00 0.00000000000000E+00 m : 1 the solution for t : t1 : 2.56141977779414E-01 -1.26192262870549E-01 t2 : 2.72348811313250E-02 2.27695964490337E+00 t3 : 8.94179859360769E-02 1.64582692269313E-02 zz1 : -1.69636690132142E+00 1.17291673807606E+00 t4 : 1.44816411386502E-01 -5.21926135720004E-02 t5 : -1.06047458297333E+00 -2.70699717824994E+00 t6 : 2.29314581678167E+00 -1.93548691562723E+00 == err : 3.630E-15 = rco : 1.266E-03 = res : 2.873E-15 = Solution 9 : t : 1.00000000000000E+00 0.00000000000000E+00 m : 1 the solution for t : t1 : -5.55849610226793E-01 -6.71303249412053E-01 t2 : 2.22897995402302E+00 -6.36069101208733E-01 t3 : -6.01231159130768E-03 3.20619531479791E-01 zz1 : 1.91319173054801E-01 8.69593783238856E-01 t4 : 1.46082467405615E+00 1.30115181744724E+00 t5 : -2.81326700289881E-01 -5.36286320208369E-01 t6 : -5.80370651666996E-01 -3.51674733202245E-01 == err : 1.098E-15 = rco : 2.893E-02 = res : 1.563E-15 = Solution 10 : t : 1.00000000000000E+00 0.00000000000000E+00 m : 1 the solution for t : t1 : 1.96420789232812E-01 -7.25547806896222E-01 t2 : 4.99261380871303E-01 6.57994832350889E-02 t3 : 1.79119494447843E-01 8.39067157393641E-02 zz1 : -2.92932332587968E-01 7.12592654282584E-01 t4 : 1.31985073905489E+00 5.86875406583772E-01 t5 : -2.16641539477234E-01 -1.59643525554850E-01 t6 : -2.56051374441468E-01 -6.62533448829890E-01 == err : 4.769E-16 = rco : 7.725E-03 = res : 1.402E-15 = Solution 11 : t : 1.00000000000000E+00 0.00000000000000E+00 m : 1 the solution for t : t1 : -2.60846935289829E-01 -1.87501112823166E+00 t2 : 8.91205034115317E-01 2.18216656676799E+00 t3 : 1.35354427992550E-01 2.14130902473316E-01 zz1 : -4.38444725918741E-01 6.37863637010385E-01 t4 : 4.58998133742581E-01 3.40221617387902E-01 t5 : 1.48618652575694E+00 -8.83671361618052E-01 t6 : -4.27731643521526E-01 3.12634407365499E-01 == err : 4.740E-15 = rco : 1.451E-02 = res : 2.900E-15 = Solution 12 : t : 1.00000000000000E+00 0.00000000000000E+00 m : 1 the solution for t : t1 : 2.58526368145855E-02 -5.89746935862251E-01 t2 : 5.89197128653301E-01 -8.56471323438483E-01 t3 : 4.99885121099350E-01 -8.51253650022305E-02 zz1 : -1.40247285577845E-01 4.15696687647816E-01 t4 : 1.66773190687860E+00 8.55179987286000E-01 t5 : -3.91334700102683E-01 1.44828575079480E-01 t6 : -3.52629174262130E-01 -2.31227315105538E-01 == err : 3.496E-15 = rco : 1.796E-02 = res : 1.877E-15 = Solution 13 : t : 1.00000000000000E+00 0.00000000000000E+00 m : 1 the solution for t : t1 : 1.31675077902931E+00 -2.33335629490662E+00 t2 : 2.60288716555775E-01 -6.40025748193045E-02 t3 : 3.47791530603780E+00 3.39861528263726E+00 zz1 : 1.78921624866824E+00 -9.20506290946835E-01 t4 : -3.11182618390869E-02 1.27100852726915E-01 t5 : -1.76684760979132E-01 1.89283790316579E-02 t6 : -3.78392322972795E+00 1.30979364462129E+00 == err : 5.729E-15 = rco : 1.880E-03 = res : 3.067E-15 = Solution 14 : t : 1.00000000000000E+00 0.00000000000000E+00 m : 1 the solution for t : t1 : 1.09751178036435E+00 -1.40574539820329E+00 t2 : -6.26603734750229E-01 2.77315044013342E+00 t3 : 1.16737341994583E-01 1.23560628499014E-01 zz1 : -9.17943053708135E-01 1.14574950444327E+00 t4 : 2.24794207999588E-01 -2.20864560734679E-01 t5 : 7.19265347716089E-03 -2.96930745959293E-01 t6 : -1.46858876699108E-01 -1.65019111957513E+00 == err : 9.467E-16 = rco : 1.061E-02 = res : 1.874E-15 = Solution 15 : t : 1.00000000000000E+00 0.00000000000000E+00 m : 1 the solution for t : t1 : -1.30458602699707E+00 -2.33541493076135E+00 t2 : -1.95199047692026E-01 -4.46316027103696E-01 t3 : -2.63391619655473E-01 -2.31639399176850E-01 zz1 : 3.72490200270314E-01 -8.90356341436546E-01 t4 : 2.41781694569341E+00 1.09012175794204E-01 t5 : 4.97584553326169E+00 7.63254192555898E-01 t6 : -1.44788918406800E+00 3.95223854445634E+00 == err : 1.808E-15 = rco : 2.602E-02 = res : 1.971E-15 = Solution 16 : t : 1.00000000000000E+00 0.00000000000000E+00 m : 1 the solution for t : t1 : 5.06717666964459E-01 -7.97241780193331E-01 t2 : -4.84953123213085E-01 -4.42303335072244E-01 t3 : 9.44820387296986E-01 -1.44512677763047E-02 zz1 : -2.86872573899956E-01 1.14217012524121E-01 t4 : 1.47330976885270E+00 3.99769298368997E-01 t5 : -2.57072989456668E-01 3.67302107948625E-01 t6 : -4.07703118258568E-01 -1.02532173760480E-01 == err : 1.760E-15 = rco : 2.381E-02 = res : 1.249E-15 = Solution 17 : t : 1.00000000000000E+00 0.00000000000000E+00 m : 1 the solution for t : t1 : -4.44607365409264E-02 -2.59406017880835E-01 t2 : 3.78176637095005E-01 4.39268560397966E-01 t3 : -1.79503189927382E+00 3.20305158897225E+00 zz1 : 6.51015867427647E-01 9.37169953082408E-01 t4 : 1.30934173849756E+00 -1.12550388002783E+00 t5 : 2.25665017724524E+00 -2.76677636166897E+00 t6 : -3.40266607063703E-01 -2.61585700440509E-01 == err : 7.075E-15 = rco : 6.393E-03 = res : 2.526E-15 = Solution 18 : t : 1.00000000000000E+00 0.00000000000000E+00 m : 1 the solution for t : t1 : -2.53488386324696E-01 -2.83321822997287E-01 t2 : 4.84338946463415E-01 -1.67152891112537E+00 t3 : -4.67320096443835E-01 -4.71307905321838E-02 zz1 : 7.80393042398170E-02 4.84167415461090E-01 t4 : 2.41580881604416E+00 6.84660143775337E-01 t5 : 4.73818299916806E-01 3.62365346793219E-01 t6 : -3.86544038004814E-01 4.76118474348958E-02 == err : 3.492E-15 = rco : 2.148E-02 = res : 1.291E-15 = Solution 19 : t : 1.00000000000000E+00 0.00000000000000E+00 m : 1 the solution for t : t1 : -1.33188225629716E-01 2.10966347401895E-02 t2 : 7.81125047936108E-02 -6.85635891220529E-02 t3 : -1.17563370850181E+00 -1.23520999866901E+00 zz1 : -1.16759331681420E+00 1.23236695756379E+00 t4 : 2.02453946582577E+00 5.47406959303102E-01 t5 : -7.18144929758816E-02 -1.30397505946681E-01 t6 : 1.24906033996779E+00 -1.34990480788646E+00 == err : 2.561E-15 = rco : 1.448E-03 = res : 5.407E-15 = Solution 20 : t : 1.00000000000000E+00 0.00000000000000E+00 m : 1 the solution for t : t1 : 7.93825359960543E-01 3.42942332165835E-01 t2 : 1.61651669536702E-01 -2.20420239291763E+00 t3 : 4.64285871839968E+00 3.38285150308267E+00 zz1 : 5.85868505889160E-01 -1.37232304716824E+00 t4 : 4.40119366407873E-02 3.19449005533791E-01 t5 : -3.57045518779285E+00 -3.30999449881425E+00 t6 : 1.53654644664973E-01 4.28064658906619E-01 == err : 3.056E-15 = rco : 1.438E-02 = res : 3.844E-15 = Solution 21 : t : 1.00000000000000E+00 0.00000000000000E+00 m : 1 the solution for t : t1 : -7.60489144456182E-02 -1.04300898291791E+00 t2 : 1.30846500932422E+00 6.09095986219939E-02 t3 : 2.60207018922791E+00 2.05366973304254E+00 zz1 : 3.31325254376896E-01 -4.47605721252978E-01 t4 : 5.02974219619557E-02 5.96655221299233E-01 t5 : -8.46448240981595E-01 -2.38906321758213E+00 t6 : -4.52524421602189E-01 8.14559254657865E-01 == err : 1.498E-15 = rco : 2.468E-02 = res : 2.047E-15 = Solution 22 : t : 1.00000000000000E+00 0.00000000000000E+00 m : 1 the solution for t : t1 : 1.17748055149989E+00 -2.43215785209726E+00 t2 : -1.11238676756403E+00 1.89832325651549E+00 t3 : 3.71807527705904E+00 1.18513377244720E+00 zz1 : -1.36994965965414E-01 -9.86163388302379E-01 t4 : -5.27247356627358E-01 -7.14664957510453E-02 t5 : -1.69492044434729E-01 -4.08782307130586E-01 t6 : -1.38104781392739E+00 1.16797791507032E+00 == err : 2.038E-15 = rco : 4.306E-02 = res : 1.249E-15 = Solution 23 : t : 1.00000000000000E+00 0.00000000000000E+00 m : 1 the solution for t : t1 : 3.12364985327808E+00 -2.05920731130273E+00 t2 : -7.83955013846558E+00 3.44568114237919E+00 t3 : 2.41311468318769E-01 -1.43824031559247E-02 zz1 : -1.59787001054699E+00 -6.62918168050137E-01 t4 : 1.10281361738592E+00 -3.47888278489006E+00 t5 : 3.62179107231530E+00 1.85699344604169E+00 t6 : -2.26905454742053E-01 2.75923139264321E-01 == err : 1.042E-14 = rco : 4.252E-03 = res : 2.163E-15 = Solution 24 : t : 1.00000000000000E+00 0.00000000000000E+00 m : 1 the solution for t : t1 : 3.08355119326816E+00 -8.60649488234224E+00 t2 : -5.82366068292758E-01 6.35509246767222E+00 t3 : -6.51342246123743E-02 9.06094708166825E-02 zz1 : 2.84990305286854E+00 1.14816597303183E+00 t4 : 4.34422945742045E-02 1.52135217854099E-01 t5 : 6.74998864667608E+00 9.94704932815523E+00 t6 : -1.17348229611637E+01 1.39527617933237E+00 == err : 3.194E-14 = rco : 5.571E-04 = res : 6.391E-15 = Solution 25 : t : 1.00000000000000E+00 0.00000000000000E+00 m : 1 the solution for t : t1 : 3.99353498759161E-01 -1.05992514732995E+00 t2 : -6.97576291634198E-01 2.90503809343657E-01 t3 : 7.12853582076897E-02 4.30854721150634E-01 zz1 : -1.84001525983760E-01 2.70200187419495E-01 t4 : 1.46156773352004E+00 -1.50613908910889E-01 t5 : 1.12282954533061E+00 4.33717117615447E-02 t6 : -5.52341835801268E-01 1.66701841647516E-01 == err : 9.415E-16 = rco : 4.214E-02 = res : 7.841E-16 = Solution 26 : t : 1.00000000000000E+00 0.00000000000000E+00 m : 1 the solution for t : t1 : 1.68976453558350E-01 4.67689996418420E-01 t2 : -1.11289042160100E+00 -2.36087487730329E+00 t3 : 7.14519021473384E-02 1.63214961074351E-01 zz1 : -3.02872131405798E-01 -6.49699828630491E-02 t4 : 2.59822631620836E+00 2.73920748230829E-02 t5 : -5.72162586858151E-02 -1.87011959227602E-01 t6 : 6.42736202016055E-01 6.82645862607672E-02 == err : 2.532E-15 = rco : 2.192E-03 = res : 2.207E-15 = Solution 27 : t : 1.00000000000000E+00 0.00000000000000E+00 m : 1 the solution for t : t1 : 5.98088716113923E-01 -1.09928306831808E+00 t2 : -1.32166665802307E+00 9.68674190067784E-02 t3 : 1.25565072505728E+00 7.88279907441350E-01 zz1 : -1.94309421837523E-01 -4.14018780046576E-01 t4 : 1.15900115504862E+00 -3.40883097941626E-01 t5 : 7.68268330674074E-01 -3.30650582363870E-01 t6 : -4.24188159828689E-01 7.70802547523126E-01 == err : 1.539E-15 = rco : 3.512E-02 = res : 7.355E-16 = Solution 28 : t : 1.00000000000000E+00 0.00000000000000E+00 m : 1 the solution for t : " t1 : 1.74056293633403E+00 1.02810794797457E+00 t2 : -4.53362942425264E+00 -3.21821306993922E+00 t3 : 9.07980903275410E-01 2.06897987372685E+00 zz1 : 9.08970112275608E-02 -1.10894123925719E+00 t4 : 2.76795451024622E+00 -1.85436435929005E+00 t5 : 8.31726772379002E-02 -3.06761087764399E-01 t6 : 3.80053540200631E-01 3.19279779559526E-01 == err : 5.467E-15 = rco : 1.088E-02 = res : 4.621E-15 = Solution 29 : t : 1.00000000000000E+00 0.00000000000000E+00 m : 1 the solution for t : t1 : 9.98996829187838E-02 5.45879605814945E+00 t2 : 4.77713088756544E-02 -1.65064542093410E-01 t3 : 7.03293595992006E-02 -5.75960210248865E-03 zz1 : -4.34989172011554E+00 2.22547996626009E+00 t4 : 7.42601541252893E-02 -4.06346066756681E-02 t5 : -8.26936045369789E+00 -8.88179809231708E+00 t6 : 9.96592014933793E+00 -6.77636361154879E+00 == err : 2.141E-14 = rco : 3.614E-04 = res : 4.914E-15 = Solution 30 : t : 1.00000000000000E+00 0.00000000000000E+00 m : 1 the solution for t : t1 : 1.26911098400795E+00 -1.26566539297069E+00 t2 : -8.06762092689544E-01 6.05358763159280E-01 t3 : 4.36774346983282E+00 1.58729813776646E+00 zz1 : -2.24457954433668E-01 -1.01428467390231E+00 t4 : -5.06895216434008E-01 2.00062592651442E-01 t5 : -2.24941445482227E+00 -1.41444572972009E+00 t6 : -4.23738271342406E-01 3.28737704966059E-01 == err : 2.782E-15 = rco : 2.863E-02 = res : 1.360E-15 = ... running cascade step ... Solution at position 14 is not appended. Solution at position 22 is not appended. ... after running the cascade ... Solution 1 : t : 1.00000000000000E+00 0.00000000000000E+00 m : 1 the solution for t : t1 : -5.45421549881402E-01 -8.38161877518281E-01 t2 : -5.49340801920855E-01 -8.35598398361888E-01 t3 : -9.74098087752273E-01 2.26125884049935E-01 t6 : -8.74935009483375E-01 -4.84240363022669E-01 t4 : 1.78912046655936E-01 -9.83865071827120E-01 t5 : 4.72153176961023E-02 -9.98884734979395E-01 == err : 3.858E-16 = rco : 3.659E-02 = res : 1.388E-16 = Solution 2 : t : 1.00000000000000E+00 0.00000000000000E+00 m : 1 the solution for t : t1 : -5.66058532229596E-01 -3.67759063106022E-01 t2 : 5.87958784214732E-01 -2.31024744989669E-01 t3 : 2.66141319725174E-01 1.71943916132782E+00 t6 : -1.05957839449340E+00 1.03531112257767E+00 t4 : 2.42136902539447E-01 1.56435563278512E+00 t5 : -8.79136932379912E-02 -5.67977370543055E-01 == err : 1.140E-15 = rco : 2.128E-02 = res : 4.441E-16 = Solution 3 : t : 1.00000000000000E+00 0.00000000000000E+00 m : 1 the solution for t : t1 : 2.80836878017556E-01 -9.59755514673061E-01 t2 : -9.99161738567148E-01 4.09367827689737E-02 t3 : -4.72153176961024E-02 9.98884734979395E-01 t6 : -9.37276397924231E-01 3.48587082225057E-01 t4 : 9.35633636119240E-01 -3.52972660360955E-01 t5 : 9.74098087752273E-01 -2.26125884049935E-01 == err : 2.120E-13 = rco : 2.187E-02 = res : 2.220E-16 = Solution 4 : t : 1.00000000000000E+00 0.00000000000000E+00 m : 1 the solution for t : t1 : -1.24225818334613E+00 -8.07075027813304E-01 t2 : 1.47332994921904E+00 -5.78910775622768E-01 t3 : 8.79136932379910E-02 5.67977370543054E-01 t6 : -4.82817017275396E-01 4.71759173981634E-01 t4 : 9.66290808831228E-02 6.24284218493860E-01 t5 : -2.66141319725174E-01 -1.71943916132781E+00 == err : 2.043E-13 = rco : 1.402E-02 = res : 2.637E-16 = Solution 5 : t : 1.00000000000000E+00 0.00000000000000E+00 m : 1 the solution for t : t1 : 8.69193907041793E-01 -1.30453665759482E+00 t2 : -2.10146778358548E-01 -5.53582709999063E-01 t3 : 1.85739737768408E+00 -2.65498503011422E-01 t6 : -4.40509781239126E-01 -4.61410384022367E-01 t4 : 1.67183103323242E+00 -2.38973437749056E-01 t5 : -5.27607584716191E-01 7.54168308853117E-02 == err : 6.392E-16 = rco : 1.136E-02 = res : 2.220E-16 = Solution 6 : t : 1.00000000000000E+00 0.00000000000000E+00 m : 1 the solution for t : t1 : 3.53717078322846E-01 -5.30879118400565E-01 t2 : -5.99365365166589E-01 -1.57888836421937E+00 t3 : 5.27607584716190E-01 -7.54168308853108E-02 t6 : -1.08247082572556E+00 -1.13383016827931E+00 t4 : 5.86169848996842E-01 -8.37877878416832E-02 t5 : -1.85739737768408E+00 2.65498503011425E-01 == err : 5.809E-16 = rco : 1.811E-02 = res : 6.661E-16 = found 6 isolated solutions The polynomials in the embedded system are printed by :: for pol in embpols: print(pol) with output in :: + 7.10358341606049E-01*t1 + 4.60000000000000E-01*t2 - 4.10000000000000E-01*t3 + (-3.99034499614690E-01 + 9.16935912764493E-01*i)*zz1+(2.40761300555115E-01 + 1.07248215701824E+00*i); + (-1.10000000000000E-01 + 4.90000000000000E-01*i)*t2 + 4.10000000000000E-01*t3 - 5.02195181179589E-01*t4 + 4.10000000000000E-01*t5 + (-2.71603706128330E-01-9.62409178477302E-01*i)*zz1; + 5.02195181179589E-01*t4 + (-9.80434782608696E-02 + 4.36739130434783E-01*i)*t5 - 7.75518556663656E-01*t6 + (-9.98029449494905E-01 + 6.27472544490738E-02*i)*zz1 - 1.20000000000000E+00; + (-9.58594885352021E-01-2.84773323499490E-01*i)*zz1+(2.40761300555115E-01-1.07248215701824E+00*i) - 4.10000000000000E-01*t3^-1 + 4.60000000000000E-01*t2^-1 + 7.10358341606049E-01*t1^-1; + (9.19472457329587E-01-3.93154422857342E-01*i)*zz1 + 4.10000000000000E-01*t5^-1 - 5.02195181179589E-01*t4^-1 + 4.10000000000000E-01*t3^-1 + (-1.10000000000000E-01-4.90000000000000E-01*i)*t2^-1; + (4.61876615285503E-01 + 8.86944187788841E-01*i)*zz1 - 1.20000000000000E+00 - 7.75518556663656E-01*t6^-1 + (-9.80434782608696E-02-4.36739130434783E-01*i)*t5^-1 + 5.02195181179589E-01*t4^-1; + (9.04264731472024E-01-4.26972241973442E-01*i)*t1 + (9.93763178327739E-01-1.11511189572842E-01*i)*t2 + (8.26568833449879E-01 + 5.62835645254728E-01*i)*t3 + (8.13748932516514E-01 + 5.81216547276687E-01*i)*t4 + (9.60611770393053E-01 + 2.77893912459997E-01*i)*t5 + (-5.80987954131586E-02 + 9.98310838352234E-01*i)*t6 + (1.86846899315945E-02 + 9.99825425943029E-01*i)*zz1+(-9.99671453748700E-01 + 2.56317100475435E-02*i); Observe that we have seven equation in seven variables, where the last variable is the slack variable ``zz1``. The code in :: print('the isolated solutions :') for (idx, sol) in enumerate(isosols): print('Solution', idx+1, ':') print(sol) produces the following output: :: the isolated solutions : Solution 1 : t : 1.00000000000000E+00 0.00000000000000E+00 m : 1 the solution for t : t1 : -5.45421549881402E-01 -8.38161877518281E-01 t2 : -5.49340801920855E-01 -8.35598398361888E-01 t3 : -9.74098087752273E-01 2.26125884049935E-01 t6 : -8.74935009483375E-01 -4.84240363022669E-01 t4 : 1.78912046655936E-01 -9.83865071827120E-01 t5 : 4.72153176961023E-02 -9.98884734979395E-01 == err : 3.858E-16 = rco : 3.659E-02 = res : 1.388E-16 = Solution 2 : t : 1.00000000000000E+00 0.00000000000000E+00 m : 1 the solution for t : t1 : -5.66058532229596E-01 -3.67759063106022E-01 t2 : 5.87958784214732E-01 -2.31024744989669E-01 t3 : 2.66141319725174E-01 1.71943916132782E+00 t6 : -1.05957839449340E+00 1.03531112257767E+00 t4 : 2.42136902539447E-01 1.56435563278512E+00 t5 : -8.79136932379912E-02 -5.67977370543055E-01 == err : 1.140E-15 = rco : 2.128E-02 = res : 4.441E-16 = Solution 3 : t : 1.00000000000000E+00 0.00000000000000E+00 m : 1 the solution for t : t1 : 2.80836878017556E-01 -9.59755514673061E-01 t2 : -9.99161738567148E-01 4.09367827689737E-02 t3 : -4.72153176961024E-02 9.98884734979395E-01 t6 : -9.37276397924231E-01 3.48587082225057E-01 t4 : 9.35633636119240E-01 -3.52972660360955E-01 t5 : 9.74098087752273E-01 -2.26125884049935E-01 == err : 2.120E-13 = rco : 2.187E-02 = res : 2.220E-16 = Solution 4 : t : 1.00000000000000E+00 0.00000000000000E+00 m : 1 the solution for t : t1 : -1.24225818334613E+00 -8.07075027813304E-01 t2 : 1.47332994921904E+00 -5.78910775622768E-01 t3 : 8.79136932379910E-02 5.67977370543054E-01 t6 : -4.82817017275396E-01 4.71759173981634E-01 t4 : 9.66290808831228E-02 6.24284218493860E-01 t5 : -2.66141319725174E-01 -1.71943916132781E+00 == err : 2.043E-13 = rco : 1.402E-02 = res : 2.637E-16 = Solution 5 : t : 1.00000000000000E+00 0.00000000000000E+00 m : 1 the solution for t : t1 : 8.69193907041793E-01 -1.30453665759482E+00 t2 : -2.10146778358548E-01 -5.53582709999063E-01 t3 : 1.85739737768408E+00 -2.65498503011422E-01 t6 : -4.40509781239126E-01 -4.61410384022367E-01 t4 : 1.67183103323242E+00 -2.38973437749056E-01 t5 : -5.27607584716191E-01 7.54168308853117E-02 == err : 6.392E-16 = rco : 1.136E-02 = res : 2.220E-16 = Solution 6 : t : 1.00000000000000E+00 0.00000000000000E+00 m : 1 the solution for t : t1 : 3.53717078322846E-01 -5.30879118400565E-01 t2 : -5.99365365166589E-01 -1.57888836421937E+00 t3 : 5.27607584716190E-01 -7.54168308853108E-02 t6 : -1.08247082572556E+00 -1.13383016827931E+00 t4 : 5.86169848996842E-01 -8.37877878416832E-02 t5 : -1.85739737768408E+00 2.65498503011425E-01 == err : 5.809E-16 = rco : 1.811E-02 = res : 6.661E-16 = :: fac = double_monodromy_breakup(embpols, sols0, 1, islaurent=True, verbose=True) produces the following output: :: ... running monodromy loops in double precision ... ... initializing the grid for the linear trace ... The diagnostics of the trace grid : largest error on the samples : 1.1914895647759973e-14 smallest distance between the samples : 2.3530539196335214 ... starting loop 1 ... new permutation : [3, 2, 1] number of factors : 3 -> 2 the decomposition : factor 1 : ([1, 3], 0.33179448122518296) factor 2 : ([2], 0.3317944812254451) ... starting loop 2 ... new permutation : [2, 3, 1] number of factors : 2 -> 1 the decomposition : factor 1 : ([1, 2, 3], 4.11226608321158e-13) The grouping of the generic sets in one set shows that the solution curve is an irreducible cubic.