fortran66のブログ

fortran について書きます。

【メモ帳】積分チェック 3種

Littlewood Lemma VI.

ゴミ捨ての時に、D. E. Littlewood, The Theory of Group Characters and Matrix Representations of Groups積分を計算したノートが出てきたのですが、その中の式のひとつ(§11.7 Lemma VI.)で係数が2だけ合わなくて気になっていたのがありました。

ほぼ同等のLemma IV.,V. が再現できているので、たぶん本文の誤りだろうと思っていたのですが、暇つぶしに数値で確かめてみました。ついでに、別手法の手計算でも再確認してみました。

f:id:fortran66:20180520124836p:plain

The Theory of Group Characters and Matrix Representations of Groups (AMS Chelsea Publishing)

The Theory of Group Characters and Matrix Representations of Groups (AMS Chelsea Publishing)

数値積分

素朴に式通りに台形積分で計算します。ファクターのチェックが目的なので、特定の x, y 値に対して数値積分して理論値と大きさが比較できればいいです。

以下の式の左右両辺を計算します。Littlewood の本では右辺の係数 2 が抜けていると思われます。

\begin{align}
\int_0^{2\pi}{(1-\cos(\phi))d\phi\over(1-2x\cos(\phi)+x^2)(1-2y\cos(\phi)+y^2)}
={2\pi\over(1+x)(1+y)(1-xy)}
\end{align}
但し
 |x|,|y| < 1

プログラム

ついでなので、Richardson 補外でシンプソン積分相当の値も出しておきました。いくつか計算して見たところ、x, y が 1.0 に近いほど収束が悪くなります。特異点があるのでもっともな感じがします。

    module m_mod
        implicit none
    contains
        real pure elemental function g(x, t)
            real, intent(in) :: x, t
            g = 1.0 - 2.0 * x * cos(t) + x**2
        end function g
        real pure elemental function f(x, y, t)
            real, intent(in) :: x, y, t
            f = (1.0 - cos(t)) / (g(x, t) * g(y, t))
        end function f
    end module m_mod
    
    
    program test
        use m_mod
        implicit none
        integer, parameter :: n = 2**8
        real, parameter :: pi = 4 * atan(1.0)
        real :: x, y, s1, s2, w(0:n), t(0:n)
        
        forall(integer:: i = 0:n) t(i) = 2 * pi * i / n
        
        x = 0.7
        y = 0.8
        w = f(x, y, t)
        s1 = w(0) / 2 + sum(w(1:n-1)) + w(n) / 2
        s1 = s1 * 2 * pi / n
        s2 = w(0) / 2 + sum(w(2:n-2:2)) + w(n) / 2
        s2 = s2 * 4 * pi / n
        
        print *, (4*s2 - s1) /3, s1, s2 ! Richardson extrapolation
        print *, f2(x, y)
    contains
        real function f2(x, y)
            real :: x, y
            f2 = 2 * pi / ( (1 + x) * (1 + y) * (1 - x * y) )
        end function f2
    end program test
実行結果

x=0.7, y=0.8 の時、係数2をつけて両辺一致。

   4.666655       4.666656       4.666655
   4.666656
続行するには何かキーを押してください . . .

Modern Fortran Explained (Numerical Mathematics and Scientific Computation)

Modern Fortran Explained (Numerical Mathematics and Scientific Computation)

  • 作者: Michael Metcalf,John Reid,Malcolm Cohen
  • 出版社/メーカー: Oxford University Press, U.S.A.
  • 発売日: 2011/05/08
  • メディア: ペーパーバック
  • この商品を含むブログを見る

複素積分(留数計算)

Littelewood は、より簡単な Lemma IV. を留数積分で解いて、Lemma V.,VI. は以下同様と済ませているので、同様に解いたのをメモっておきます。

\Gamma積分|z|=1 を表すとする。求める積分 I(x,y) は、z=re^{i\phi} として

