デフォルト値: []
%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つの警告メッセージを表示し、
[]を返します。
デフォルト値: false
solveradcanがtrueの時、
solveはradcanをコールし、solveは遅くなりますが、
指数と対数を含むある問題が解けるようになります。