Next: Differential Equations, Previous: Integration [Contents][Index]
デフォルト値: []
%rnum_list
は、
solve
やalgsys
による解で導入された
変数のリストです。
%r
変数は、それらが生成された順に
%rnum_list
に追加されます。
これは、あとで解への代入を行うのに便利です。
concat ('%r, j)
をするよりこのリストを使うことを推奨します。
(%i1) solve ([x + y = 3], [x,y]); (%o1) [[x = 3 - %r1, y = %r1]]
(%i2) %rnum_list; (%o2) [%r1]
(%i3) sol : solve ([x + 2*y + 3*z = 4], [x,y,z]); (%o3) [[x = - 2 %r3 - 3 %r2 + 4, y = %r3, z = %r2]]
(%i4) %rnum_list; (%o4) [%r2, %r3]
(%i5) for i : 1 thru length (%rnum_list) do sol : subst (t[i], %rnum_list[i], sol)$
(%i6) sol; (%o6) [[x = - 2 t - 3 t + 4, y = t , z = t ]] 2 1 2 1
デフォルト値: 10^8
algsys
が
algepsilon
を使います。
デフォルト値: false
algexact
は、以下のようにalgsys
の振る舞いに影響を与えます:
もしalgexact
がtrue
なら、
algsys
はいつもsolve
をコールし、
solve
の失敗時にはrealroots
を使います。
もしalgexact
がfalse
なら、
問題が1変数でないときだけ、
もしくは、方程式が二次もしくは四次なら
solve
がコールされます。
このように、algexact: true
は、
厳密解だけを保証せず、ただ、
algsys
は最初に厳密解を与えるように最大限努力して、
他のすべてが失敗した時近似をもたらすことだけを保証します。
同時多項式expr_1, …, expr_m
または多項式方程式eqn_1, …, eqn_m
を変数x_1, …, x_nについて解きます。
式exprは、等式expr = 0
と同値です。
変数より等式が多い場合も逆もあります。
algsys
は、解のリストを返します。
ここで、それぞれの解は、
方程式系を満たす変数x_1, …, x_nの値を指定する等式のリストとして
与えられます。
もしalgsys
が解を見つけられなければ、
空のリスト[]
が返されます。
シンボル%r1
, %r2
, …,
が、解の任意パラメータを表すために、必要に応じて導入されます;
これらの変数は、リスト %rnum_list
にも追加されます。
方法は以下の通りです:
これは、xが消去されるので、 1つ変数の少ない新しいサブシステムS_i’をもたらします ここでプロセスは(1)に戻ります。
solve
がコールされます。
いくつかの場合、solve
は解を見つけることができないか、
もし見つけたら、絵が非常に大きな式になるかもしれません。
もし等式が1変数で、線形か二次か四次なら、
もし近似が導入されないなら、再びsolve
がコールされます。
もし近似が導入されるか、等式が1変数でなく、線形でも二次でも、四次でもないなら、
もしスイッチrealonly
がtrue
なら、
実数解を見つけるため関数realroots
がコールされます。
もしrealonly
がfalse
なら、
実数解と複素数解を探すallroots
がコールされます。
もしalgsys
が
要求よりも有効数字が少ない解を生成するなら、
ユーザーはalgepsilon
の値をより高い値に変更できます。
もしalgexact
がtrue
に設定されているなら、
いつもsolve
がコールされます。
algsys
が(通常、初期の段階での厳密解発見の失敗による)浮動小数点近似を含む多変数方程式に出会う時、
厳密な方法をそんな方程式に適用しようとせず、かわりにメッセージを表示します:
"algsys
cannot solve - system too complicated."
radcan
との対話は、多きなもしくは複雑な式を生成することができます。
この場合、pickapart
または reveal
を使って結果の一部を分離することができるかもしれません。
時々、radcan
は、実際には実数値の解に虚数単位%i
を導入するかもしれません。
例:
(%i1) e1: 2*x*(1 - a1) - 2*(x - 1)*a2; (%o1) 2 (1 - a1) x - 2 a2 (x - 1) (%i2) e2: a2 - a1; (%o2) a2 - a1 (%i3) e3: a1*(-y - x^2 + 1); 2 (%o3) a1 (- y - x + 1) (%i4) e4: a2*(y - (x - 1)^2); 2 (%o4) a2 (y - (x - 1) ) (%i5) algsys ([e1, e2, e3, e4], [x, y, a1, a2]); (%o5) [[x = 0, y = %r1, a1 = 0, a2 = 0], [x = 1, y = 0, a1 = 1, a2 = 1]] (%i6) e1: x^2 - y^2; 2 2 (%o6) x - y (%i7) e2: -1 - y + 2*y^2 - x + x^2; 2 2 (%o7) 2 y - y + x - x - 1 (%i8) algsys ([e1, e2], [x, y]); 1 1 (%o8) [[x = - -------, y = -------], sqrt(3) sqrt(3) 1 1 1 1 [x = -------, y = - -------], [x = - -, y = - -], [x = 1, y = 1]] sqrt(3) sqrt(3) 3 3
1変数多項式exprもしくは1変数多項式方程式eqnの実数と複素数の根の数値近似を 計算する。
フラグpolyfactor
がtrue
の時、
allroots
は、多項式が実数なら多項式を実数上で因数分解し、
多項式が複素数なら複素数上で因数分解します。
allroots
は、多重根の場合、不正確な結果をもたらすことがあります。
もし多項式が実数なら、allroots (%i*p)
は、
allroots (p)
より精確な近似を生成します。
allroots
はこの場合異なるアルゴリズムを呼ぶので。
allroots
は非多項式を却下します。
rat
された分子が多項式であることを要求し、
分母はせいぜい複素数であることを要求します。
この結果、もしpolyfactor
がtrue
なら、
allroots
はいつも(因数分解された)同値の式を返します。
複素多項式のために、JenkinsとTraubのアルゴリズムが使われます (Algorithm 419, Comm. ACM, vol. 15, (1972), .97)。 実多項式のために、Jenkinsのアルゴリズム (Algorithm 493, ACM TOMS, vol. 1, (1975), p.178)が使われます。
例:
(%i1) eqn: (1 + 2*x)^3 = 13.5*(1 + x^5); 3 5 (%o1) (2 x + 1) = 13.5 (x + 1) (%i2) soln: allroots (eqn); (%o2) [x = .8296749902129361, x = - 1.015755543828121, x = .9659625152196369 %i - .4069597231924075, x = - .9659625152196369 %i - .4069597231924075, x = 1.0] (%i3) for e in soln do (e2: subst (e, eqn), disp (expand (lhs(e2) - rhs(e2)))); - 3.5527136788005E-15 - 5.32907051820075E-15 4.44089209850063E-15 %i - 4.88498130835069E-15 - 4.44089209850063E-15 %i - 4.88498130835069E-15 3.5527136788005E-15 (%o3) done (%i4) polyfactor: true$ (%i5) allroots (eqn); (%o5) - 13.5 (x - 1.0) (x - .8296749902129361) 2 (x + 1.015755543828121) (x + .8139194463848151 x + 1.098699797110288)
1変数の多項式exprまたは多項式等式eqnの実数根と複素数根の数値近似 を計算します。
bfallroots
は多倍長浮動小数点を使って根を計算する以外の
すべての点で、bfallroots
はallroots
と同一です。
詳しい情報についてはallroots
を参照してください。
デフォルト値: true
backsubst
がfalse
の時、
方程式が三角行列化された後、linsolve
の後退代入を妨げます。
これは、後退代入が極端に大きな式の生成のもととなる非常に大きな問題に関して役立つかもしれません。
(%i1) eq1 : x + y + z = 6$ (%i2) eq2 : x - y + z = 2$ (%i3) eq3 : x + y - z = 0$ (%i4) backsubst : false$
(%i5) linsolve ([eq1, eq2, eq3], [x,y,z]); (%o5) [x = z - y, y = 2, z = 3]
(%i6) backsubst : true$
(%i7) linsolve ([eq1, eq2, eq3], [x,y,z]); (%o7) [x = 1, y = 2, z = 3]
デフォルト値: true
breakup
がtrue
の時、
solve
は、三次と四次の方程式の解を共通部分式を使って表現します。
共通部分式は、中間式ラベル(%t1
, %t2
, など)に割り当てられます。
そうでなければ、共通部分式は同定されません。
breakup: true
は、
programmode
がfalse
の時だけ、効果を持ちます。
例:
(%i1) programmode: false$ (%i2) breakup: true$ (%i3) solve (x^3 + x^2 - 1); sqrt(23) 25 1/3 (%t3) (--------- + --) 6 sqrt(3) 54 Solution: sqrt(3) %i 1 ---------- - - sqrt(3) %i 1 2 2 1 (%t4) x = (- ---------- - -) %t3 + -------------- - - 2 2 9 %t3 3 sqrt(3) %i 1 - ---------- - - sqrt(3) %i 1 2 2 1 (%t5) x = (---------- - -) %t3 + ---------------- - - 2 2 9 %t3 3 1 1 (%t6) x = %t3 + ----- - - 9 %t3 3 (%o6) [%t4, %t5, %t6] (%i6) breakup: false$ (%i7) solve (x^3 + x^2 - 1); Solution: sqrt(3) %i 1 ---------- - - 2 2 sqrt(23) 25 1/3 (%t7) x = --------------------- + (--------- + --) sqrt(23) 25 1/3 6 sqrt(3) 54 9 (--------- + --) 6 sqrt(3) 54 sqrt(3) %i 1 1 (- ---------- - -) - - 2 2 3
sqrt(23) 25 1/3 sqrt(3) %i 1 (%t8) x = (--------- + --) (---------- - -) 6 sqrt(3) 54 2 2 sqrt(3) %i 1 - ---------- - - 2 2 1 + --------------------- - - sqrt(23) 25 1/3 3 9 (--------- + --) 6 sqrt(3) 54
sqrt(23) 25 1/3 1 1 (%t9) x = (--------- + --) + --------------------- - - 6 sqrt(3) 54 sqrt(23) 25 1/3 3 9 (--------- + --) 6 sqrt(3) 54 (%o9) [%t7, %t8, %t9]
dimen
は、次元解析パッケージです。
load ("dimen")
はこのパッケージをロードします。
demo ("dimen")
は短いデモンストレーションを表示します。
デフォルト値: true
もしblock
内でfalse
に設定されたら
block
内でコールされた解法関数が生成する出力の表示を抑制します。
block
をドル記号$で終端すると、
dispflag
をfalse
に設定します。
eqnを満たす有理関数g(t)
が存在するかどうかに依存して、
[g(t) = ...]
または[]
を返します。
ここで、eqnは(この場合)
g(t)
とg(t+1)
に関して
一次、線形多項式でなければいけません。
(%i1) eqn: (n + 1)*f(n) - (n + 3)*f(n + 1)/(n + 1) = (n - 1)/(n + 2); (n + 3) f(n + 1) n - 1 (%o1) (n + 1) f(n) - ---------------- = ----- n + 1 n + 2 (%i2) funcsolve (eqn, f(n)); Dependent equations eliminated: (4 3) n (%o2) f(n) = --------------- (n + 1) (n + 2)
警告: これはとても未熟な実装です – 多くの安全性チェックや 明らかな一般化が忘れられています。
デフォルト値: false
globalsolve
がtrue
の時、
2つ以上の線形方程式を解く時、
解くべき変数が、linsolve
やsolve
が見つけた解の値に割り当てられます。
globalsolve
がfalse
の時、
2つ以上の線形方程式を解く時、
linsolve
やsolve
が見つけた解は、
等式として表現され、
解くべき変数は割り当てられません。
2つ以上の線形方程式以外の何かを解く時には、
solve
はglobalsolve
を無視します。
方程式を解く他の関数(例えばalgsys
)はいつもglobalsolve
を無視します。
例:
(%i1) globalsolve: true$ (%i2) solve ([x + 3*y = 2, 2*x - y = 5], [x, y]); Solution 17 (%t2) x : -- 7 1 (%t3) y : - - 7 (%o3) [[%t2, %t3]] (%i3) x; 17 (%o3) -- 7 (%i4) y; 1 (%o4) - - 7 (%i5) globalsolve: false$ (%i6) kill (x, y)$ (%i7) solve ([x + 3*y = 2, 2*x - y = 5], [x, y]); Solution 17 (%t7) x = -- 7 1 (%t8) y = - - 7 (%o8) [[%t7, %t8]] (%i8) x; (%o8) x (%i9) y; (%o9) y
inteqn
は、積分方程式を解くためのパッケージです。
load ("inteqn")
はこのパッケージをロードします。
ieは、積分方程式です;
unkは、未知の関数です;
techは、上で与えられたこれらから試される手法です;
is the
technique to be tried from those given above
(tech = first
は以下を意味します: 解を見つける最初の手法を試みる;
tech = all
は以下を意味します: 適用可能な手法すべてを試みる);
nは、
taylor
, neumann
, firstkindseries
, またはfredseries
に関して扱う項の最大数です (微分法に関する再帰の最大深度でもあります);
guessは、neumann
またはfirstkindseries
に関する
初期の推測です。
2番目から5番目までのパラメータのデフォルト値は、以下の通りです:
unk: p(x)
。
ここで、pは被積分関数の中で出会うMaximaが知らない最初の関数であり、
xは、secondkind
方程式の場合の積分の外側で見つかったp
の最初の出現時の引数、または、firstkind
方程式の中の積分変数を除いた唯一の残りの変数
です。
もしxを探す企てが失敗したら、ユーザーは独立変数を供給するよう尋ねられるでしょう。
tech: first
n: 1
guess: neumann
とfirstkindseries
が
初期推測としてf(x)
を使うようにするnone
デフォルト値: true
ieqnprint
は、ieqn
コマンドが返す結果の振る舞いを決めます。
ieqnprint
がfalse
の時、
ieqn
関数が返すリストは、形式
[solution, technique used, nterms, flag]
を取ります。
ここで、もし解が厳密ならflagはありません。
そうでなければ、厳密でない解か閉じていない形の解かに対応して、それぞれ、単語approximate
またはincomplete
です。
もし級数法が使われたら、
ntermsは、取った項の数を与えます。
(項の数は、もしエラーが更なる項の生成を防いだなら、ieqn
に与えられたnよりも小さいこともあり得ます。)
exprの演算子が関係演算子< <= = # equal notequal >= >
の1つ、
割り当て演算子:= ::= : ::
の1つ、
またはinfix
で宣言されたユーザー定義の二項中置演算子の時、
式exprの左辺(すなわち、最初の項)
を返します。
exprがアトムか、演算子が上で記載したもの以外の何かの時、
lhs
はexprを返します。
rhs
も参照してください。
例:
(%i1) e: aa + bb = cc; (%o1) bb + aa = cc (%i2) lhs (e); (%o2) bb + aa (%i3) rhs (e); (%o3) cc (%i4) [lhs (aa < bb), lhs (aa <= bb), lhs (aa >= bb), lhs (aa > bb)]; (%o4) [aa, aa, aa, aa] (%i5) [lhs (aa = bb), lhs (aa # bb), lhs (equal (aa, bb)), lhs (notequal (aa, bb))]; (%o5) [aa, aa, aa, aa] (%i6) e1: '(foo(x) := 2*x); (%o6) foo(x) := 2 x (%i7) e2: '(bar(y) ::= 3*y); (%o7) bar(y) ::= 3 y (%i8) e3: '(x : y); (%o8) x : y (%i9) e4: '(x :: y); (%o9) x :: y (%i10) [lhs (e1), lhs (e2), lhs (e3), lhs (e4)]; (%o10) [foo(x), bar(y), x, x] (%i11) infix ("]["); (%o11) ][ (%i12) lhs (aa ][ bb); (%o12) aa
変数のリストに関して同時線形方程式のリストを解きます。 それぞれの式は変数に関する多項式でなければならず、等式も取り得ます。
globalsolve
がtrue
の時、
解くべき変数それぞれは、方程式の解の値にバインドされます。
backsubst
がfalse
の時、
linsolve
は、方程式が三角行列化された後、後退代入を実行しません。
これは、後退代入が極端に大きな式の生成の原因となる非常に大きな問題に関して
必要とされるかもしれません。
linsolve_params
がtrue
の時、
linsolve
は
algsys
の下のマニュアルの中で記述された任意のパラメータを表すのに使われる
%r
シンボルも生成します。
そうでなければ、
linsolve
は、他を使って表現されたいくつかの変数を持つ
決定中の方程式系を解きます。
programmode
がfalse
の時、
linsolve
は、中間式(%t
)ラベルを使って解を表示し、
ラベルのリストを返します。
(%i1) e1: x + z = y; (%o1) z + x = y (%i2) e2: 2*a*x - y = 2*a^2; 2 (%o2) 2 a x - y = 2 a (%i3) e3: y - 2*z = 2; (%o3) y - 2 z = 2 (%i4) [globalsolve: false, programmode: true]; (%o4) [false, true] (%i5) linsolve ([e1, e2, e3], [x, y, z]); (%o5) [x = a + 1, y = 2 a, z = a - 1] (%i6) [globalsolve: false, programmode: false]; (%o6) [false, false] (%i7) linsolve ([e1, e2, e3], [x, y, z]); Solution (%t7) z = a - 1 (%t8) y = 2 a (%t9) x = a + 1 (%o9) [%t7, %t8, %t9] (%i9) ''%; (%o9) [z = a - 1, y = 2 a, x = a + 1] (%i10) [globalsolve: true, programmode: false]; (%o10) [true, false] (%i11) linsolve ([e1, e2, e3], [x, y, z]); Solution (%t11) z : a - 1 (%t12) y : 2 a (%t13) x : a + 1 (%o13) [%t11, %t12, %t13] (%i13) ''%; (%o13) [z : a - 1, y : 2 a, x : a + 1] (%i14) [x, y, z]; (%o14) [a + 1, 2 a, a - 1] (%i15) [globalsolve: true, programmode: true]; (%o15) [true, true] (%i16) linsolve ([e1, e2, e3], '[x, y, z]); (%o16) [x : a + 1, y : 2 a, z : a - 1] (%i17) [x, y, z]; (%o17) [a + 1, 2 a, a - 1]
デフォルト値: true
linsolvewarn
がtrue
の時、
linsolve
はメッセージ"Dependent equations eliminated"を表示します。
デフォルト値: true
linsolve_params
がtrue
の時、
linsolve
は、
algsys
の下のマニュアルに記述された任意のパラメータを表すのに使われる%r
シンボルも生成します。
それでなければ、linsolve
は、
他を使って表現されたいくつかの変数を使った
決定中の方程式系を解きます。
デフォルト値: not_set_yet
半開区間(low, high]
の中の
実数一変数多項式pの実根の数を返します。
区間の端点はminf
もしくはinf
、無限大かもしれません。
マイナス無限大とプラス無限大。
nroots
は、Sturm列の方法を使います。
(%i1) p: x^10 - 2*x^4 + 1/2$ (%i2) nroots (p, -6, 9.1); (%o2) 4
pは整数係数多項式で、
nは正の整数ですが、
q^n=pのような整数上の多項式qを返すか、
pが完全なn番目のべきでないことを示すエラーメッセージを表示します。
このルーチンは、factor
より、またsqfr
よりさえもっと速いです。
デフォルト値: false
オプション変数polyfactor
がtrue
の時、
allroots
とbfallroots
は
もし多項式が実数なら実数上で、もし多項式が複素数なら複素数上で多項式を因数分解します。
例はallroots
を参照してください。
デフォルト値: true
programmode
がtrue
の時、
solve
, realroots
, allroots
, linsolve
は、
リストの中の要素として解を返します。
(backsubst
がfalse
設定されている時―
その場合、programmode: false
が仮定されます―を除いて)
programmode
がfalse
の時、
solve
などは、中間式ラベル%t1
, t2
など生成し、
解をそれらに割り当てます。
変数多項式exprもしくは1変数多項方程式eqnの実根の有理近似を、
bound
の許容誤差の範囲内で計算します。
exprもしくはeqnの係数はリテラル数でなければなりません。
%pi
のようなシンボル定数は却下されます。
realroots
は、みつけた根の多様性を
グローバル変数multiplicities
に割り当てます。
realroots
は、それぞれの根を囲むためSturm列を構成し、
近似を精密化するため二分法を適用します。
根を探索する前に、すべての係数は同値の有理数に変換され、
正確な有理算術によって計算が実行されます。
たとえ係数が浮動小数点でも、
(float
もしくはnumer
フラグによって浮動小数点が強要されない限り)結果は有理数です。
boundが1よりも小さい時、全ての整数根は正確に計算されます。
boundがしてされない時、グローバル変数rootsepsilon
と等しいと仮定されます。
グローバル変数programmode
がtrue
の時、
realroots
は形式[x = x_1, x = x_2, …]
のリストを
返します。
programmode
がfalse
の時、realroots
は
中間式ラベル%t1
, %t2
, …を生成し、
結果をそれらに割り当て、ラベルのリストを返します。
例:
(%i1) realroots (-1 - x + x^5, 5e-6); 612003 (%o1) [x = ------] 524288 (%i2) ev (%[1], float); (%o2) x = 1.167303085327148 (%i3) ev (-1 - x + x^5, %); (%o3) - 7.396496210176905E-6
(%i1) realroots (expand ((1 - x)^5 * (2 - x)^3 * (3 - x)), 1e-20); (%o1) [x = 1, x = 2, x = 3] (%i2) multiplicities; (%o2) [5, 3, 1]
exprの演算子が関係演算子< <= = # equal notequal >= >
の1つ、
割り当て演算子:= ::= : ::
の1つ、または、
infix
で宣言されたユーザー定義の二項中置演算子の時
式exprの右辺(すなわち、二番目の項)を返します。
exprがアトムか、演算子が上で記載したもの以外の何かの時、
rhs
はexprを返します。
lhs
も参照してください。
例:
(%i1) e: aa + bb = cc; (%o1) bb + aa = cc (%i2) lhs (e); (%o2) bb + aa (%i3) rhs (e); (%o3) cc (%i4) [rhs (aa < bb), rhs (aa <= bb), rhs (aa >= bb), rhs (aa > bb)]; (%o4) [bb, bb, bb, bb]
(%i5) [rhs (aa = bb), rhs (aa # bb), rhs (equal (aa, bb)), rhs (notequal (aa, bb))];
(%o5) [bb, bb, bb, bb] (%i6) e1: '(foo(x) := 2*x); (%o6) foo(x) := 2 x (%i7) e2: '(bar(y) ::= 3*y); (%o7) bar(y) ::= 3 y (%i8) e3: '(x : y); (%o8) x : y (%i9) e4: '(x :: y); (%o9) x :: y (%i10) [rhs (e1), rhs (e2), rhs (e3), rhs (e4)]; (%o10) [2 x, 3 y, y, y] (%i11) infix ("]["); (%o11) ][ (%i12) rhs (aa ][ bb); (%o12) bb
デフォルト値: true
rootsconmode
は、rootscontract
コマンドの振る舞いを決定します。
詳細はrootscontract
を参照してください。
根の積を積の根に変換します。
例えば、
rootscontract (sqrt(x)*y^(3/2))
はsqrt(x*y^3)
をもたらします。
radexpand
がtrue
かつdomain
がreal
の時、
rootscontract
は、 converts
abs
をsqrt
に変換します。
例えば、rootscontract (abs(x)*sqrt(y))
はsqrt(x^2*y)
をもたらします。
以下のようにrootscontract
に影響するオプションrootsconmode
があります:
問題 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)
rootsconmode
がfalse
の時、
rootscontract
は、分母が同じ有理数指数に関してだけ短縮します。
rootsconmode: true
の例のキーは、
単に、4は2で割り切れますが、4は2で割り切れないということです。
rootsconmode: all
は、指数の分母の最小公倍数を取ることを伴います。
rootscontract
は、
logcontract
と似た方法で、ratsimp
を使います。
例:
(%i1) rootsconmode: false$ (%i2) rootscontract (x^(1/2)*y^(3/2)); 3 (%o2) sqrt(x y ) (%i3) rootscontract (x^(1/2)*y^(1/4)); 1/4 (%o3) sqrt(x) y (%i4) rootsconmode: true$ (%i5) rootscontract (x^(1/2)*y^(1/4)); (%o5) sqrt(x sqrt(y)) (%i6) rootscontract (x^(1/2)*y^(1/3)); 1/3 (%o6) sqrt(x) y (%i7) rootsconmode: all$ (%i8) rootscontract (x^(1/2)*y^(1/4)); 2 1/4 (%o8) (x y) (%i9) rootscontract (x^(1/2)*y^(1/3)); 3 2 1/6 (%o9) (x y ) (%i10) rootsconmode: false$ (%i11) rootscontract (sqrt(sqrt(x) + sqrt(1 + x)) *sqrt(sqrt(1 + x) - sqrt(x))); (%o11) 1 (%i12) rootsconmode: true$ (%i13) rootscontract (sqrt(5+sqrt(5)) - 5^(1/4)*sqrt(1+sqrt(5))); (%o13) 0
代数等式exprをxについて解き、xの解等式のリストを返します。
もしexprの等式でなければ、等式expr = 0
が仮定されます。
xは関数(例えばf(x)
)でも他のアトムでない式でも問題ありません。
(sumやproductは除きます。)exprが変数を1つだけ含む場合、xは省略できます。
exprは有理式でも、三角関数や指数関数を含むことができます。
以下の方法が使われます:
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
は2次方程式、3次方程式、4次方程式の解の公式を必要に応じて使います。
Eが解くべき変数のある関数(以下F(X)
)の多項式の場合,
最初にF(X)
について解かれ(結果をCと呼ぶ)、
関数Fの逆関数がわかっている場合、等式F(X)=C
がXについて解かれます。
breakup
がfalse
なら、
solve
は3次もしくは4次方程式の解を、
デフォルトであるいくつかの共通部分式から成る表現ではなく、
単一の式で表現されます。
multiplicities
は、solve
やrealroots
, allroots
が返した
多数の独立の解のリストに設定されます。
slove
に影響するスイッチについては、apropos (solve)
を試してください。
もしスイッチの目的がはっきりしないなら、
個々のスイッチ名についてdescribe
を使うことができます。
solve ([eqn_1, ..., eqn_n], [x_1, ..., x_n])
は、linsolve
もしくはalgsys
をコールすることで,
同時(線形もしくは非線形)代数方程式系を解き、変数の解リストのリストを返します。
linsolve
の場合、このリストは解の単一リストを含みます。
引数に2つのリストをとります。
最初のリストは解くべき等式を示し、2番目のリストは決定すべき未知数のリストです。
もし等式の変数の総数が等式の数に等しいなら、2番目の引数リストは省略できます。
programmode
がfalse
の時、
solve
は中間式(%t
)ラベルを持つ解を表示し、ラベルのリストを返します。
globalsolve
がtrue
、かつ、問題が2つ以上の線形方程式を解くことである場合、
それぞれの解くべき変数は方程式の解の値にバインドされます。
例:
(%i1) solve (asin (cos (3*x))*(f(x) - 1), x); solve: using arc-trig functions to get a solution. Some solutions will be lost. %pi (%o1) [x = ---, f(x) = 1] 6 (%i2) ev (solve (5^f(x) = 125, f(x)), solveradcan); log(125) (%o2) [f(x) = --------] log(5) (%i3) [4*x^2 - y^2 = 12, x*y - x = 2]; 2 2 (%o3) [4 x - y = 12, x y - x = 2] (%i4) solve (%, [x, y]); (%o4) [[x = 2, y = 2], [x = .5202594388652008 %i - .1331240357358706, y = .07678378523787788 - 3.608003221870287 %i], [x = - .5202594388652008 %i - .1331240357358706, y = 3.608003221870287 %i + .07678378523787788], [x = - 1.733751846381093, y = - .1535675710019696]] (%i5) solve (1 + a*x + x^3, x); 3 sqrt(3) %i 1 sqrt(4 a + 27) 1 1/3 (%o5) [x = (- ---------- - -) (--------------- - -) 2 2 6 sqrt(3) 2 sqrt(3) %i 1 (---------- - -) a 2 2 - --------------------------, x = 3 sqrt(4 a + 27) 1 1/3 3 (--------------- - -) 6 sqrt(3) 2 3 sqrt(3) %i 1 sqrt(4 a + 27) 1 1/3 (---------- - -) (--------------- - -) 2 2 6 sqrt(3) 2 sqrt(3) %i 1 (- ---------- - -) a 2 2 - --------------------------, x = 3 sqrt(4 a + 27) 1 1/3 3 (--------------- - -) 6 sqrt(3) 2 3 sqrt(4 a + 27) 1 1/3 a (--------------- - -) - --------------------------] 6 sqrt(3) 2 3 sqrt(4 a + 27) 1 1/3 3 (--------------- - -) 6 sqrt(3) 2 (%i6) solve (x^3 - 1); sqrt(3) %i - 1 sqrt(3) %i + 1 (%o6) [x = --------------, x = - --------------, x = 1] 2 2 (%i7) solve (x^6 - 1); sqrt(3) %i + 1 sqrt(3) %i - 1 (%o7) [x = --------------, x = --------------, x = - 1, 2 2 sqrt(3) %i + 1 sqrt(3) %i - 1 x = - --------------, x = - --------------, x = 1] 2 2 (%i8) ev (x^6 - 1, %[1]);
6 (sqrt(3) %i + 1) (%o8) ----------------- - 1 64
(%i9) expand (%); (%o9) 0 (%i10) x^2 - 1; 2 (%o10) x - 1 (%i11) solve (%, x); (%o11) [x = - 1, x = 1] (%i12) ev (%th(2), %[1]); (%o12) 0
シンボル%r
は、解の中で任意定数を示すのに使われます。
(%i1) solve([x+y=1,2*x+2*y=2],[x,y]); solve: dependent equations eliminated: (2) (%o1) [[x = 1 - %r1, y = %r1]]
更に知るには、algsys
と %rnum_list
.
デフォルト値: true
solvedecomposes
がtrue
の時、
もし多項式を解くように頼まれたなら、
solve
は、polydecomp
をコールします。
デフォルト値: false
solveexplicit
がtrue
の時、
solve
が
陰解―すなわち、F
がある関数である形式F(x) = 0
の解―
を返すことを妨げます。
デフォルト値: true
solvefactors
がfalse
の時、
solve
は、式を因数分解しようとしません。
false
設定は、
因数分解が不要ないくつかの場合に望まれるかもしれません。
デフォルト値: true
solvenullwarn
がtrue
の時、
もし空の等式リストか空の変数リストを引数にコールされたら
solve
は、警告メッセージを表示します。
例えば、solve ([], [])
は、2つの警告メッセージを表示し、
[]
を返します。
Next: Differential Equations, Previous: Integration [Contents][Index]