Re: Why this function does not return a single value
- To: mathgroup at smc.vnet.net
- Subject: [mg60195] Re: Why this function does not return a single value
- From: Marek <marekbr at gmail.com>
- Date: Wed, 7 Sep 2005 04:03:53 -0400 (EDT)
- References: <dfiv9c$p99$1@smc.vnet.net> <dfj9h7$rga$1@smc.vnet.net>
- Reply-to: marekbr at gmail.com
- Sender: owner-wri-mathgroup at wolfram.com
Hi Paul Thanks for reply. I do not understand Your comments fully yet but let me read up on stuff. For now I have only one thing to say. Those multiplication signs appear out of nowhere when I convert the call with function definition from Input Form to Standard Form. I can remove the m while in Standard form but as soon as I execute this cell (or convert it to Standard Form) they reappear. Is that the way it is suppose to be? Marek Paul Abbott wrote: > In article <dfiv9c$p99$1 at smc.vnet.net>, > Marek Bromberek <marek at chopin.physics.mun.ca> wrote: > >> I was wondering if somebody could tell me what am I doing wrong here. > > A number of things: > > [1] The syntax is incorrect. You cannot use (a[1]*_)?NumericQ. This > means a[1] times a blank, which is not what you intend. > > If you enter > > (x_)?NumericQ // FullForm > > and > > (a[1]*_)?NumericQ // FullForm > > you will see the difference. > > [2] A much better syntax is to define a test for numerical lists, say > > num[c_List] := And @@ (NumericQ /@ c) > > and then use it in your definition, say > > VoigtSum[x_?NumericQ, a_List?num, b_List?num, ...] := ... > >> I am constructing a function (for fitting purposes) which is a sum of 15 >> Voigt functions + one Gaussian peak and and exponential background. >> However when I want to check if that function works and try to evaluate >> it it does not return a value. > > [3] There is no need to restrict attention to 15 Voight functions or to > test the length of each list. Now your arguments are lists, instead > write your definition so that it works for _any_ number of Voight > functions (mapping the function over the lists of arguments), and use > the last two elements of the lists a, b, and \[Delta]G to give the > Gaussian peak and exponential background, i.e., > > a[[-2]] Exp[(-Log[2]) ((x - b[[-2]])^2/\[Delta]G[[-2]]^2)] + > > a[[-1]] Exp[-x/b[[-1]]] > > [4] You have > >> Sum[a[i]*((2.*Log[2.]*\[Delta]L[i])/(N[Pi^(3/2)]*\[Delta]G[i]))* >> NIntegrate[Exp[-t^2]/((Sqrt[Log[2.]]*(\[Delta]L[i]/\[Delta]G[i]))^2 >> + >> (Sqrt[4.*Log[2.]]*((x - b[i])/\[Delta]G[i]) - t)^2), {t, >> -Infinity, >> Infinity}], {i, 1, 15}] + >> a[16]*Exp[(-Log[2.])*((x - b[16])^2/\[Delta]G[16]^2)] + >> a[17]*Exp[-x/b[17]] > > There is no need -- and it is usually a bad idea -- to numericalize > constants. Since you are computing a numerical integral, all exact > numerical values will be coerced to numerical ones (of the same > precision). Try entering > > 2. Pi > > to see what I mean. > > [5] Although Mathmatica cannot compute your integral directly, > > Integrate[Exp[-t^2]/((Sqrt[Log[2.]] (\[Delta]L[i]/\[Delta]G[i]))^2 + > (Sqrt[4.*Log[2.]]*((x - b[i])/\[Delta]G[i]) - t)^2), > {t, -Infinity, Infinity}] > > or the equivalent integral > > Integrate[Exp[-t^2]/(a^2 + (b - t)^2), {t, -Infinity, Infinity}] > > it is possible to compute this in closed form (at least for a and b > real). I get > > int[a_, b_] = -((1/(2 a)) (I (((-I) Pi Erf[a + I b] - > Log[1/(I a - b)] + Log[1/(b - I a)])/E^(b - I a)^2 - > (I Pi Erf[a - I b] - Log[-(1/(I a + b))] + Log[1/(I a + b)])/ > E^(I a + b)^2))) > > Although this involves I, numerical evaluation for real a and b (to any > desired precision, followed by Chop, yields the same answer as > > nint[a_, b_, opts___] := NIntegrate[Exp[-t^2]/(a^2 + (b - t)^2), > {t, -Infinity, Infinity}, opts] > > For example, > > nint[2,3] > 0.14563 > > int[2.,3.]//Chop > 0.14563 > > nint[2,3,WorkingPrecision->30] > 0.14562973135699681308 > > int[2`30,3`30]//Chop > 0.1456297313569968130774404707 > > Cheers, > Paul > > _______________________________________________________________________ > Paul Abbott Phone: 61 8 6488 2734 > School of Physics, M013 Fax: +61 8 6488 1014 > The University of Western Australia (CRICOS Provider No 00126G) > AUSTRALIA http://physics.uwa.edu.au/~paul