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

14. 方程式

14.1 方程式に関する諸定義  


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

14.1 方程式に関する諸定義

変数: %RNUM_LIST
デフォルト値:[] - 変数%RがALGSYS命令で解に導入された場合、それらは%RNUM_LIST に生成された順番で追加される。これは後に解に代入する際に便利である。 CONCAT('%R,J)を実行するよりも、このリストを使う事を薦める。

変数: ALGEXACT
デフォルト値:[FALSE] - ALGYSYSの動作に以下の影響を与える: ALGEXACTがTRUEであれば、ALGSYSはSOLVEを常に呼び出し、SOLVEの機能のREALROOTSを 利用する。ALGEXACTがFALSEであれば、SOLVEが呼出されるのは、終結式が単変数でない 場合か、quadraticかbiquadraticな場合のみである。

この様にALGEXACTl:TRUEは厳密解のみを保証するものでは無く、ALGSYSが最初に厳密解 を計算しようと試み、結局、ALLか失敗した時に近似解のみを生成する。

関数: ALGSYS ([exp1, exp2, ...], [var1, var2, ...])
変数リストに対し連立多項式方程式や多項式方程式(非線型も可)を解く。記号%R1,%R2 等々は解に必要な時に任意の助変数を表現する為に用いられる(変数%RNUM_LISTに これらが保存される)。以下に示す過程でALGSYSは必要ならば再帰的に実行する。

その手法は以下の通り;

稀に、RADCANは本当に実数値解であるにもかかわらず、解の中に%iを入れる事がある。 例題はEXAMPLE(ALGSYS);を実行せよ。

関数: ALLROOTS (poly)
全ての実数係数の多項式polyの実数解と複素解を求める。ここでpolyは単変数でなけ ればならないが、例えば、poly=0の様な方程式であっても良い。複素多項式には、 JenkinsとTraubのアルゴリズム(Algorithm 419,Comm. ACM,vol.15,(1972), p. 97)が 用いられている。実多項式にはJenkins(Algorithm 493,TOMS,vol. 1, (1975),p.178) が用いられている。

POLYFACTOR[FALSE]フラグがTRUEの時、ALLROOTSは多項式が実係数であれば実数上、 複素係数であれば複素数上で因子分解を行う。ALLROOTSは重複解を持つ場合は不正確 な結果を戻す事がある(polyが実で、不正確な解が戻った場合、ALLROOTS(%I*poly)を 試しても良い)。例はEXAMPLE(ALLROOTS);を実行せよ。

ALLROOTSは多項式以外には使えない。RAT命令を実行した後に分子は多項式でなければ ならなず、分母は高々複素数である事が要求される。POLYFACTORがTRUEであれば、 このALLROOTSの結果として常に同値な式(但し、因子分解されたもの)が返される。

変数: BACKSUBST
デフォルト値:[TRUE] - FALSEであれば、方程式を三角関数化した後の後代入を防ぐ。 これは、後代入でとてつもなく大きな式が生成される様な、非常に大きな問題では 必要となるだろう(MCでは、これは記憶装置の容量を消耗しかねない。)

変数: BREAKUP
デフォルト値:[TRUE] - FALSEであれば、SOLVEはデフォルト値の幾つかの共通部分式 で構成されたものとしてはなく、一つの式として三次又は二次の方程式の解の表示を 行う。 BREAKUP:TRUEはPROGRAMMODEがFALSEの時のみ動作する。

関数: DIMENSION (equation or list of equations)
ファイル"share1/dimen.mc"は自動次元解析向けの関数を含む。LOAD(DIMEN);で読み 込まれる。この関数のデモはshare1/dimen.demである。その実行はDEMO("dimen");で 行う。

変数: DISPFLAG
デフォルト値:[TRUE] - FALSEであれば、BLOCKの中で呼ばれた関数によって生成され た出力の表示を禁止する。記号$のあるBLOCKの末尾は、DISPFLAGをFALSEに設定する。

関数: FUNCSOLVE (eqn,g(t))
eqnを満す有理関数g(t)が存在するかどうかに依存して、[g(t)=...]か[]を与える。 このeqnは(この場合)g(t)とg(t+1)の一次線形な多項式でなければならない。

 
(C1) FUNCSOLVE((N+1)*FOO(N)-(N+3)*FOO(N+1)/(N+1) =
(N-1)/(N+2),FOO(N));
                                   N
(D1)               FOO(N) = ---------------
                            (N + 1) (N + 2)

(* 訳者注:一次線形結合の漸化式が解けると云う事。*)

警告:これはとても不完全な実装である--沢山の安全性の検証と明かな一般化が欠落し ている。

変数: GLOBALSOLVE
デフォルト値:[FALSE] - TRUEであれば、解かれた変数は連立方程式の集合の解に設定 される。

 
(* 訳者注:

即ち、連立方程式を解くと、その変数に解が代入されるかを指定するフラグである。
以下の例で簡単に示す:

(C101) GLOBALSOLVE:TRUE;
(D101)                               TRUE
(C102) solve([xx*2+yy*3-1=0,xx+yy=10],[xx,yy]);
(D102)                      [[xx : 29, yy : - 19]]
(C103) xx;
(D103)                                29
(C104) yy;
(D104)                               - 19
(C105) GLOBALSOLVE:FALSE;
(D105)                               FALSE
(C106) solve([mm*2+nn*3-1=0,mm+nn=10],[mm,nn]);
(D106)                      [[mm = 29, nn = - 19]]
(C107) mm;nn;
(D107)                                mm
(C107) 
(D107)                                nn

尚、GLOBALSOLVE:TRUEとした状態で、ある方程式を解いた後に、同じ変数の方程式を
解こうとすると次のエラーが出るので注意する。例えば、上記の例の(C106)行の方程式
以下の行で置き換えれば、

(C106) solve([xx*2+yy*3-1=0,xx+yy=10],[xx,yy]);
A number was found where a variable was expected -SOLVE
 -- an error.  Quitting.  To debug this try DEBUGMODE(TRUE);)
(C107) 

となる。

関数: IEQN (ie,unk,tech,n,guess)
積分方程式を解くルーチン。LOAD(INTEQN);で使える。注意: ある保存領域を解放する 為にKILL(LABELS)がこのファイルの中に含まれている。それ故、積分方程式 パッケージを読み込む前に利用者は保持しておきたい任意の式に名前を付けなければ ならない。

ieを積分方程式; unkを未知関数; techを上で与えられたものから試すべき手法 (tech=FIRSTの意味は: 解を見付ける最初の手法を試みる;tech=ALLの意味は:全ての 適用可能な手法を試みる)であり、nはTAYLOR,NEUMANN,FIRSTKINDSERIESやFEDSERIES (微分手法に対する繰り返しの最大深度でもある)から取るべき項の最大数;guessは NEUMANNやFIRSTKINDSERIESへの予測値の初期値である。第二から第五の助変数に対す る初期値は:unk: P(X)、ここでPは第一の関数で、MACSYMAの未知関数となる被積分 関数に現れるものであり、そして、Xは第2種の方程式の場合、積分の外側で現われる Pの第一の出現に対応する引数として現われるか、第1種の方程式で積分変数を除いた その他の変数となる。Xを探す事に失敗すると、利用者は独立変数を与える事を要求 される;

tech: FIRST; n: 1; guess: NONE, これでNEUMANNとFIRSTKINDSERIESを初期予測値としてF(X)を用いる事 となる。

変数: IEQNPRINT
デフォルト値:[TRUE] - IEQN命令(この項参照)で返された結果の挙動を制御する。 IEQNPRINTがFALSEであれば、IEQN関数によって返されたリストは次の形式となる。

 
   [SOLUTION, TECHNIQUE USED, NTERMS, FLAG]

ここで、解が完全(exact)であればFLAGは不在になる。そうでなければ、不完全や 非閉形式解に各々対応するAPPROXIMATEかINCOMOLETEと云う語になる。級数による手法 が用いられると、NTERMSは取られた項の数(これは、エラーがより多くの項の生成を 妨げた場合、IEQNに対して与えられたnよりも小さくなる)を与える。

関数: LHS (eqn)
方程式eqnの左側。

 
(* 訳者注:

方程式は=の両方に式が配置されたものである。以下に実際の例を示す。

(C113) zz:2*x^2+3*x-5=sin(x)*x+4;
                            2
(D113)                   2 x  + 3 x - 5 = x SIN(x) + 4
(C114) lhs(zz);
                                   2
(D114)                          2 x  + 3 x - 5

LHSがあれば、その反対側の右辺を返すRHSも存在する。

(C115) rhs(zz);
(D115)                           x SIN(x) + 4

但し、不等式には使えない。

(C117) zz:2*x^2+3*x-5>=sin(x)*x+4;
                           2
(D117)                  2 x  + 3 x - 5 >= x SIN(x) + 4
(C118) lhs(zz);
                           2
(D118)                  2 x  + 3 x - 5 >= x SIN(x) + 4
(C119) rhs(zz);
(D119)                                 0

*)

関数: LINSOLVE ([exp1, exp2, ...], [var1, var2, ...])

線形連立方程式のリストを変数リストに対して解く。expiは各々、その変数の多項式 でなければならないが、方程式であっても良い。GLOBALSOLVE[FALSE]がTRUEであれば、 SOLVEで解かれた変数に連立方程式の集合の解が設定される。

BACKSUBST[TRUE] FALSEであれば、方程式が三角関数化された後に戻し代入を妨げる。 これは非常に大きな問題で、戻し代入でとてつもなく大きな式を生成する原因となり かねない場合には必要である(MCでこれは保存容量を消耗する原因となる)。

LINSOLVE_PARAMS[TRUE] TRUEであれば、LINSOLVEは記号%Riを生成して、ALGSYSで 手入力した任意の助変数を表現する為に用いる。FALSEであれば、LINSOLVEは以前と 同様の挙動をする。つまり、不定方程式(Diophantus方程式)に出会うと他の項の引数 の幾つかに対して解く。

 
(C1) X+Z=Y$
(C2) 2*A*X-Y=2*A**2$
(C3) Y-2*Z=2$
(C4) LINSOLVE([D1,D2,D3],[X,Y,Z]),GLOBALSOLVE:TRUE;
SOLUTION
(E4)                            X : A + 1
(E5)                             Y : 2 A
(E6)                            Z : A - 1
(D6)                          [E4, E5, E6]


変数: LINSOLVEWARN
デフォルト値:[TRUE] - FALSEであれば、"Dependent equations eliminated"(意味: "従属した方程式は消去された")と云うメッセージ出力が抑制される。

変数: LINSOLVE_PARAMS
デフォルト値:[TRUE] - TRUEであれば、LINSOLVEはまた記号%Riを生成し、ALGSYSに ついて記載された任意の助変数を表現する為に用いられる。

FALSEであれば、以前の様にLINSOLVEは動作する。つまり、不定方程式型に対しては、 他の項の幾つかの引数に対して解く。

変数: MULTIPLICITIES
デフォルト値:[NOT_SET_YET] - SOLVEやREALROOTSで返される個々の解の重複度の リストが設定される。

関数: NROOTS (poly, low, high)
単変数多項式polyの実根を半開区間内(low,hight]で見付ける。区間の終点は負の 無限大と正の無限大に各々対応するMINF,INFでも良い。Sturm級数による手法が用い られている。

 
(C1) POLY1:X**10-2*X**4+1/2$
(C2) NROOTS(POLY1,-6,9.1);
RAT REPLACED 0.5 BY 1/2 = 0.5
(D2)                               4

関数: NTHROOT (p,n)
ここでpは整数係数の多項式、nを正の整数で、返すのは整数上の多項式qであり、 このqはq^n=pか、そうで無ければpが完全な第nの羃乗では無い事を含むエラー メッセージが表示される。このルーチンはFACTORやSQFRよりも遥かに速い。

 
(* 訳者注:

(C1) nthroot(x^2+2*x+1,2);

(D1)                                x + 1
(C2) nthroot(x^3+3*x^2+3*x+1,2);

Not an nth power
 -- an error.  Quitting.  To debug this try DEBUGMODE(TRUE);)
(C3) nthroot(1-3*x+3*x^2-x^3,3);

(D3)                                1 - x
(C4) nthroot(-1+3*x-3*x^2+x^3,3);

(D4)
                                x - 1
の様に使える。
*)

