Re: NDSolve with momentum
- To: mathgroup at smc.vnet.net
- Subject: [mg105473] Re: NDSolve with momentum
- From: Gareth Russell <russell at njit.edu>
- Date: Fri, 4 Dec 2009 04:32:21 -0500 (EST)
- References: <hf86m0$17g$1@smc.vnet.net>
Hi, Thanks to the response from "Daniel", I was able to get the answer to my own question, so I'm posting it here. Daniel provided the basic model of motion (F=ma) implemented in NDSolve, with an example on a parametric surface. I figured out how to apply it to to an arbitrary surface that starts life as an array of height values. I may have some of the physics oversimplified, esp. friction, but it's ok, I'm not tring to actually model a ball rolling! Gareth Create an interesting surface, based on something in the help function, plus a bowl shape to help the "ball" stay within the bounds. ifun = ListInterpolation[RandomReal[1, {5,5,5,5}], {{0,1},{0,2},{0,3},{0,4}}]; integ = Integrate[ifun[x1, x2, x3, x4], {x1,0,1},{x4,0,4}]; array=Table[integ,{x2,0,2,0.01},{x3,0,3,0.01}]; bowlArray=Table[{x,y}.{x,y},{x,-1,1,0.01},{y,-1,1,0.006666666}]; smoothSurface=ListInterpolation[array+bowlArray,{{0,2},{0,2}}]; Plot3D[smoothSurface[x,y],{x,0,2},{y,0,2}] Create derivative surfaces in the x and y directions. dX=Derivative[1,0][smoothSurface]; dY=Derivative[0,1][smoothSurface]; Clear some variables and set up constants Clear[mass,friction,x,y,pos,position,pot,grad]; mass=1; friction=0.2; gravity=9.81; A function that returns the gradient at a point by sampling from the two surfaces. This was used in Daniel's original version. grad[{x_,y_}]={dX[x,y],dY[x,y]}; For a moving ball, though, there is a problem in that there should be a maximum acceleration due to gravity even at an infinitely steep gradient. A function that (I think) converts the gradient into a force under the principle that F=m g where g=0.981. grav[{x_,y_}]=gravity*Sin[2*Pi+Map[ArcTan,{dX[x,y],dY[x,y]}]]; A function used to plot the trajectory on the surface. trajectory3D[t_]:=Append[position[t],Apply[smoothSurface,position[t]]] Simulate the dynamics! tmax; position=pos/.NDSolve[{-grav[pos[t]]-pos'[t]*0.5==pos''[t] mass,pos[0]=={1.2,1.7},pos'[0]=={1,0}},pos,{t,0,tmax},MaxSteps->100000][[1]]; Plot trajectory on surface Show[Plot3D[smoothSurface[x,y],{x,0,2},{y,0,2}],ParametricPlot3D[trajectory3D[t],{t,0,tmax},PlotStyle->Thickness[0.003]],ViewPoint->{1.3,-2.4,2}] trajectory3D[tmax] A Manipulate[] function to animate the rolling ball. Manipulate[Show[Plot3D[smoothSurface[x,y],{x,0,2},{y,0,2}],ListPointPlot3D[{trajectory3D[t]+{0,0,0.2}},PlotStyle->PointSize[0.05]],Axes->False,Boxed->False,ViewPoint->{1.3,-2.4,2}],{t,0,tmax}] On 2009-12-03 06:16:16 -0500, Gareth Russell <russell at njit.edu> said: > Hi, > > Does anyone know how to use NDSolve to create the trajectory of motion > of a point following positive gradients on an arbitrary landscape (a > ListStreamPlot-like path), but with 'momentum'? The idea is that the > trajectory would not terminate on smaller local maxima, depending on > the momentum term. > > I don't know exactly how ListStreamPlot does its thing -- I would guess > it interpolates the array of gradient pairs, and then uses NDSolve to > find the paths. If so, is there way to modify that basic idea to > include a momentum-like term? Or would I need to do a full physics-type > model as if I were modelling a ball with mass, gravity, friction, etc.? > > Thanks, -- Gareth Russell NJIT