3

Haskell allows to represent recurrent functions in a very concise way. For example, infinite list, that contains Fibonacci numbers can be defined as follows:

fibs :: [Integer]
fibs = 1 : 1 : zipWith (+) fibs (tail fibs)

I am dealing with 'probabilists' Hermite polynomials, which have the following recursion relation:

enter image description here

What would be the optimal way to construct the infinite list of n-th Hermite polynomials for given x?

1 Answers1

4

We can write it as:

hermite :: (Enum n, Num n) => n -> [n]
hermite x = s
    where s@(_:ts) = 1 : x : zipWith3 (\hn2 hn1 n1 -> x*hn1 - n1*hn2) s ts [1..]

where the first items 1 : x : ... are the first elements of the hermite (you can fill in other values).

For the next one, we zip the original values s (so that starts with H0), the tail ts of s (that starts with H1) and the index (that starts with 2, 3, ...) and perform an operation x*hn1 - x*hn2 (nh1 stands for Hn-1, and nh2 stands for Hn-2), and so we calculate the next element each time.

The first 11 values for x = 0.75 are:

Prelude> take 11 (hermite 0.75)
[1.0,0.75,-0.4375,-1.828125,-5.859375e-2,7.2685546875,5.744384765625,-39.30303955078125,-69.68797302246094,262.1583366394043,823.8105096817017]

So the first value is 1, the second x, the third one x*x-2, the fourth one x*x*x-2*x-3*x, and so on.

That being said, if I recall correctly, the recursion formula of the Hermite polynomials is:

Hn(x) = 2×x×Hn-1(x)-2×(n-1)Hn-2(x)

instead of the one quoted in the question.

In that case the formula is thus:

hermite :: (Enum n, Num n) => n -> [n]
hermite x = s
    where s@(_:ts) = 1 : 2 * x : zipWith3 helper s ts [1..]
          helper hn2 hn1 n1 = 2 * (x * hn1 - n1 * hn2)

Then the first 11 values are:

Prelude> take 11 (hermite 0.75)
[1.0,1.5,0.25,-5.625,-9.9375,30.09375,144.515625,-144.3515625,-2239.74609375,-1049.994140625,38740.4384765625]

Which is correct acording to this Wolfram article:

H0 = 1

H1 = 2*x

H2 = 4˙x2 - 2

H3 = 8˙x3 - 4˙x

H4 = 16˙x4 - 48˙x2 + 12

Which maps exactly on the values we obtained:

Prelude> let x = 0.75 in [1,2*x,4*x*x-2,8*x*x*x-4*x,16*x*x*x*x-48*x*x+12]
[1.0,1.5,0.25,0.375,-9.9375]
Willem Van Onsem
  • 443,496
  • 30
  • 428
  • 555
  • Yup, I made a typo in my formula (n instead of n-1 on the rhs), now it's corrected. However, the formula you talking about is a so-called 'physicists' Hermite polynomial, which I don't need. Could you please correct your answer according to the change I've made? – Aleksandr Samarin Nov 20 '17 at 17:00