[ 前へ | 目次 | 次へ ]
Now Loading...
ダウンロード
PC (※スマートフォンでは動きません) でダウンロードし、ZIPファイルを右クリックメニューから展開して、できたフォルダ内の「 VCSSL.bat(バッチファイル) 」または「 VCSSL.jar 」をダブルクリックなどで実行すると、プログラムが起動します。
» 詳しい使用方法や、エラーで展開できない際の対応方法などはこちら

入力された数式を積分して値とグラフを表示するツール

このVCSSLプログラムは、 画面上で数式を入力すると、それを数値的に積分し、 値とグラフを表示してくれるGUIツールです。 数値積分のアルゴリズムは、 シンプソン法台形法、および 矩形法(長方形近似) から選択できます。

[ 数値積分シリーズの連載記事 ]

- バグ修正のお詫び -
2019年01月20日公開のバージョンにおいて、入力した式の中における、整数同士の除算の結果が整数として解釈され、小数部が落ちるバグが存在しました。 2019年1月31日公開のバージョンにおいて修正いたしました。 ご迷惑をお掛けいたしました事をお詫び申し上げます。

使用方法

ダウンロードと展開(解凍)

まず、PC(スマホは未対応)で上の画面の「 ダウンロード 」ボタンを押してください。 するとZIP形式で圧縮されたファイルがダウンロードされるので、そのZIPファイルを右クリックして「すべて展開」や「ここに展開」などで展開(解凍)してください。 展開が成功すると、ZIPファイルと同じ名前のフォルダができ、その中にZIPファイルの中身が入っています。

» 展開がエラーで止まってしまう場合は…

なお、Linux® 等をご使用で、右クリックメニューから展開するとファイル名が文字化けしてしまう場合は、 コマンドライン端末でZIPファイルのある場所まで cd した上で「 unzip -O cp932 ZIPファイル名 」で展開してみてください。

プログラムの起動

Microsoft® Windows® をご使用の場合

上記の通りにZIPファイルを展開したフォルダ内にある、 「 VCSSL.bat(種類はバッチファイル) 」をダブルクリック実行してください。 もしプログラムの内容を書き変えながら使いたい場合は、代わりに「 VCSSL_Editor.bat 」を実行してください。

実行すると、最初にメモリー使用量や、(必要な場合のみ)Java®実行環境を自動で入手するか 等を尋ねられるので、適時答えると、プログラムが起動します。2回目以降はすぐに起動します。

※ ここで入手したJava®実行環境は、ZIPファイルを展開した中の「 jre 」フォルダ内にダウンロードされ、このプログラムの実行のみに使用されます。PC全体に影響する形でインストールされる事はありません。

Linux® 等やその他のOSをご使用の場合

ZIPファイルを展開したフォルダ内へコマンドライン端末で cd して、以下の通り入力して実行してください:

java -jar VCSSL.jar
(プログラムの内容を書き変えながら使いたい場合は、代わりに VCSSL_Editor.jar を実行)

» javaコマンドが使用できない等のエラーが表示される場合は…

起動後

画面の様子

起動すると、まず2つの画面が立ち上がります。 背後の黒いウィンドウがコンソール画面、手前の左にある白いウィンドウが入力画面です。 入力画面上の「 CALC - 計算 」ボタンを押すと、さらにグラフ画面(右)が起動します。

コンソール画面(背後)と入力画面(左)およびグラフ画面(右)

数式と積分区間を入力して積分する

まず、積分したい数式(被積分関数)を、入力画面の「 f(x) = 」の入力欄に入力してください。 式の書き方のポイントは以下の通りです:

- 数式の書き方のポイント -
  • 式は半角(123などの、幅の細い文字)で書いてください。キーボード左上の「半角/全角」キーで切り替えられます。
  • 「 x 」は大文字ではなく小文字を用いてください。
  • 四則演算が普通に使用できます。ただし、かけ算は「 * 」、割り算は「 / 」の記号を用いてください。足し算や引き算は普通に「 + 」と「 - 」を用います。
  • かけ算や割り算は、足し算や引き算よりも先に計算されます(手計算と同じです)。
  • sin や cos といった数学関数が使用できます。また、円周率の値は「 PI 」と書けばOKです。 使用可能な数学関数・定数の一覧は、Mathライブラリの仕様書ページをご覧ください。
  • 累乗は「 ** 」の記号を用いてください。例えば x の2乗なら「 x**2 」です。

