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

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

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

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

スポンサーリンク


使用方法

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

まず、PC(スマホは未対応)で上の画面の「 ダウンロード 」ボタンを押してください。 するとZIP形式で圧縮されたファイルがダウンロードされます。

Windows をご使用の方は、ここでまずZIPファイルを右クリックし、「プロパティ」を選んで開かれる画面で、 下の方にあるセキュリティ項目の「許可する」にチェックを入れて「OK」で閉じてください。 これを行わないと、ZIP展開やソフト起動時に、警告メッセージが出て展開完了/起動できない場合があります。

その後、ZIPファイルを右クリックして「すべて展開」や「ここに展開」などで展開(解凍)してください。 展開が成功すると、ZIPファイルと同じ名前のフォルダができ、その中にZIPファイルの中身が入っています。

» 展開がエラーで止まってしまう場合や、ファイル名が文字化けしてしまう場合は…

プログラムの起動

Windows をご使用の場合

上記でZIPファイルを展開したフォルダ内にある、以下のバッチファイルをダブルクリック実行してください:

VCSSL__ダブルクリックでプログラム実行.bat

もしプログラムを書き変えながら使いたい場合は、代わりに「 VCSSL_Editor__プログラム編集はこちら.bat 」を実行してください。

正常に起動できると、初回のみ、Java実行環境を入手するか等を尋ねられるので、適時答えて済ませると、プログラムが起動します。 2回目以降はすぐに起動します。

» うまく起動できずにエラーになってしまう場合は…

Linux 等をご使用の場合

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 ) 」というデータ解析用のグラフソフトで、 単体でも入手・利用できます。

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

数値積分アルゴリズムの選択と、刻み数 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/Vnanoコード( 拡張子が「.vcssl」や「.vnano」のファイル )は実質的な著作権フリー(パブリックドメイン) である CC0 の状態で公開しています。 記事中にC言語/C++/Java言語などでのサンプルコードが掲載されいてる場合は、それらについても同様です。 そのままでのご利用はもちろん、改造や流用などもご自由に行ってください。

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

※ Vnano の実行環境については、別途スクリプトエンジンのソースコードも一般公開しており、 何らかのソフトウェア内に組み込んでご利用いただく事も可能です。詳細はこちらをご参照ください。

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

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


スポンサーリンク



[ 前へ | 目次 | 次へ ]
角度の「度」とラジアンとを相互変換し、図示もするツール

45度などの「度」の値と、ラジアンの値とを相互に変換できるツールです。対応する角度の図示もできます。
FizzBuzz の答えを表示するプログラム

プログラミングの練習問題としても有名な、FizzBuzz 問題の答えを表示するプログラムの例です。
Vnano版 | 積分値のグラフ描画用データを出力するプログラム

数値的に積分を行い、結果の関数をグラフに描くためのデータを出力するコードです。
Vnano版 | 積分値を求めるプログラム (数値積分)

矩形法/台形法/シンプソン法を用いて、積分の値を数値的に求めるコードです。
入力された数式を積分して値とグラフを表示するツール

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

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

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

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

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

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

試し割り法を用いて、素数判定を行ってくれる簡易ツールです。
この階層の目次
お知らせ

各ソフトウェアをアップデート、リニアングラフのコマンド拡張やVCSSLの英語対応など
2024/02/05 - 各ソフトの一斉アップデートの内容をお知らせします。今回は、リニアングラフのコマンド機能を大幅拡張したのがメインです。また、VCSSLのメッセージ類の英語対応も行いました。

Vnano の Ver.1.1 で実装した反復計算高速化の内側
2024/01/17 - 前回のお知らせ記事の続編です。スクリプトエンジン Vnano の Ver.1.1 において実施した高速化を、エンジン内部の実装面から掘り下げて解説します。

スクリプトエンジン Vnano の Ver.1.1 を公開、同じ内容の反復実行が劇的に高速化
2023/12/22 - スクリプトエンジン Vnano の最新版を公開しました。同じ計算式やスクリプトを反復実行する速さが、大幅に向上しました。次期版リニアングラフ3D内での活用例を交えつつ、詳しく解説します。

新着
[公式ガイドサンプル] 各種の図形や画像を描画する

「VCSSL 2DCG開発ガイド」内のサンプルコードです。図形や画像などを描画します。
2022-12-16
角度の「度」とラジアンとを相互変換し、図示もするツール

45度などの「度」の値と、ラジアンの値とを相互に変換できるツールです。対応する角度の図示もできます。
2022-11-22
[公式ガイドサンプル] 立体モデルを回転させるアニメーション

「VCSSL 3DCG開発ガイド」内のサンプルコードです。立体モデルを、アニメーションで回転させ続けます
2022-11-18
[公式ガイドサンプル] 立体モデルを回転させる

「VCSSL 3DCG開発ガイド」内のサンプルコードです。立体モデルを、指定した角度だけ回転させます。
2022-11-17
[公式ガイドサンプル] 四則演算の計算順序や、カッコを使った順序指定

「VCSSLスタートアップガイド」内のサンプルコードです。四則演算が計算される順序や、カッコを使って順序を指定する方法を例示します。
2022-10-31