MathGroup Archive 2003

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Integrate piecewise with Assumptions

  • To: mathgroup at smc.vnet.net
  • Subject: [mg44099] Re: Integrate piecewise with Assumptions
  • From: poujadej at yahoo.fr (Jean-Claude Poujade)
  • Date: Thu, 23 Oct 2003 07:14:40 -0400 (EDT)
  • References: <bn2iop$o1e$1@smc.vnet.net>
  • Sender: owner-wri-mathgroup at wolfram.com

"Chia-Ming" <yucalf at mail.educities.edu.tw> wrote in message news:<bn2iop$o1e$1 at smc.vnet.net>...
> Excuse me,
> 
> First, I define a piecewise function to discribe the shortest distance
> on the edge of a circle.
> 
> dis[x_, xi_] :=
>   Which[1/2 >= x - xi >= 0, x - xi, x - xi > 1/2, 1 - (x - xi),
>     0 > x - xi >= -1/2, xi - x, x - xi < -1/2, 1 - (xi - x)]
> 
> And it does works that it can automatically judge to go in a clockwise
> or a conter-clockwise direction.
> 
> dis[2/3, 1/10]
> 13/30
> 
> Furthermore, dis[] can be applied in the Integrate[] command:
> 
> Integrate[(a - 5 dist[1/6, x])^2, {x, 0, 1}]// Simplify
> 25/12 - (5 a)/2 + a^2
> 
> However, it can not work with the option Assumptions:
> 
> Integrate[(a - 5 dist[y, x])^2, {x, 0, 1}, Assumptions->0<y<1/2]//Simplify
[...] 

Dear Chia-Ming  (or should I write Dear Yu ?)

You better use UnitStep functions to describe your function.
Here are two small modules that might help you
to build piecewise constant functions,
or piecewise linear functions, expressed 
in terms of UnitStep functions.

In[1]:=(* 'pcf' is piecewise constant function constructor.
Function is expressed in terms of UnitStep functions.
call format : pcf[y0, listOfPoints, x]
input :
   y0 = leftmost value  
   listOfPoints = {{x1,y1},...,{xn,yn}} where  yi are right values
   at points of discontiuity
   x = variable used to generate output expression
output :
   piecewise constant function expressed in terms of UnitStep
functions
   using 'x' as variable
*)

pcf[y0_, listOfPoints_List, x_]:=
Module[{lp = Length[listOfPoints], f, a, b, eq, vars},
   f[u_] := Sum[a[i]UnitStep[u-listOfPoints[[i,1]]],{i,1,lp}]+b;
   eq = Append[f[#[[1]]] == #[[2]]& /@ listOfPoints,f[-Infinity] ==
y0];
   vars = Append[Table[a[i],{i,1,lp}],b]; 
   First[f[x] /. Solve[eq,vars]]
];

(* example of a square bump *)
pcf[0,{{0,1},{1,0}},x]
Out[2]=-UnitStep[-1+x]+UnitStep[x]

In[3]:=(* a stairs function : *)
pcf[0,{{0,1},{1,2},{2,3},{3,4},{4,5},{5,0}},x]
Out[3]=-5 UnitStep[-5+x]+UnitStep[-4+x]+UnitStep[-3+x]+UnitStep[-2+x]+UnitStep[-1+x]+
  UnitStep[x]

In[4]:=(* plf is a piecewise linear function constructor.
(function may be discontinuous)
call format : plf[leftSlope0_, listOfPoints_List, x_]
input :
   leftSlope0 : leftmost slope
   listOfPoints format : 
   {{x1, lefty1, righty1, rightSlope1},...,
    {xn, leftyn, rightyn, rightSlopen}}
   x : variable
output :
   piecewise linear function expressed in terms of UnitStep functions
   using 'x' as variable
*)

plf[leftSlope0_, listOfPoints_List, x_]:=
Module[{deltaFunctions, pcfPoints, tempPlf, k, sol},
   deltaFunctions = (#[[3]]-#[[2]])DiracDelta[x-#[[1]]]&/@listOfPoints;
   pcfPoints = {#[[1]],#[[4]]}& /@ listOfPoints;
   tempPlf = Integrate[pcf[leftSlope0,pcfPoints,x]+Plus@@deltaFunctions,x]+k;
   sol = Solve[(tempPlf/.x -> (listOfPoints[[1,1]]+
   listOfPoints[[2,1]])/2)==(listOfPoints[[1,3]]+listOfPoints[[2,2]])/2,k];
   tempPlf/.sol[[1]]
];

(* example of a sawtooth function *)
plf[0,{{0,0,0,1},{1,1,0,1},{2,1,0,1},{3,1,0,0}},x] //Simplify

Out[5]=-(-2+x) UnitStep[-3+x]-UnitStep[-2+x]-UnitStep[-1+x]+x
UnitStep[x]

In[6]:=(* the bump function may be expressed two ways : *)
plf[0,{{0,0,1,0},{1,1,0,0}},x] == pcf[0,{{0,1},{1,0}},x]//Simplify
Out[6]=True

Hoping this will help you
---
jcp


  • Prev by Date: Re: recode procedural algorithm to faster functional module
  • Next by Date: Re: Summation Problem w/ 5.0
  • Previous by thread: Integrate piecewise with Assumptions
  • Next by thread: Re: Integrate piecewise with Assumptions