Re: Re: FindRoot accuracy/precision
- To: mathgroup@smc.vnet.net
- Subject: [mg11460] Re: Re: FindRoot accuracy/precision
- From: bt585@FreeNet.Carleton.CA (Michael Chang)
- Date: Thu, 12 Mar 1998 01:34:15 -0500
- Organization: The National Capital FreeNet
- References: <199803030411.XAA02345@smc.vnet.net.> <6dk5kd$oam$3@dragonfly.wolfram.com> <199803060541.AAA22147@smc.vnet.net.> <6dtb42$s4u$3@dragonfly.wolfram.com>
Thanks again for your response! Daniel Lichtblau (danl@wolfram.com) writes: > Michael Chang wrote: >> ... >> Hi! Thanks for your response! >> >> With regards to an example, suppose I have the following (made up on the >> spur of the moment). >> >> 100==x1*x2-x3*x4; >> 1*10^-3==x3/x2-x1^2; >> 2*10^-6==x4/x1+x2*x3; >> 5*10^-13==x1*x4-x3/x2; >> >> eq1={100,1*10^-3,2*10^-6,5*10^-13}; >> eq2={x1*x2-x3*x4, etc.} >> >> (Note the great "spread" in numerical values.) I have four equations >> with four unknowns, and eq1 and eq2 *both* have *infinite* precision. >> Because I don't know where to start my parameter space search, I try >> using a random starting point. I'm looking for positive real roots >> since the 7 nonlinear equations that I'm *actually* dealing with come >> about from an electrical R & C circuit. >> >> Hence, I try the following: >> >> ok=0;While[ok==0, ans=FindRoot[(eq1-eq2)==0,{x1,Random[Real,x1max]}, >> {x2,Random[Real,x2max]},{x3,Random[Real,x3max]}, >> {x4,Random[Real,x4max]},MaxIterations->1000]; >> If[Min[{x1,x2,x3,x4}/.ans]>=0, >> ok=1; Print[ans]]] >> >> Now since eq1 and eq2 both have infinite precision, should I be using >> >> Rationalize[Random[Real,ximax],0] >> >> in the above expressions? The main problem is that the actual value of >> >> (eq1-eq2) >> >> is "small" (the largest residual is of order 10^-2), but not small in >> percentage for the smaller valued elements. My default for >> WorkingPrecision is 16, but this doesn't seem to give (eq1-eq2) to be >> order 10^-16 ! I will try increasing WorkingPrecision, but am finding >> that the calculations are becoming increasingly slower. >> >> Once again, any suggestions and advice would be greatly appreciated! >> >> Thanks again, >> >> Mike > > Here are a few pointers that may help. > > (1) Often you can use Solve or NSolve. For example, try out exprs = > {x1*x2-x3*x4-100, > x3/x2-x1^2-10^(-3), > x4/x1+x2*x3-2*10^(-6), > x1*x4-x3/x2-5*10^(-13)}; > vars = {x1,x2,x3,x4}; > Timing[sol = Solve[exprs==0, vars];] nsol1 = N[sol, 100]; > exprs /. nsol1 // Chop > > (2) The solutions to the above system are not real. Hence if we try > FindRoot and give real starting values, we will not converge to a > solution (this is because FindRoot uses some flavor of Newton > iterations, and all the data is real). > > If I do, say, > > max = 50; > start := Table[Random[Complex,max+I*max,100], {4}] > FindRoot[Evaluate[Thread[exprs==0]], > Evaluate[Sequence @@ Thread[{vars,start}]], > WorkingPrecision->100, AccuracyGoal->20, > MaxIterations->300] > > then I get a fairly decent result. > > (3) You do not need to rationalize the starting values. Indeed, the > precision of the starting values should be largely immaterial, assuming > the code is robust (I have not looked into this issue). > > (4) Given the spread of inputs, I would be surprised if machine > arithmetic will suffice for your needs. Hence setting WorkingPresision > to some bignum level is probably the appropriate thing to do. You will > most likely also want to up the values for AccuracyGoal and > MaxIterations, as I have done above. As you realize, this will result > in slower computation, but I see no easy remedy for that. > > > Daniel Lichtblau > Wolfram Research Okay, I've had Solve running for two days now trying to solve my actual seven variable problem, but haven't gotten any output yet. (I'm running a NEC P220MHz PC with Windoze 95 and 64MB RAM and Mathematica 3.0.) Specifically, my seven equations are as follows: eqs={369664/981 - 1/(x2*(x3+x4))==0, -6513786578938559/9223372036854775808+x1*x4+x1*x5+x6*x7==0, -3858337547701687/9444732965739290427392+x1*x2*x4*x5+x1*x4*x6*x7+ x1*x5*x6*x7==0, -1/97280000000+x1*x2*x4*x5*x6*x7==0, 981/369664-x2*x3-x2*x4==0, 77/924160000-x1*x2*x3*x4-x1*x2*x3*x5-x2*x3*x4*x6-x2*x3*x6*x7- x2*x4*x6*x7==0, 1/1848320000000-x1*x2*x3*x4*x6*x7-x1*x2*x3*x5*x6*x7==0} (The fractions above may seem ridiculous, but they give me infinite precision.) So ... I try ans=Solve[eqs,{x1,x2,x3,x4,x5,x6,x7}] Thus far, I haven't had any output (unfortunately) after about 1.5 days. Now I'm a newbie at Mathematica, so is there something that I'm doing wrong here? I initially started just wanted to find positive real root solutions to these seven equations, but now I'm just struggling to find *any* complex solution to this set of equations. Sigh ... Again, I'd be grateful for any suggestions or help that anyone may have! Thanks again! Mike
- Follow-Ups:
- Re: Re: Re: FindRoot accuracy/precision
- From: Daniel Lichtblau <danl@wolfram.com>
- Re: Re: Re: FindRoot accuracy/precision
- References:
- FindRoot accuracy/precision
- From: bt585@FreeNet.Carleton.CA (Michael Chang)
- Re: FindRoot accuracy/precision
- From: bt585@FreeNet.Carleton.CA (Michael Chang)
- FindRoot accuracy/precision