MathGroup Archive 2007

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Is there a way to rewrite Roots[#n] result in easier to read form?


ToRadicals will (sometimes) eliminate Root objects, but that will  
generally make things MORE complicated, not less. There are some things 
you can do instead, however.

First I suggest avoiding subscripts (for ease in posting Q&A, if nothing 
else):

Clear[x, y]
ode11 = y'[x] ==
   1/Sqrt[a[4]*x^4 + a[3]*x^3 + a[2]*x^2 + a[1]*x + a[0]]
y[x_] = y[x] /. First@DSolve[ode11, y[x], x];

There are 36 instances of Root in the result, but only four are distinct:

Cases[y[x], _Root, \[Infinity]];
% // Length
roots = %% // Union

36

{Root[a[0] + a[1] #1 + a[2] #1^2 + a[3] #1^3 + a[4] #1^4 &, 1],
  Root[a[0] + a[1] #1 + a[2] #1^2 + a[3] #1^3 + a[4] #1^4 &, 2],
  Root[a[0] + a[1] #1 + a[2] #1^2 + a[3] #1^3 + a[4] #1^4 &, 3],
  Root[a[0] + a[1] #1 + a[2] #1^2 + a[3] #1^3 + a[4] #1^4 &, 4]}

Hence we can simplify display of y[x] this way:

displayable = y[x] /. Root[_, k_] :> r[k]

C[1] - (2 EllipticF[
      ArcSin[Sqrt[((x - r[1]) (r[2] - r[4]))/((x - r[2]) (r[1] -
          r[4]))]], ((r[2] - r[3]) (r[1] - r[4]))/((r[1] -
         r[3]) (r[2] - r[4]))] (x -
       r[2])^2 Sqrt[((-r[1] + r[2]) (x - r[3]))/((x - r[2]) (-r[1] +
        r[3]))] (r[1] -
       r[4]) Sqrt[((x - r[1]) (r[1] - r[2]) (x - r[4]) (r[2] -
        r[4]))/((x - r[2])^2 (r[1] - r[4])^2)])/(Sqrt[
     a[0] + x (a[1] + x (a[2] + x (a[3] + x a[4])))] (-r[1] +
       r[2]) (r[2] - r[4]))

If, at any time, you still want to display subscripts, it's simple enough  
to do so:

displayable /. {a[k_] :> Subscript[a, k], r[k_] :> Subscript[r, k],
   C[k_] :> Subscript[c, k]}

Subscript[c, 1] - (2 EllipticF[
      ArcSin[Sqrt[((x - Subscript[r, 1]) (Subscript[r, 2] - Subscript[
          r, 4]))/((x - Subscript[r, 2]) (Subscript[r, 1] - Subscript[
          r, 4]))]], ((Subscript[r, 2] - Subscript[r, 3]) (Subscript[r,
          1] - Subscript[r, 4]))/((Subscript[r, 1] - Subscript[r,
         3]) (Subscript[r, 2] - Subscript[r, 4]))] (x - Subscript[r,
       2])^2 Sqrt[((-Subscript[r, 1] + Subscript[r, 2]) (x - Subscript[
        r, 3]))/((x - Subscript[r, 2]) (-Subscript[r, 1] + Subscript[r,
         3]))] (Subscript[r, 1] - Subscript[r,
       4]) Sqrt[((x - Subscript[r, 1]) (Subscript[r, 1] - Subscript[r,
        2]) (x - Subscript[r, 4]) (Subscript[r, 2] - Subscript[r,
        4]))/((x - Subscript[r, 2])^2 (Subscript[r, 1] - Subscript[r,
        4])^2)])/(Sqrt[
     Subscript[a, 0] +
      x (Subscript[a, 1] +
         x (Subscript[a, 2] +
            x (Subscript[a, 3] + x Subscript[a, 4])))] (-Subscript[r,
        1] + Subscript[r, 2]) (Subscript[r, 2] - Subscript[r, 4]))

y[x] is still intact, but you can also retrieve the long-form result as

displayable /. Thread[r /@ Range[4] -> roots];
y[x] == %

True

I hope that helps.

Bobby

On Fri, 17 Aug 2007 00:52:15 -0500, Nasser Abbasi <nma at 12000.org> wrote:

> Hello;
> This is Mathematica 6.01
>
> Is there a way to make the output of the following DSolve more readable?  
> It
> contains lots of Root[] with #n in it.
>
>
> Remove["Global`*"]
> ode11 = Derivative[1][y][x] -
>      1/Sqrt[Subscript[a, 4]*x^4 + Subscript[a, 3]*x^3 +
>         Subscript[a, 2]*x^2 + Subscript[a, 1]*x + Subscript[a, 0]] ==
>     0;
> DSolve[ode11, y[x], x]
>
> here is a pic of the output:
>
> http://12000.org/tmp/081507/output.PNG
>
> I understand what #'s are for, but was wondering if the output can be
> written using more 'traditional' form so it will easier to read? i.e  
> having
> the polynomial whose Roots are being called for, to be explicitly written
> out or something along those lines?...I tried Simplify[].
>
> thanks,
> Nasser
>
>
>



-- 
DrMajorBob at bigfoot.com


  • Prev by Date: Re: 3DPlot in Mathematica 6
  • Next by Date: Re: What determines what is assigned to Out[]?
  • Previous by thread: Re: Is there a way to rewrite Roots[#n] result in easier to read form?
  • Next by thread: generalized 2d IFS for D_n Cartan group using MathWorld DihedralGroupMatrices