MathGroup Archive 2008

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

Search the Archive

Re: question about Solve

  • To: mathgroup at smc.vnet.net
  • Subject: [mg91739] Re: question about Solve
  • From: Jean-Marc Gulliet <jeanmarc.gulliet at gmail.com>
  • Date: Sun, 7 Sep 2008 05:33:37 -0400 (EDT)
  • Organization: The Open University, Milton Keynes, UK
  • References: <g9r4cf$cj3$1@smc.vnet.net>

Jaccard Florian wrote:

> I don't understand the following behaviour of Solve.
> 
> Consider the following system :
> 
> Solve[{x*y==(a+2*b)/(c+2*d),1/Sqrt[2]==Sqrt[(e*y)/(z*f*g*h)],2*Pi*i==0.9/(z*f)},{x,y,z}]
> 
> Everything fine, I obtain :
> 
> {{z -> 0.1432394487827058/(f*i),
>     x -> (1.419827298426263*^-9*(9.83403688*^9*a +
>               1.966807376*^10*b)*e*i)/((c + 2.*d)*g*h),
>     y -> (0.0716197243913529*g*h)/(e*i)}}
> 
> But if I ask for the answer of almost the same (only a 4 in the denominator
> of the second equation), Solve isn't abble anymore to manage without using
> inverse functions... why?
> 
> Solve[{x*y == (a + 2*b)/(c + 2*d),
>  1/Sqrt[2] == Sqrt[(e*y)/(4*z*f*g*h)],
>     2*Pi*i == 0.9/(z*f)}, {x, y, z}]
> 
> Worse:
> 
> If I have numerical values for a, b, c, d, e, f, g, h, i:
> a = 65/10^6;
> b = 1/10^3;
> c = 1.9;
> d = 0.19;
> e = 1/(2.5/10^3);
> v = 18;
> w = 8;
> g = (2*v)/((c + 2*d)*w);
> i = 3000;
> h = 0.2;
> 
> Then Solve isn't able anymore! Mathematica thinks there is no solution. But
> there is one. I have to use Reduce or give the numerical values as rules
> after the Solve to find them.
> 
> In[247]:= Solve[{x*y == (a + 2*b)/(c + 2*d),
>  1/Sqrt[2] == Sqrt[(e*y)/(z*f*g*h)],
>     2*Pi*i == 0.9/(z*f)}, {x, y, z}]
> 
> Out[247]= {}

. Though Solve[] and Reduce[] have many things in common they use 
different sets of algorithms.

. Solve[] does not check the domain of definition of the equations or of 
the solution.

. Reduce[] does it systematically (for instance, your system is not 
defined for f == 0).

. Solve[] and Reduce[] are designed to work on symbolic expressions, 
yielding infinite precision solutions. So you better use exact coefficients.

. Since your system is not defined for f == 0 (among other things), when 
solving numerically (say, by providing machine-number-precision 
coefficients) you might face round off errors and numerical instability.

. Also, a *warning/informational* message is just that. An *error* 
message is a different beast and usually does not yield a result.

The examples below illustrate several ways to get the correct and exact 
solutions (and to check their validity) as well as well as how to get 
numerical results from them.

In[1]:= eqs = Rationalize[{x*y == (a + 2*b)/(c + 2*d),
    1/Sqrt[2] == Sqrt[(e*y)/(z*f*g*h)], 2*Pi*i == 0.9/(z*f)}, 0]
sol = Solve[eqs, {x, y, z}]
eqs /. sol // Simplify
sol // N
eqs /. % // Simplify
sol = Reduce[eqs, {x, y, z}]
eqs /. ToRules[sol] // Simplify

Out[1]=
         a + 2 b     1              e y                 9
{x y == -------, ------- == Sqrt[-------], 2 i Pi == ------}
         c + 2 d  Sqrt[2]         f g h z             10 f z

Out[2]=
            9           40 (a e i Pi + 2 b e i Pi)         9 g h
{{z -> ---------, x -> --------------------------, y -> ---------}}
        20 f i Pi            9 (c + 2 d) g h             40 e i Pi

Out[3]= {{True, True, True}}