数式を入力したら、続いて「 b (x_max) = 」および「 a (x_min) = 」の入力欄に、それぞれ積分区間の上端および下端の値を入力してください。 必要なら、ここでも数式や sin や cos などの数学関数を使用する事ができます。また、円周率の値は「 PI 」として使用できます。

入力画面の様子

数式と積分区間を入力したら、 入力画面の「 CALC - 計算 」ボタンを押すと、その数式を積分する計算が実行され、結果の値がボタンの下に表示されます。 積分結果の値は、10桁に丸めて表示されます( 丸めていない元の値は、コンソール画面(黒い画面)の最終行の右の列の値から確認できます )。

グラフの描画

上記の通り「 CALC - 計算 」ボタンを押した時点で、 積分区間の上端 b の値を、下端 a から指定値まで動かした、積分過程のグラフも表示されます。 横軸が b の値、縦軸が積分値です。下端 a の値は、グラフ上では横軸の最小値(左端)の値として確認できます。 このグラフはつまるところ、被積分関数 f(x) を積分した関数 F(x) + C を、横軸を x として描いたグラフと同じ形をしています(ただし、a の設定値に応じて、上下に平行移動されています)。

グラフの様子

グラフの目盛りや範囲などを綺麗に揃えたい場合や、ラベルやタイトルを編集したい場合などは、グラフ画面上部のメニューバーから細かい調整を行う事ができます。

なお、後述する N の設定値によっては、グラフ用のデータを用意する処理に時間がかかるため、 大きいNの設定で使っていて、重いと感じたら「 Plot Graph - グラフを描画する 」のチェックを外してください。 そうするとグラフは描かれなくなりますが、計算は素早く完了するようになります。

ただ、本質的な積分可能性(リーマン可積分かどうか)にも関わる問題として、被積分関数が無限大に発散している箇所があったりすると積分も吹っ飛んでおかしくなったり、 また、滑らかでない関数の場合は積分値が収束しない場合もあります。 従って、初めて積分する数式は、 一度は粗い N でグラフを描いてみて、そもそも積分値が収束しそうなのかを確認する事をお勧めします。 積分ではなく元の関数のグラフも確認したい場合は、 「 y = f(x) の形の数式を2Dグラフとして描画するツール 」も併せてご利用ください。

グラフを別のグラフソフトで描きたい場合は…

ところで、グラフに描画されているデータは、背後の黒いコンソールウィンドウに、「 x    y 」の2カラム形式で書き出されています。 もし、グラフを別のグラフソフトで描きたい場合は、コンソールウィンドウ上部のメニューバーから 「 File 」 > 「 Save File - コンソールの内容をファイルに保存 」 を行って、 保存したファイルをグラフソフトで開いてください。

参考までに、このプログラムで起動されるグラフ画面は、 「 リニアングラフ2D( RINEARN Graph 2D ) 」というデータ解析用のグラフソフトで、 単体でも入手・利用できます。

数値積分アルゴリズムの選択と、刻み数 N の設定

さて、数値的に積分を計算する際に、精度を左右する重要なテーマが、 数値積分アルゴリズムの選択と、刻み数 N の値をどれくらいにするかです。 このプログラムでは、数値積分アルゴリズムは入力画面上の「 Algorithm = 」の選択欄で、 N の値は「 N = 」の入力欄で指定できます。 以下では、そもそもそれらのアルゴリズムや N の値が、どういう意味のものなのかについて、簡単に説明します。

このプログラムでは、シンプソン法、台形法(台形公式)、および矩形法(長方形近似)の3つをサポートしています。 各アルゴリズムについては、下記の記事でもそれぞれ個別に解説していますので、詳しく読みたい場合はそちらをご参照ください:

ここでは、簡単なイメージを駆け足で見てみましょう。 まず前提として、被積分関数 f(x) を、a から b までの区間で定積分した値は、下図のように、その区間内で f(x) と x 軸に挟まれた領域の面積に相当します。 従って、この面積を求めれば、積分値が得られるわけです。

