Excel VBA(マクロ)で計算する方法を書いておきます(末尾)。
第一種0次ベッセル関数は、エンジニアリング関数のアドインを有効にすればExcelでも計算できますが、その関数 BesselJ(x,0) はワークシート上でしか使えないので、マクロでは多項式による近似式 [1] を使いました。この近似式による計算結果は BesselJ(x,0) の値と同じです(同じ式を使っているのでしょう)。ベッセル関数の部分は、ワークシートのセルに =J0(x) と書けば計算できるので、 ワークシート関数 BesselJ(x,0) を使った場合と比較してみてください。x = 0~100の範囲で、真の値(数式処理ソフトで計算)と比較したところ、相対精度 [ (計算値-真値)/真値 ] は 10^(-6) 程度でした(特定の x でこれより精度が悪くなるところがある)。
問題の定積分を計算するユーザ関数は deint(A, kR) です。A のところには a/R の値を、kR には k*R の値を入れます。この関数の値は回答2の式(2)の右辺になりますので、問題の定積分の値は R^2*deint(a/R, k*R) になります。プログラム中の N の値は、定積分の範囲の分割数を 2 で割ったものです。N の値は k*R の大きさ によって変えるようにしてあります。k*R が大きいほどベッセル関数の振動周期が短くなるので N が大きくなるようにしています。しかし、k*R が 30 を超えると、N を1000より大きくしても、問題の定積分の相対精度は良くなりません(ベッセル関数の近似精度によるものと思われます)。ただし、問題の定積分の値そのものは、 k*R が大きいほどゼロに近づくので、絶対精度 [真値-計算値] は悪くありません。
【Excel2003でのマクロ(ユーザ定義関数)作成方法】
(1) Excelシートのメニューの [ツール] → [マクロ] → [Visual Basic Editor]
(2) Visual Vasic Editor のメニューの [挿入] → [標準モジュール]
(3) 出てきた空白画面に以下の文を貼り付ける
↓ここから
' 定積分 ∫[0~a/R] x*exp(-2*x^2)*J0(k*R*x)dx
' A : a/R
' kR: k*R (0<k*R)
'
Function deint(A As Double, kR As Double)
If kR < 0 Then
deint = ""
Exit Function
End If
Dim N As Integer
If kR < 1 Then
N = 100
Else
N = 100 * kR
End If
Dim M As Integer, i As Integer, h As Double, s1 As Double, s2 As Double, x1 As Double, x2 As Double
M = 2 * N ' 分割数
h = A / M ' 刻み幅
s1 = 0: s2 = 0
For i = 1 To N - 1
x1 = h * 2 * i
x2 = x1 - h
s1 = s1 + x1 * Exp(-2 * x1 * x1) * J0(kR * x1)
s2 = s2 + x2 * Exp(-2 * x2 * x2) * J0(kR * x2)
Next i
s2 = s2 + (A - h) * Exp(-2 * (A - h) * (A - h)) * J0(kR * (A - h))
deint = h / 3 * (A * Exp(-2 * A * A) * J0(kR * A) + 2 * s1 + 4 * s2) End Function
' 第一種0次ベッセル関数 J0(x)
'
Function J0(x As Double) As Double
Dim ax As Double, A As Double, a1 As Double, a2 As Double, z As Double, xx As Double
ax = Abs(x)
If ax < 8 Then
A = x * x
a1 = 57568490574# + (-13362590354# + (651619640.7 + (-11214424.18 + (77392.33017 - 184.9052456 * A) * A) * A) * A) * A
a2 = 57568490411# + (1029532985 + (9494680.718 + (59272.64853 + (267.8532712 + A) * A) * A) * A) * A
J0 = a1 / a2
Else
z = 8 / ax
A = z * z
xx = ax - 0.785398164
a1 = 1 + (-0.001098628627 + (0.00002734510407 + (-0.000002073370639 + 2.093887211E-07 * A) * A) * A) * A
a2 = -0.01562499995 + (0.0001430488765 + (-0.000006911147651 + (7.621095161E-07 - 9.34935152E-08 * A) * A) * A) * A
J0 = Sqr(0.636619772 / ax) * (Cos(xx) * a1 - z * Sin(xx) * a2)
End If
End Function
↑ここまで
(4) Visual Vasic Editor画面の右上隅の×をクリックするか、メニューの [ファイル] → [終了 Microsoft Excelへ戻る]
(5) シート上の適当なセルに =R^2*deint(a/R, k*R) と記入する(R、a、k は数値やセル位置)
【セキュリティーレベルの変更方法】
マクロ(Visual Basicプログラム)を含むExcelファイルは、PCのセキュリティーレベルによっては実行できないかもしれないので、以下にセキュリティーレベルの変更方法を書いておきます(Excel2003の場合)。
(1) Excelのブック(ワークシート)を新規作成
(2) メニューの[ツール] → [マクロ] → [セキュリティー]
(3) セキュリティーレベルを「中」に変更 → OK
(4) Excelを終了
(5) マクロを含むExcelファイルを開く
マクロを含むExcelファイルを開いた後、「このファイルはマクロを含んでいます」と警告が出ますが、[マクロを有効にする] をクリックすることでマクロを実行できるようになります。セキュリティーレベルが「高」のままだと、ファイルを開くことはできますがマクロを実行できません。
[1] 第一種0次ベッセル関数の近似式 http://books.google.co.jp/books?id=0LSFEmmUFbQC&pg=PA349&lpg=PA349&dq=%2257568490574%22+%22bessel%22&source=bl&ots=4xXLNT2n9u&sig=4M3a2_dZYqa3mq2PNUA5u_G871E&hl=ja&ei=Hyp3S8C3O4vk7AOwoeiYBg&sa=X&oi=book_result&ct=result&resnum=3&ved=0CBMQ6AEwAg#v=onepage&q=%2257568490574%22%20%22bessel%22&f=false
お礼
ご丁寧にありがとうございます. このプログラムで試してみたいと思います.