I would consider this to be a bug in det(). It should try to compute it in such a way that it returns a polynomial. This is somewhat related to this issue https://github.com/sympy/sympy/issues/11082.
cancel() would normally be what you'd use to do this, but doesn't help here either because it only cancels things if they cancel out exactly, but because of the floating point coefficients, this does not happen. apart() actually might work, if it didn't have its own issues (https://github.com/sympy/sympy/issues/11795). Can you open an issue for this in the issue tracker? Unfortunately, I can't think of a good workaround for this right now. Aaron Meurer On Fri, Dec 22, 2017 at 8:50 AM, gosia <[email protected]> wrote: > Dear SymPy users, > > I'm new to SymPy and i'm struggling for some time now with expressing a > polynomial fraction as a polynomial. > > I try to calculate: > w(x) = f(x^10)/g(x^2) > which should be a function of x (of the order 8) > > what i get (using various sympy functions) is: > w(x) = a_8 * x^8 + ... + a_0 + p(x)/q(x^2) > or > w(x) = a_8 * x^8 + ... + a_0 + p(x^0)/q(x^2) > > instead of: > w(x) = a_8 * x^8 + ... + a_0 > > > below is the full story with a part of a script i'm using (i installed sympy > 1.1.1 with python 3.6 in anaconda environment; i'm using linux ubuntu 16.04) > > any hints will be extremely helpful! > best, > gosia > > > ------------------------------------------------------------------------ > import sympy as sp > > # 1. i start with defining elements of 4x4 matrix: each element is a > function of x (more precisely: f(x^2)): > > x = sp.Symbol(x) > s1_14 = s1_21 = s1_34 = s1_41 = 0.0 > s1_11 = A1*(x**2) + B1*x + C1 > s1_12 = A2*(x**2) + B2*x + C2 > s1_13 = A3*(x**2) + B3*x + C3 > s1_22 = A1*(x**2) + B1*x + C1 > s1_23 = A2*(x**2) + B2*x + C2 > s1_24 = A3*(x**2) + B3*x + C3 > s1_31 = A4*(x**2) + B4*x + C4 > s1_32 = A5*(x**2) + B5*x + C5 > s1_33 = A6*(x**2) + B6*x + C6 > s1_42 = A4*(x**2) + B4*x + C4 > s1_43 = A5*(x**2) + B5*x + C5 > s1_44 = A6*(x**2) + B6*x + C6 > s1 = sp.Matrix([[s1_11, s1_12, s1_13, s1_14], [s1_21, s1_22, s1_23, > s1_24], [s1_31, s1_32, s1_33, s1_34], [s1_41, s1_42, s1_43, s1_44]]) > > # where A1,..., B1, ..., C1, ... are floats (computed in the same script > before; all checked) > # for instance (they are small...): > # A1 = -8.832920000001262e-20 > # A2 = 1.23393935e-16 > # A3 = -1.841680000001036e-20 > # A4 = 1.5494922020000018e-18 > # A5 = 7.434205120000009e-19 > # A6 = 5.154697260000002e-19 > # B1 = -2.4092100000002057e-19 > # B2 = -2.4352230000004432e-19 > # B3 = -6.06127000000108e-20 > # B4 = 3.555121236000002e-18 > # B5 = 4.224810150000003e-18 > # B6 = 1.2527727940000004e-18 > # C1 = -1.5992580000002828e-19 > # C2 = -1.656777000000101e-19 > # C3 = -4.2327499999991735e-20 > # C4 = 1.9217166420000004e-18 > # C5 = 2.3215129980000005e-18 > # C6 = 6.981400700000001e-19 > > > # 2. calculate a determinant of that matrix and write it as a polynomial of > x (the maximum order of that polynomial is then 8): > > det = sp.simplify(s1.det()) > > # we can print the results; for coefficients A1...C6 above it is: > # det = (1.07479861449248e-87*x**10 + 8.00921385801962e-87*x**9 + > 2.45757883595634e-86*x**8 + 3.97197994040761e-86*x**7 + > 3.56434445101232e-86*x**6 + 1.68328171836074e-86*x**5 + > 3.26853998044205e-87*x**4 + 4.42042971009037e-91*x**3 + > 6.87690887243217e-92*x**2 - 1.67739461567147e-96*x - > 2.66764671309489e-97)/(8.83292000000126e-20*x**2 + 2.40921000000021e-19*x + > 1.59925800000028e-19) > > # now for instance i do: > > if det.is_rational_function(): > det_poly = sp.apart(det, x) > else: > break > > # what for the given coefficients gives: > # det_poly = 1.21681008601044e-68*x**8 + 5.74856653371868e-68*x**7 + > 9.94041734367267e-68*x**6 + 7.44692074414804e-68*x**5 + > 2.04344273909691e-68*x**4 + 2.1162503508103e-72*x**3 + > 4.30019156172244e-73*x**2 - 7.97549194718549e-78*x + > 1.0*(7.19921945884898e-101*x + > 7.35103305249383e-101)/(8.83292000000126e-20*x**2 + 2.40921000000021e-19*x + > 1.59925800000028e-19) - 1.66851240787895e-78 > > > # combining sp.apart() with factor() or collect() does not change > anything... > > -- > You received this message because you are subscribed to the Google Groups > "sympy" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To post to this group, send email to [email protected]. > Visit this group at https://groups.google.com/group/sympy. > To view this discussion on the web visit > https://groups.google.com/d/msgid/sympy/ce698f69-2f11-40ae-a13c-b7194603ee3a%40googlegroups.com. > For more options, visit https://groups.google.com/d/optout. -- You received this message because you are subscribed to the Google Groups "sympy" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at https://groups.google.com/group/sympy. To view this discussion on the web visit https://groups.google.com/d/msgid/sympy/CAKgW%3D6%2B7iXHPkEXzEU-S2xe6P86JJ%2BrVe3fr9gEpzd2HYG7g9g%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.
