MathGroup Archive 2000

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

Search the Archive

Re: [Q] accuracy control in eq. solving?

  • To: mathgroup at smc.vnet.net
  • Subject: [mg23741] Re: [mg23678] [Q] accuracy control in eq. solving?
  • From: Andrzej Kozlowski <andrzej at tuins.ac.jp>
  • Date: Mon, 5 Jun 2000 01:09:34 -0400 (EDT)
  • Sender: owner-wri-mathgroup at wolfram.com


> To: mathgroup at smc.vnet.net
> Subject: [mg23741] [mg23678] [Q] accuracy control in eq. solving?
> From: research at proton.csl.uiuc.edu (James)
To: mathgroup at smc.vnet.net
> Date: Mon, 29 May 2000 12:24:06 -0400 (EDT)
> Organization: University of Illinois at Urbana-Champaign
> Sender: owner-wri-mathgroup at wolfram.com
> Hello!
> 
> I have a question regarding to the accuracy control of
> the equation solution.
> 
> I'm currently solving polynomial equations(degrees are at least 5),
> and wondering if I can control the accuracy level
> of the solution.
> Specifically, when I recomputed the original equation
> by replacing the answers that mathematica gives,
> I got the error of roughly 10^-7 or 10^-8 for degree 9.
> Regarding this, I have the following questions.
> 
> (1) Is there any way to control(increase) the accuracy?
> (2) What would be the best known math tool (in terms of accuracy)
> in solving high-degree polynimial equations?
> (3) I'm a newbie in mathematica,
> so I manually type in, when I check the answer(polynomial eqs.).
> Is there any systax for that in mathematica?
> 
> Thank you.


The general rule about Mathematica is: anything that can be computed at all
can be computed to an arbitrary degree of accuracy. There are actually some
rare exceptions but this is not one of them.

Probably the easiest way to understand this is to look at an example. Here
is a random polynomial of degree 9:

In[2]:=
poly = Table[Random[Integer, {-10, 10}], {10}].x^Range[0, 9]

Out[2]=
              2      3      4      5      6      7      8      9
2 - 10 x + 3 x  + 9 x  + 8 x  - 3 x  - 3 x  + 3 x  - 8 x  + 4 x

We first solve it exactly (infinite accuracy):

In[3]:=
polyroots = Solve[poly == 0, x]

Out[3]=
{{x -> Root[2 - 10*#1 + 3*#1^2 + 9*#1^3 + 8*#1^4 - 3*#1^5 - 3*#1^6 + 3*#1^7
- 8*#1^8 + 
       4*#1^9 & , 1]},
  {x -> Root[2 - 10*#1 + 3*#1^2 + 9*#1^3 + 8*#1^4 - 3*#1^5 - 3*#1^6 + 3*#1^7
- 8*#1^8 + 
       4*#1^9 & , 2]},
  {x -> Root[2 - 10*#1 + 3*#1^2 + 9*#1^3 + 8*#1^4 - 3*#1^5 - 3*#1^6 + 3*#1^7
- 8*#1^8 + 
       4*#1^9 & , 3]},
  {x -> Root[2 - 10*#1 + 3*#1^2 + 9*#1^3 + 8*#1^4 - 3*#1^5 - 3*#1^6 + 3*#1^7
- 8*#1^8 + 
       4*#1^9 & , 4]},
  {x -> Root[2 - 10*#1 + 3*#1^2 + 9*#1^3 + 8*#1^4 - 3*#1^5 - 3*#1^6 + 3*#1^7
- 8*#1^8 + 
       4*#1^9 & , 5]},
  {x -> Root[2 - 10*#1 + 3*#1^2 + 9*#1^3 + 8*#1^4 - 3*#1^5 - 3*#1^6 + 3*#1^7
- 8*#1^8 + 
       4*#1^9 & , 6]},
  {x -> Root[2 - 10*#1 + 3*#1^2 + 9*#1^3 + 8*#1^4 - 3*#1^5 - 3*#1^6 + 3*#1^7
- 8*#1^8 + 
       4*#1^9 & , 7]},
  {x -> Root[2 - 10*#1 + 3*#1^2 + 9*#1^3 + 8*#1^4 - 3*#1^5 - 3*#1^6 + 3*#1^7
- 8*#1^8 + 
       4*#1^9 & , 8]},
  {x -> Root[2 - 10*#1 + 3*#1^2 + 9*#1^3 + 8*#1^4 - 3*#1^5 - 3*#1^6 + 3*#1^7
- 8*#1^8 + 
       4*#1^9 & , 9]}}

The answer is given in terms of Root objects. (Of course you can't get
expressions in terms of radicals in this case). Now we compute these with,
say, 20 digits of precision:

In[4]:=
numpolyroots = N[polyroots, 20]

Out[4]=
{{x -> -0.98988060577279493540}, {x -> 0.22829237962552395100}, {x ->
0.64224951666033773144},
 
  {x -> -0.61735759466257344187 - 0.70338383228603023397 I},
 
  {x -> -0.61735759466257344187 + 0.70338383228603023397 I},
 
  {x -> 0.15805224924788994907 - 1.2845743104741265788 I},
 
  {x -> 0.15805224924788994907 + 1.2845743104741265788 I},
 
  {x -> 1.5189747001581501193 - 0.20186087093410669801 I},
 
  {x -> 1.5189747001581501193 + 0.20186087093410669801 I}}

Mathematica gives its answers in terms of replacement rules. That makes it
very easy to substitute these back into the original polynomial:

In[5]:=
poly /. numpolyroots

Out[5]=
      -18       -20       -19       -18        -18         -18        -18
{0. 10   , 0. 10   , 0. 10   , 0. 10    + 0. 10    I, 0. 10    + 0. 10    I,
 
       -17        -17         -17        -17         -16        -16
-16        -16
  0. 10    + 0. 10    I, 0. 10    + 0. 10    I, 0. 10    + 0. 10    I, 0. 10
+ 0. 10    I}

You see that the error is extremly small. You can of course make it even
smaller by taking more digits.

expr/. {a->b} is the way to substitute a given rule into an expression.
You can also substitute a list of rules as in

expr/.{{a->b},{a->c},...}

to get a list of the results as above.  Pay attention to the List brackets.
To see why compare the following two cases:


In[6]:=
x^2 + y^2 /. {x -> 1, y -> 2}

Out[6]=
5

In[7]:=
x^2 + y^2 /. {{x -> 1}, {y -> 2}}

Out[7]=
      2       2
{1 + y , 4 + x }
-- 
Andrzej Kozlowski
Toyama International University, JAPAN

For Mathematica related links and resources try:
<http://www.sstreams.com/Mathematica/>



  • Prev by Date: Re: Newbie Q: Referencing Auto-number Cells
  • Next by Date: Re: programming DeleteRepetitions
  • Previous by thread: Re: Newbie Q: Referencing Auto-number Cells
  • Next by thread: Re: [Q] accuracy control in eq. solving?