Haskell-Hermite多项式的实现

Haskell-Hermite多项式的实现,haskell,math,recursion,hermite,Haskell,Math,Recursion,Hermite,Haskell允许以非常简洁的方式表示递归函数。例如,包含斐波那契数的无限列表可以定义如下: fibs :: [Integer] fibs = 1 : 1 : zipWith (+) fibs (tail fibs) 我处理的是“概率论者”埃尔米特多项式,它具有以下递归关系: 对于给定的x,构造n次Hermite多项式无限列表的最佳方法是什么?我们可以这样写: hermite :: (Enum n, Num n) => n -> [n] hermite x = s whe

Haskell允许以非常简洁的方式表示递归函数。例如,包含斐波那契数的无限列表可以定义如下:

fibs :: [Integer]
fibs = 1 : 1 : zipWith (+) fibs (tail fibs)
我处理的是“概率论者”埃尔米特多项式,它具有以下递归关系:

对于给定的x,构造n次Hermite多项式无限列表的最佳方法是什么?

我们可以这样写:

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..]
其中第一个项目
1:x:…
hermite
的第一个元素(您可以填写其他值)

对于下一个,我们压缩原始值
s
(以
H0
开始),压缩
s
的尾部
ts
(以
H1
开始)和索引(以
2
3
,…)并执行操作
x*hn1-x*hn2
nh1
代表Hn-1,
nh2
代表Hn-2),因此我们每次计算下一个元素

x=0.75
的前11个值为:

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]
因此,第一个值是1,第二个值是
x
,第三个值是
x*x-2
,第四个值是
x*x*x-2*x-3*x
,依此类推

也就是说,如果我没记错的话,Hermite多项式的递归公式是:

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

而不是问题中引用的

在这种情况下,公式如下:

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)
那么前11个值是:

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]
根据这一点,哪一个是正确的:

H0=1

H1=2*x

H2=4˙x2-2

H3=8˙x3-4˙x

H4=16˙x4-48˙x2+12

与我们获得的值完全对应:

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]

是的,我的公式错了(在rhs上是n而不是n-1),现在它被更正了。但是,你说的公式是所谓的“物理学家”埃尔米特多项式,我不需要。你能根据我所做的更改更正你的答案吗?