変数: PROGRAMMODE
デフォルト値:[TRUE] - FALSEであれば、SOLVE,REALROOTS,ALLROOTSとLINSOLVEが、 E-ラベル(中間行ラベル)に答をラベル付けして出力する。TRUEであれば、SOLVE等は リストの要素として答えを返す(PROGRAMMODE:FALSEも用いられる、BACKSUBSTがFALSE に設定された時を除く)。

 
(* 訳者注:

(C1) PROGRAMMODE:FALSE;

(D1)                                 FALSE
(C2) solve(x^2+1,x);

Solution:

(E2)                               x = - %I

(E3)                               x = %I
(D3)                              [E9, E10]
(C3) PROGRAMMODE:TRUE;

(D3)                                TRUE
(C4) solve(x^2+1,x);

(D4)                         [x = - %I, x = %I]

PROGRAMMODE:TRUEで中間行(Ei)が出ていない事に注目。
*)

変数: REALONLY
デフォルト値:[FALSE] - TRUEであればALGSYSは%Iを持たない解のみを返す。

関数: REALROOTS (poly, bound)
実単変数多項式polyの全ての実根をboundで指定する許容範囲内で求め、許容範囲が1 よりも小さければ、全ての整数根を厳密に求める。助変数boundは希望する精度を達成 する為に任意の小さな数を設定してよい。最初の変数は方程式でも良い。

