0
応用数学問題
文献あり

[QuestionじゃなくてProblemの方の問題] 佐藤超函数を用いた数値積分法について

149
0

前置き

先日、私は「 求積アルゴリズム(+Excelのワンセルコード) 」という記事を投稿したのですが、なるべく色々な求積アルゴリズムを集めたいという理由で、緒方秀教氏、平山弘氏の発表した「 数値積分に対する超函数法 」などを参考にExcelのワンセルコードを作ったのですが、一部の関数を除いて結果が著しく合わないので、Excelのコードとか自分の理解や解釈が間違っているのではないかというのを確認するためにこの記事を作成しました。値や関数、パラメータなどを色々変えて実験したのですが、結果が合わず、自分一人で考えても埒があかないと感じたためです。

本題

詳しくは「 数値積分に対する超函数法(日本応用数理学会論文誌 Vol. 26, No. 1, 2016, pp. 33~43) 」や「 佐藤超函数論に基づく数値積分法(日本数学会 2016 年年会) 」などを参照してほしいのですが、佐藤超函数を用いて、
[a,b]を含む領域DCにおいて解析的である関数f(x)と重み関数w(x)に対して
abf(x)w(x)dx
を考えるとき、この被積分関数に指示関数χ(a,b)(x)を掛けたものを超函数とみなして、その定義関数[F(x)]を求めると、
f(x)w(x)χ(a,b)(x)=[12πif(z)Ψ(x)]
Ψ(z)=abw(x)zxdx
となる。あとはこれを積分して、複素領域D内に正の向きの閉積分路Cをとり、周期関数をφ(u)、周期をuperiodと置いて台形則で近似すると、
abf(x)w(x)dx=12πiCf(z)Ψ(z)dzh2πil=0n1f(φ(lh))Ψ(φ(lh))φ(lh)
h=uperiodn
となります。
重み関数がw(x)=1、積分範囲が(a,b)のとき、
Ψ(z)=log(zazb)
(πIm(logz)<π)
となることと、
参考文献による周期関数の取り方から
φ(u)=a+b2+ba4(k+1k)cosu+iba4(k1k)sinu
(φ(u)=ba4(k+1k)sinu+iba4(k1k)cosu)
(uperiod=2πkは正の定数[パラメータ])
として、Excelのワンセルコードを作成しました。
とりあえずテスト積分は
0πecosxdx=πI0(1)3.97746326050642

超関数法のExcelコード(?)

=LET(a,0,b,PI(),n,80,k,2,h,2*PI()/n,u,SEQUENCE(n,1,0)*h,z,COMPLEX((a+b)/2+(b-a)/4*(k+1/k)*COS(u),(b-a)/4*(k-1/k)*SIN(u)),fx,MAP(z,LAMBDA(x,IMEXP(IMCOS(x)))),r,COMPLEX(-(b-a)/4*(k+1/k)*SIN(u),(b-a)/4*(k-1/k)*COS(u)),xi,MAP(z,LAMBDA(x,IMLN(IMDIV(IMSUB(x,a),IMSUB(x,b))))),S,IMSUM(MAP(IFERROR(fx,0),xi,r,LAMBDA(p,q,m,IMPRODUCT(p,q,m)))),O,IMAGINARY(S)/n,O)

k=2n=80に設定
結果:3.97746326050642
k=2.5n=80に設定
結果:3.97746326050642
k=3n=150に設定
結果:3.97746326050643
この関数は非常に正確な値を返します。(しかしk5とかにすると結構ずれ始めます。おそらくcoszの値が大きくなって大幅な桁落ちが起こるのが理由なのかと思われますがこちらも原因は不明です。)

ではテスト関数を変えてみます。
01xdx=23
すると
k=2n=100に設定
結果:0.693034765599263
k=2.5n=100に設定
結果:0.718322768711128
k=3n=100に設定
結果:0.746029367111263
となってどんどん真値と離れていきます。(勿論kを1に近づけると真値に近づいていきますが、kφ(u)が先ほどの解析的である領域D内であれば問題ないのでその範囲内に収まるkによって値が大幅に変わることはありません。)

今度は参考文献に載っている数値積分例で行います。
01xα1(1x)β1exdx3.718197036284701×104
(α=104,β=104)
k=10n=50に設定
結果:0.847653395793876
合わないです。kの値を1に近づけると一応真値に近づきそうな気配はあります。(ただ正負すら合ってないっていうのは本当に謎です。)

終わりに

そもそもExcelで複素数をこういった感じで扱うということ自体かなり無謀という気がします。それにlogzzαの演算が正しいか(正しい分枝を取っているか)というのも一応確認しましたが、それが全域で正しいと言えるかどうかはもっと調べる必要があると思います。
ただExcelで縛った以上このコードも完成させたいと思うので、どうかこの記述に初歩的なミスがあるかどうかでも確認して頂けると幸いです。
(DE公式が苦手な積分もしっかり積分したいので...。)

参考文献

投稿日:20241010
更新日:20241011
OptHub AI Competition

この記事を高評価した人

高評価したユーザはいません

この記事に送られたバッジ

バッジはありません。
バッチを贈って投稿者を応援しよう

バッチを贈ると投稿者に現金やAmazonのギフトカードが還元されます。

投稿者

vunu
vunu
32
4231
「西」の「西東南」の部分

コメント

他の人のコメント

コメントはありません。
読み込み中...
読み込み中