Re: Re: Re: Integration of
- To: mathgroup at smc.vnet.net
- Subject: [mg105972] Re: [mg105919] Re: [mg105916] Re: [mg105896] Integration of
- From: Leonid Shifrin <lshifr at gmail.com>
- Date: Mon, 28 Dec 2009 04:58:25 -0500 (EST)
- References: <200912240515.AAA25812@smc.vnet.net>
> The OP still has a big problem, however, if p3 and p4 > are undefined. > A good point. Regards, Leonid > Bobby > > On Fri, 25 Dec 2009 05:09:41 -0600, Leonid Shifrin <lshifr at gmail.com> > wrote: > > > Hi Bobby, > > > > Just a few comments > > > > Integrate is a SYMBOLIC integrator; it can't integrate numerical > >> interpolating functions. > >> > > > > Not always true, although true in Brian's case, because he uses his > > InterpolatingFunction object on functional argument (not the integration > > variable directly). Consider: > > > > In[1]:= > > Short[data = {#,#^2}&/@Range[-2,2,0.1]] > > > > Out[1]//Short= {{-2.,4.},{-1.9,3.61},<<38>>,{2.,4.}} > > > > In[2]:= > > intF = Interpolation[data] > > > > Out[2]= > > InterpolatingFunction[{{-2.,2.}},<>] > > > > In[3]:= > > intFIntegrated = Integrate[intF[x],x] > > > > Out[3]= > > InterpolatingFunction[{{-2.,2.}},<>][x] > > > > In[4]:= > > Plot[intFIntegrated,{x,-2,2}] > > > > (* Plot output skipped, but the point is that it does work *) > > > > The main point is that Integrate *does* integrate a direct > > InterpolatingFunction object (if integration is over the same variable on > > which this InterpolatingFunction is defined), returning another > > InterpolationFunction object as its antiderivative (does not need > > specific > > integration limits). This is possible because internally interpolation is > > nothing but a bunch of splines which are polynomials of some finite order > > and therefore can be integrated analytically. As far as I remember, this > > can > > be also done for multi-dimensional InterpolatingFunction objects. > > > > Moreover, for direct InterpolatingFunction object using Integrate is in > > fact > > often both faster and > > more accurate than NIntegrate, since the latter often has (or used to > > have > > in prior versions anyway) slow convergence on InterpolatingFunction > > objects. > > > > What is also true is that Integrate can not be used directly to integrate > > say functions of InterpolatingFunction objects: > > > > In[5]:= > > intFIntegratedSq = Integrate[intF[x]^2,x] > > > > Out[5]= > > \[Integral]InterpolatingFunction[{{-2.,2.}},<>][x]^2 \[DifferentialD]x > > > > Not even in fixed numerical limits > > > > In[6]:= > > intFIntegratedSq = Integrate[intF[x]^2,{x,-2,2}] > > > > (* Output skipped *) > > > > However, for numerical limits there is a NIntegrateInterpolatingFunction > > function in FunctionApproximations` package, which still uses symbolic > > Integrate internally, and which again often gives better results than > > NIntegrate (or at least this used to be so in v.5 when I was using this > > functionality): > > > > In[7]:= > > Needs["FunctionApproximations`"] > > > > In[8]:= > > NIntegrateInterpolatingFunction[intF[x]^2,{x,-2,2}] > > > > Out[8]= 12.8 > > > > > > Regards, > > Leonid > > > > > > > > > >> You might use NIntegrate or NDSolve instead, but that would require p3 > >> and > >> p4 to have numerical values. > >> > >> If they did, you could try solving for xP via > >> > >> Clear[xP] > >> xP = xP /. > >> First@NDSolve[{xP'[t] == qFC[t], xP[0] == 0}, xP, {t, 0, tMax}] > >> > >> Bobby > >> > >> On Wed, 23 Dec 2009 23:15:01 -0600, blamm64 <blamm64 at charter.net> > wrote: > >> > >> > Hi All, > >> > > >> > Well, my problem with NDSolve diagnosing delay differential algebraic > >> > equations where there are no explicit delay arguments is because I > >> > defined a "function of an InterpolatingFunction"; it never gets > >> > evaluated apparently because Integrate cannot deal with it unless the > >> > InterpolatingFunction is not "changed" in any way. > >> > > >> > Now, I searched the forums and found some posts regarding essentially > >> > what my post is titled, but I could only find instances where the user > >> > was basically trying to get rid of integrations of > >> > InterpolatingFunctions being tied to a particular argument, and what I > >> > want is just the precise reverse of that. > >> > > >> > I have an dataset I interpolate. The independent argument is pressure > >> > difference. I have a quantity tied to the integral of that function > >> > derived from the dataset. The quantity is displacement and it is tied > >> > to time-dependent pressure difference "sent through" that function > >> > (volumetric flow rate as a function of pressure difference across it. > >> > > >> > I "played around" and came up with the following. Please consider: > >> > > >> > Model > >> > > >> > fmodel[delp_]=30 (-(1/(delp+1)^3)+1); > >> > > >> > Data > >> > > >> > qdata = Table[{delp,fmodel[delp]},{delp,0,1000,1}]; (* note this is > >> > not actual data I have *) > >> > > >> > Interpolation > >> > > >> > qFConIN = Interpolation[qdata,InterpolationOrder->2]; > >> > > >> > Interpolation with time dependent variables in the needed form p3[t] - > >> > p4[t] "pre-loaded" > >> > > >> > dp3p4 = p3[t]-p4[t]; > >> > > >> > qFC[t_]=qFConIN[dp3p4] > >> > Out[5]= InterpolatingFunction[{{0,1000}},<>][p3[t]-p4[t]] > >> > > >> > Interpolation with time dependent variables "pre-loaded", but no > >> > independent argument (t) on l.h.s. > >> > > >> > qFCnoT=qFConIN[dp3p4] > >> > Out[6]= InterpolatingFunction[{{0,1000}},<>][p3[t]-p4[t]] > >> > > >> > Derivatives (zero and higher) work fine (see below after setting > >> > explicit, but dummy, p3[t] and p4[t]) > >> > > >> > dfmodeldt=D[fmodel[dp3p4],t]; > >> > > >> > dqFCdt=D[qFC[t],t] > >> > Out[8]= InterpolatingFunction[{{0,1000}},<>][p3[t]-p4[t]] (p3'[t]- > >> > (p4'[t]) > >> > > >> > dqFCnoTdt=D[qFCnoT,t] > >> > Out[9]= InterpolatingFunction[{{0,1000}},<>][p3[t]-p4[t]] (p3'[t]- > >> > (p4'[t]) > >> > > >> > Integration of Model > >> > > >> > xPfmodel[t_]=Integrate[fmodel[dp3p4],{s,0,t}]; > >> > > >> > Intergration of "pre-loaded" interpolation (will FAIL) > >> > Next is what I wanted, but this is what is causing NDSolve to diagnose > >> > the diffeqs as delay (I have several functions of xP[t] as terms in > >> > the diffeqs, e.g. fDoor[xP[t]]*qFC[t]/areaPh ... where fDoor is a > >> > force as a function of displacement function ... qFC[t] gets evaluated > >> > just fine ... and qFC[t]/areaPh is a fluid velocity, and qFC[t] is the > >> > pre-defined regulation of that flow which in turn constrains the > >> > displacement xP[t] ) > >> > > >> > > >> > xP[t_]=Integrate[qFC[s],{s,0,t}] > >> > The output here is Integralsign, limits 0 to t, InterpolatingFunction > >> > [{{0,1000}},<>][p3[s]-p4[s]] ds > >> > > >> > Now here's where it gets interestingly strange > >> > Even with strange leading t, this integration with "pre-loaded" time- > >> > dependent arguments (but no independent argument t on the > >> > interpolation function), apparently works (see below) > >> > > >> > xP2[t_]=Integrate[qFCnoT,{s,0,t}] > >> > Out[12]= t InterpolatingFunction[{{0,1000}},<>][p3[t]-p4[t]] > >> > > >> > Now define "dummy" pressures, as functions of time. In actuality, p3 > >> > [t] and p4[t] can vary according to the physics modeled by the diffeqs > >> > (they are two of five time dependent variables in my diffeqs). All we > >> > need ensure here is their initial value difference is zero > >> > > >> > p3[t_]=30+4 t; > >> > p4[t_]=30; > >> > > >> > Derivatives work fine (a bit higher InterpolationOrder would make > >> > disparity less) > >> > > >> > N[{dqFCdt/.t->2,dqFCnoTdt/.t->2,D[fmodel[dp3p4],t]/.t->2},6] > >> > Out[15]= {0.0571875,0.0571875,0.0548697} > >> > > >> > Integral of model at p3[6] - p4[6] > >> > > >> > xPfmodel[6] > >> > Out[16]= 562464/3125 > >> > > >> > APPARENTLY works > >> > > >> > In[17]:= xP2[6] > >> > Out[17]= 562464/3125 > >> > > >> > FAILS > >> > > >> > xP[2] > >> > The output is Integralsign, limits 0 to 2, InterpolatingFunction > >> > [{{0,1000}},<>][4 s] ds > >> > > >> > Now, I tried several different models, and several different p3 and p4 > >> > functions, and I always got agreement between xPfmodel and xP2. > >> > > >> > But that really does not *prove* anything. My problem (one of them > >> > anyway) is I don't know enough Mathematica semantics to decide if xP2 > >> > will always do what I need. I never need the time derivative of xP > >> > since I already have it explicitly (qFC[t]). > >> > > >> > Can anyone enlighten me? What I need to know is the *proper* way to > >> > get what I need done which is integrate and InterpolatingFunction, > >> > rather, a function of an InterpolatingFunction. What is the *correct* > >> > way of getting what is represented by xP[t_] = Integrate[qFC[s], {s, > >> > 0,t}] (but obviously does not work)? > >> > > >> > Thanks, > >> > -Brian L. > >> > > >> > >> > >> -- > >> DrMajorBob at yahoo.com > >> > >> > > > -- > DrMajorBob at yahoo.com > >
- References:
- Integration of Interpolation
- From: blamm64 <blamm64@charter.net>
- Integration of Interpolation