例はEXAMPLE(REALROOTS);を実行せよ。

関数: RHS (eqn)
方程式eqnの右側。
 
(* 訳者注:

(C1) rhs(x^2+2*x+1=0);

(D1)                                  0
(C2) lhs(x^2+2*x+1=0);

                                 2
(D2)                            x  + 2 x + 1
(C3) rhs(0=x^2+2*x+1);

                                 2
(D3)                            x  + 2 x + 1

方程式は"a=b"の形式であり、右側とはb、左側とはaの事で、"="のどちらかの側にある
かと云う意味である。その為、式の順番を変更した場合には(C1)と(C3)の結果が入替
わる。
*)

変数: ROOTSCONMODE
デフォルト値:[TRUE] - ROOTSCONTRACT命令の挙動を定める。詳細は DESCRIBE(ROOTSCONTRACT);を実行せよ。

関数: ROOTSCONTRACT (exp)
根の積を積の根に変換する。

例えば、
 
ROOTSCONTRACT(SQRT(X)*Y^(3/2)) ==> SQRT(X*Y^3)
RADEXPANDがTRUEでDOMAINがREAL(これらが初期値)であれば、ROOTSCONTRACTはABSを SQRTに変換する。例えば、

 
ROOTSCONTRACT(ABS(X)*SQRT(Y)) ==> SQRT(X^2*Y)