f(x) と x 軸に挟まれた領域の面積

矩形法(長方形近似)

一番単純な数値積分アルゴリズムである矩形法(長方形近似)では、この面積を、微小な N 個の領域に区切って、その微小領域の面積を長方形で近似します。 そして、その N 個の微小領域の長方形を並べて、それらの面積を足す事で、積分区間全体での面積を求めます。イメージとしては下図の通りです。

積分区間を微小領域で区切るイメージ

上の図から、積分区間を微小領域で刻む数 N を増やしたほうが、微小領域の刻みが細かくなって、 上のギザギザではみ出したり欠けている箇所が減り、 f(x) と x 軸との間の面積をよく近似できるようになりそうな事が想像できると思います。 これは実際その通りで、矩形法では、N を1桁増やすと、積分値の信頼できる桁数がだいたい 1 桁程度増える事が見込めます。

台形法(台形公式)

続いて台形法です。これは上で説明した矩形法をちょっとだけ改良したもので、長方形の上の辺を、f(x) の変化に沿うように傾けます。これによって長方形は台形になりますね。 あとは、N 個の微小領域の台形を並べて、それらの面積を足す事で、積分区間全体での面積を求めます。イメージは下図です。

積分区間を台形を並べて近似するイメージ

上図を見ると、最初の矩形法の場合と比べて、ギザギザにはみ出したり欠けたりしていた部分が軽減されて、直感的にも面積の近似精度が上がっていそうに見えます。 実際その通りで、台形法では、N を1桁増やすと、積分値の信頼できる桁数がだいたい 2 桁程度増える事が見込めます。

ただ、台形法では微小領域の上の辺を直線で近似しているので、f(x) の微妙な丸みなどは真似しきれません。f(x) が直線でもない限り、 拡大すると少し面積が食い違っているはずです(下図)。これが台形法の誤差を生み出しています。

台形近似の誤差のイメージ

シンプソン法

「 それなら、上の辺を曲線で近似すれば、もっと精度が上がるのでは? 」と思いませんか? …という事で、上図の台形の上の辺を、f(x) の丸みに良い感じでフィットする二次関数で置き換えたのがシンプソン法です。下図の通りです。

長方形の上の辺を二次関数で置き換えるイメージ

シンプソン法では、この「 上の辺を二次関数でかじった短冊のようなもの 」を N 個並べる事で、面積を足し上げて積分値を求めます。 f(x) の丸みをそれなりに(2次成分まで)真似できるので、少なくとも直線で真似る台形法よりは精度が上がりそうですね。 実際その通りで、シンプソン法では N を1桁増やすと、積分値の信頼できる桁数がだいたい 4 桁程度増える事が見込めます。 台形法は2桁程度だったので、だいぶ違いますね。 ( 一方で、被積分関数 f(x) とアルゴリズムとの相性問題のようなものもあり、必ずしも高次のアルゴリズムが万能とも言い切れないのも複雑なところです。)

と、やや長い前置きになってしまいましたが、数値積分アルゴリズムと N のイメージが大まかには掴めたでしょうか。

刻み数 N の調整とアルゴリズム選択

さて、重要なのは N の値です。 N は、あくまでも基本的にですが、大きいほうが上述の近似精度が向上し、誤差(厳密な積分値と、計算結果の値のずれ)が減る事が見込めます。 ただし、あまり極端に増やし過ぎると、逆に別の誤差 が効いてきてしまったりもするので、N を1桁ずつ変えながら何度か計算してみて、 積分値が概ね(求める値の桁数まで)収束しているあたりに設定するのが無難です。具体的な適正範囲は被積分関数 f(x) の凹凸の激しさなどによって異なります。

N を1桁増やすと、結果の信頼できる桁数が何桁増えるかは、既に述べた通り、アルゴリズムによって大きく異なります。 基本的には、矩形法よりも台形法の方が、また台形法よりもシンプソン法の方が、精度を出すのに有利な場面が多いでしょう。 一方で、先に少し述べた通り、被積分関数 f(x) とアルゴリズムとの相性問題のようなものもあるので、 初めて積分する関数で、精度が要求される場合には、色々変えて様子を掴むのがおすすめです。

※ N の値がかなり大きい場合に効いてくる、演算誤差の蓄積

