Casio fx-5800P や他の電卓の数値積分

  修正 2015/06/07

fx-JP900 の数値積分計算が非常に速くなり、プログラム関数電卓 fx-5900P よりも速くなったことから、最近の自然表示関数電卓、プログラム電卓で、幾つかの計算の比較をして、数値積分の違いや変遷を調べて見ます。

今回比較の対象にしたのは、以下の機種。

Int_fx-991ES Int_fx-993ES Int_fx-995ES 

順に、fx-991ES、fx-993ES、fx-995ES



Int_fx-JP900 Int_fx-5800P Int_fx-9860GII 

順に、fx-JP900fx-5800Pfx-9860GII

今回のテーマとは関係ありませんが、こうしてみると黒液晶は見やすくて良いですね。


数値積分

fx-995ES、fx-JP900fx-5800Pfx-9860GII の結果は、Casio fx-JP900 (その3) の内容のままで、これに fx-991ES と fx-993ES の結果を追加しました。処理速度の順に機種を並べ直しています。

機 種積分1積分2
fx-991ES28.0秒5.1204秒 4.2
fx-993ES26.4秒4.8246秒5.1
fx-995ES25.6秒4.7
241秒
4.9
fx-5800P10.1秒1.856,7秒1.2
fx-JP9005.5秒48.7秒
fx-9860GII1.5秒0.278.4秒0.17

 で示したように、何故だか一番遅い筈の fx-991ES が積分2については、fx-995ES よりも速い逆転現象が見られます。何度か測定しなおしたのですが、これは間違いありません。

積分1、積分2共に、fx-JP900 の処理時間を1として、その相対比率を赤文字で示しています。機種別の処理速度の相対比率をグラフにしてみました。
積分比較 
全体として、CPU速度の違いがうまく反映したグラフになっていると思います。

細かくみてみると、fx-JP900 に対する fx-993ES、fx-995ES (スタンダード関数電卓)の処理速度の割合は、積分1と積分2が同じ比率になっています。ところが、fx-JP900 に対する fx-5800P と fx-9860GII (プログラム電卓)の処理速度の割合は、積分1と積分2の割合が上記と異なっており、誤差と言えないレベルの差を示しています。これはCPU性能だけが要因ではなくて、プログラム電卓での計算アルゴリズムの違いが反映されている可能性を示しています。

面白いのが、fx-991ES では、積分2が全体の傾向に合わない逆転現象を示している点です。

関数電卓とプログラム電卓のグループで分けて見てみると、fx-JP900を基準にした処理時間比は、関数電卓では積分1の方が小さい傾向(逆に速度比は大きい)があり、fx-5800P や fx-9860GII などのプログラム電卓では積分2が相対的に処理時間比が小さい傾向(速度比が大きい傾向)が見られます。但し fx-9860GII ではその差は非常に小さく、CPUが圧倒的に速いので差が小さくなっていると考えられ、プログラム電卓と関数電卓とで傾向の違いがあると言えるかも知れません。

この速度比の傾向が、fx-991ES と fx-5800P が同じなのは、共に2006年発売であることと関係あるかも知れません。

これら機種の取扱説明書を見ると、fx-9860GII 以外の数値積分計算には、ガウス・クロンロッド法を使うとありますが、fx-9860GII については、数値積分計算の方法についての説明はありません。誤差は fx-995ES だけ指定無き場合はに 1x10-10 で、それ以外は 1x1--5 とありますが、いずれも正しい計算結果を出しており、誤差は数値積分処理時間に影響が無いように思います。

ガウス・クロンロッド法は周期関数が苦手で、却って計算時間がかかる傾向があるようです。積分2に時間がかかる上の結果もそれを反映しているようです。

積分1と積分2の処理時間の比率を各機種別に整理して、グラフを作ってみます。CPU速度の違いを打ち消して、苦手な周期関数をどのように扱うのかのアルゴリズムの違いを反映する例になると思います。

機種処理時間比率 [積分2/積分1]
fx-991ES7.29
fx-993ES9.32
fx-995ES9.41
fx-JP9008.85
fx-5800P5.61
fx-9860GII5.6
積分比較2 
プログラム電卓である fx-5800P と fx-9860GIi は、積分1と積分2の速度比率がほぼ同じなので、似たようなアルゴリズムになっていると思われます。



ガウス・クロンロッド法が苦手とする周期関数の積分の例として、以下のような計算をさせてみます。
積分3 

ここで、n は、自然数(1, 2, 3...)です。n を少し大きな数にすると、いずれの機種でもタイムアウトになって計算を諦めてしまいます。そこで、タイムアウトしない n を比較すれば、積分アルゴリズムの違いが分かるかも知れません。