オプションのROOTSCONMODE(デフォルト値はTRUE)もあり、ROOTSCONTRACTに次の影響を 与える:

 
問題                ROOTSCONMODEの値        ROOTSCONTRACTを作用させた結果
	                          
X^(1/2)*Y^(3/2)      FALSE                  (X*Y^3)^(1/2)
X^(1/2)*Y^(1/4)      FALSE                   X^(1/2)*Y^(1/4)
X^(1/2)*Y^(1/4)      TRUE                   (X*Y^(1/2))^(1/2)
X^(1/2)*Y^(1/3)      TRUE                    X^(1/2)*Y^(1/3)
X^(1/2)*Y^(1/4)      ALL                    (X^2*Y)^(1/4)
X^(1/2)*Y^(1/3)      ALL                    (X^3*Y^2)^(1/6)

上の例と多くの例は次を入力すると良い。

 
EXAMPLE(ROOTSCONTRACT);

ROOTSCONMODEがFALSEならば、ROOTSCONTRACTはwrt有理数の指数の分母が同じ指数の もののみを約分する。ROOTSCONMODE:TRUE$の例に対するキーは、単に2が4を割切るが、 3はそうでない事である。ROOTSCONMODE:ALL$は指数の分母のlcm(最小公倍数)を取って 纏める。ROOTSCONTRACTはLOGCONTRACT(マニュアルを見よ)と似た手法でRATSIMPを用い る。

変数: ROOTSEPSILON
デフォルト値:[1.0E-7] - REALROOTS関数によって見つけられた根を含む確実な区間を 構築する為に使う実数。

関数: SOLVE (exp, var)
代数方程式expを変数varに対して解き、方程式の解のリストを返す。expが方程式で なければ、式が零に等しいと設定されていると仮定する。

 
(*訳者注:
x^2+2*x+1だけの式はSOLVEの側でx^2+2*x+1=0と自動的に設定される事を意味する。
*)

varは関数(例えば、F(X))や他の和や積を除く非原子的な式で良い。expが1変数のみの 場合、varを省略しても良い。expは有理式でも良く、三角関数、指数関数等を含んで いても良い。次に述べる手法が用いられている:Eを式、Xを変数とする。もし、EがX の線形結合であれば、Xについて自明に解かれる。一方で、EがA*X**N+Bの形式であれ ば、その解は(-B/A)**(1/N)に1のN乗根を掛けたものとなる。

EがXに関して線形結合ではなく、Eに含まれるXの指数のGCD(Nとする)が指数を割切り、 根の重複度はN倍される。そして、SOLVEはその結果について再び呼出される。もし、 Eが因子であれば、各因子に対してSOLVEが呼出される。最後に、SOLVEは二次、三次、 又は四次の解の公式を必要があれば用いる。Eが解くべき変数の関数の多項式、F(X) とする、であれば、最初にF(X)に対して解き(結果をCとする)、そして、方程式 F(X)=Cを既知関数Fの逆で与えられるXを解く事が可能である。

