先日、私は「 求積アルゴリズム(+Excelのワンセルコード) 」という記事を投稿したのですが、なるべく色々な求積アルゴリズムを集めたいという理由で、緒方秀教氏、平山弘氏の発表した「 数値積分に対する超函数法 」などを参考にExcelのワンセルコードを作ったのですが、一部の関数を除いて結果が著しく合わないので、Excelのコードとか自分の理解や解釈が間違っているのではないかというのを確認するためにこの記事を作成しました。値や関数、パラメータなどを色々変えて実験したのですが、結果が合わず、自分一人で考えても埒があかないと感じたためです。
詳しくは「
数値積分に対する超函数法(日本応用数理学会論文誌 Vol. 26, No. 1, 2016, pp. 33~43)
」や「
佐藤超函数論に基づく数値積分法(日本数学会 2016 年年会)
」などを参照してほしいのですが、佐藤超函数を用いて、
を考えるとき、この被積分関数に指示関数
となる。あとはこれを積分して、複素領域
となります。
重み関数が
(
となることと、
参考文献による周期関数の取り方から
(
として、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)
結果:
結果:
結果:
この関数は非常に正確な値を返します。(しかし
ではテスト関数を変えてみます。
すると
結果:
結果:
結果:
となってどんどん真値と離れていきます。(勿論
今度は参考文献に載っている数値積分例で行います。
結果:
合わないです。
そもそも
ただExcelで縛った以上このコードも完成させたいと思うので、どうかこの記述に初歩的なミスがあるかどうかでも確認して頂けると幸いです。
(DE公式が苦手な積分もしっかり積分したいので...。)