On Friday, August 22, 2014 4:41:57 AM UTC+2, Richard Fateman wrote:
>
> You realize that you cannot express roots of polynomials in terms of
> radicals
> generally?
>
> Maybe you should figure what you are doing with apart().
> If it is integration of rational functions, maybe you should find another
> path.
> RJF
>
> On Thursday, August 21, 2014 1:05:42 PM UTC-7, Mateusz Paprocki wrote:
>>
>> Hi,
>>
>> On 21 August 2014 16:26, clemens novak <[email protected]> wrote:
>> > Am Mittwoch, 20. August 2014 23:45:55 UTC+2 schrieb Mateusz Paprocki:
>> >>
>> >> Hi,
>> >>
>> >> On 20 August 2014 21:28, Ondřej Čertík <[email protected]> wrote:
>> >> > Hi Clemens,
>> >> >
>> >> > On Wed, Aug 20, 2014 at 5:15 AM, clemens novak <[email protected]>
>> >> > wrote:
>> >> >> I have a question regarding the apart function. I want to obtain
>> the
>> >> >> partial
>> >> >> fractions for eq = z / (z**2-z-1) .
>> >> >>
>> >> >> The denominator has real roots solve(denom(eq)) yields [1/2 +
>> sqrt(5)/2
>> >> >> ,
>> >> >> 1/2- sqrt(5)/2], but apart does not return the partial fractions;
>> i,e.
>> >> >> apart(eq, z) = z/(z**2 - z - 1) .
>> >> >>
>> >> >> Using apart(eq, z, full=True) yields RootSum(_w**2 - _w - 1,
>> Lambda(_a,
>> >> >> (_a/5 + 2/5)/(-_a + z))) which doesn't seem to be of much help (at
>> >> >> least for
>> >> >> me).
>> >> >>
>> >> >> Using apart with a fraction with "simpler" roots produces the
>> desired
>> >> >> partial fractions; e.g. apart (z / (z**2+z-2), z) yields 2/(3*(z +
>> 2))
>> >> >> +
>> >> >> 1/(3*(z - 1))
>> >> >>
>> >> >> Are there any additional options I can provide to apart to obtain
>> the
>> >> >> desired result?
>> >> >
>> >> > Good point. I checked Mathematica and it produces the same result as
>> >> > SymPy.
>> >> > However, clearly this can be decomposed, so I don't quite understand
>> >> > if this is a bug in Mathematica as well,
>> >> > or whether perhaps there is some reason not to do the decomposition
>> >> > for this case.
>> >>
>> >> There is no bug in this case. apart() uses polynomial factorization
>> >> routines to "decompose" the denominator. By default, sympy (but also
>> >> many other computer algebra systems) work over the rationals and z**2
>> >> - z - 1 doesn't have rational zeros. If you invoke apart(f, z), then
>> >> you will get partial fraction decomposition over rationals. To get the
>> >> expected result, you have set the domain of computation properly, e.g.
>> >> apart(f, z, extension=sqrt(5)) is helpful in this case. apart()
>> >> accepts all options that factor() and other polynomial manipulation
>> >> functions accept.
>> >>
>> >> In [1]: apart(z/(z**2 - z - 1), z, extension=sqrt(5))
>> >> Out[1]:
>> >> ___ ___
>> >> ╲╱ 5 + 5 -5 + ╲╱ 5
>> >> ─────────────────── - ───────────────────
>> >> ⎛ ___ ⎞ ⎛ ___⎞
>> >> 5⋅⎝2⋅z - ╲╱ 5 - 1⎠ 5⋅⎝2⋅z - 1 + ╲╱ 5 ⎠
>> >>
>> >> In [2]: simplify(_)
>> >> Out[2]:
>> >> z
>> >> ──────────
>> >> 2
>> >> z - z - 1
>> >>
>> >> Another option is to use full=True (no need for extension, because
>> >> this method doesn't use factorization at all). The result seems
>> >> useless at first but you can use .doit() on the resulting RootSum to
>> >> get more familiar result:
>> >>
>> >> In [1]: apart(z/(z**2 - z - 1), z, full=True)
>> >> Out[1]:
>> >> ⎛ a 2 ⎞
>> >> ⎜ ─ + ─ ⎟
>> >> ⎜ 2 5 5 ⎟
>> >> RootSum⎜w - w - 1, a ↦ ──────⎟
>> >> ⎝ -a + z⎠
>> >>
>> >> In [2]: _.doit()
>> >> Out[2]:
>> >> ___ ___
>> >> ╲╱ 5 1 ╲╱ 5 1
>> >> ───── + ─ - ───── + ─
>> >> 10 2 10 2
>> >> ───────────── + ─────────────
>> >> ___ ___
>> >> ╲╱ 5 1 1 ╲╱ 5
>> >> z - ───── - ─ z - ─ + ─────
>> >> 2 2 2 2
>> >>
>> >> In [3]: simplify(_)
>> >> Out[3]:
>> >> z
>> >> ──────────
>> >> 2
>> >> z - z - 1
>> >>
>> >> It would be good to document this in apart()'s docstring (the current
>> >> one is pretty weak), because it's a common misconception that apart()
>> >> uses either roots() or solve() to decompose the denominator.
>> >>
>> >> Mateusz
>> >>
>> >> > Ondrej
>> >> >
>> >> >>
>> >> >> Thanks & regards - Clemens
>> >> >>
>> >> >> --
>> >>
>> >
>> > Hello,
>> >
>> > thanks for quick answer and support. Both suggestions (apart with
>> full=True
>> > + doit() and apart with extension) work for me.
>> >
>> > I read factor's documentation
>> > (
>> http://docs.sympy.org/latest/modules/polys/reference.html#symbolic-root-finding-algorithms)
>>
>>
>> > which says:
>> >
>> > "By default, the factorization is computed over the rationals. To
>> factor
>> > over other domain, e.g. an lgebraic or finite field, use appropriate
>> > options:
>> > ``extension``, ``modulus`` or ``domain``."
>> >
>> > I don't quite get it:
>> >
>> > "extension" allows providing a list of irrational numbers which shall
>> be
>> > considered during factorization:
>> >
>> > eq = x**2 - sqrt(2)*x + sqrt(3)*x - sqrt(6)
>> > factor(eq, extension=[sqrt(2), sqrt(3)])
>> >
>> > This works for complex numbers as well
>> >
>> > eq = x**2+x+5
>> > factor(eq, extension=sqrt(-19))
>> >
>> >
>> > "modulus allows factorization over a finite field (there is an example
>> in
>> > the "docstring)
>> >
>> > However, I don't get the use of "domain" - from the name I would assume
>> that
>> > you can restrict the domain (e.g. integer, ration, irrational,
>> complex...)
>> > from which the factors are obtained? What domains does sympy provide
>> (and
>> > where can I find that in the documentation)?
>>
>> Domain is the ultimate way to set the domain of computation.
>> extension, modulus, etc. are helpers, that, in the end, will generate
>> a domain. For example:
>>
>> In [1]: Poly(x**2 + sqrt(2), extension=sqrt(2))
>> Out[1]: Poly(x**2 + sqrt(2), x, domain='QQ<sqrt(2)>')
>>
>> You can see that extension=sqrt(2) really means an algebraic domain
>> over sqrt(2). In case of x**2 + sqrt(2) you could use extension=True
>> as well (equivalent of Mathematica's auto):
>>
>> In [2]: Poly(x**2 + sqrt(2), extension=True)
>> Out[2]: Poly(x**2 + sqrt(2), x, domain='QQ<sqrt(2)>')
>>
>> Ultimately you can construct domain yourself:
>>
>> In [3]: Poly(x**2 + sqrt(2), domain=QQ.algebraic_field(sqrt(2)))
>> Out[3]: Poly(x**2 + sqrt(2), x, domain='QQ<sqrt(2)>')
>>
>> extension allow you to type less and gives you Mathematica-like feel.
>> Domains can be useful on their own e.g.:
>>
>> In [4]: x**2 + sqrt(2) in QQ[x]
>> Out[4]: False
>>
>> In [5]: x**2 + sqrt(2) in QQ.algebraic_field(sqrt(2))[x]
>> Out[5]: True
>>
>> Mateusz
>>
>> > If you want I can try to improve the apart (maybe also the factor)
>> docstring
>> > and send a corresponding PR (probably in the next few days).
>> >
>> > Regards - Clemens
>> >
>> > --
>> > 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 http://groups.google.com/group/sympy.
>> > To view this discussion on the web visit
>> >
>> https://groups.google.com/d/msgid/sympy/ed1fcf30-233e-4551-8b34-040e047e42c5%40googlegroups.com.
>>
>>
>> >
>> > For more options, visit https://groups.google.com/d/optout.
>>
>
I was trying to do the z-transform for a_n = a_{n-1} + a_{n-2} (Fibonacci
Numbers) which leads to F(z) = z / (z**2-z-1). From my understanding, using
apart to get a partial fraction decomposition is the way to go...? The
discussion here sparked my curiosity...
Based on the dicussion I created a PR (#7905) which contains the
(hopefully) improved apart docstring.
Thanks for the information regarding domains; I will need some time to
understand this, though.
Regards - Clemens
--
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 http://groups.google.com/group/sympy.
To view this discussion on the web visit
https://groups.google.com/d/msgid/sympy/06e22781-a005-4a54-8673-260a989a1277%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.