機種計算できる nタイムアウトする n
fx-991ES89
fx-993ES89
fx-995ES89
fx-JP90089
fx-5800P89
fx-9860GII6061

いずれの機種も計算できた時は、正しい計算値(4n)を示します。上記のいずれの機種も内部精度は15桁です。sin x の入力範囲も同じです(0 ≦|x| < 157079632.7)。

fx-9860GII だけが、より大きな n で計算可能なのは、圧倒的なCPUの速さから、タイムアウト時間を長くとっているのかも知れません。

アルゴリズムもチューニングしている可能性がありそうです。



関数計算に使われるアルゴリズムには、CORDICや多項式近似があり、sentaro様によれば、Intel 486系までではCORDICが使われ、Pentium 以降では多項式近似が使われるようになっているとのことです。CORDIC は、小さなテーブル参照と四則演算で関数計算が可能になる巧妙なアルゴリズムで、遅いCPUと限られたメモリしかない環境では有効です。一方、多項式近似は、速いCPUと十分なメモリを使える場合は、精度と速度が得られるので、Pentium以降で用いられることは納得できます。

以下の資料が非常に参考になります。

関数計算で用いられる、CORDIC と 多項式近似についてまとめられている;
- 関数アルゴリズムの検証

CODRICの具体的な計算方法が、大変分かりやすく書かれている;
- サルでもわかるCORDICアルゴリズム


カシオの電卓は、浮動小数点処理を行うFPUが使われていないようなので、基本的にはCORDICが採用されていると考えられます。

積分1と積分2の計算時間の違いについて、関数計算の違いがどの程度反映しているのかを調べて見ます。

ガウス・クロンロッド法はガウス法の一種で、積分区間内の複数点での f(x) の値の総和を求める計算をしています。そこで、総和計算を、cos x と cos(ln x) で行って、その違いをみてみます。

機 種総和1総和2
fx-991ES23.1秒6.236.4秒5.3
fx-993ES17.7秒4.834.0秒4.9
fx-995ES17.0秒4.6
32.8秒
4.8
fx-5800P8.7秒2.411.7秒1.7
fx-JP9003.7秒6.9秒
fx-9860GII1.9秒0.511.9秒0.28

積分と同様に、fx-JP900 の処理時間を1とした相対比率(赤文字)を使ってグラフを作ってみます。
総和比較 
全体的には、CPU速度の違いをうまく反映した結果になっています。但し、fx-991ES の総和2の計算時間が特異的に速くなっていて、積分計算と同様の結果です。さらに、fx-JP900 に対する処理時間の割合が、関数電卓とプログラム電卓で異なった比率になっていて、これも積分計算の傾向と同じです。積分も内部では総和計算を使っていると考えれば、同じ傾向になるのは納得できます。ちなみに、取扱説明書によれば、cos( )ln( ) の入力範囲と精度は、いずれの機種でも同じです。

総和1と総和2の処理時間比率を機種別に整理してグラフ化してみます。CPU速度の違いを消して、アルゴリズムの違いを見る試みです。

機種処理時間比率 [総和2 / 総和1]
fx-991ES1.58
fx-993ES1.92
fx-995ES1.93
fx-JP9001.86
fx-5800P1.34
fx-9860GII1.00
総和比較2 
総和1に対する総和2の相対速度は、積分計算と異なり、fx-5800P より fx-9860GII がはっきりと速くなっています。タイムアウトする積分3で見たように、fx-9860GII では関数計算がチューニングされているようです。


以上、あまり明確なことは言えませんが、fx-5800P の積分計算の位置づけが少し見えたと思います。




関連ページ:
- Casio fx-JP900(その3)





応援クリックをお願いします。励みになるので...
にほんブログ村 IT技術ブログ 開発言語へ


 



keywords: fx-5800Pプログラミングプログラム関数電卓

リンク集 | ブログ内マップ
関連記事

テーマ : プログラム関数電卓
ジャンル : コンピュータ

コメントの投稿

非公開コメント

最新記事
検索フォーム
最新コメント
カテゴリ
C# (3)
Online Counter
現在の閲覧者数:
プロフィール

やす (Krtyski)

Author:やす (Krtyski)
since Oct 30, 2013


プログラム電卓は、プログラムを作って、使ってナンボ!

プログラム電卓を実際に使って気づいたこと、自作プログラム、電卓での Casio Basic, C.Basic そして Casio Python プログラミングについて書いています。

なお管理人はカシオ計算機の関係者ではありません。いつでもどこでもプログラミングができるプログラム電卓が好きな1ユーザーです。


写真: 「4駆で泥んこ遊び@オックスフォード郊外」

リンク
月別アーカイブ
Sitemap

全ての記事を表示する

ブロとも申請フォーム

この人とブロともになる

QRコード
QR