[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2. 微分

2.1 微分に関する諸定義  


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.1 微分に関する諸定義

関数: ANTID (G,X,U(X))
任意の未割り当ての関数とその導関数を含む式の積分を評価するルーチン。 LOAD(ANTID);で使える。この後に関数ANTIDIFFが使える。例えば、 ANTIDIFF(G,X,U(X)); ここでGはU(X)(U(X)は任意)とその微分を含む式で、Xによる 積分が求めるものである。関数NONZEROANDFREEOFとLINEARもANTIDと同様に 定義される。ANTIDはANTIDIFFと同様だが、二つの成分のリストを返す点で異なり、 そのリストの最初の成分は式を積分したもので、二番目の成分は残りの微分不能な 成分である。

関数: ANTIDIFF -
ANTIDを見よ。

属性: ATOMGRAD
- 式の原子による勾配属性。GRADEFで設定してよい。

関数: ATVALUE (form, list, value)
利用者がlistで指定した点での境界値valueをformに割り当てる。

 
(C1) ATVALUE(F(X,Y),[X=0,Y=1],A**2)$
(C2) F(0,1);
                                       2
(D2)                                  A

formは関数f(v1,v2,...)か、導関数DIFF(f(v1,v2,...),vi,ni,vj,ni,...)(niはviに よる微分の階数)で、その引数の中で明示的に現れるものでなければならない。

等式のリストは値が与えられた"境界"を定める;listは方程式のリストか、上述の 様に単一の方程式vi=exprでも良い。ATVALUEが表示された時に、記号@1,@2,...は 関数変数v1,v2,....を表現する為に用いられる。 PRINTPROPS([f1,f2,...],ATVALUE)は、ATVALUE関数を用いて以前指定された関数f1, f2,...のATVALUEを表示する。もしリストが丁度一つの元のみを含むのであれば、 その元はリストを外して与えられる。第一の引数にALLが与えられると、全ての関数の 持つATVALUEが表示される。例はEXAMPLE(ATVALUE);を実行せよ。

 
(* 訳者注:
関数F(X,Y)に対し、(0,2),(0,1)に境界値を各々A^2,B^3を設定してPRINTPROSを実行。
ATVALUEを実行した後のPRINTPROSに注目。
(C1)  ATVALUE(F(X,Y),[X=0,Y=2],A**2);

                                       2
(D1)                                  A
(C2)  ATVALUE(F(X,Y),[X=0,Y=1],B**3);

                                       3
(D2)                                  B
(C3) PRINTPROPS([F],ATVALUE);

                                            3
                                 F(0, 1) = B

                                            2
                                 F(0, 2) = A

(D3)                                 DONE
(C4)  ATVALUE(F(X,Y),[X=0,Y=-1],C**4);

                                       4
(D4)                                  C
(C5)  PRINTPROPS([F],ATVALUE);

                                             4
                                F(0, - 1) = C

                                            3
                                 F(0, 1) = B

                                            2
                                 F(0, 2) = A

(D5)                                 DONE
(C6) ATVALUE(G(X),[X=1],2);

(D6)                                   2
(C7)  PRINTPROPS(ALL,ATVALUE);

                                             4
                                F(0, - 1) = C

                                            3
                                 F(0, 1) = B

                                            2
                                 F(0, 2) = A

                                   G(1) = 2

(D7)                                DONE
(C8) PRINTPROPS([G],ATVALUE);

                                   G(1) = 2

(D8)                                DONE
(C8) 

*)

関数: CARTAN -
微分形式の外積はElie Cartanにより発展した微分幾何学の基本的な道具で、偏微分 方程式論でも重要な適用事例を持つ。現行の実装はF.B.EstabrookとW.H.Wahlquist による。プログラムは自己説明的なものであり、batch("cartan");を実行すれば 使える。又、例題付きの説明もある。

関数: DELTA (t)
これはDiracのデルタ関数である。現在、LAPLACEのみがデルタ関数を認識している。

 
(C1) LAPLACE(DELTA(T-A)*SIN(B*T),T,S);
Is A positive, negative or zero?
POS;
                                          - A S
(D1)                           SIN(A B) %E

(*訳者注:
変数Aに関して何らの仮定や割り当てが無い為に、
"Is A positive, negative or zero?"と聞いている。
例えば、assumeを用いてA<0と仮定した場合を以下に示す:
(C1) assume(A<0);

(D1)                                [A < 0]
(C2) LAPLACE(DELTA(T-A)*SIN(B*T),T,S);

(D2)                                   0

この様にAに関して仮定があれば、LAPLACEで尋ねられる事が無い。

*)

変数: DEPENDENCIES
デフォルト値:[] - 関数の依存性(DEPENDSかGRADEF関数によって設定される)を持つ 原子のリスト。DEPENDENCIES命令はDEPENDS命令で置き換えられている。 DESCRIBE(DEPENDS);を実行せよ。

関数: DEPENDS (funlist1,varlist1,funlist2,varlist2,...)
DIFFで用いる変数に対し、関数の従属性を宣言する。

 
(* 訳者注:

お馬鹿な例として、何でもない原子nekoをtamaとmikeに依存する関数にする;

(C1) depends(neko,[tama,mike]);

(D1)                          [neko(tama, mike)]
(C2) diff(neko,tama);

                                     dneko
(D2)                                 -----
                                     dtama
(C3) diff(diff(neko,tama),mike);

                                     2
                                    d neko
(D3)                              -----------
                                  dmike dtama

勿論、dependsを実行していなければ、diffで0になる。dependsでnekoが。tamaとmike
を変数とする関数と宣言した為に、微分を行っても零にならない。

*)

 
DEPENDS([F,G],[X,Y],[R,S],[U,V,W],U,T)
で、FとGがXとYに、RとSがU,VとWに依存し、UがTに従属する事をDIFFに伝える。 DEPENDSへの引数は評価される。各funclistの変数は次のvarlistの全ての変数に依存 する事が宣言される。funlistは原子変数か配列名を含む事が可能である。後者の場合、 配列の全ての要素は後に続くvarlistに含まれる全ての変数に依存すると仮定される。 最初、DIFF(F,X)は0であるが、DEPENDS(F,X)を実行すると、その後のXに対するFの 微分はdF/dXかY(DERIVABBREV:TRUEであれば)となる。

 
(C1) DEPENDS([F,G],[X,Y],[R,S],[U,V,W],U,T);
(D1)           [F(X, Y), G(X, Y), R(U, V, W), S(U, V, W), U(T)]
(C2) DEPENDENCIES;
(D2)           [F(X, Y), G(X, Y), R(U, V, W), S(U, V, W), U(T)]
(C3) DIFF(R.S,U);
                               dR           dS
(D3)                           -- . S + R . --
                               dU           dU

MACSYMAは記号微分で合成関数の微分公式を認識しており、次の様に与えられた 従属性を活用する。

 
(C4) DIFF(R.S,T);
                           dR dU             dS dU
(D4)                      (-- --) . S + R . (-- --)
                           dU dT             dU dT
もしも、

(C5) DERIVABBREV:TRUE;
(D5)                                 TRUE

と設定していると、命令C4を再実行すれば次を得る

(C6) ''C4;
(D6)                      (R  U ) . S + R . (S  U )
                            U  T              U  T

以前宣言した従属性を削除する為にREMOVE命令が使える。例えば、C1で宣言した様に RがUに最早従属していない事を宣言する場合、利用者は以下の入力を行なう。

 
REMOVE(R,DEPENDENCY)

これでRに対して宣言された全ての従属性が消去される。

 
(C7) REMOVE(R,DEPENDENCY);
(D7)                                 DONE
(C8) ''C4;
(D8)                             R . (S  U )
                                  U    T

注意: DIFFはMACSYMAだけの命令で、DEPENDENCIESに設定された情報を用いる。 積分、Laplace変換等に対する引数は、例えば、INTEGRATE(F(X),X)の様に、それらの 従属性を命令の中で明示的に与えなければならない。

変数: DERIVABBREV
デフォルト値:[FALSE] - TRUEであれば、微分は下添字として表示される。

 
(* 訳者注:

(C1) diff(f(x),x);

                                   d
(D1)                              -- (f(x))
                                   dx

(C2) DERIVABBREV:TRUE;

(D2)                                TRUE
(C3) diff(f(x),x);

(D3)                                f(x)
                                         x
この様に表示される事を意味するだけ。

*)

関数: DERIVDEGREE (exp, dv, iv)
expの中の独立変数ivに対する従属変数dvの微分で最も高い階数を見付ける。
 
(C1) 'DIFF(Y,X,2)+'DIFF(Y,Z,3)*2+'DIFF(Y,X)*X**2$
(C2) DERIVDEGREE(%,Y,X);
(D2)                           2

(* 訳者注:

名詞型の入力に対して最高の階数を探す。ここで、名詞型で入力していなければ、
評価された式で返される為に希望する値が返ってこないので注意せよ。

*)

関数: DERIVLIST (var1,...,vark)
EV命令内部では、これで指定した変数に対してのみ微分される。

変数: DERIVSUBST
デフォルト値:[FALSE] - 次の様な非構文的な代入制御を行う。
 
SUBST(X,'DIFF(Y,T),'DIFF(Y,T,2));
DERIVSUBSTがTRUEであれば、結果は'DIFF(X,T)となる。

 
(*訳者注:

(C1) SUBST(X,'DIFF(Y,T),'DIFF(Y,T,2));

                                       2
                                      d Y
(D1)                                  ---
                                        2
                                      dT

この様に、'DIFF(Y,T,2)(='DIFF('DIFF(Y,T),T))のDIFF(Y,T)をXで置き換えたいが、
DERIVSUBST:TRUEでないと叶わない。
そこで、

(C2) derivsubst:true;

(D2)                                 TRUE

とすれば、この代入処理の結果が目的通りに、

(C3) SUBST(X,'DIFF(Y,T),'DIFF(Y,T,2));

                                      dX
(D3)                                  --
                                      dT

となる。
*)

特殊記号: DIFF
[flag] EVへの[flag]はexpで指定された全ての微分が実行される原因となる。

関数: DIFF (exp, v1, n1, v2, n2, ...)

DIFFは各viで各々ni階のexpの微分を行う。1変数による1階微分が望ましければ、 DIFF(exp,v)の書式で良い。関数の名詞型が要求される場合(例えば、微分方程式を 記述する時の様に)、'DIFFを用いなければならず、表示は二次元的 (プリティプリント)書式となる。DERIVEABBREV[FALSE]がTRUEであれば、微分は 下添字として表示される。 DIFF(exp)は"全微分"を与える、つまり、expの各変数に 対する微分とその変数の関数のDELとの積の和である。DELのこれ以上の簡易化は提供 されていない。

 
(* 訳者注: 

diff(sin(x*y));を実行するとx COS(x y) DEL(y) + y COS(x y) DEL(x)となる。

*)

 
(C1) DIFF(EXP(F(X)),X,2);
                             2
                      F(X)  d             F(X)  d         2
(D1)                %E     (--- F(X)) + %E     (-- (F(X)))
                              2                 dX
                            dX
(C2) DERIVABBREV:TRUE$
(C3) 'INTEGRATE(F(X,Y),Y,G(X),H(X));
                                H(X)
                               /
                               [
(D3)                           I     F(X, Y) dY
                               ]
                               /
                                G(X)
(C4) DIFF(%,X);
            H(X)
           /
           [
(D4)       I     F(X, Y)  dY + F(X, H(X)) H(X)  - F(X, G(X)) G(X)
           ]            X                     X                  X
           /
            G(X)

テンソルパッケージ向けには、以下の改変が含まれている。

関数: DSCALAR (関数)
スカラ値関数に対し、スカラのd'Alembertの演算子を作用させる。
 
(C41) DEPENDENCIES(FIELD(R));
(D41)                           [FIELD(R)]
(C42) DSCALAR(FIELD);
(D43)
    -M
  %E  ((FIELD  N - FIELD  M + 2 FIELD   ) R + 4 FIELD )
             R  R       R  R         R R             R

- -----------------------------------------------------
                             2 R

関数: EXPRESS (expression)
結果はベクトルの微分演算子の展開から得られる任意の微分の名詞型を用いる。 これらの微分の評価を強制的に行う為、組み込みの関数DEPENDSで任意の新しい隠れた 従属性を設定した後、組み込みのEV関数を評価フラグ(evflag)のDIFFと一緒に用いる 事が可能である。

関数: GENDIFF
DIFF(E,X,N)はNが記号であっても縮約され得る事がある。

Maxima-5.9preよりも前であれば、
 
batch("gendif.mc")$
で、Maxima-5.9pre以上では
 
batch("gendif.mac")$
を実行し、次の例のDIFFをGENDIFFで置き換えて実行してみよ。

 
DIFF(%E^(A*X),X,Q)

評価出来ない項目は括られて返される。幾つかの項目は"GENFACT"の項にあり、それら を参照せよ。

 
(* 訳者注:

(C31) DIFF(%E^(A*X),X,Q);
                                   Q
                                  d      A X
(D31)                             --- (%E   )
                                    Q
                                  dX
(C32) GENDIFF(%E^(A*X),X,Q);
                                    Q   A X
(D32)                              A  %E
(C33) 

この例では、最初のDIFFでは式をそのまま名詞型で返すが、GENDIFFではちゃんと計算
した結果を返している。尚、GENDIFFはshareライブラリ関数であり、利用する為には、
予め読込む必要がある。上記のbatchで読込むか、LOAD命令を用いよ。

*)

関数: GRADEF (f(x1, ..., xn), g1, ..., gn)
関数fのn個の引数に対する微分を定義する。即ち、df/dxi=gi等々となる。もし、n個 の勾配よりも少なく、これをi個とすれば、最初のfのi番目の引数が参照される。xiは 関数定義ヘッダでの変数の様な単なるダミー変数であり、fのi番目の引数を指定する 為に使われる。最初の引数を除く全てのGRADEFの引数はgが定義された関数であれば、 それが呼出されて、その結果が用いられる。勾配は、例えば、関数が第一階微分を 除いて正確には知られておらず、より高階の微分を得る事が望まれている時に必要と される。

変数: GRADEFS
デフォルト値:[] - GREDEF命令の使用(つまり、GRADEF(f(x1,...,xn),g1,...,gn))で 勾配を与えられた関数のリスト。

関数: LAPLACE (exp, ovar, lvar)
変数ovarと変換助変数lvarに対するexpのLaplace変換を計算する。expは関数EXP,LOG, SIN,COS,SINH,COSHとERF関数を含むもののみとする。ATVALUEの従属変数が使われてい る線型で、定数係数の微分方程式でも良い。変換が行われる前後のどちらでも適用さ れる。初期条件は零で指定されていなければならない為、もし、他の一般解の何処か に押し込める境界条件があれば、その境界条件に対して一般解を求めて値を代入する 事で定数の消去が可能である。

epxは畳み込み(convolution integral)を含んでいても良い。関数の関連性はLAPLACE が適切に動作する為に、明示的に表現されていなければならない。つまり、FがXとYに 従属していれば、LAPLACE('DIFF(F(X,Y),X),X,S)の様にFが現れる場合は何時でも F(X,Y)と記述されていなければならない。LAPLACEはDEPENDS命令で設定される DEPENDECIESの影響を受けない。

 
(C1) LAPLACE(%E**(2*T+A)*SIN(T)*T,T,S);
                     A
                 2 %E  (S - 2)
(D1)            ---------------
                        2     2
                ((S - 2)  + 1)


 
(* 訳者注:
逆Laplace変換はILTである。詳細はILTの項を参照せよ。
*)

関数: UNDIFF (exp)
もし、微分が実行されれば、添字されたオブジェクトの全ての微分を除いた式expと 同値な式を返すが、その微分の引数は添字付けられたオブジェクトを生成するDIFF関数 の名詞型で置き換えたものである。微分され、添字付けられたオブジェクトをある関数 定義で置き換え、EV(...,DIFF)を指定して微分をしたい時に便利である、


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated by Hiroshi Yokota on September, 16 2002 using texi2html