Re: Solvability sensitive to small changes in numerical input
- To: mathgroup at smc.vnet.net
- Subject: [mg47510] Re: [mg47494] Solvability sensitive to small changes in numerical input
- From: Daniel Lichtblau <danl at wolfram.com>
- Date: Thu, 15 Apr 2004 03:39:12 -0400 (EDT)
- References: <200404141116.HAA27286@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Gareth J. Russell wrote:
> Hi,
>
> I have a function that includes the Solve command
>
> f[a1_, a2_, b_] := Module[{c},
>
> c = 2*b/(b - 1);
>
> Solve[b/(1 + (a1*n)^c) + b/(1 + (a2*n)^c) == 2, n]
>
> ] ]
>
> but it seems very sensitive to the numerical input. For example,
>
> f[2., 0.05, 6.19]
>
> and
>
> f[2., 0.05, 6.21]
>
> Produce the error "The equations appear to involve the variables to be
> solved for in an essentially non-algebraic way."
>
> Whereas
>
> f[2., 0.05, 6.20]
>
> produces the solutions
>
> {{n -> -23.8725 - 13.2503i]}, {n -> -23.8725 + 13.2503i}, {
> n -> 0.183281 - 0.707873i}, {n -> 0.183281 + 0.707873i]}, {n -> 27.
> 3032}}
>
> Can anyone enlighten me as to what is going on here? Other peoples' work
> suggests that, given a1 = 2., it should be possible to get numerical
> solutions for a large range of values of a2 and b.
>
> If it makes a differences we make the assumptions a1 > 0, a2 > 0, a2 <
> a1 and b >= 1.
>
> Oh, and v5.0.1.0 on Mac OS X
>
> Thanks!
>
> Gareth Russell
>
> Columbia University
>
When presented with approximate exponents Solve uses heuristics based on
denominator size to determine whether or not to rationalize (and later
numericize the resulting exponents). There can be advantages and
disadvantages to rationalizing these, and trhe goal is to strike a
balance between obtaining reasonable solutions and not hanging.
If you change the function to print the rationalized exponent it may
become more clear.
f[a1_, a2_, b_] := With[{c=2*b/(b-1)},
Print[InputForm[{Rationalize[c,0]}]];
Solve[b/(1 + (a1*n)^c) + b/(1 + (a2*n)^c) == 2, n]
]
InputForm[f[2., 0.05, 6.19]]
{1238/519}
Solve::tdep: The equations appear to involve the variables to be solved
for in
an essentially non-algebraic way.
Out[22]//InputForm=
Solve[6.19/(1 + 0.0007880970503582654*n^2.3853564547206165) +
6.19/(1 + 5.224729892085899*n^2.3853564547206165) == 2, n]
In contrast:
InputForm[f[2., 0.05, 6.20]]
{31/13}
Out[23]//InputForm=
{{n -> -23.872497527916014 - 13.250317078942366*I},
{n -> -23.872497527916014 + 13.250317078942366*I},
{n -> 0.18328095526493268 - 0.7078727572270465*I},
{n -> 0.18328095526493268 + 0.7078727572270465*I}, {n ->
27.3032423150231}}
If you try
InputForm[Timing[f[2., 0.05, 619/100]]]
you will get an idea of how long it can take with a large denominator.
What you might instead do is use FindRoot with starting values given by
the solutions for "nearby" exponents of more modest denominator. Though
you may lose some solutions this way (I think). If you are only
interested in the real-valued solution this will not be a problem. For
example:
InputForm[
FindRoot[6.19/(1+0.0007880970503582654*n^2.3853564547206165) +
6.19/(1 + 5.224729892085899*n^2.3853564547206165) == 2,
{n,27.3032423150231}, PrecisionGoal->12]]
Out[2]//InputForm= {n -> 27.273328531648822}
Daniel Lichtblau
Wolfram Research
- References:
- Solvability sensitive to small changes in numerical input
- From: "Gareth J. Russell" <gjr2008@columbia.edu>
- Solvability sensitive to small changes in numerical input