Re: Interactive input? and sorting FindRoot list
- To: mathgroup at christensen.cybernetics.net
- Subject: [mg727] Re: Interactive input? and sorting FindRoot list
- From: rubin at msu.edu (Paul A. Rubin)
- Date: 11 Apr 1995 21:18:55 GMT
- Organization: Michigan State University
In article <3m4ogd$e47 at news0.cybernetics.net>, REECE_D <REECE+_D%A1%Electromagnetic_Sciences at mcimail.com> wrote: -> -> Two questions: -> -> 1) Is there a way to have a module execute up to a point, ask the user ->for input and then continue? Yes. Input["prompt"] does it. -> 2) How does one take a list of roots returned from -> Table[FindRoot[eq, i], {i,x0,x1,di}] and return only the unique roots? -> ->The problem I am encountering is that FindRoot will return two or more ->versions of the same root so Union sees them as distinct while in reality ->they are approximations to the same root. I've tried N[] and ->SetPrecision[] with no luck. -> You can specify your own comparison function for the option SameTest in Union. For example: In[1]:= s = Table[ FindRoot[ x^3 - 2x == 0, {x, i} ], {i, -3, 3} ] Out[1]= {{x -> -1.41421}, {x -> -1.41421}, {x -> -1.41421}, {x -> 0.}, {x -> 1.41421}, {x -> 1.41421}, {x -> 1.41421}} (*note repeated roots*) In[2]:= stest[ {Rule[ x_, n_ ]}, {Rule[ y_, m_ ]} ] := x === y && n == m In[3]:= Union[ s, SameTest -> stest ] Out[3]= {{x -> -1.41421}, {x -> 0.}, {x -> 1.41421}} (*repetitions gone*) -> I am trying to write a module which will calculate a characteristic ->equation, plot it, prompt the user for approximate distance between roots ->and then return the first n roots. I could eliminate the plot and prompt ->if I knew of a robust method to calculate the first n roots of the ->characteristic equation. I take it from context that (a) you are only interested in real roots and (b) Solve[] isn't doing the job for you. If you have a priori knowledge of a finite interval containing all roots, you could eliminate the plot/prompt cycle by doing a grid search of the interval until you find either a sign change (indicating a root of odd multiplicity) or a function value "near" zero (indicating a root, possibly of even multiplicity), then applying FindRoot to that interval to nail a root, then dividing x - root out of the characteristic polynomial (reducing the degree by one), and repeating until either the degree gets down to 4 (Solve does quartics exactly, I think) or you fail to find a sign change before hitting some minimal mesh size. (BTW, in the mesh search, I would suggest progressively bisecting all subintervals rather than doing a left-to-right search on the final mesh; I suspect successive bisection would be quicker, although I wouldn't swear to it.) This is not fool-proof: if two roots are very close together, or worse yet you have a repeated root with even multiplicity, you could miss them (it?), and a function value "near" 0 does not guarantee a root nearby. Paul ************************************************************************** * Paul A. Rubin Phone: (517) 432-3509 * * Department of Management Fax: (517) 432-1111 * * Eli Broad Graduate School of Management Net: RUBIN at MSU.EDU * * Michigan State University * * East Lansing, MI 48824-1122 (USA) * ************************************************************************** Mathematicians are like Frenchmen: whenever you say something to them, they translate it into their own language, and at once it is something entirely different. J. W. v. GOETHE