Thank you for sharing your code and explaining your challenge. It seems
like you have put a lot of effort into trying to print a shorter version of
your power series. Your approach of converting the expression to a list and
sorting it by the values of t**n is clever.
Have you considered using the built-in round function to round the
coefficients to 5 significant digits instead of 5 decimal places?
That way, you could achieve the desired rounding without losing significant
digits. Try it i think this should work
On Sunday, 5 March 2023 at 14:01:58 UTC+5:30 [email protected] wrote:
> I have a lot of power series that look like this (but going up to t**12):
> exp1 = -2867.70035529489*t**5 + 147.938724526848*t**3 - 2.56500070531002*t
> While trying to gain some insight into the mathematics that creates them,
> I want to print a shorter version, such as
> - 2.565 t + 147.93872 t**3- 2867.70036 t**5
> but the best I have achieved is
> - 2867.70036 t^{5} + \left(147.93872 t^{3} - 2.565 t\right)
> Rounding the numbers was easy, but I would prefer to round to 5 digits
> total, not 5 digits after the decimal point. I was able to convert the
> expression to a list and sort the list, but when I converted the list back
> to an expression, I didn't succeed in producing the order I wanted.
> Here is the code:
> global t
> t = symbols('t')
> def sortSeries(valIn):
> valOut = valIn
> for num in (valOut.atoms(sympy.Float)):
> valOut = valOut.xreplace({num: 1}) # remove coefficient
> if valOut == 1:
> return 1 # set t**0 to 1
> else:
> valOut = valOut.subs(t, 2) # change t**n to 2**n, which is a
> sortable number
> return valOut
>
> def printSeries(expIn):
> expOut = expIn
> expOut = collect(expOut, t)
> for num in (expOut.atoms(Number)):
> expOut = expOut.xreplace({num: num.round(5)})
> expList = expOut.as_ordered_terms() # convert expression to list
> expList.sort(key=sortSeries) # sort list by values of t**n
> for ind in range(0, len(expList)): # convert list to expression
> term = expList[ind]
> if ind == 0:
> exp = term
> else:
> # exp = exp + term
> exp = Add(exp, term, evaluate=False)
> #exp = Add(term, exp, evaluate=False)
> expOut = exp
> print(latex(expOut))
> #return expOut
>
> def test():
> #exp1 = 6.14979599379575*t**3 - 1.69088473154467*t
> #exp2 = 0.331732200302894 - 2.35512815419867*t**2
> exp1 = -2867.70035529489*t**5 + 147.938724526848*t**3 -
> 2.56500070531002*t
> exp2 = 701.066644698213*t**4 - 23.5908063706474*t**2 + 0.13771861708229
> printSeries(exp1)
> printSeries(exp2)
> print('end of test')
>
--
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/65a465c4-cd88-4308-990e-60897b373114n%40googlegroups.com.