Re: how do i access the inside of the interpoating functions
- To: mathgroup at smc.vnet.net
- Subject: [mg43542] Re: [mg43518] how do i access the inside of the interpoating functions
- From: Selwyn Hollis <selwynh at earthlink.net>
- Date: Fri, 19 Sep 2003 03:42:11 -0400 (EDT)
- Sender: owner-wri-mathgroup at wolfram.com
Hi Sean, If your Interpolating function is named interp and covers the interval [a,b], you can use FindMinimum like this: FindMinimum[-interp[t],{t,.5(a+b),a,b}] So the rub is how to extract a and b... This does it with a rule: FindMinimum[-interp[t], interp /. _[{{a_, b_}}, __] :> {t, 0.5*(a + b), a, b}] Also, I recently wrote the following, which you and others might find useful. It defines a function named InterpolatingFunctionPlot. Needs["Graphics`Graphics`"]; InterpolatingFunctionPlot[f_List, (opts___)?OptionQ] := DisplayTogether[(Plot[Evaluate[#[t]], Evaluate[#/. _[{{t1_,t2_}},__] :> {t,t1,t2}], opts] & ) /@ f] /; MatchQ[f, {InterpolatingFunction[__]..}]; InterpolatingFunctionPlot[f_InterpolatingFunction, (opts___)?OptionQ] := InterpolatingFunctionPlot[{f}, opts] ; InterpolatingFunctionPlot[f:{{_, _}..}, (opts___)?OptionQ] := DisplayTogether[(ParametricPlot[ Evaluate[#/. i_InterpolatingFunction -> i[t]], Evaluate[First[#/. _[{{t1_,t2_}}, __] :> {t,t1,t2}]], opts]&)/@ f]/; MatchQ[f, {{InterpolatingFunction[__]..}..}]; InterpolatingFunctionPlot[f:{{_, _, _}..}, (opts___)?OptionQ] := DisplayTogether[(ParametricPlot3D[ Evaluate[#/. i_InterpolatingFunction -> i[t]], Evaluate[First[#/. _[{{t1_,t2_}}, __] :> {t,t1,t2}]], opts]&)/@ f]/; MatchQ[f, {{InterpolatingFunction[__]..}..}]; (*Example*) soln = {x, y, z} /. First[NDSolve[{x'[t] == x[t]*Cos[z[t]], y'[t] == x[t] - y[t], z'[t] == x[t] - z[t], x[0] == 1, y[0] == 1, z[0] == 0}, {x, y, z}, {t, 0, 10}]] InterpolatingFunctionPlot[soln] InterpolatingFunctionPlot[{soln}] ----- Selwyn Hollis http://www.math.armstrong.edu/faculty/hollis On Thursday, September 18, 2003, at 05:40 AM, sean k wrote: > good to see the group back up. > > What I would like to do is to look inside the interpolatingn functions > generated by the NDSolve in Mathematica. > > so take y[t] -> InterpolatingFunction[{{0., 25.}}, "<>"][t] for > instance. > > I need to figure out a few things about this interpolating function. > > 1. what is the Maximum y[t] value and the t value associated with that > in the range of t given. (if there are more than on maximums, then the > value of the first one that occurs in terms of time and the value of > t. ) > > 2. what is the half Maximal y[t] value and the t values associated > with it? > > 3. are any of values less than 0? if it has at least a single > value that is negative, thenn I would like to throw out the > integration( is this a proper way to control for artifacts/or > targets?) > > For 1, 2 what I have thought initially is to use Table and use some > kinda logic along with it. but it will be too slow since the intervals > will be have to be sufficienly small. > > For 3, I'm kinda stumped. Similarly i can use table but its still > going to be so slow... There has to be another way to approachthis > problem? > > So far only thing that I have found in the math group archives that > does something similar to what I want is to use the FindRoot as below. > It seems to work for the equations that saturate( second cells pasted > below), but not for the type shown below. I's using lorenz eqn's here > as an example. This really isn;t very good example since the maximum > comes later in the time range, but my systems shows maximums before in > the eralier time points. > > > begin first cell---- > > solution = > NDSolve[{Derivative[1][x][t] == -y[t] - z[t], x[0] == -0.04, > Derivative[1][y][t] == x[t] + 0.425*y[t], y[0] == -0.3, > Derivative[1][z][t] == 2 - (4 - x[t])*z[t], z[0] == 0.52}, > {x[t], y[t], > z[t]}, {t, 0, 25}, Method -> RungeKutta] > (*ParametricPlot3D[Evaluate[{x[t], y[t], z[t]} /. solution], {t, 0, > 25}, > PlotPoints -> 1000, PlotRange -> All];*) > > (*pulling out interpolating functions*) > interp = solution[[1, 2, 2]] > > (*finding the maxvalues for y[t]*) > maxYoft = Max[Table[interp, {t, 0, 25, 1}]] > > (*finding the t value for max Y this doesn't work. is there any other > ways to do this? instead of using findroot? I don't quite understand > how it's working, and it seems to cause lotta errors which means i > would have to use Check[] on this too....*) > > tformaxY = FindRoot[interp == maxYoft, {t, 0}] > > (*half maximal y*) > halfmaxY = ( maxYoft)/2 > > (*tfor half maximal y*) > {t, halfmaxY} > tforhalfmaxY = FindRoot[interp == halfmaxY, {t, 0}] > > Plot[Evaluate[y[t] /. solution], {t, 0, 25}]; > > end first cell--- > > > this one below works as expected and pick out at least the half > maximal values and time associated with it and generates no errors. > > > begin second cell --- > > In[1]:= > NDSolve[{D[y[t], t] == 1 - y[t], y[0] == 0}, y[t], {t, 0, 20}]; > secondCellsol = y[t] /. %[[1]] > maxy = Max[Table[secondCellsol, {t, 0, 20, 0.01}]] > halfmaxy = maxy/2 > FindRoot[secondCellsol == halfmaxy, {t, 1}] > Plot[secondCellsol, {t, 0, 10}, PlotRange -> {0, 2}] > > end second cell --- > >