BREAKUP[TRUE] FALSEであれば、SOLVEが三次と四次方程式の解を、デフォルトの幾つ かの共通の部分式から構築されたものでは無く、単一の式として表示する事になる。

MULTIPLICITIES[NOT_SET_YET] - SOLVE,REALROOTSやALLROOTSによって返された個々の 解の重複度のリストが設定される。SOLVEに影響するスイッチに関しては、 APROPOS(SOLVE)を試す事。もし、それらの目的が明確でなければ、個々のスイッチ名で DESCRIBEを用いても良い。

SOLVE([eq1, ..., eqn], [v1, ..., vn])は連立(線形、又は非線形)多項式の方程式系 を、LINSOLVEかALGSYSを用いて解き、その変数で解のリストを返す。LINSOLVEの場合、 このリストは解の単一のリストを含む。それは二つのリストを引数として取る。最初 のリスト(eqi,i=1,..,n)は解くべき方程式を表現する;第二のリストは決定すべき 未知変数のリストである。もし、方程式中の変数の総数が方程式の数と等しければ、 第二の引数リストは省略しても良い。線形系に対しては与えられた方程式が十分で ない場合、INCONSISTENTと云うメッセージが表示される(SOLVE_INCONSISTENT_ERROR スイッチを見よ);もし、単一な解が存在しない場合はSINGULARが表示される。 例題はEXAMPLE(SOLVE);を実行せよ。

変数: SOLVEDECOMPOSES
デフォルト値:[TRUE] - TRUEであれば、多項式を解く際に、SOLVEにPOLYDECOMP (POLYDECOMPを見よ)を導入する。

変数: SOLVEEXPLICIT
デフォルト値:[FALSE] - TRUEであればSOLVEに陰的な解、即ち、F(x)=0の形式で返す 事を禁止する。

変数: SOLVEFACTORS
デフォルト値:[TRUE] FALSEであればSOLVEは式の因子分解を実行しない。FALSEに設定 する事は因子分解が不必要な場合には望ましいだろう。

変数: SOLVENULLWARN
デフォルト値:[TRUE] - TRUEであれば、空の方程式リストや空の変数リストでSOLVEを 呼んだ場合に警告が出る。例えば、SOLVE([],[]);とすれば警告と[]が返される。

変数: SOLVERADCAN
デフォルト値:[FALSE] - TRUEであればSOLVEはRADCANを用いる。RADCANはSOLVEをより 遅くするが、指数や対数関数を含む問題に対処可能となる。

変数: SOLVETRIGWARN
デフォルト値:[TRUE] - FALSEであれば、SOLVEは方程式を解く為に逆三角関数を利用 し、それによって解が失なわれる事を警告しない。

変数: SOLVE_INCONSISTENT_ERROR
デフォルト値:[TRUE]- TRUEであれば、SOLVEとLINSOLVEは、SOLVE([A+B=1,A+B=2])の 様な(階数が)不十分な線形連立方程式に遭遇するとエラーを表示する。

FALSEであれば、この場合は[]を返す。(これは新しいモードであり、以前は、ALGSYS を呼び出した場合のみであった。)

関数: ZRPOLY
- 単純な多項式(一変数、実係数で指数が全て非負整数)の零点を見付ける為の IMSL ZRPOLYルーチンで、Jenkins-Yraub法が用いられている。利用する為には LOADFILE("imsl")を実行せよ。命令はPOLYROOTS(polynomial);である。より詳細な 情報は、PRINTFILE("zrpoly.usg");を実行せよ。デモはDEMO("zrpoly.dem"); を実行 せよ。MACSYMA-IMSLパッケージに関する一般的な情報は、 PRINTFILE(IMSL,USAGE,SHARE2);を参照せよ。

 
(* 訳者注:
imslパッケージはMaxima-5.6には含まれていない。
*)

関数: ZSOLVE
- 近似数値解が必要な人向けにIMSL Fortranライブラリから変換したルーチンを呼出 すパッケージがある。このルーチンはN個の未知変数を持つN個の非線形同時方程式を 解く為のものである。これはblack-box風のテクニックを用いており、正確な解がより 洗練されたソルバ(LINSOLVE,ALGSYS等々)の一つから得られるものに対しては多分望 ましいものでは無い。しかし、他のソルバで扱えない事に対して非常に有効な結果を 与える事が可能である。ドキュメントはPRINTFILE("zsolve.usg");を実行し、デモは batch("zsolve.mc")$を実行せよ。

 
(* 訳者注:
imslパッケージはMaxima-5.6には含まれていない。
*)


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

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