\begin{align}
I(x,y)&=\int_\Gamma{(1-(z+z^{-1})/2)\over(1-xz)(1-xz^{-1})(1-yz)(1-yz^{-1})}{dz\over iz}\\
&={2\pi i \over 2i}\mathrm{Res_{z=x,y}}{-(z^2-2z+1)\over (1-xz)(z-x)(1-yz)(z-y)}\\
&=\pi\left({-(x^2-2x+1)\over(1-x^2)(1-xy)(x-y)}+{-(y^2-2y+1)\over(1-xy)(y-x)(1-y^2)} \right)\\
&=\pi\left({-(x-1)^2\over-(x+1)(x-1)(1-xy)(x-y)}+{-(y-1)^2\over-(1-xy)(y-x)(y+1)(y-1)} \right)\\
&={\pi\over (1-xy)(x-y)} \left( {x-1\over x+1}-{y-1\over y+1}  \right) \\
&={\pi\over (1-xy)(x-y)} {xy+x-y-1-xy-y+x+1\over (x+1)(y+1)} \\
&={2\pi\over(1+x)(1+y)(1-xy)}\\
\end{align}

留数解析―留数による定積分と級数の計算 (数学ワンポイント双書 28)

留数解析―留数による定積分と級数の計算 (数学ワンポイント双書 28)

積分 \int{dx\over a^2+x^2}={1\over a}\tan^{-1}{x\over a} より

力づくで実関数の積分で解くこともできます。

t=\tan{\phi\over 2} と変数変換する。この時、\cos\phi={1-t^2\over 1+t^2},d\phi={2\over 1+t^2}dt となるので、

\begin{align}
I(x,y)&=\int_0^{2\pi}{(1-\cos(\phi))d\phi\over(1-2x\cos(\phi)+x^2)(1-2y\cos(\phi)+y^2)}\\
&=2\int_0^\pi{(1-\cos(\phi))d\phi\over(1-2x\cos(\phi)+x^2)(1-2y\cos(\phi)+y^2)}\\
&=2\int_0^\infty{(1-{1-t^2\over 1+t^2}){2\over1+t^2}dt \over (1-2x{1-t^2\over 1+t^2}+x^2)(1-2y{1-t^2\over 1+t^2}+y^2)}\\
&=4\int_0^\infty{2t^2\over \{ (1-2x+x^2)+(1+2x+x^2)t^2 \} \{ (1-2y+y^2)+(1+2y+y^2)t^2 \}  }\\
&=4\int_0^\infty{C_1\over(1-x)^2+(1+x)^2t^2}+{C_2\over (1-y)^2+(1+y)^2t^2}dt
\end{align}

部分分数に展開することにして、
 
\begin{align}
C_1(1-y)^2 + C_2(1-x)^2&=0\\
C_1(1+y)^2 + C_2(1-x)^2&=2\\
\end{align}
の関係式を解くと、C_2=-C_1{(1-y)^2\over(1-x)^2}より

\begin{align}
C_1&=-{1\over2}{(1-x)^2\over(x-y)(1-xy)}\\
C_2&=+{1\over2}{(1-y)^2\over(x-y)(1-xy)}\\
\end{align}
となる。

これから元の積分は、

\begin{align}
I(x,y)&={2\over(x-y)(1-xy)}\int_0^\infty {-(1-x)^2\over (1-x)^2+(1+x)^2t^2} +{(1-y)^2\over (1-y)^2+(1+y)^2t^2}dt\\
&={2\over(x-y)(1-xy)}\left(-{(1-x)^2\over(1+x)^2}{1+x\over 1-x}\tan^{-1}{1+x\over1-x}t+{(1-y)^2\over(1+y)^2}{1+y\over 1-y}\tan^{-1}{1+y\over1-y}t  \right)\rvert_0^\infty\\
&={2\over(x-y)(1-xy)}\left( -{1-x\over1+x}{\pi\over2}+{1-y\over1+y}{\pi\over2}\right)\\
&={\pi\over(x-y)(1-xy)}{-1+x-y-xy+1-y+x-xy\over(1+x)(1+y)}\\
&={2\pi\over(1+x)(1+y)(1-xy)}
\end{align}