Re: Piecewise functions definition and usage
- To: mathgroup at smc.vnet.net
- Subject: [mg24273] Re: [mg24098] Piecewise functions definition and usage
- From: BobHanlon at aol.com
- Date: Wed, 5 Jul 2000 23:10:57 -0400 (EDT)
- Sender: owner-wri-mathgroup at wolfram.com
In a message dated 7/4/2000 10:16:23 PM, vio2 at Lehigh.EDU writes: >Thanks, >Nice example. My calculations are very big and if I use your suggestion >in the following: > >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] > >I get a complex number when I shouldn't. > >If I wnat to plot NumberDens[0,Evar] I get no result. > >My real program is much more complex and of course I can't get it working >with piecewise functions. > > >BobHanlon at aol.com wrote: > >> In a message dated 6/27/2000 1:06:55 AM, vio2 at mail.lehigh.edu writes: >> >> >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 !! >> > >> >> Needs["Algebra`InequalitySolve`"] >> >> InequalitySolve[Abs[x - 3] < 10, x] >> >> -7 < x < 13 >> >> f[x_] := Sqrt[ >> 1 - ( (x - 3)/10)^2 ] * (UnitStep[(x + 7)] - UnitStep[(x - 13)]) >> >> Plot[f[x], {x, -10, 15}, >> PlotStyle -> {AbsoluteThickness[2], RGBColor[1, 0, 0]}]; >> >> Integrate[f[x], {x, -1, 17}] >> >> (2*Sqrt[21])/5 + (5*Pi)/2 + 5*ArcSin[2/5] >> >> % // N >> >> 11.74459614229426 >> >> Bob Hanlon > PeakUp[n_] := n + 10; DOSup[n_, Energy_, G_:10] := 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] 5*I*Log[20] - 10*I*Log[2*I*Sqrt[5]] Although this may appear to be complex, it is readily shown to be real by simplifying the expression % // Simplify 5*Pi Looking at the results for other values of n examples = Table[FullSimplify[NumberDens[n, 20]], {n, 0, 5}] Examination of the pattern of these results leads to the supposition that for 0<= n <= 20, NumberDens[n, 20] is given by nd20[n_] := (1 - n/10)*Sqrt[n(20 - n)]/2 + 5ArcCos[n/10 - 1]; Thread[Equal[examples, Table[nd20[n], {n, 0, 5}]]] // FullSimplify {True, True, True, True, True, True} However, n need not necessarily be an integer, for example FullSimplify[NumberDens[#, 20] == nd20[#]] & /@ {Pi, E, 2.25, 20} {True, True, True, True} A proof is left for a mathematician. plot20 = Plot[nd20[n], {n, 0, 20}, PlotStyle -> RGBColor[0, 0, 1]]; Similarly for Evar = 10 NumberDens[0, 10] 5*I*(2*Log[1 + I] + Log[10]) - 10*I*Log[2*I*Sqrt[5]] % // FullSimplify (5*Pi)/2 examples = Table[FullSimplify[NumberDens[n, 10]], {n, 0, 5}] For 0<=n <= 10, nd10[n_] := -n*Sqrt[100 - n^2]/20 + 5*ArcCos[n/10]; Thread[Equal[examples, Table[nd10[n], {n, 0, 5}]]] // FullSimplify {True, True, True, True, True, True} FullSimplify[NumberDens[#, 10] == nd10[#]] & /@ {Pi, E, 2.25, 10} {True, True, True, True} plot10 = Plot[nd10[n], {n, 0, 10}, PlotStyle -> RGBColor[1, 0, 0]]; Since the plots appear to be pretty smooth we can use MultipleListPlot to plot the function plotData = Table[{n, FullSimplify[NumberDens[n, Evar]]}, {Evar, 5, 20, 5}, {n, 0, Evar, Evar/10}]; Needs["Graphics`MultipleListPlot`"] mlp = MultipleListPlot[Sequence @@ plotData, DisplayFunction -> Identity]; Show[{plot10, plot20, mlp}, DisplayFunction -> $DisplayFunction, ImageSize -> {500, 310}]; Note that since we know the results are real, you could speed up the generation of plotData by using Chop[N[_]] rather than FullSimplify[_] Bob Hanlon