株式会社オメガシミュレーション

EQUATRAN-G - TRIAL -

EQUATRAN-G 文法

ここに提示してあるのは、EQUATRAN-G の文法のエッセンスです。 このほかにユーザー関数機能などがあります。


基本事項

● 使用する文字
・英字         A B C ... X Y Z a b c ... x y z _
・数字         0 1 2 3 4 5 6 7 8 9
・特殊文字     + - * / ^ = , . ; : <> ( ) [ ] % & | ! # $ ' ~
・漢字、かな   ( コメント文および変数の説明項のみ使用可 )
● シンボル

変数、ラベル、パラメータ、テーブルなどを区別する文字列。英字で始まる 8文字以内の英数字をつける。大文字と小文字は区別する。
ただし、次の予約語はシンボルとして用いることができない。

ALLI BREAK BY CALL CHANGE END EXTERNAL FIND FUNCTION GLOBAL INCLUDE 
INITIAL INPUT INTEGRAL LOCAL MACRO MAXIMAIZE MAXLOOP MINIMIZE OUTPUT 
OUTPUT1 OUTPUT2 REPEAT RESET REV STEP TABLE TREND UNDER UNTIL 
VAR VARIABLE WHEN

● 変数

2次元までの配列変数を使用でき、VARIABLE 文で定義しておく。 ↓変数定義

● 定数

定数はすべて実定数として扱われる. 指数部は E を用いて表記する。

例  123 4.567 -5.12 -1.7012E38 794.26e-5

実数の範囲は 約 ±1.0e-307 〜 1.0e308

● 文

ソーステキスト、及びデータテキストは文の集まりで構成され、1つの式も1つの文を成す。


●継続

文が2行以上にわたるときは、前の文の最後に継続記号[ .. ] をつける. ただし、1つの文は最大 2000 文字まで。

例  p = -2.0 * x ^ 2 + 0.5 * x * y .. -0.8 * y ^ 2 + 4 * x - y


●マルチステートメント


文と文の間をセミコロン[ ; ] で区切ることで1行に2つ以上の文を書いてもよい。

例  z + 3 = y ; x = y - 2.1 * z ; y - x / 6 = z


● 行番号

ソーステキストやデータテキストに付けられる通し番号。

● 文番号

コンパイル時に各文に付けられる番号。 $ を頭に冠した3桁の数字(行番号)より成る。ソースリスト-1により各文と対応を取ることができる。

● コメント

テキストの随所に /* と */ ではさんだコメントをいれることができる。ただしテキストの1行目はそのままプリント等の頭に出力されるので、
その問題のタイトルやコメントを書いておく。コメントには漢字やかなも使用できる。

式の記述

方程式の記述は通常の数学的な記法に準じ、移項の必要はない。

・算術演算子 優先順に  べき乗 [ ^ ]
             乗算  [ * ]   除算  [ / ]
             加算  [ + ]   減算  [ - ]
  演算の実行順序を変更する時はカッコ ( ) を用いる.
  
・関係演算子  ↓論理演算
    [ == ]  [ != ]  [ <] [> ]  [ <= ] [>= ]
    
・論理演算子  ↓論理演算
    優先順に  [ ! ]  [ & ]  [ | ]
  優先順序は 算術演算子、関係演算子、論理演算子の順である。
    
● 常微分方程式