Out[4]=
        0.143239       4.44444 (3.14159 a e i + 6.28319 b e i)
{{z -> --------, x -> ---------------------------------------,
          f i                      (c + 2. d) g h

         0.0716197 g h
    y -> -------------}}
              e i

Out[5]= {{True, True, True}}

Out[6]= (c + 2 d) g h != 0 && e i != 0 && f != 0 &&

        40 (a e i Pi + 2 b e i Pi)           9 g h               9
   x == -------------------------- && y == --------- && z == ---------
             9 (c + 2 d) g h               40 e i Pi         20 f i Pi

Out[7]= {True, True, True}

In[8]:= eqs = Rationalize[{x*y == (a + 2*b)/(c + 2*d),
    1/Sqrt[2] == Sqrt[(e*y)/(4*z*f*g*h)], 2*Pi*i == 0.9/(z*f)}, 0]
sol = Solve[eqs, {x, y, z}]
eqs /. sol // Simplify
sol // N
eqs /. % // Simplify
sol = Reduce[eqs, {x, y, z}]
eqs /. ToRules[sol] // Simplify

Out[8]=
         a + 2 b     1       1        e y                 9
{x y == -------, ------- == - Sqrt[-------], 2 i Pi == ------}
         c + 2 d  Sqrt[2]    2      f g h z             10 f z

During evaluation of In[8]:= Solve::ifun: Inverse functions are being 
used by Solve, so some solutions may \
not be found; use Reduce for complete solution information. >>

Out[9]=
            9           10 (a e i Pi + 2 b e i Pi)         9 g h
{{z -> ---------, x -> --------------------------, y -> ---------}}
        20 f i Pi            9 (c + 2 d) g h             10 e i Pi

Out[10]= {{True, True, True}}

Out[11]=
        0.143239       1.11111 (3.14159 a e i + 6.28319 b e i)
{{z -> --------, x -> ---------------------------------------,
          f i                      (c + 2. d) g h

         0.286479 g h
    y -> ------------}}
             e i

Out[12]= {{True, True, True}}

Out[13]= (c + 2 d) g h != 0 && e i != 0 && f != 0 &&

        10 (a e i Pi + 2 b e i Pi)           9 g h               9
   x == -------------------------- && y == --------- && z == ---------
             9 (c + 2 d) g h               10 e i Pi         20 f i Pi

Out[14]= {True, True, True}

In[15]:= Block[{a = 65/10^6, b = 1/10^3, c = 1.9, d = 0.19, e = 
1/(2.5/10^3), v = 18,
   w = 8, g = (2*v)/((c + 2*d)*w), i = 3000, h = 0.2},
  eqs = Rationalize[{x*y == (a + 2*b)/(c + 2*d),
     1/Sqrt[2] == Sqrt[(e*y)/(4*z*f*g*h)], 2*Pi*i == 0.9/(z*f)}, 0];
  sol = Solve[eqs, {x, y, z}]]
eqs /. sol // Simplify
sol // N
eqs /. % // Simplify
sol = Reduce[eqs, {x, y, z}]
eqs /. ToRules[sol] // Simplify

Out[15]=
        148083731502947733735566537720000 Pi           3
{{x -> ------------------------------------, z -> ----------,
           48405093832682679258144806707           20000 f Pi

              6664487519298027
    y -> --------------------------}}
         22511157842962219240000 Pi

Out[16]= {{True, True, True}}

Out[17]=
                      0.0000477465                 -8
{{x -> 9610.95, z -> ------------, y -> 9.42365 10  }}
                           f

Out[18]= {{True, True, True}}

Out[19]=
                148083731502947733735566537720000 Pi
f != 0 && x == ------------------------------------ &&
                   48405093832682679258144806707

             6664487519298027                  3
   y == -------------------------- && z == ----------
        22511157842962219240000 Pi         20000 f Pi

Out[20]= {True, True, True}

In[21]:= $Version

Out[21]= 6.0 for Mac OS X x86 (64-bit) (May 21, 2008)


Regards,
-- Jean-Marc


  • Prev by Date: Re: How can I create a two-axis graph in Mathematica v6
  • Next by Date: Re: force variable to be real
  • Previous by thread: Re: question about Solve
  • Next by thread: NDSolve Problem