MathGroup Archive 2005

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

Search the Archive

Re: Why this function does not return a single value

  • To: mathgroup at smc.vnet.net
  • Subject: [mg60180] Re: Why this function does not return a single value
  • From: Paul Abbott <paul at physics.uwa.edu.au>
  • Date: Tue, 6 Sep 2005 01:26:50 -0400 (EDT)
  • Organization: The University of Western Australia
  • References: <dfiv9c$p99$1@smc.vnet.net>
  • Sender: owner-wri-mathgroup at wolfram.com

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


  • Prev by Date: Re:numerical-symbolic Groebner basis
  • Next by Date: Re: Maximising a sum of matrix elements
  • Previous by thread: Why this function does not return a single value
  • Next by thread: Re: Why this function does not return a single value