このエントリーをはてなブックマークに追加
2013/11/30

ユーザーが入力した数式を2Dグラフにプロットする

ユーザーが入力した数式を、2次元グラフにプロットする、単純なプログラムです。

RINEARN CODE - ユーザーが入力した数式を2Dグラフにプロットする
スクリーンショット
※ ダウンロードしたZIPファイルを展開し、中のVCSSL.jarをダブルクリックして下さい。
※ 各種デスクトップOSで動作しますが、動作には Java が必要です。

概要

このVCSSLプログラムは、ユーザーが入力した数式を2Dグラフにプロットします。サンプル的な短いコードなので、改造や流用のベースに適しています。

使用方法

このプログラムは、Webページ上でも、ダウンロードしてでも使用できます。

Webページ上で起動

上の画面の実行ボタンを押すと、実行用のWebページに移動し、プログラムが起動します。

ダウンロードして起動

上の画面のダウンロードボタンを押して ZIP ファイルをダウンロードし、解凍した中にある「 VCSSL.jar 」をダブルクリックすると、プログラムが起動します。 なお、ZIPファイルの解凍は、右クリックして「 すべて展開 」などで行えます。

起動後の操作方法

起動すると、まず数式を入力する画面が表示されますので、入力してください。

数式入力画面

続いてX軸の範囲(最小値と最大値)を入力すると、グラフ画面が起動し、数式のグラフがプロットされます。

グラフ画面

コード解説

それでは、このプログラムのコード内容について解説していきます。 このプログラムのコードは、プログラミング言語 VCSSL で記述されています。

前提

このプログラムのコード内容は、「 配列を2Dグラフにプロットする 」の応用となっています。 必要に応じて、そちらのコードもご参照ください。

コード全体

まずは、コード全体を見てみましょう。50行未満の短いコードです。

以上です。流れとしては、前半部で各パラメータや数式などを設定・取得し、後半部で数式の値を計算して座標値配列に格納し、最後にそれをグラフにプロットしています。

先頭部分

先頭部分を見てみましょう。

先頭の「 encode Shift_JIS; 」では、プログラムの文字コードを明示しています( UTF-8も可 )。必須ではありませんが、書いておくと文字化けするのを防げます。

「 import science.graph.Graph2D; 」の部分は、2次元グラフを扱うためのライブラリ「 science.graph.Graph2D 」を読み込んでいます。

「 import Math; 」の部分は、各種数学関数を提供する標準ライブラリ「 Math 」を読み込んでいます。 こうしておく事で、ユーザーが入力する数式で sin や cos などの使用をサポートする事ができます。

各パラメータや数式の用意

続いて、各パラメータや数式の用意です。

この通り、基本的には普通の変数定義です。

「 const int N = 100; 」の const は値を変更できなくする(定数にする)ためのキーワードで、付けても付けなくてもいいですが、付けておくと誤って書き換えてしまう事を防げます。

input関数は、ダイアログを表示して、ユーザーに値を入力してもらうための関数です。ここではプロット範囲や数式などの入力に使用しています。 GUIで入力画面を作っても良いのですが、値が少ない場合はこのようにinput関数を使うほうが楽です。

座標値配列の用意

続いて今回の中核です。ここではユーザーが入力した数式の値を計算して、座標値配列に代入します。

ここで使用している feval 関数は、文字列変数に格納された式の内容を計算(評価)して、値を float 型で返す関数です。 第二引数に 0.0 を指定していますが、こうしておくと式中の整数リテラル(数字)を小数と見なすオプションが適用されます(0.0でなくてもfloat型の値なら何でも同じ)。

今回のように数式プロットツールなどを作る場合、ユーザーが式中に "1/2" や "sin(1)" といった項を記述する事が予想されますが、 これを言語仕様のまま処理すると、整数除算や引数型エラーなど、色々と面倒な事になります。 なので、このようなオプションを付けて、数字を小数として扱わせます。

なお、feval 関数は eval 関数の派生型で、実はここは普通に eval 関数でも実行できます。 しかし、eval 関数は戻り値をstring型の配列で返すので、今回のように結果をfloat型の変数で受け取る場合、 内部でstring→float変換や、配列→非配列変換などのやや重い処理が生じます。 今回くらいの計算量では問題にならないのですが、プロット点数を増やしたり、アニメーションなどを行う場合はボトルネックになっても嫌なので、このように結果がfloatと決まりきっている場合は feval 関数を使用します。

式の動的評価というと一般に遅いイメージがありますが、VCSSLの eval / feval 関数は、同じ式内容での連続呼び出しに関しては構文解析結果がキャッシュされるため、あまり気にする必要はありません。 関数コールのオーバーヘッドを除けば、数式をそのままコード中にベタ書きしたのと大差ない速度で走ります。

プロット

最後に、書き出したファイルを2次元グラフにプロットする部分です。

上のほうの行の、newGraph2D関数で、2次元グラフソフトを起動しています。 この関数は、呼ぶ度にグラフソフトを1個起動し、そのグラフソフトに固有のID番号を割り振って返します。

