Re: Piecewise functions definition and usage
- To: mathgroup at smc.vnet.net
- Subject: [mg24258] Re: [mg24098] Piecewise functions definition and usage
- From: Viorel Ontalus <vio2 at lehigh.edu>
- Date: Wed, 5 Jul 2000 23:10:39 -0400 (EDT)
- Organization: Lehigh University
- References: <NDBBJGNHKLMPLILOIPPOOEIBCBAA.djmp@earthlink.net>
- Sender: owner-wri-mathgroup at wolfram.com
Dear David, Thank you for pointing out this method. However my calculations are very complex and I still have some problems. Here is an example of using your method. As you will see, the answer is a complex number when no complex number solutions are possible. Imagine what a mess I get when I run this in a much bigger program that is using these results. Clear[PeakUp, DOSup, NumberDens] PeakUp[n_] := n + 10; G = 10; DOSup[n_, Energy_] := UnitStep[1 -( (Energy - PeakUp[n]) /G )^2 ) ] *Sqrt[ Abs[1 -( (Energy - PeakUp[n]) /G )^2 )] NumberDens[n_, Evar_] := Integrate[DOSup[n, Energy], {Energy, 0, Evar}] NumberDens[0, 20] You get the complex answer !! If you do Plot[Evaluate[NumberDens[0, Evar]], {Evar, 0, 100}] the computer is running very long time and I am not sure you get a plot. David Park wrote: > Viorel, > > Whenever you plan to integrate or differentiate piecewise functions use the > UnitStep function. In fact, UnitStep is so useful, and the multiple > conditional definition method is so limited, that it is a bit of a shame > that the Mathematica Book often leads people down the conditional definition > path. UnitStep is a regular part of Version 4, but a standard package in > earlier versions. So, here is how to do your problem using UnitStep. (I > think that you made an error in the second conditional using 3 instead of > 10. An alternative method of expressing the condition is that the formula > applies for the range -7 < x < 13.) Using UnitStep we just turn the formula > on at x == -7 and off at x == 13. > > f[x_] := Sqrt[ 1 - ( (x - 3)/10)^2 ](UnitStep[x + 7] - UnitStep[x - 13]) > > The following gives a warning message because NIntegrate has trouble with > the kink in the curve, but gives an approximately correct answer. > > NIntegrate[f[x], {x, -1, 17}] > 11.7447 > > This works better: > NIntegrate[f[x], {x, -1, 13}] > 11.7446 > > You can actually obtain an exact answer using Mathematica. > > Integrate[f[x], {x, -1, 17}] > N[%] > (2*Sqrt[21])/5 + (5*Pi)/2 + 5*ArcSin[2/5] > 11.7446 > > Piecewise functions? Always think UnitStep. > > David Park > djmp at earthlink.net > http://home.earthlink.net/~djmp/ > > > -----Original Message----- > > From: Viorel Ontalus [mailto:vio2 at mail.lehigh.edu] To: mathgroup at smc.vnet.net > > > > > It seems I got into an area where Mathematica has some problems, and I > > hope somebody can give me a hint on how to go around these problems. > > > > 1. I am trying to define a piecewise function and do some computations > > with it. When I integrate mathematica does not behave. Here is an simple > > example you can run and see what I am talking about > > > > Clear[f,x} > > f[x_] := Sqrt[ 1- ( (x-3)/10)^2 ] /; > > Abs[x-3]<10 > > f[x_] := 0 /; > > Abs[x-3]>3 ; (*this is a very simple piecewise function but one > > must be sure the Sqrt is from a positive # ) > > > > NIntegrate[f[x],{x,-1,17}] (* Here Mathematica goes nuts !!!*) > > > > Of course it gives an answer but if your program is more complex, then > > you never get an answer !! > > ( I tried to make the upper limit a variable etc !!) > > Does anybody know how to avoid the error , or non convergence messages I > > get !! > > > > > > > > 2. For fun I tried the only reference from the book on piecewise > > functions: > > If[Abs[x-3]<10, f[x_]:=Sqrt[1- ( (x-3)/10)^2 ] , f[x_]:=0 ] > > > > This definition does not work !! > > > > > > > > > > > > > > > > > > > >