Re: ListPlot with multiple (related) series.
- To: mathgroup at smc.vnet.net
- Subject: [mg33479] Re: [mg33420] ListPlot with multiple (related) series.
- From: Daniel Lichtblau <danl at wolfram.com>
- Date: Fri, 22 Mar 2002 04:07:29 -0500 (EST)
- References: <200203211426.JAA18087@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Curt Fischer wrote: > > Dear Group, > > equations as a function of a parameter of the equations b. Problem > is, there are multiple solution sets and my graph does not show which > x goes with which y at a given b. How can I make such a graph? > > Details: > In my problem, I have three equations in three unknowns x, y, and z. > b is a parameter in these equations. Using NSolve, I built a function > which takes b as a variable and returns the values of x, y, and z, > like this; > > soln[b_]:=NSolve[{eqns},{x,y,z}] > > This is all good. My equations are rational, and NSolve returns at > most three solutions sets {x,y,z} for any given b. > > Now, I want to plot x and y vs. b, on the same graph. I want the > graph to show every solution set for each b. > > I tried: > > Show[{ > ListPlot[ > Flatten[ > Table[Table[{i, x/.soln[i][[n]]]}, {i,1,10,.2}],{n, 1, 3}], > 1], > PlotStyle -> {PointSize[ .02], RGBColor[1, 0, 0]}, > DisplayFunction -> Identity], > ListPlot[ > Flatten[ > Table[Table[{i, y/.soln[i][[n]]]}, {i,1,10,.2}],{n, 1, 3}], > 1], > PlotStyle -> {PointSize[ .02], RGBColor[0, 1, 0]}, > DisplayFunction -> Identity]}, > DisplayFunction -> $DisplayFunction] > > which worked and a output a graph. Problem is, since there are three > solutions, there are three distinct red (x) and three distinct green > (y) points for every b. There is no way of knowing which x goes with > which y from this graph. > > How can I make a graph which preserves this information? It is not as > important to me to keep to color difference in x and y as it is to > distinguish solution 1 from solution 2 from solution 3...but is there > an easy way to do both in the same graph? > > Thanks for your help. > -- > Curt Fischer > crf3 at po.cwru.edu I'll show a basic example using two equations in two variables. There are two approaches that come to mind. One is to pick at each "new" b value, for a successor to a given solution at the previous value, the one that is closest to that previous solution. This will work fine until you get near b-values where solution paths cross. An alternative is to solve for a given initial value of b, convert to a system of ODEs with b as independent value, and give as separate initial solutions the solutions for the initial b value. This is what is done below. I think Carl Woll has posted variations of this in the past (but if it does not work for your purposes you should probably blame me and not him). eqns = {1+3*x[b]-7*x[b]*y[b]+b*x[b]*y[b]^2-x[b]^2, 4-2*x[b]+b^2/3*y[b]-y[b]^2} In[34]:= initsoln = NSolve[eqns /. b->3, {x[3],y[3]}] Out[34]= {{x[3] -> -0.0428556, y[3] -> 4.01708}, {x[3] -> 2.83817, y[3] -> 2.25741}, {x[3] -> -0.074289, y[3] -> -1.02954}, {x[3] -> 2.25857, y[3] -> 0.183619}} odes = D[eqns /. {x->x[b],y->y[b]}, b] sol1 = First[NDSolve[Join[Thread[odes==0], Thread[{x[3],y[3]} == ({x[3],y[3]}/.initsoln[[1]])]], {x[b], y[b]}, {b,3,6}]]; Now you can plot the solution over b in the range for which we solved: ParametricPlot[Evaluate[{x[b], y[b]} /. sol1], {b,3,6}] Similarly you can get plots for solutions using the other three initial values, e.g. sol2 = First[NDSolve[Join[Thread[odes==0], Thread[{x[3],y[3]} == ({x[3],y[3]}/.initsoln[[2]])]], {x[b], y[b]}, {b,3,6}]] ParametricPlot[Evaluate[{x[b], y[b]} /. sol2], {b,3,6}] One drawback to this approach is that you have to have some idea of how far you can continue a solution, in the parameter b, without it becoming complex-valued. Daniel Lichtblau Wolfram Research
- References:
- ListPlot with multiple (related) series.
- From: crf3@po.cwru.edu (Curt Fischer)
- ListPlot with multiple (related) series.