On Fri, Feb 23, 2018 at 5:53 AM, Matthias Geier
<matthias.ge...@gmail.com> wrote:
> Thanks Leonid for this quick and helpful answer!
>
> I just have a few follow-up questions:
>
> On Thu, Feb 22, 2018 at 11:38 PM, Leonid Kovalev wrote:
>> In SymPy, polynomials have extra structure that distinguishes them from
>> generic expressions. a3 * t**3 + a2 * t**2 + a1 * t + a0 is an expression.
>> If you create a polynomial in t, it will print with the order of terms being
>> from highest to lowest.
>>
>>     >>> p = sp.Poly([a3, a2, a1, a0], t)
>>     >>> print(p)
>>     Poly(a3*t**3 + a2*t**2 + a1*t + a0, t, domain='ZZ[a0,a1,a2,a3]')
>
> Ah, that's interesting!
>
> I was actually using a Jupyter notebook with MathJax output most of
> the time, and there this is not true!
>
> Same for the raw LaTeX output:
>
>     >>> sp.latex(p)
>     '\\operatorname{Poly}{\\left( a_{0} + a_{1} t + a_{2} t^{2} +
> a_{3} t^{3}, t, domain=\\mathbb{Z}\\left[a_{0}, a_{1}, a_{2},
> a_{3}\\right] \\right)}'
>
> Is this a bug?
>
>> Also, the order can be specified in the print command
>>
>>     >>> pprint(a3 * t**3 + a2 * t**2 + a1 * t + a0, order='grevlex')
>>         3       2
>>     a₃⋅t  + a₂⋅t  + a₁⋅t + a₀
>>
>>
>> or, staying with str format,
>>
>>
>>     >>> sstrrepr(a3 * t**3 + a2 * t**2 + a1 * t + a0, order='grevlex')
>>     'a3*t**3 + a2*t**2 + a1*t + a0'
>
> That's great, I think 'grevlex' is what I want!
>
> I was actually already playing around with 'lex', 'revlex' and
> 'grevlex', but I got confused at some point.
> It looks like this doesn't work if the highest power doesn't have a
> symbolic coefficient, e.g.:
>
>     >>> sp.sstrrepr(t**2 + a1 * t, order='grevlex')
>     'a1*t + t**2'
>
> I assume there is a perfectly reasonable explanation for that, and in
> my case such expressions didn't actually appear yet, so that's fine
> for me.
>
> I think I will mainly use 'grevlex' with:
>
>     sp.init_printing(order='grevlex')
>
> But when I'm dealing with expressions that have only the coefficients
> and no powers of t in them, e.g.:
>
>     3*a3 + 2*a2 + a1
>
> ... then I'll temporarily switch:
>
>     sp.init_printing(order='rev-lex')
>
> Or is this a bad idea?
> Or is there a better way to temporarily change the order?
>
> Is there a way to specify the order for a single Jupyter output cell?

It is possible to create a custom order, however the documentation is
pretty sparse. The place to start is here if you want to look into it
https://github.com/sympy/sympy/blob/fb536869fb7aa28b2695ad7a3b70949926b291c4/sympy/polys/orderings.py#L199.
The printers (including the latex printer) have an order setting which
ends up getting passed to that function.

Aaron Meurer

>
>> The printing module has a number of printers which support a number of
>> settings.
>
> Thanks for the reference to
> http://docs.sympy.org/latest/modules/printing.html, that's a very
> helpful page.
>
> cheers,
> Matthias
>
>> On Thursday, February 22, 2018 at 2:02:20 PM UTC-5, Matthias Geier wrote:
>>>
>>> Dear SymPy list.
>>>
>>> I'm playing around with polynomials in the context of spline curves.
>>>
>>> I want to use a cubic polynomial with yet unknown coefficients like this:
>>>
>>> >>> import sympy as sp
>>> >>> t, a0, a1, a2, a3 = sp.symbols('t, a:4', real=True)
>>> >>> a3 * t**3 + a2 * t**2 + a1 * t + a0
>>> a0 + a1*t + a2*t**2 + a3*t**3
>>>
>>> The problem here is that the displayed order of terms is reversed,
>>> normally the highest power of t should come first.
>>> I guess this is because SymPy doesn't know that the coefficients a0
>>> etc. are constants and shouldn't be treated like variables.
>>> So in fact this polynomial isn't sorted by powers of t but instead by
>>> the coefficients.
>>>
>>> Is there a way to get around this?
>>>
>>> At some later point, I have expressions like this (without t):
>>>
>>> a1 + 2*a2 + 3*a3
>>>
>>> It would make sense in my case to also display them reversed like this:
>>>
>>> 3*a3 + 2*a2 + a1
>>>
>>> Is it possible to create a new type of symbol with non-default ordering?
>>> Is it possible to define that this order is "ascending": a3, a2, a1, a0?
>>> It doesn't have to be a generic solution, I'm OK with having those 4
>>> special symbols.
>>>
>>> Or is there an entirely different and much better way to do this?
>>>
>>> I know that I could just use a, b, c, d instead of a3, a2, a1, a0 and
>>> it would work, but I would really like to see the connection between a
>>> coefficient and its power of t.
>>>
>>> For the record, I also quickly tried to use IndexedBase to get a3, a2,
>>> a1 and a0, and it turns out that although the LaTeX display of the
>>> symbols looks the same (in text mode it's different), they are sorted
>>> differently.
>>>
>>> >>> b = sp.IndexedBase('b')
>>> >>> b[3] * t**3 + b[2] * t**2 + b[1] * t + b[0]
>>> t**3*b[3] + t**2*b[2] + t*b[1] + b[0]
>>>
>>> They are sorted after the powers of t, which isn't what I want, either.
>>>
>>> cheers,
>>> Matthias
>
> --
> 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 sympy+unsubscr...@googlegroups.com.
> To post to this group, send email to sympy@googlegroups.com.
> 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/CAFesC-cN3_h-dVm854PeU%3Dkr3J%2Bhywyvkk0JBMbDrqQiRcbinA%40mail.gmail.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 sympy+unsubscr...@googlegroups.com.
To post to this group, send email to sympy@googlegroups.com.
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%2BraBmXYn8_hdxGeyaqzLXk9yovpwoeOtPnYjVuEzXUGQ%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to