========================= 方程式解析型関数描画プログラム。 エコグラム VER0.99。 ========================= 上梓 2002年12月中旬 作者 深山数臣 kaz_kimijima@livedoor.com 目次 1 このプログラムの特徴 2 動作環境 3 動作画面 4 実際の操作方法 5 配布条件 6 使用権限 7 作者の連絡先 8 論文:プログラムの動作原理の解説 −−−−− 1 このプログラムの特徴。 このプログラムは、入力された関数の式を解析し、そ の関数の任意の範囲をグラフとして描画するものです。 y=f(x)の形式で表現される陽関数のみに対応し ます。 2 動作環境 486以上のIBM/AT互換機で動作します。 プロセッサintel486SX以上。 :PENTIUM133以上推奨。(複雑な計算を精 密に行う場合は、セルロン以上の機種がよいでしょう。 ) メモリ32Mバイト以上。:64メガバイト以上推奨 。 ハードディスクの空き、数メガバイト程度の若干の領 域。 OS WIN3.1を除く全てのWINDOWSで動 作可能。 VISUALBASIC6.0のランタイムが別途必 要。 拙作マルチテキスト/WEEKCLNが動作する環境 ならば必要なランタイムDLLは導入されています。 MIYAMA.作のほかのプログラムの登録先。 kimijima.tripod.co.jp 3 動作画面。 まずはクリックして立ち上げてみて下さい。 ・関数解析フォーム ・−−−−−−−−−−−−−−−−−−−−−−−− | | 関数式入力窓 | | 関数式の第一次解釈窓(内部論理) | 関数式の第二次解釈窓(内部論理) | | 関数式入力窓:便宜上のエイリアス | 解析後の 単純演算x値入力窓 解析スタートボタン | 関数構造体 単純計算y値出力窓 グラフ画面を呼ぶ | 配列の一覧 終了ボタン 計算時にメッセージを表示しない | ・−−−−−−−−−−−−−−−−−−−−−−−− このフォームは方程式のかたちで入力された関数を関 このフォームは方程式のかたちで入力された関数を関 数評価簡易AIが解析し、ほかのフォームの論理がアク セス可能な形式として格納する機能です。 方程式の入力は最上階の入力窓でもしたの入力窓でも かまいません。 この論理は関数解釈時に途中経過をメッセージで表示 していましたので一時的にそのメッセージの表示をオフ にする機能選択チェックボックスが装備されています。 実際上は機能が自動的にオフになりますので経過メッ セージ表示させたい場合以外はこの機能を選択する必要 はありません。 関数入力窓に任意の方程式を入力し、解析ボタン FuncAnalysisを押し下すと関数が解釈され ます。 便宜上関数は3段階のプロセスを経て解釈されます。 解釈の結果、各合成関数のかっこの属性関係がみどり 色の深度レイヤー表示窓に表示表示表示されます。 入力を繰り返し行っていれば、勘の良い人ならばこの アルゴリズムがどのような論理で動作しているかがわか るかもしれません。 エラーが出なければ解釈は終了です。 注意: 入力窓に不適切な文字を入力するとメッセージが表示 され、その文字は表示されません。 入力が可能な文字は xと四則演算記号+−*/とべき乗^ 指数関数eと対数関数log:これは自然対数になり ます。 3種類の三角関数sin cos tan あとこれらの優先順位をくくるかっこ()だけです。 sec cosec cotは入力できません。 ・数値の入力はふつうに +123 と言うふうに行ってかまいません。 ただし、一番上位のかっこ階層で数値入力を行う場合 は (x−123) のように入力して下さい。 むきだしの数値入力を行うと自動的にその数値はかっこ で囲まれます。 またまえかっこと後ろかっこの総数が一致していない 場合は、その旨を警告するメッセージが表示されます。 (かっこの文字は危険なため危険なため危険なため強制 変更はされません。) また空かっこ()の入力はしないで下さい。 その形式の関数には入力変数xの値が代入されません 。 また多項式の入力には若干の配慮が必要です。 たとえば x^3−6x^2+12x−24 という3次関数を入力するときこのままの形式ではあ やまった解釈として解析されます。 この場合は (x^3)−(6(x^2))+(12*x)−24 と入力して下さい。。。 その理由は、解析構造が同一かっこ階層のばあい、 (......+.....*.....−.....^) と並んでいた場合、 演算は左端の加算記号から始まってしまいます。。。 べき乗や乗法演算の優先を解析する機能がこのプログ ラムには備わっていないからです。 同じかっこ内階層であれば、演算子は左から単純に評 価されて演算をされていきます。 ・関数描画フォーム ・−−−−−−−−−−−−−−−−−−−−−−− | グラフをクリア 関数定義フォームを呼ぶ この画面の終了 千回以上演算選択窓 表示値をグラフィックス座標に切り替え = グラフィックス 演算回数精度選択 描画曲線の色選択 | 描画画面 | 演算結果値の一覧窓 | | | | 演算用Xの範囲入力窓 | 演算ボタン | 描画用Yの範囲入力窓 | 描画ボタン | ・−−−−−−−−−−−−−−−−−−−−−−− 解析フォームで関数を解析した後、 CALLGRAPHボタンを押し下し、この画面を呼び出します。 呼び出した直後は グラフの色彩 水色 演算範囲 xはマイナス1からプラス1 解析フォームで関数を解析した後、 解析フォームで関数を解析した後、 演算結果 yの表示範囲はマイナス1からプラス1 演算精度 100演算ステップ 演算値表示窓 グラフィックウィンドウのピクセル座標値 このフォームの動作原理は 高速化するためあらかじめグラフの座標を一気に全て演算し、メ モリのなかに全て格納する方式を取っています。 100ステップなら100個、1万ステップなら1万の値をメモ リーに繰り返し演算次に演算時に格納してしまいます。 表示機能 値の一覧出力機能はそれぞれのボタンにより、格納された変数を 呼び出して行われます。 −−−−−− 実際の操作方法。 −−−−− 別に詳しく説明するより、操作したほうが理解しやす いと思われます。 y=cos(x)を描画する例 解析フォームのいちばん上の行に cos(x)と入 力して NOMSGCHKの四角にレ点を入れます。 そしてFuncAnalysisボタンを押し下すと 関数が分解されて複数の窓に表示されます。 これはこういう呪文だと思って下さい。 ----- 次に CALLGRAPHICSボタンを押してグラ フフォーム画面を呼び出し、 (xとyの範囲は初期値の−1と1のままでかまいま せん)。 UNDERCALCボタンを一回押し、 EXPRESSIONボタンを押すと グラフが描画されます(初期値の演算ステップは10 0演算です)。 このプログラムの 全ての三角関数はxにラジアンの値を要求するので、こ の場合のグラフはきれいなサインカーブにはなりません 。 PICTURECLEARボタンを押して、 画面を消去した後、 xの値を−3.14と3.14に変更し、 再びUNDERCALCとEXPRESSIONを押 すと今度は周期1のきれいなサインカーブが表示されま す。 ここでステップを細かくしてもっとなめらかな演算を します。 DOT1000チェックボックスをクリックすると、 演算ステップ表示窓が表示されます。 ステップは1000のままでふたたび UNDERCALCと EXPRESSIONを押すと、 さらになめらかなサインカーブが表示されます。 演算ステップ表示窓の値は1万まで増加設設定可能で す。 *グラフが表示できない場合。 関数出力yの値が表示指定で表された範囲内に存在して いないことが考えられます。 ステップを100ステップに戻し、 YDOTチェックボックスをOFFにして もう一度演算と表示を行い、 演算結果出力窓を押してみて下さい。 yの値が指定している範囲よりも外側にある場合はyの 表示範囲を広く取ってみて下さい。 −−−−− 一般の操作手順もこれと変わりません。 解析エラーのメッセージが出ないかぎり、どんな複合 関数も解析できます。 またグラフィックフォームの xとyの値を操作し直すと、 グラフの描画範囲が変わります。 演算結果出力窓を動作させるボタンは同時に演算結果 を外部テキストファイルCALCOUT.TXTとして 出力します。 VBが提供する表示テキストボックスはおおむね32 キロバイト以上の表示は出来ないことになっているので 、 ステップが1000回以上の場合は、演算値はテキスト ファイルへの出力のみとなるように作成されています。 −−−−− 操作をあやまってプログラムが無限ループにおちいっ た場合には alt+cntl+delキー同時押しでこのプログ ラムそのものを強制終了させて下さい。 −−−−− 5 配布条件 アーカイブECOGRA99.EXEの内容を改変し ないかぎり、常識の範囲内で自由に配布していただいて かまいません。 6 使用条件 使用する方は一人につき以下の金額を次の口座に振り 込んでください。 一口 5000円 東京三菱銀行 池袋東口支店 普通 0005−173−0877927 名義人 君島一基。 6−1 ソースコードについて。 学術論文を公開するのと同じ趣旨においてこのプログ ラムのソースコードを公開します。 公的研究機関あるいは学校施設の職員や学生が基礎研 究並びに社会資本整備にかかわる目的でこのソースコー ドを二次利用する場合、作者MIYAMA.はその使用を制限 しません。 受験勉強の教材として使用することもそれは含みます が、営利産業としての私学、並びに受験予備校でのソー スコードの二次使用はその利用形態によっては制限が発 生することがあります。 基本的には、ソースコードも、実行ファイルにおいて も、 使用者一人につき5000円の使用料が発生いたしま す。 ソースコード経由で使用者が二次的に発生した場合で も基本的には使用料が発生したとみなしたいところです が、 ここのところは日本国著作権法の二次的著作物の扱い に準じることにします。 営利企業が製品として商用目的でこのソースコードを 利用することはこのかぎりではありません。 ご注意下さい。 7 作者の連絡先 メール kaz_kimijima@livedoor.com URL kimijima.tripod.co.jp (多忙につき基本的に返事は出しておりません。ご容 赦下さい。) 8 動作原理(論文)。 2002年12月15日。 ===== このプログラムの動作中央原理の実際。 このプログラムは文字列として入力された方程式をプログラムの 繰り返し内部形式が演算として認識できる形に変換することが、最 も重要なコアになっているところのものです。 その実際。 具体的には、 1 重要なところは、方程式の「かっこの構造である」と言うと ころに着目し、 カッコをシンボルとした構造体の配列として、入力された文字列 形式である関数方程式を動的に定義し確保することととなっていま す。 さらに具体的には、 1 関数文字列をカッコの従属属性に変換分解し、 2 それぞれの「前」カッコ除く生としてそれらの関数方程式の 全ての要素として格納するして代入します。 −−−−−− たとえば、 y=・F1(・F2(・F3(x))・F4(x)・F5(x)・F6(x))・F7(x) 注意:・は加減乗除のような演算子。 と言う関数は括弧の階層属性として、 (((())()())() と言う形式に分解され、 これは次の図のような論理深度形式に展開されます。
この図は上方がより上位の括弧、加法がより下方の括弧として表現 されています。 これらの論理構造は、 それぞれの質点が入力方程式の、前かっこの位置に相当し、それぞ れの前かっこの従属関係はその前括弧が配列構造体属性として所持 している「深度変数」によって決定されます。 このプログラムは、 それぞれの「前かっこ複合変数」の「順位番号」とこの深度変数に より、複雑な演算優先順位決定を振り分けています。 前括弧構造体配列の属性は、 配列変数=index 深度=depth 繰り込み種類演算子=enzanshi 自己演算決定種類=funckind 被代入変数値実数=buf 未演算フラッグ=open と決定されています。 ーーーーーーーーーーーーーー これらの論理は、以下の原則で動作しています。 --------------------------- A 演算終了後の処理 自分が演算終了したら、オープンパラメータをクローズして、逐 次処理から自らの存在を見えないようにする。 B 演算実行の手順 自分が演算するように上位論理から支持を受け、演算結果の数値 は配列上自分の前方、もっとも近い演算のオープンしている一つ上 の階層のバッファに対し、自分の定義で宣言されている演算子の演 算の形式で繰り込み代入を行う。 C 次の演算のための処理 自分が演算をした場合には配列インデックスはナンバー1番目か ら再びシーケンシャルに順番を加算する。 D 演算候補構造体の順番探索1:オープン属性による探索 インデックスを1づつ加算し、それぞれの次のインデックスが指 示する前括弧構造体の演算準備オープンパラメータがクローズ=FA LSEの場合は無視してインデックスを一つ次に進める。 E 演算候補構造体の順番探索2:深度属性による探索・次が下 位なら次へ 進めたそのインデックスがオープンである場合、次のオ ープン属性インデックスが深度階層上自分よりも下位に属する場合 には、自分の演算を無視して、条件判断論理をその次の下位のオー プンのインデックスに順位変数を加算することにより引き渡す。 F 演算候補構造体の順番探索3:深度属性による探索・次項が 平行位なら演算 また、次にあたるオープン属性のインデックスが自分と同じ深度 階層に属する場合は、自分を演算して上位バッファに繰り込み、か つみずからのオープンの属性をクローズしてに論理全体から自らの 存在を消す。 G 演算候補構造体の順番探索4:深度属性による探索・次項が 上位なら演算 また自分が次のインデックスに比べてより階層的に下位ならば同 じく自ら演算して繰り込みクローズする。 H 演算候補構造体の順番探索5:最終項は無条件演算。 正当に演算してきて自分が最後のオープン構造体である場合は 自分を演算します。 これらは実際には以下の例のように動作します。 −−−−−u 凡例
この論理は必ず1番の構造体から繰り返し演算を行います。
インデックス1番の構造体は、次が自分よりも下位になるので 原則論理 Eによって自らの演算を無視して次に向かいます。
次の構造体2番も、次が自分よりも下なので次のインデックスに進 みます。
インデックス3番で初めて演算該当条件 自分が前の階層と同じか なおかつしたに位置しまた同時に次の構造体が自分よりも上にある と言う条件 Gに該当するので自らのバッファを演算し、もっとも 近くなおかつ一つ上位のオープンされている構造体インデックス2 番に繰り込み代入します。また自らはクローズされるため、以降の 論理の流れからインデックス3番のバッファは論理上見えなくなり ます。 手順Cによりインデックス1番から再び条件を吟味します。
インデックス2番は論理条件Fに該当。 手順Cより再びインデックス1番から条件を吟味します。
第4構造体から第5構造体まで、、、 「次が自分と同じ階層でなおかつオープンされている場合」という 条件Fに該当するので演算して第1バッファに繰り込み演算を行い ます。。 手順Cにより再びインデックス1番から条件を吟味します。
![]()
第6構造体のときのみ 次が自分より上位という条件Gに該当しま す。これも自らを演算して第1構造体のバッファに繰り込みます。 手順Cにより再びインデックス1番から条件を吟味します。
この場合は次が自分と同じ階層論理により第1バッファを演算しま す。 手順Cにより再びインデックス1番より条件を吟味します。
順次正当に処理をしてきて、自分が最後のオープン状態の構造体で あるとき、、、条件Hに相当するので、演算して繰り込みます。 手順Cにより再びインデックス1番より処理条件を吟味します。
自分が順番インデックス0であり、自分より後ろ全ての構造体が全 てクローズ状態になったとき、このインデックス0番関数演算ロジ ックとして呼び出された論理に渡して出力します。 以上で繰り返し処理が終了し、 ほかのプロセスから求められたこの複雑な関数処理は終了します。 ======