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>