Re: Plot3D with NDSolve
- To: mathgroup at smc.vnet.net
- Subject: [mg82014] Re: Plot3D with NDSolve
- From: Szabolcs Horvát <szhorvat at gmail.com>
- Date: Tue, 9 Oct 2007 05:42:32 -0400 (EDT)
- References: <fdnlg5$klu$1@smc.vnet.net> <feca11$fl1$1@smc.vnet.net>
Andrew Moylan wrote: > On Sep 30, 6:07 pm, sean_incali <sean_inc... at yahoo.com> wrote: >> Hello group, >> >> Let's say I can solve the following DE that depends on 2 paparmeters a >> and b, and plot it accordingly. >> >> eqn = y'[x] == b/(a y[x]) >> par = {a -> 1, b -> 1} >> >> solution = NDSolve[{eqn /. par, y[0] == 0.1}, y, {x, 0.1, 5}]; >> >> Plot[y[x] /. solution, {x, 0.1, 5}]; >> >> Above shows a 2d graph in x and y axes. >> >> What I want to do is now use one of the parameter as z axis. >> >> So I need to solve the DE while varying a from 1 to 5 for instance. >> >> Then I want to graph the solutions as a 3D object. with x. y and a >> axis (where a will be the new z axis.) >> >> I guess I can use Table to iterate the whole procedure, but I wanted >> to see how others would approach it. >> >> For instance, if I use >> >> eqn = y'[x] == b/(a y[x]) >> par = {b -> 1} >> >> solution = Table[NDSolve[{eqn /. par, y[0] == 0.1}, y, {x, 0.1, 5}], >> {a, 1, 5}]; >> >> Plot[Evaluate[y[x] /. solution], {x, 0.1, 5}]; >> >> It will shows all the solutions in one 2D graph. I want to see them in >> 3D. >> >> On the side note.. Why does the Plot require the "Evaluate" in the >> second code I posted and not in the first code??? >> >> If someone can explain that that will be great also. >> >> Thanks in advance as usual. >> >> sean > > > Here's a way Sean: > > eqn[(a_)?NumericQ] = Derivative[1][y][x] == b/(a*y[x]) /. b -> 1 > > solution[(a_)?NumericQ] := solution[a] = > Block[{x}, > y /. NDSolve[{eqn[a], y[0] == 0.1}, y, {x, 0.1, 5}][[1]]] Yes, this result caching technique is what came to my mind first when I read the question of the OP, but the problem is that there is nothing to limit the number of results cached. Gradually, 'solution' will fill up with junk, especially if it is used with unpredictable functions, such as Plot3D. If 'solution' took only integers as its argument, the situation would be somewhat better ... but there are infinitely many floating point numbers in a bounded interval. > solution3d = FunctionInterpolation[solution[a][x], {a, 1, 5}, > {x, 0.1, 5}] Why do you use FunctionInterpolation before passing the result to Plot3D? > Plot3D[solution3d[a, x], {a, 1, 5}, {x, 0.1, 5}] > -- Szabolcs