コンピューターでの数値計算は、本来は無限桁まで続く小数の値も、有限の桁数 (このプログラムで使用している倍精度浮動小数点数では、有効桁数で大体16桁程度) で打ち切って扱っているため、 四則演算などの基本的な計算を1回行うだけでも、その度に非常に小さな誤差が発生しています(データ型にもよります)。

なので、あまりに N を大きくして、微小領域を細かく刻みすぎると、その面積を足し上げる計算の回数が膨大になってしまって、 逆に上述のような別の誤差が蓄積する事により、ある程度以上は精度を上げられなくなってしまう場合もあります ( 矩形法で試すと分かりやすいです )。

つまり、基本的には N が大きい方が、上の方で図示して説明した近似精度は向上しますが、それにはピークがあって、 それを超えると逆に演算誤差の蓄積のせいで精度が落ちていく事もあります。

コード解説

コード全体

このプログラムのコードはVCSSLで記述されています。 VCSSLはC言語系のシンプルな文法を持っているので、C系の言語に触れられた事のある方なら、 コメントを参考にしながらコード内容を比較的簡単に追う or 改造する事ができると思います。

今回のコードは、数値積分の計算処理に、GUIの画面を組み合わせて、ツールとして仕上げたものです。 数値積分のアルゴリズムをシンプルに実装したプログラムについては、以下の回で解説していますので、そちらをご参照ください:

[ 数値積分のアルゴリズム解説記事(連載) ]

また、VCSSLでのGUI画面の構築については、「 VCSSL GUI開発ガイド 」をご参照ください。

今回のコードは、サンプルコードというよりは実際に使うためのツールなので、 細部を細かくピックアップしながらの解説は割愛し、コード全体の掲載に留めておきます。 今回のコードの全体は、以下の通りです:

詳しいVCSSLのプログラミングガイド(無料)はこちらへ!

上記のコードはプログラミング言語VCSSLで記述されており、VCSSLのプログラミングガイドは下記で無料公開しています。 上記のコードを改造したい方や、新しいコードを書いてみたい方はぜひご活用ください!

ブラウザで読めるWeb版だけでなく、PDF版も無料で配布しています!

スタートアップガイド( プログラミングがはじめての方向け )
プログラミングの入門書に相当する内容です。プログラミングが初めての方はこちらがおすすめです。
即席ガイド( C系言語ユーザー向け )
C言語や C++ などのC系の言語を扱われている方が、即席でVCSSLを扱うための簡易ガイドです。
文法ガイド
VCSSLの文法や基本的な機能を淡々とまとめた、リファレンスマニュアル的な位置づけのガイドです。
GUI開発ガイド
ボタンや入力項目などのGUI部品が並ぶ、画面を備えたVCSSLプログラムを開発するためのガイドです。
2DCG開発ガイド
画面上や画像ファイルなどに、2次元的な描画を行うVCSSLプログラムを開発するためのガイドです。
3DCG開発ガイド
画面上や画像ファイルなどに、3次元的な描画を行うVCSSLプログラムを開発するためのガイドです。
標準ライブラリ 仕様書
コード内で呼び出される関数は、大半が標準ライブラリのものです。その詳細仕様を掲載しています。

ライセンス

このVCSSLコード( 拡張子が「.vcssl」のファイル )は実質的な著作権フリー(パブリックドメイン) である CC0 の状態で公開しています。 そのままでのご利用はもちろん、言語の種類を問わず、改造や流用などもご自由に行ってください。

※ ただし、このVCSSLコードの配布フォルダ内には、ダウンロード後すぐに実行できるように、 VCSSLの実行環境も同梱されており、そのライセンス文書は「 License 」フォルダ内に同梱されています (要約すると、商用・非商用問わず自由に使用できますが、使用の結果に対して開発元は一切の責任を負いません、といった具合の内容です)。 配布フォルダ内の各構成物の一覧やライセンスについては「 ReadMe_使用方法_必ずお読みください.txt 」をご参照ください。