変数の微分は微分記号[ ' ] を使って y', y'' のように書く. y', y'' は y と は別個の変数となる。

● #式

被積分変数に初期値を与える。 例  y # 10

● ラベル

文を区別するのに使われるシンボル。コロン[ : ] を後ろにつけて文の前に置く。おもに RESET文で式を指定するのに使われる。

変数定義

使用する変数はその名前とその属性 ( スカラー変数か配列変数か ) とを
VARIABLE文によって定義しておく必要がある。ただし、スカラー変数は省略できる。
    例  VARIABLE   t = 28  "温度  [゜C]",   dog(5)
        VAR        c(10,20)
        GLOBAL VAR gc

        t    ... スカラー変数
                 t = 28 は t に 28 を与える
                 "温度  [゜C]" は説明項で、40文字以内で与える
        dog  ... 要素数 5 の1次元の配列変数
                       dog(1) dog(2) ... dog(5)
        c    ... 要素数 10 × 20 の2次元の配列変数
                       c(1,1)  c(1,2)  c(1,3)  ・・・ c(1,20)
                       c(2,1)  c(2,2)  c(2,3)  ・・・ c(2,20)
                          ・       ・       ・           ・
                          ・       ・       ・           ・
                       c(10,1) c(10,2) c(10,3) ・・・ c(10,20)
        GLOBAL を付けることで、大域変数を定義している。

配列変数・定数の表記

● 配列変数の定義

配列変数は VARIABLE文によってあらかじめ定義しておく必要がある。 ↑変数定義

● 配列の要素と部分配列
VAR a(3,2), b(5) と定義されている時
         a(1,2)                               スカラー変数
         b(2)                                     〃
添字の省略    a(2)      ( a(2,1), a(2,2) )         1次元の配列変数
    〃    a(,2)     ( a(1,2), a(2,2), a(3,2) )     〃
[ . ]    b(1.3.5)  ( b(1), b(3), b(5) )           〃
[ : ]    b(2:4)    ( b(2), b(3), b(4) )           〃
    
● 二次元配列の転置

a~ は配列変数 a を転置した要素数 2 × 3 の二次元の配列を表す。
a~(2,1) と a(1,2) は同じ変数をさす。

● 配列定数

1次元 ( 0.125, 1.52, 3.81 )
2次元 ( 0.1, 0.2 )( 0.3, 0.5 )( 0.9, 1.2 )

配列変数の演算

● 配列変数の演算
VAR   a(3), b(3), c(2,3), d(2,3)

a - b      ( a(1)-b(1), a(2)-b(2), a(3)-b(3) )

c * d      |  c(1,1)*d(1,1), c(1,2)*d(1,2), c(1,3)*d(1,3)  |
           |  c(2,1)*d(2,1), c(2,2)*d(2,2), c(2,3)*d(2,3)  |
● 次元の拡張

次元の異なる変数どうしの演算は、次元の低い方の変数を高い方の次元まで拡張して行われる。

VAR   a(3), c(2,3), d(2,3), x
 
a * x      ( a(1)*x, a(2)*x, a(3)*x )
 
a - c      |  a(1)-c(1,1), a(2)-c(1,2), a(3)-c(1,3)  |
           |  a(1)-c(2,1), a(2)-c(2,2), a(3)-c(2,3)  |
 
c / d(2,1) |  c(1,1)/d(2,1), c(1,2)/d(2,1), c(1,3)/d(2,1)  |
           |  c(2,1)/d(2,1), c(2,2)/d(2,1), c(2,3)/d(2,1)  |

入力

● INPUT文

変数に計算実行時に対話形式で入力するか、データテキストから読み込むことで値を与えることを指定する。
配列変数名を添字なしで与えると、定義されているすべての要素の入力となる。

例  INPUT x, y(3,2), ABC(5)

● INITIAL文

変数に積分の初期値を入力することを指定する。使い方は INPUT文に準ずる。
INITIAL ALLI はすべての被積分変数の初期値を添字なしの形で入力することを指定する。

例  INITIAL p, s(3)
initial ALLI

出力

計算結果を出力する変数を指定するのに OUTPUT文、OUTPUT1文、OUTPUT2文を用いる。

● OUTPUT文

画面、プリンタあるいは一時ファイルへの出力を指定する。

例  OUTPUT x, y, a(3)

● OUTPUT1文、OUTPUT2文

リザルトファイル1 および リザルトファイル2 への出力を指定する。

配列変数名を添字なしで与えると定義されているすべての要素が表示される。また、変数名に ALLI を指定するとすべての被積分変数の値が出力される。積分計算時に STEP 項を加えると周期的な出力が行われる

例  OUTPUT1 t, x STEP 0.1

論理演算

● 論理値

論理値を表わすのに実数値を用い、真は 1.0 偽は 0.0 で表す。また、正の実数は真とみなし、0 および負の実数は偽とみなされる。

● 演算子
・関係演算子
    等しい     [ == ]     等しくない   [ != ]
    小さい     [ <  ]     大きい     [ >  ]
    小さいか等しい [ <= ]     大きいか等しい [ >= ]

・論理演算子
    否定      [ ! ] 
    論理積     [ & ]      論理和     [ | ]
● 論理演算

論理演算に限って、ユーザーが記述したままの順序で演算が実行される. また、論理値に対して符号やあるいは算術演算子を適用する場合は、組み込み関数 IF を用いた方がわかりやすい。

例  cond = IF( a>b+c & d<=0 ) また、関係演算子は続けて使ってはならない。

例  × 0 < x <=2.7>
○ 0 < x & x <=2.7>

条件付きの式

関数の形が独立変数の値の範囲によって変わる場合の式の記述。
例えば

        0.5 x + b  ( x > 1.0 )
y = {   0.8        ( 1.0 >= x >= 0 )
       -0.2 x + c  ( x <0 ) は y=0.5 * x + b WHEN x> 1.0  ..
  =  0.8            WHEN  x <= 1.0 & x>= 0  ..
  = -0.2 * x + c    WHEN  x <0 のように書く.

組み込み関数

                              三角関数の引数はラジアン

exp( x )   : 指数      |  loge( x )  : 自然対数
exp10( x ) : 10 ^ x     |  log10( x ) : 常用対数
sqre( x )  : x ^ 2      |  sqrt( x )  : 平方根
                     |
sin( x )   : 正弦           |  asin( x )  : 逆正弦
cos( x )   : 余弦           |  acos( x )  : 逆余弦
tan( x )   : 正接           |  atan( x )  : 逆正接
                     |
sinh( x )  : 双曲線正弦   |  asinh( x ) : 双曲線逆正弦
cosh( x )  : 双曲線余弦   |  acosh( x ) : 双曲線逆余弦
tanh( x )  : 双曲線正接   |  atanh( x ) : 双曲線逆正接
                     |
sum( y )   : 配列変数の総和 |  int( x )   : 整数値に切り捨て
prod( y )  : 配列変数の総積 |  mod( x, y ): x / y の剰余
max(a,b,..): 最大の変数値  |  sign( x )  : 符号の取り出し
min(a,b,..): 最小の変数値  |  if( x )    : 論理値化
maxof( y ) : 配列の最大要素 |  abs( x )   : 絶対値
minof( y ) : 配列の最小要素 |

数表

関数関係を数表によって与える。例えば

    +-----+------------------------------------+
    |  x  | 1.0   1.5   2.0   3.0   4.0   6.0  |
    +-----+------------------------------------+
    |  y  | 0.38  0.36  0.34  0.28  0.21  0.14 |
    +-----+------------------------------------+
は
    VAR  x(6), y(6)
    TABLE  y = tab1( x ) REV
        x = ( 1.0,  1.5,  2.0,  3.0,  4.0,  6.0  )
        y = ( 0.38, 0.36, 0.34, 0.28, 0.21, 0.14 )

のように定義し、方程式の中で

    p - 1 = tab1( a ) + 3 * c
のように一種の関数として引用する.

なお、TABLE文 の REV は数表の逆引きを可能とする指定である。この例は引数が1つの場合であるが2つまで書くことができる。

繰り返し収束計算

非線形連立方程式は解くためには繰り返し収束計算が必要である。ある未知変数にある値を仮定して計算し、ある式の両辺が等しくなるように繰り返し計算をする。この時の変数と式の組を指定するためにRESET文 を用いる。

例  eq1: ( x + 0.3 )^ 2 - sin( x ) = 10
RESET x # 1 [0,100] BY eq1 UNTIL 0.01%

この例は未知数 x ( 初期値 1、下限値 0、上限値 100 ) を仮定して方程式 eq1 ( ラベルによる指定 )が成り立つまで収束計算するよう指定し、収束精度を 0.01% としている。初期値、下限値、上限値、収束精度は省略でき、その時は default値 が使われる。
RESET文による指定がない場合や不足している場合は、自動的にこの組み合わせが追加される。

最適化計算

ある変数( 目的関数 )の値を最大、あるいは最小とする独立変数の値を決定する最適化問題を扱う場合、以下のように FIND文 で指定する。
また、解の存在範囲に制約条件をつけることができる。独立変数の数は複数でもよいが、10個まで。

例  FIND ( x # 1 [0,20], y # 1 [0,20] ) ..
MINIMIZE p UNDER cond UNTIL 0.5%
p = 3*x^2 + 3*y^2 + 2*x*y - 10*x - 50*x + 330
cond = IF( x + y <20 ) x ( 下限値 0、上限値 20、初期値 1 ) および y ( 同じく )の値を x + y < 20 の条件の下で p を最小にするように決めることを表し、その収束精度を 0.5% としている。  なお、下限値、上限値、初期値、収束精度は省略でき、その時は default 値が使われる。  また、制約条件がない時は UNDER の指定を省略する。

積分計算

微分方程式を含む問題で積分計算を指定するには INTEGRAL文 を用いる。

例  INTEGRAL t[0,50] STEP 0.1 BY RKV BREAK ok
ok = t > t_next

この例は積分の独立変数に t を指定し、0 から 50 まで積分キザミ 0.1 で積分 計算することを指定している。
BY項 は積分手法を指定するもので、次のいずれか を選ぶ。省略時には RKF がとられる。

RKF ... 4次のルンゲクッタ法(固定キザミ)
RKV ... 4次のルンゲクッタ法(可変キザミ)
EUL ... オイラー法

BREAK項は積分の中断条件を与えるもので、okが真になったら中断する。中断する条件がなければ省略する。

繰り返し計算(積分機能による)

微分方程式を含まない問題で繰り返し計算をさせるとき REPEAT文 を用いる。

例  y = a*x^3 + b*x^2 + c*x + d
REPEAT x[0,10] STEP 0.5

この例は x を 0 から 10 まで 0.5 キザミで変化させながら繰り返し計算を行うことを指定している。

積分トレンド表示

積分過程のトレンド表示出力を指定するのに TREND文 を用いる。

例  TREND x, y STEP 0.1

この例は x と y の値を積分の 0.1 キザミに表示することを指定している。表示できる変数の数は最大 20 まで。配列変数が含まれる場合はその要素数の合計が最大 20 まで。

例  TREND s[0,10], s'[-5,5]

トレンド表示をキャラクタグラフで行う場合は、この例のように変数名の後にグラフの表示範囲を [ ] で囲んで与える。 ただし、全ての変数に対して表示範囲を指定した場合にのみキャラクタグラフが得られる。 STEP項を省略すると INTEGRAL文 で指定した積分のキザミ幅毎に表示が行われる。

パラメータ

ソーステキスト中の任意のシンボルを、別の記述 (定数、変数名などの記述) によって置き換える機能。  ソーステキスト全体に対して有効な GLOBAL パラメータ と、ひとつのマクロ内やメイン内の文に対してのみ有効な LOCAL パラメータ とがある。

例  LOCAL N = 5, parm = 0.5*x
VAR a(N), b(N), c(N+2)
a(2:N) = b(1:N-1) + parm

は次の内容を意味している。

VAR a(5), b(5), c(7)
a(2:5) = b(1:4) + 0.5*x

マクロ

繰り返し使われるような式の一群をまとめたものに名前をつけておき、その名前によって随時その式群を呼び出す機能。
マクロは、次のような時に使うと便利。

  • 類似の式群が繰り返し現れる問題では、これをマクロとしておき必要な都度呼び出せば、繰り返し書く煩雑さが避けられる。
  • よく使われる式群をマクロとしてあらかじめ用意しておき、新しい問題を記述する時にこれを利用する。

マクロは CALL文によって呼び出すと、その CALL文の代わりにマクロの式群がその位置にそっくり挿入されることになる。また、この際マクロ内の任意のシンボル ( 変数名など ) を、マクロを CALLする時のパラメータ指定によって適宜変更することが可能。

例  マクロの定義   MACRO mname
a^2 - 3*a*b + 2*b = 12
END mname
マクロのコール  label: CALL mname( a = 10, b = x )