On Mon, May 9, 2016 at 11:26 AM, Peter Brady <[email protected]> wrote: > I have some expressions that are being written to a fortran file and sympy > is keeping them in a form that involves coefficients that are too large. > > For example, here's one of my coefficients: > > > (6447959512020*c21*r**10 + 89877391198101*c21*r**9 + > 482379015493674*c21*r**8 + 1955782912118958*c21*r**7 + > 6144750386733894*c21*r**6 + 9734633983924239*c21*r**5 + > 3581719348056096*c21*r**4 - 7087617275638458*c21*r**3 - > 11332310233710024*c21*r**2 - 6752358207277020*c21*r + 6016737364560*r**10 + > 83866633598228*r**9 + 450118807506472*r**8 + 1562757816049524*r**7 + > 3409298852122307*r**6 + 2460129818497007*r**5 - 3107226702425082*r**4 - > 9732722117772259*r**3 + 12534948043759713*r**2 - 10702947100060800*r + > 1022514295602150)/(3387470672547000*r**5 + 21246968829475350*r**4 + > 34890947927234100*r**3 - 11310388190004150*r**2 - 62103628996695000*r - > 33761791036385100) > > > The problem is if I write it to a file with a simple transformation of > str(expr.n()) I get something troublesome like > > > (6447959512020.0*c21*r**10 + 89877391198101.0*c21*r**9 + > 482379015493674.0*c21*r**8 + 1.95578291211896e+15*c21*r**7 + > 6.14475038673389e+15*c21*r**6 + 9.73463398392424e+15*c21*r**5 + > 3.5817193480561e+15*c21*r**4 - 7.08761727563846e+15*c21*r**3 - > 1.133231023371e+16*c21*r**2 - 6.75235820727702e+15*c21*r + > 6016737364560.0*r**10 + 83866633598228.0*r**9 + 450118807506472.0*r**8 + > 1.56275781604952e+15*r**7 + 3.40929885212231e+15*r**6 + > 2.46012981849701e+15*r**5 - 3.10722670242508e+15*r**4 - > 9.73272211777226e+15*r**3 + 1.25349480437597e+16*r**2 - > 1.07029471000608e+16*r + 1.02251429560215e+15)/(3.387470672547e+15*r**5 + > 2.12469688294753e+16*r**4 + 3.48909479272341e+16*r**3 - > 1.13103881900042e+16*r**2 - 6.2103628996695e+16*r - 3.37617910363851e+16) > > > I also do some regex processing to add the appropriate '_dp' suffix to all > the numbers.
You could also write a custom StrPrinter subclass that prints floats how you want. May be more robust than regular expressions. > > > the problem is that c21 and r are O(1) and they are being multiplied by huge > numbers and then divided by huge numbers. I've tried expand and several > other options but I can't seem to figure out an automatic way to get sympy > to give me more reasonable double precision coefficients. I can do it > "manually" by splitting the expression into the numerator and denominator > and then taking the large constant and in the denominator and normalizing > the numerator with it before gluing the expression back together but I'm > hoping there's a better way. That's how I would do it. Does dividing by the leading coefficient work? In [11]: p, q = a.as_numer_denom() In [12]: print(p/LC(q)/(q/LC(q))) (0.00190347316193054*c21*r**10 + 0.0265323009071318*c21*r**9 + 0.142400942214203*c21*r**8 + 0.577357887691594*c21*r**7 + 1.81396415813505*c21*r**6 + 2.87371756833687*c21*r**5 + 1.05734327889046*c21*r**4 - 2.09230365684889*c21*r**3 - 3.34536039693279*c21*r**2 - 1.99333333333333*c21*r + 0.00177617400892096*r**10 + 0.0247578921576817*r**9 + 0.132877551134054*r**8 + 0.461334714633707*r**7 + 1.00644379883558*r**6 + 0.726243872289311*r**5 - 0.917270436496146*r**4 - 2.87315317491866*r**3 + 3.70038570233136*r**2 - 3.15956893348198*r + 0.301851851851852)/(1.0*r**5 + 6.27222222222221*r**4 + 10.3*r**3 - 3.3388888888889*r**2 - 18.3333333333333*r - 9.96666666666667) Aaron Meurer > > > Here's what I get if do the splitting manually: > > > (0.342625169147496617*c21*r**10 + 4.77581416328371673*c21*r**9 + > 25.632169598556608*c21*r**8 + 103.924419784486855*c21*r**7 + > 326.513548464309187*c21*r**6 + 517.269162300637267*c21*r**5 + > 190.321790200281699*c21*r**4 - 376.614658232800258*c21*r**3 - > 602.164871447902571*c21*r**2 - 358.8*c21*r + 0.319711321605773568*r**10 + > 4.45642058838269934*r**9 + 23.9179592041297048*r**8 + > 83.0402486340673783*r**7 + 181.159883790403722*r**6 + > 130.723897012075825*r**5 - 165.108678569306389*r**4 - > 517.167571485358666*r**3 + 666.069426419644693*r**2 - 568.722408026755853*r > + 54.3333333333333333)/((r + 1.0)*(180.0*r**4 + 949.0*r**3 + 905.0*r**2 - > 1506.0*r - 1794.0)) > > > Is there a better way? > > > > -- > 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/ee10ecaf-bd9f-4b21-98e5-68bdf2640a5b%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%3D6LGpTQGMfFJwCLR-KQanmJ1_W3iLvAoVYOXT3SJD70w0A%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.
