Ah that's interesting. I would consider that to be a bug. I would expect apart() to just be assemble_partfrac_list(apart_list()), but apparently there is a lot of duplicated logic. Can you open a bug report about this https://github.com/sympy/sympy/issues
Aaron Meurer On Tue, Aug 11, 2020 at 9:23 AM Mikhael Myara <[email protected]> wrote: > apart_list() does not seem to support the « full=True » mode. > So I guess I have to loop over the summed terms. Do you agree ? > thanks again, > Mike > > Le lundi 10 août 2020 23:05:42 UTC+2, Aaron Meurer a écrit : >> >> Yes, that is what I mean by only getting the real roots. I don't think >> it's possible now, though it shouldn't be hard to do it manually with >> apart_list(). >> >> Aaron Meurer >> >> On Mon, Aug 10, 2020 at 3:03 PM Mikhael Myara <[email protected]> >> wrote: >> >>> Thanks again Aaron, >>> here is what I did : >>> >>> import sympy as sp >>> >>> sp.var('s t') >>> >>> >>> Hstab = 1/(s**3+s**2+5*s+4) >>> Hstab = sp.apart(Hstab,full=True).doit().evalf() >>> display(Hstab) >>> And I get : >>> >>> [image: Capture d’écran 2020-08-10 à 23.00.45.png] >>> >>> >>> >>> Which is great. However I would have liked the conjugate denominator >>> fractions combined. Is this possible ou should I write some code for this ? >>> Moreover : I am not sure I understood how is appart_list() interesting ? >>> >>> Thanks again, >>> Mikhaël >>> >>> Le lundi 10 août 2020 21:58:23 UTC+2, Aaron Meurer a écrit : >>>> >>>> If you replace the coefficients with floating point numbers, you can >>>> use full=True and get an answer with floats (although they aren't fully >>>> simplified for some reason, so you may want to use apart_list() instead). >>>> I'm not sure if it is possible to get an answer with just the real roots, >>>> so that there are no complex numbers added. >>>> >>>> Aaron Meurer >>>> >>>> On Mon, Aug 10, 2020 at 1:53 PM Mikhael Myara < >>>> [email protected]> wrote: >>>> >>>>> Thanks a lot Aaron. >>>>> However : for my usage, an approximate root would be sufficient. Is >>>>> there a way to allow this in Sympy ? >>>>> Thanks again, >>>>> Mikhaël >>>>> >>>>> Le lundi 10 août 2020 20:48:04 UTC+2, Aaron Meurer a écrit : >>>>>> >>>>>> The roots are the key difference. The second polynomial has a >>>>>> rational root, -1, meaning it can be split out in a partial fraction >>>>>> decomposition. If you don't call evalf() on the roots you can also see >>>>>> that >>>>>> the roots of the first polynomial are more complicated, because they are >>>>>> coming from the general cubic formula. You can also see the difference in >>>>>> the two if you call factor(). >>>>>> >>>>>> >>> factor(s**3+s**2+5*s+4) >>>>>> s**3 + s**2 + 5*s + 4 >>>>>> >>> factor(s**3+2*s**2+5*s+4) >>>>>> (s + 1)*(s**2 + s + 4) >>>>>> >>>>>> The first polynomial is irreducible over rationals, but the second >>>>>> factors. So if you do a partial fraction decomposition, it will not split >>>>>> because apart() only decomposes over rational numbers by default. If you >>>>>> want a full decomposition over all the roots, you can use something like >>>>>> apart(1/(s**3+s**2+5*s+4), full=True).doit(). >>>>>> >>>>>> Note that it's not uncommon for polynomials to work like this, where >>>>>> if you change a coefficient it changes the behavior of it. That's because >>>>>> it's easy for a polynomial to have a rational root with one coefficient >>>>>> but >>>>>> not with another close coefficient, like in this case. >>>>>> >>>>>> Aaron Meurer >>>>>> >>>>>> On Mon, Aug 10, 2020 at 2:29 AM Mikhael Myara < >>>>>> [email protected]> wrote: >>>>>> >>>>>>> Dear all, >>>>>>> >>>>>>> I don't know if my problem is with the knowledge of fractionnal >>>>>>> decomposition itself or with symPy's implementation. >>>>>>> >>>>>>> I start with the following code : >>>>>>> >>>>>>> import sympy as sp >>>>>>> sp.var('s') >>>>>>> >>>>>>> >>>>>>> Hstab = 1/(s**3+s**2+5*s+4) >>>>>>> Hstab = sp.apart(Hstab) >>>>>>> display(Hstab) >>>>>>> >>>>>>> >>>>>>> The result is : >>>>>>> >>>>>>> [image: Capture d’écran 2020-08-10 à 10.18.18.png] >>>>>>> Now I check another similar expression : >>>>>>> >>>>>>> Hstab2 = 1/(s**3 + 2*s**2 + 5*s + 4) >>>>>>> Hstab2 = sp.apart(Hstab2,s) >>>>>>> display(Hstab2) >>>>>>> >>>>>>> and I get : >>>>>>> >>>>>>> [image: Capture d’écran 2020-08-10 à 10.21.14.png] >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> If now I check for the roots of the denominator for each case : >>>>>>> >>>>>>> >>>>>>> print("\n\nFirst case :") >>>>>>> P1=(1/Hstab).simplify() >>>>>>> display(P1) >>>>>>> for sol in sp.solve(P1,s): >>>>>>> display(sol.evalf()) >>>>>>> >>>>>>> >>>>>>> print("\n\nSecond case :") >>>>>>> P2=(1/Hstab2).simplify() >>>>>>> display(P2) >>>>>>> for sol in sp.solve(P2,s): >>>>>>> display(sol.evalf()) >>>>>>> >>>>>>> I get : >>>>>>> >>>>>>> [image: Capture d’écran 2020-08-10 à 10.26.18.png] >>>>>>> Which is very similar except that the real root of the first case is >>>>>>> not ass simple as the one of the second case. So I do not understand as >>>>>>> I >>>>>>> can't see any mathematical impossibility, the two cases are very close. >>>>>>> Is there a way to reach the fractional decomposition for the first >>>>>>> case ? >>>>>>> >>>>>>> Thanks a lot, >>>>>>> Mike >>>>>>> >>>>>>> >>>>>>> -- >>>>>>> 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 view this discussion on the web visit >>>>>>> https://groups.google.com/d/msgid/sympy/4ccc519f-8a28-4478-bc2e-adbc302a9647o%40googlegroups.com >>>>>>> <https://groups.google.com/d/msgid/sympy/4ccc519f-8a28-4478-bc2e-adbc302a9647o%40googlegroups.com?utm_medium=email&utm_source=footer> >>>>>>> . >>>>>>> >>>>>> -- >>>>> 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 view this discussion on the web visit >>>>> https://groups.google.com/d/msgid/sympy/b4c883c0-0840-4cd2-b964-cb32a27c8aaao%40googlegroups.com >>>>> <https://groups.google.com/d/msgid/sympy/b4c883c0-0840-4cd2-b964-cb32a27c8aaao%40googlegroups.com?utm_medium=email&utm_source=footer> >>>>> . >>>>> >>>> -- >>> 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 view this discussion on the web visit >>> https://groups.google.com/d/msgid/sympy/9a1d5c28-b8f7-4d66-b197-02d615c7af18o%40googlegroups.com >>> <https://groups.google.com/d/msgid/sympy/9a1d5c28-b8f7-4d66-b197-02d615c7af18o%40googlegroups.com?utm_medium=email&utm_source=footer> >>> . >>> >> -- > 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 view this discussion on the web visit > https://groups.google.com/d/msgid/sympy/64ac532d-bf89-41fa-b4e6-9a2d77d25940o%40googlegroups.com > <https://groups.google.com/d/msgid/sympy/64ac532d-bf89-41fa-b4e6-9a2d77d25940o%40googlegroups.com?utm_medium=email&utm_source=footer> > . > -- 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 view this discussion on the web visit https://groups.google.com/d/msgid/sympy/CAKgW%3D6%2BR06DHzVKAHcBPxrgBsk56V1nnSziOBdy84KZVAUM4Zg%40mail.gmail.com.
