資料請求番号:TS31 TS38
スポンサーリンク
数値計算による積分計算の基本~Simpson法~
積分の計算は高校生までは紙とペンを使用し、様々な積分テクニック(置換積分・部分積分など)を駆使して行っていきます。
大学の初年度に上がると重積分を学習しますが、これも紙とペンを使って問題を解いていき、単位を取得します。
ところが、大学3年生以上になり、専門分野の勉強が進んでいくと、紙とペンでは解けない積分や、紙とペンを解くのが非常に難解だったり、手続きが多くてミスが起こりやすい積分の問題に度々出会うようになります。
そこで、「積分の計算をコンピュータで解く方法」が開発されており、代表例としてシンプソン法があります。
今回の資料は、シンプソン法の理論的解説を詳しく行い、
プログラムを解いたり、シンプソン法を使ったプログラムを使用する際に迷いが起こらないようにするための基礎知識を整理するための資料になります。
台形近似より精度の高いシンプソン法
今回のテーマはシンプソン法による積分の計算ね!ストークはシンプソン法使ったことある?
なんかなぁ・・。大学でちょっとやったことあるんやけど、どんなことしとるんか覚えていないたいね。
へぇ~。ストークが大学でやったこと忘れるなんてあるんだ・・・。
まぁ、積分の計算はな、台形近似でもどうにかなるからな。
って思うとって、こないな計算をやってみたらな、どうにも実現象と計算が合わなさ過ぎて、基礎式の再構築と、パラメータの確認と・・・って2日かけて色々悩んだ結果、その原因は積分計算の精度の甘さやってん。
こういう、自分の勉強不足が原因で実験に失敗したり、時間を費やしたりすると・・・へこむよなぁ・・・。
なるほどねぇ・・・その気持ち、わかる気がする。
ワタシもバグの原因がわからなくてアルゴリズムとプログラムを何度も何度も往復しながら悩んで、結局は「ただの文法間違いで代入値が勝手にゼロになってました。」とかあると、悔しくなるもん。
最近、コンパイラの性能が上がってきてて「多少間違っていても動いてしまう」ようになってきているから、むしろプログラミングが難しくなってきている気がするのよ。
そうなんや~。それで、シンプソン法と言うのはなんね?台形近似より精度ええんよな?
うん!もちろん!台形近似よりショボかったり、技術レベルが低レベルだったら、わざわざこんな形で資料作ることなんてないでしょ?
シンプソン法は2次関数で近似する
そもそも、台形近似で精度の甘さが目立ってきてしまうのは、非線形性の高い関数を積分したときなのよね。
せやな。台形近似は積分したい関数を「ある微小区間においては線形である」として近似するけん、
このとき、変化率の大きな関数を取り扱ったり、4次関数や三角関数みたいなグネグネした関数を取り扱ったりすると台形近似の限界が見えてくると思うたいね。
そうそう。そういうグネグネした関数を無理矢理線形、つまりは直線に近似しようとするから精度の甘さが出てきてしまうのよ。
マシンスペックのいいヤツ使えば何とかなるかもしれないけど、ストークの仕事の場合、ノートパソコンを実験室に持って行って実験結果を見ながらサッと計算してみたいっていう希望があると思うのよね。
そうなんよ。反復数が万単位になると時間がかかってまう。それがちょっとしたストレスなのな。
でも、計算結果が収束しなければ安心して次の仕事に進めんから・・・ってなって結局ストレスなのな。
計算時間がね、研究開発活動の推進において障害になるってハッキリ認識しているんであれば、計算アルゴリズムの見直しが必要になるのよね。
今回みたいに積分するときは台形近似ではなくシンプソン法にしてみよう。みたいなね。
それでね、シンプソン法の特徴なんだけど、積分するときの微小要素を「台形」ではなく「二次関数」に近似しようっていう発想なのよ。
あー・・・。2次関数なら直線はもちろん、急カーブとか急に変化率が大きなる問題にも対応できるというわけか~。
さすがストーク!そういうこと!以後、イメージしやすいように図を用意したから、それを使って説明するね!
シンプソン法 導出
2次関数近似(シンプソンの公式)
例えば、こんな感じ関数があって、これを積分したいとするじゃない?
この時、その関数の微小区間[x0~x2]をとって、ここの区間を二次関数で近似してみるのよ。
説明の関係上、微小区間に見えないけど、そこは勘弁してね。
まぁ、ある関数f(x)を二次関数で近似するっていう概念と具体的な導出がわかればええからな。
そうね。じゃあ、その具体的なシンプソンの公式の導出ってのをやっていくね。
微小区間[x0~x2]における関数f(x)が作るカーブの形あるでしょ?
f(x0),f(x1),f(x2)からなるカーブのことな。
うん。このカーブを2次関数で近似するのよ。
じゃあ、この赤いカーブがこの形になるとして、区間[x0~x2]について積分するとこうなるね。
うん。とりあえず、この計算結果は置いておいてね。
まぁ、しょうがないじゃない。それとも、この連立方程式をA,B,Cについて解いてみる?
今回はさぁ、「シンプソンの公式は二次関数で近似している」ってことを基本的な思想としているってとこが分かればいいと思うからさぁ、これでいいんじゃない?
それな。f(x0)+4f(x1)+f(x2)ば計算するとこうなるんか。
あ~。これ、さっき積分して計算して出てきた部分と同じユニットが現れるけんね。
そうそう!そしたら、この式が導かれるよね!これがシンプソンの公式。右辺がちゃんと全部既知数になってるでしょ?
これがシンプソンの公式なん?これだけじゃあ、関数f(x)の積分はできないけんね。
まぁ、そうなんだけどさぁ・・・。
ストークが「自分の中にない論理が現れたとき」とか、「想定外の話をされたとき」によくやるこの
「あ?」ってヤツ?あれ、わりと心理的攻撃力あるよ。
合成シンプソンの公式
うん。ストークの言う通り、これだけじゃ、任意の関数f(x)の積分はできないんだよね。
そこで、2次関数近似した微小区間[x0~x2]と同じモノをm個集めるわけよ。
だから、その「あ?」とか「は?」とかやめろって言ってんの!!
クセかもしんないけどさぁ・・。上司先輩からは生意気、同僚部下からは威圧的に見えちゃうよ?ワタシはもう慣れてるけど。
ほう~。青の面積と赤の面積ば足して・・・ってのをm回やるわけやんな~。
そうそう!そしたら[x0~x2m]に渡って積分する計算ができるでしょ?
なるほどなぁ~・・・。かしこかね~・・・。
ただ、これやとプログラミングできにくそうやな・・・。
お。ストークもだいぶプログラミングの勘がついてきたんじゃない?
そうなの。だから、1区間の幅をhとして、こんな風に定義して・・・
ああ。x2はx0+2h,x3はx0+3hで、最終的にx2mはx0+2mhになるってオチか。
そう。そういうオチ。それで式変形してみてよ。
うん。それが合成シンプソンの公式って言って、これで任意の関数f(x)の積分が実行できるようになるのよ。
まとめ
今回は、積分をコンピュータで解くのに使用されるシンプソン法について解説しました。
積分をコンピュータで解く初歩的な方法には台形近似があるのですが、台形近似では非線形性の高い関数の積分を行ったときに精度の甘さが出てきてしまいます。
ここで、「積分計算を台形の集合体の和ではなく、二次関数の集合体の和に近似しよう。」というのがシンプソン法の発想です。
ストークも惑わされた言葉の定義についてですが、積分したい関数を二次関数に近似するだけの公式を単に「シンプソンの公式」といい、
積分したい関数を二次関数の集合体として取り扱う公式を「合成シンプソンの公式」と呼びます。
私たちが積分の計算でプログラムを組む時に使われるのは「合成シンプソンの公式」の方になります。
合成シンプソンの公式でググってみるとわかると思いますが、色々な式の形があり、混乱することがあると思います。
奇数だけ足し合わせたり、偶数だけ足し合わせるとか、色々です。
しかし、基本思想として「2次関数近似の寄せ集め」ということを理解しておけば、自分なりの理解の仕方がマスターでき、それに基づいてプログラムを書けるようになるでしょう。
この資料は私のシンプソン法への自分なりの理解の整理の結果でもあるのです。