例えば2次元グラフソフトを何個も起動した場合、12番グラフ、22番グラフ、101番グラフ、 …といったように、それぞれに番号が割り振られているわけです。 上では、生成したグラフに割り振られたID番号をint型変数「 graph 」に格納しているわけです。

続いて下のほうの行です。ここでは、setGraph2DData関数で、先ほど起動した2Dグラフソフトに、座標値配列 xData, yData をプロットさせています。 ここで第一引数に、先ほどグラフ起動時に受け取ったID番号 graph を指定しています。グラフが複数ある場合でも、このようにID番号で操作対象のグラフを区別できるわけです。

コードのライセンス

このVCSSLコードは著作権フリー(パブリックドメイン)で公開しています。 そのままでのご利用はもちろん、言語の種類を問わず、改造や流用などもご自由に行ってください。



スポンサーリンク


このエントリーをはてなブックマークに追加
新着プログラム

台形近似による数値積分
2015年06月25日

長方形近似による数値積分
2014年11月01日

小数(浮動小数点数)から分数へ近似的に変換する
2014年08月10日

ユーザーが入力した数式を2次元グラフにプロットする
2013年11月30日

配列を3次元グラフにプロットする
2013年11月28日

配列を2次元グラフにプロットする
2013年11月28日

ファイルを3次元グラフにプロットする
2013年11月27日

ファイルを2次元グラフにプロットする
2013年11月26日

ウィンドウの生成
2013年08月28日

ボタンが並ぶパネルの配置(ButtonPanel)
2013年08月28日

ボタンの配置
2013年08月28日

2DCGと3DCGの合成
2013年05月04日

凹レンズを通過する波のシミュレーション
2013年03月16日

凸レンズを通過する波のシミュレーション
2013年03月15日

乱雑な密度分布における波のシミュレーション
2013年03月12日

ローレンツアトラクタ(ファイル出力版)
2013年02月28日

波の屈折のシミュレーション
2012年12月05日

力学アルゴリズムによる波のシミュレーション(面上の波)
2012年11月21日

手動で波を発生させるシミュレーション
2012年11月19日

力学アルゴリズムによる波のシミュレーション(線上の波)
2012年11月18日

カラーコードとRGBの相互変換と色表示
2012年11月15日

頂点配列によるモデルの変形アニメーション
2012年11月14日

頂点配列によるモデルの作成(四角形格子メッシュ形式)
2012年11月11日

円周率1万桁の計算(ガウス=ルジャンドル法)
2012年08月22日

2DCG用フレームワークの使用サンプル(アニメーション版)
2012年08月09日
  スポンサー リンク

  おすすめ / 人気のコーナー
フリーソフト
RINEARN では、インストール不要の各種解析ソフトを無償公開しています。Windows 8.1 で動作確認済み !
ピックアップ
【VCSSL実践講座】 3Dグラフ描画ツールを作ろう!
C言語系の簡易プログラミング言語「 VCSSL 」で、色々なものを作っていく連載記事コーナーです。現在は3Dグラフ描画ツールを開発中 !
2013年08月29日
【RINEARN CODE】 凸レンズを通過する波のシミュレーション
凸レンズ形状の高密度媒質を通過する、波のシミュレーションです。まっすぐ入射した波がレンズ通過時に屈折し、焦点へ収束する様子がアニメーションで楽しめます。
2013年03月15日
  新着情報
RSSフィード
RINEARN の新着・更新情報をRSSフィードで配信しています !
新着リスト
台形近似による数値積分

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

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

小数(浮動小数点数)を、適当な誤差の範囲内で、近い分数に変換するプログラムです。
2014年08月10日
ベクターソフトニュース様でリニアングラフ3Dをご紹介頂きました!

オンラインソフトウェア流通サイトVector様の「ベクターソフトニュース」コーナーにて、リニアングラフ3Dを取り上げて頂きました。
2014年07月31日
ユーザーが入力した数式を2次元グラフにプロットする

実行時にユーザーが入力した数式の値を、2次元グラフにプロットするサンプルプログラムです。
2013年11月30日
配列を3次元グラフにプロットする

座標値配列の内容を、3次元グラフにプロットするサンプルプログラムです。
2013年11月28日
配列を2次元グラフにプロットする

座標値配列の内容を、2次元グラフにプロットするサンプルプログラムです。
2013年11月28日
ファイルを3次元グラフにプロットする

座標値ファイルの内容を、3次元グラフにプロットするサンプルプログラムです。
2013年11月27日
ファイルを2次元グラフにプロットする

座標値ファイルの内容を、2次元グラフにプロットするサンプルプログラムです。
2013年11月26日
2013年の不具合修正情報

2013年1月〜12月に実施された不具合修正に関する情報を掲載しています。
2013年11月01日
3Dグラフ描画ツールを作ろう!〜第5回縮尺を自動調整する

VCSSL実践講座、3Dグラフ開発編。第5回では、最大最小値に応じて、縮尺を自動調整する処理を実装します。
2013年09月02日
3Dグラフ描画ツールを作ろう!〜第5回縮尺を自動調整する

VCSSL実践講座、3Dグラフ開発編。第5回では、最大最小値に応じて、縮尺を自動調整する処理を実装します。
2013年09月02日
  Twitter