Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

Minimum function path on a surface with Mathematica

  1. Oct 11, 2011 #1
    Hello,

    I am trying to solve the following problem using Mathematica:

    I have (defined) a surface of two variables, say f(a,b). Now I want to
    plot a path (a line) that corresponds to min[f(a,b)] starting from
    certain valus of a and b (say a0,b0). In other words the path always proceeds through
    the minimum of f(a,b), starting from f(a0,b0), but it should be continuous(!).

    I will apreceate very very much any hint how to do it in Mathematica.
    Many thanks!

    Best,
    Evgeniy
     
  2. jcsd
  3. Oct 12, 2011 #2
    It isn't clear to me how much of this you know how to do and what parts you need help with.

    Are you able to find the {a,b} that correspond to the minimum of f[]?

    Once you have that are you perhaps looking for a parametric equation that gives you {at,bt} where {at,bt}={a0,b0} when t=0 and {at,bt}={a,b} when t=1?

    Am I anywhere near what you are looking for?

    Either way, please give a more precise description of what you are looking for, what you know how to do, what you have already done and where you are stuck. A concrete example f and {a0,b0} would also help.
     
  4. Oct 13, 2011 #3
    Hi,

    thanks for your response. Here are some more details on the problem (sorry that
    I didn't give them in the first post):

    the surface is defined as follows:

    surf=Interpolation[{
    {{150.0, 150.0}, 3.096864},
    {{150.0, 160.0}, 3.046994},
    {{150.0, 170.0}, 3.009620},
    {{150.0, 180.0}, 2.989012},
    {{150.0, 190.0}, 2.986530},
    {{150.0, 200.0}, 3.002286},
    {{150.0, 210.0}, 3.035953},

    {{160.0, 150.0}, 3.086955},
    {{160.0, 160.0}, 3.034026},
    {{160.0, 170.0}, 2.998120},
    {{160.0, 180.0}, 2.981648},
    {{160.0, 190.0}, 2.983551},
    {{160.0, 200.0}, 3.003376},
    {{160.0, 210.0}, 3.041179},

    {{170.0, 150.0}, 3.071875},
    {{170.0, 160.0}, 3.020885},
    {{170.0, 170.0}, 2.987889},
    {{170.0, 180.0}, 2.973381},
    {{170.0, 190.0}, 2.978328},
    {{170.0, 200.0}, 3.003711},
    {{170.0, 210.0}, 3.046983},

    {{180.0, 150.0}, 3.059369},
    {{180.0, 160.0}, 3.011611},
    {{180.0, 170.0}, 2.980452},
    {{180.0, 180.0}, 2.968498},
    {{180.0, 190.0}, 2.978878},
    {{180.0, 200.0}, 3.008716},
    {{180.0, 210.0}, 3.055378},

    {{190.0, 150.0}, 3.050455},
    {{190.0, 160.0}, 3.006078},
    {{190.0, 170.0}, 2.979718},
    {{190.0, 180.0}, 2.973050},
    {{190.0, 190.0}, 2.985642},
    {{190.0, 200.0}, 3.017429},
    {{190.0, 210.0}, 3.067576},

    {{200.0, 150.0}, 3.044132},
    {{200.0, 160.0}, 3.005296},
    {{200.0, 170.0}, 2.984163},
    {{200.0, 180.0}, 2.980781},
    {{200.0, 190.0}, 2.995990},
    {{200.0, 200.0}, 3.030428},
    {{200.0, 210.0}, 3.082939},

    {{210.0, 150.0}, 3.038026},
    {{210.0, 160.0}, 3.003644},
    {{210.0, 170.0}, 2.986792},
    {{210.0, 180.0}, 2.988001},
    {{210.0, 190.0}, 3.007861},
    {{210.0, 200.0}, 3.044050},
    {{210.0, 210.0}, 3.093928}
    },Method->Spline]

    f=Function[{a,b},surf[a,b]]

    The path (curve) I want to find (plot) can be looked upon as a trajectory for a particle
    (m=1) that starts moving on the above surface from (a0=180.0 , b0=180.0) with some initial velocity v_init={0; v_b}, i.e. the particle has some initial impulse only along coordinate b; along coordinate a it is 0. At a certain v_init the particle should proceed along the so-called minimum energy path (MEP) for b, which I want to find. (f is basically the potential energy surface).

    The surface f(a,b) is "bound" (has a parabolic form) from {180.0,180.0}
    till {~198.9, ~159.8}. The latter point is an inflection point for coordinate a. I have defined the MEP for b from {180.0,180.0} till {~198.9, ~159.8} by simply finding
    the minimum of f(a,b) for b varying from 180.0 till 159.8. For b<159.8 this doesn't work because here f is "unbound" with respect to a.

    Well, I think the easeist way to find MEP for b is to run trajectories for a few different
    v_init to find its optimimal value, i.e. the minimal value of v_init at which the particle
    moves only forward along b.

    (Sorry if it is still not entirely clear)

    Best,
    Evgeniy
     
  5. Oct 14, 2011 #4
    I did a ListPlot3D on your data and the surface has a sawtooth appearance. I don't know whether your real surface has that appearance or whether the plot just appears this way because of the limited number of data points. If you look at that plot does that accurately represent your surface? A "smooth" surface might more easily yield a robust solution, but we deal with what you have.

    Could you possibly express your problem in the form of a system of differential equations involving initial and final position, velocity and acceleration? If so then DSolve or NDSolve might be an approach. That is just my first idea for how to mount an attack on this.
     
  6. Oct 15, 2011 #5
    Ok, think I have something: start with point zstart=a+bi. Now draw a small circle around that point and compute f(a,b) over those values. Find the mininum value, then let zstart=min. Loop.

    Here's the quick code. I only let it go 10 iterations. Not sure how to stop it automatically. Maybe you can figure it out.

    Code (Text):

    rdelta = 1;
    thepointTable = {};
    zstart = 200 + 200*I;
    For[n = 1, n <= 10, n++,
      mycircle = Table[{Re[z], Im[z], f[Re[z], Im[z]]} /. z -> zstart + rdelta*Exp[I*t],
         {t, 0, 2*Pi, 0.25}]; themin = First[Position[mycircle,
          Min[(#1[[3]] & ) /@ mycircle]]]; zstart = mycircle[[themin[[1]],1]] +
         I*mycircle[[themin[[1]],2]]; thepointTable = Append[thepointTable, zstart]; ]
    thepointTable
    thevalues = ({Re[#1], Im[#1], f[Re[#1], Im[#1]]} & ) /@ thepointTable
    myline = Graphics3D[{Thickness[0.01], Red, Line @@ {thevalues}}]
    mystart = Graphics3D[{PointSize[0.02], Red,
        Point[{Re[zstart], Im[zstart], f[Re[zstart], Im[zstart]]}]}]
    myplot = Plot3D[f[a, b], {a, 150, 210}, {b, 150, 210}, PlotStyle -> Yellow]
    Show[{myplot, mystart, myline}]

     
     
  7. Oct 16, 2011 #6
    Hi Bill Simpson and Jackmell,

    Thanks a lot for your replies. The surface actually looks smooth if you just plot
    f[a,b]; I mean Plot3D[f[a,b],{a,160,210},{b,160,210}]. Well, to run trajectories
    on that surface one should solve a set of 4 equations, i.e. two conjugated pairs
    (coordinate and impulse): dq/dt=p/m and dp/dt=-(df[a,b]/dq). It will take some
    time (at least for me) to implement it and I will postpone it for a while.

    On the other hand, what Jackmell suggested is a very nice circumventing way to
    find the minimum energy path (MEP). It seems to work quite well. In fact, the idea with
    the circle is just smack. Well, I didn't know how to make a circle restriction and
    your way is very elegant. Actually I am interested for the MEP that starts from
    point (180,180) and goes kind of "uphill", i.e. "b" should increase (on average) or
    keep the same value while "a" can take any value. I think to get this I should make
    another restriction, namely instead of taking a circle I should specify a sector,
    i.e. Exp[I*t],{t,Pi/2,Pi}. Looks like it works :)

    Many thanks for your help once again!

    Best wishes,
    Evgeniy
     
Know someone interested in this topic? Share this thread via Reddit, Google+, Twitter, or Facebook




Similar Discussions: Minimum function path on a surface with Mathematica
  1. Mathematica functions (Replies: 1)

Loading...