fx-5800Pで区分求積してみた

関数の積分を数値計算で求める簡単な方法として区分求積法というものがあります。

簡単にいうと、y=f(x)という関数のaからbまでを積分する場合、小さく長方形に区切って足し合わせるという方法です。

下の図を見ればわかるように、本来の面積から飛び出したり、足りなかったりする部分があるのでその分、精度が悪くなります。精度を上げる簡単な方法は区切る数を小さくすればいいですが、計算量が増えてしまうという欠点があります。

まずは、この基本的な区分求積をfx-5800Pに実装してみます。

このサイト*1のコードをまず、丸写ししました。

下のコードはf(x)=sin(cos(x))を0から1の範囲で積分しています。

fx-JP900でこの定積分を求めると0.738642998となりました。

関数として三角関数を使うのでまずラジアンを使うことを宣言しています。

使う変数を0で初期化します。

分割数Aを入力します。積分範囲1をAで割って、Bに入れています。Bは長方形の幅になります。

Lbl 0はプログラムにラベルを付けています。Gotoのようなジャンプコマンドで飛ぶための仕組みです。

Cはカウンターです。最初はC=0なのでB*C=0になります。それをDに入れています。DはXに相当する変数です。

f(x)は長方形の高さになるので幅Bを掛けて面積を出します。それをMに次々放り込んで、合計を求めます。

Cはカウンターなので1足してカウンターをひとつ進めておきます。

A-C-1が0以上なら上の演算を繰り返します。A-C-1というのは、Aが分割数だったのでカウンターを0から始めると、0から4番までの長方形を計算することで5分割したことになります。C+1つまり-C-1を引いてそれが0になるまで計算するということです。わかりにくかったら絵を描くとわかると思います。

上のコードを参考に、自分なりにアレンジしてみました。

やってることはほぼ同じですがWhile文を使っています。

分割数を変えながら何度か計算をして実行速度を比較してみましたが、私が作ったコードの方が若干実行速度が早いでした。

中身のことはよくわかりませんが、If thenでいちいち判断するのじゃなくて、条件を満たす間はループを回すっていう動作の方が簡単なのかもしれません。

分割数を細かくするだけでなく、精度を上げる工夫がいろいろあります。関数電卓に実装されているアルゴリズムはガウスークランロッド法というもののようです。

今回、さらにプログラムしたのはシンプソンの公式というものです。

こちらのサイト*2を参考にしました。数学的な背景はリンク先などを参考にしてください。リンク先にはPythonのコードが書いてあるので、それを参考にカシオの電卓の言語に変換しました。

このプログラムでは𝑓(𝑥)=𝑠𝑖𝑛(5𝑥)を0からπで積分するものです。

最初の画面はプログラム名です。この表示をかっこいいと思うのは私だけでしょうか。

ここからがコードです。

A、Bは積分範囲です。この場合A=0、B=πと入れ込んでもいいんですが、任意の範囲で積分するようにあえて入力するようにしています。

Mは分割数です。

Nは積分の幅です。M/2としているのはシンプソン法では積分の幅を2の倍数で分割するからで、2個分の幅でワンセットの計算になっているのでこういう工夫をしておきます。Nはループを回すための条件判断に使います。

Hは分割の幅です。

Sは求める面積なので最初に0で初期化しておきます。

Cはカウンターでこの場合は1を入れておきます。

N-Cが0以上で回るループを組みます。

ごちゃごちゃした計算はシンプソン法の式を書き下したものです。それにSを足したものをSに代入します。これは総和を求めるための計算です。つまり、計算結果をひたすらSに入れ込むことで、結果的にSが総和になるわけです。

カウンターを一個回す部分です。

最後にSを出力して終了です。▲の出力コマンドを書くと結果を見た後、EXEキーを押す必要がありますが、S単体を書いておくと、計算が終わり次第、自動で結果が出力されプログラムが終了します。

M=100で計算した結果がこれです。

解析解は0.4らしいので、よく計算できていると思います。

プログラミングを学ぶのに、パソコンとかタブレットとかなくても、数千円の関数電卓で十分基本的なことは勉強できると思います。一番簡単な区分求積を実装するだけでも、なるほど積分ってそういうことなんだなということがよくわかると思います。プログラムに関しても、代入とか条件判断、ループ、総和の求め方などが学べます。

連絡はこちらから