Re: Solving an equation
- To: mathgroup at smc.vnet.net
- Subject: [mg51363] Re: [mg51299] Solving an equation
- From: Daniel Lichtblau <danl at wolfram.com>
- Date: Fri, 15 Oct 2004 02:46:24 -0400 (EDT)
- References: <200410141035.GAA14785@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Scott wrote:
> I have an equation, Gamma[a+I b] = some complex number. I need to
> solve this equation for a and b. I can write a+I b as z, but it can't
> be solved through NSolve. What I have been doing is a double do loop
> for a and b and getting some number. Then I compare this to the
> number I have. Then I narrow down my possibilities for a and b, and
> go through the process again. Does anyone know of a better way to do
> this problem? Is there a way to have Mathematica compare each result
> of the do loop to a given value, and given certain conditions spit out
> an answer for a and b?
>
> Hope that makes sense.
>
I'm not sure what might be the best way to do this, but one workable
approach is to treat it as an optimization. Say your complex number is
3+5*I. Belwo we find roots near 1-2*I and 5+4*I respectively.
In[9]:= FindMinimum[Abs[Gamma[a+I*b]-(3+5*I)], {a,1}, {b,-2}]
FindMinimum::lstol:
The line search decreased the step size to within tolerance specified by
AccuracyGoal and PrecisionGoal but was unable to find a sufficient
decrease in the function. You may need more than MachinePrecision
digits of working precision to meet these tolerances.
-8
Out[9]= {2.39838 10 , {a -> 0.0910323, b -> -0.133628}}
In[10]:= FindMinimum[Abs[Gamma[a+I*b]-(3+5*I)], {a,5}, {b,4}]
FindMinimum::lstol:
The line search decreased the step size to within tolerance specified by
AccuracyGoal and PrecisionGoal but was unable to find a sufficient
decrease in the function. You may need more than MachinePrecision
digits of working precision to meet these tolerances.
-7
Out[10]= {1.10535 10 , {a -> 5.24561, b -> 4.37032}}
If you like you can use a root finder instead, or in conjunction with
this. I tend to prefer the second approach, using it as a polishing
step, because it does not always perform well without a good initial
point. Also, as the functions are not analytic, we should either provide
a gradient or use a secant method by specifying two initial values per
argument.
eqns = Thread[{Re[Gamma[a+I*b]],Im[Gamma[a+I*b]]}=={3,5}];
In[16]:= FindRoot[eqns, {a,5.24,5.25}, {b,4.3,4.4},
WorkingPrecision->20, AccuracyGoal->20, PrecisionGoal->20]
Out[16]= {a -> 5.2456145798271348496, b -> 4.3703225075594339402}
We could instead have requested higher precision/accuracy in FindMinimum
but that is slower and also, to judge from residuals, not quite as accurate.
Daniel Lichtblau
Wolfram Research
- References:
- Solving an equation
- From: jujio77@yahoo.com (Scott)
- Solving an equation