この記事中の商標などについて

  • OracleとJavaは、Oracle Corporation 及びその子会社、関連会社の米国及びその他の国における登録商標です。文中の社名、商品名等は各社の商標または登録商標である場合があります。
  • Windows は、米国 Microsoft Corporation の米国およびその他の国における登録商標です。この記事は独立著作物であり、Microsoft Corporation と関連のある、もしくはスポンサーを受けるものではありません。
  • Linux は、Linus Torvalds 氏の米国およびその他の国における商標または登録商標です。
  • その他、文中に使用されている商標は、その商標を保持する各社の各国における商標または登録商標です。


スポンサーリンク



[ 前へ | 目次 | 次へ ]
入力された数式を積分して値とグラフを表示するツール

画面上で数式を入力すると、それを数値的に積分し、値とグラフを表示してくれるGUIツールです。
シンプソン法による数値積分

積分の値を数値的に求めます。台形法よりも高精度な方法として、被積分関数を微小区間内で二次関数近似して求めた面積を足しあげる、シンプソン法を使用します。
台形法(台形近似)による数値積分

積分の値を数値的に求めます。長方形近似よりも高精度な方法として、台形で近似した微小領域を足しあげる方法を使用します。
矩形法(長方形近似)による数値積分

積分の値を数値的に求めます。長方形の短冊(矩形)で近似した微小領域を足しあげる、最も単純な方法を使用します。
小数(浮動小数点数)から分数へ近似的に変換するツール

小数(浮動小数点数)を、適当な誤差の範囲内で、近い分数に変換してくれるツールプログラムです。
円周率1万桁の計算(ガウス=ルジャンドル法)

ガウス=ルジャンドル法により、円周率を1万桁まで計算するプログラムです。
試し割り法による素数判定ツール

試し割り法を用いて、素数判定を行ってくれる簡易ツールです。
スポンサーリンク

この階層の目次
お知らせ

リニアンプロセッサー nano の先行開発版やソースコードリポジトリを公開
2019年04月16日 - オープンソースで開発中の小型プログラム関数電卓ソフト、「 リニアンプロセッサー nano 」の先行開発版やソースコードリポジトリを公開しました。概要と使用方法、ビルド方法などについて解説します。

各ソフトウェアの最新版を一括でリリース、OpenJDKのJava実行環境(JRE)に対応
2019年03月06日 - RINEARNでは3月6日に、主要なソフトウェアの最新版を一括でリリースしました。今回のアップデートには、以前お知らせした、OpenJDKで生成したJREへの対応が含まれています。その概要等をお知らせします。

次回のVCSSL 3.4.10において、関数1個の挙動に非互換な修正が適用されます
2019年02月12日 - VCSSLの次回の正式リリース版3.4.10において、これまでドキュメントと実際の挙動が異なっていた描画系の関数1個に、非互換な修正が適用されます。その詳細と、使用コードでの対応方法について解説します。

新着
[公式ガイドサンプル] 立体モデルを生成して3D空間に配置する

「VCSSL 3DCG開発ガイド」内のサンプルコードです。立体モデルを生成し、3D空間に配置します。
2019年05月21日
[公式ガイドサンプル] ポリゴンを生成して3D空間に配置する

「VCSSL 3DCG開発ガイド」内のサンプルコードです。立体の基本的な構成要素となるポリゴンを生成し、3D空間に配置します。
2019年05月20日
[公式ガイドサンプル] CSVファイルにデータを書き出し&読み込んで、複雑な3次元曲面のグラフを描く(魔法陣形)

「VCSSLスタートアップガイド」内のサンプルコードです。CSVファイルにデータを書き出し、さらにそれを読み込んで、魔法陣のような3次元曲面のグラフを描画します。
2019年05月17日
[公式ガイドサンプル] CSVファイルにデータを書き出し&読み込んで、複雑な3次元曲面のグラフを描く(花形)

「VCSSLスタートアップガイド」内のサンプルコードです。CSVファイルにデータを書き出し、さらにそれを読み込んで、花の形の3次元曲面のグラフを描画します。
2019年05月16日
[公式ガイドサンプル] CSVファイルにデータを書き出し、読み込んで3次元のメッシュグラフを描く

「VCSSLスタートアップガイド」内のサンプルコードです。CSVファイルにデータを書き出し、さらにそれを読み込んで、3次元のメッシュグラフを描画します。
2019年05月16日
開発元Twitterアカウント

スポンサーリンク