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

# 20. Equations

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

## 20.1 Functions and Variables for Equations

システム変数: %rnum_list

  デフォルト値: `[]`

  `%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

  Categories: Algebraic equations

オプション変数: algepsilon

  デフォルト値: 10^8

  `algsys`が `algepsilon`を使います。

  Categories: Algebraic equations

オプション変数: algexact

  デフォルト値: `false`

  `algexact`は以下のように `algsys`の振る舞いに影響を与えます:

  もし `algexact`が `true`なら、 `algsys`はいつも `solve`をコールし、 `solve`の失敗時には `realroots`を使います。

  もし `algexact`が `false`なら、 問題が１変数でないときだけ、または方程式が二次か四次なら (only if the eliminant was not univaririate, or if it was a quadratic or biquadratic) `solve`がコールされます。

  このように `algexact: true`は厳密解だけを保証しません。 ただ、 `algsys`は最初に厳密解を与えるように最大限努力して、 他のすべてが失敗した時近似をもたらすことだけを保証します。

  Categories: Algebraic equations

関数: algsys
`algsys` ([expr_1, …, expr_m], [x_1, …, x_n])
`algsys` ([eqn_1, …, eqn_m], [x_1, …, x_n])

  同時多項式 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`にも追加されます。

  方法は以下の通りです:

  1. 最初に方程式は因数分解され、サブシステムに分割されます。
  2. それぞれのサブシステム S_iに関して等式 Eと変数 xを選択します。 変数をゼロでない最低次を持つよう選びます。 そして、 xに関する Eと E_jの終結式を サブシステム S_iの中の残っている等式群 E_jのそれぞれに関して計算します。

     xが消去されるので１つ変数の少ない新しいサブシステム S_i'が得られます。 ここでプロセスは(1)に戻ります。

  3. そのうち１つの等式からなるサブシステムが得られます。 もし等式が多変数なら、浮動小数点数の形式の近似は導入されず、 厳密解を見つけるために `solve`をコールします。

     いくつかの場合、 `solve`が解を見つけることができないか、 もし見つけたても、解が非常に大きな式になるかもしれません。

     等式が１変数で、線形か二次か四次の場合、 もし近似が導入されないなら、再び `solve`をコールします。 もし近似が導入されるか、等式が１変数でなく、線形でも二次でも、四次でもない場合、 もしスイッチ `realonly`が `true`なら、 実数解を見つけるため関数 `realroots`をコールします。 もし `realonly`が `false`なら、 実数解と複素数解を探す `allroots`をコールします。

     もし `algsys`が要求よりも有効数字が少ない解を生成するなら、 ユーザーは `algepsilon`の値をより高い値に変更できます。

     もし `algexact`が `true`に設定されているなら、 いつも `solve`をコールします。

  4. 最終的にステップ(3)で得られた解は以前のレベルに代入され、解処理は(1)に戻ります。

  `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

  Categories: Algebraic equations

関数: allroots
`allroots` (expr)
`allroots` (eqn)

  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)

  Categories: Polynomials · Numerical methods

関数: bfallroots
`bfallroots` (expr)
`bfallroots` (eqn)

  １変数の多項式 exprまたは多項式方程式 eqnの実数根と複素数根の数値近似を計算します。

  `bfallroots`は多倍長浮動小数点を使って根を計算する以外のすべての点で `allroots`と同一です。 詳しい情報については `allroots`を参照してください。

  Categories: Polynomials · Numerical methods

オプション変数: backsubst

  デフォルト値: `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]

  Categories: Algebraic equations

オプション変数: breakup

  デフォルト値: `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]

  Categories: Algebraic equations

関数: dimension
`dimension` (eqn)
`dimension` (eqn_1, …, eqn_n)

  `dimen`は、次元解析パッケージです。 `load ("dimen")`はこのパッケージをロードします。 `demo ("dimen")`は短いデモンストレーションを表示します。

  Categories: Share packages

オプション変数: dispflag

  デフォルト値: `true`

  もし `block`内で `false`に設定されたら `block`内でコールされた解法関数が生成する出力の表示を抑制します。 `block`をドル記号$で終端すると、 `dispflag`を `false`に設定します。

  Categories: Algebraic equations · Display flags and variables

関数: funcsolve (eqn, g(t))

  eqnを満たす有理関数 `g(t)`が存在するかどうかに依存して、 `[g(t) = ...]`か `[]`を返します。 ここで、 eqnは（この場合） `g(t)`と`g(t+1)`に関して 一次、線形多項式(first order, linear polynomial)でなければいけません。

      (%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)

  警告: これはとても未完成な実装です - 多くの安全性チェックや明らかな一般化が忘れられています。

  Categories: Algebraic equations

オプション変数: globalsolve

  デフォルト値: `false`

  `globalsolve`が `true`の場合、 ２つ以上の線形方程式を解く時、 解くべき変数が `linsolve`や `solve`が見つけた解の値に割り当てられます。

  `globalsolve`が `false`の時、 ２つ以上の線形方程式を解く時、 `linsolve`や `solve`が見つけた解は等式として表現され、 解くべき変数は割り当てられません。

  ２つ以上の線形方程式以外の何かを解く時には、 `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

  Categories: Linear equations

関数: ieqn (ie, unk, tech, n, guess)

  `inteqn`は積分方程式を解くためのパッケージです。 `load ("inteqn")`はこのパッケージをロードします。

  ieは積分方程式です; unkは未知の関数です; techは上で与えられたこれらから試される手法です; (tech = `first`は次を意味します: 解を見つける最初の手法を試みる; tech = `all`は次を意味します: 適用可能な手法すべてを試みる); nは `taylor`か, `neumann`, `firstkindseries`, `fredseries` に関して扱う項の最大数です (微分法に関する再帰の最大深度でもあります); guessは `neumann`か `firstkindseries`に関する初期の推測です。

  ２番目から５番目までのパラメータのデフォルト値は、以下の通りです:

  unk: `p(x)`。 ここで pは被積分関数の中で出会う Maximaが知らない最初の関数であり、 xは `secondkind`方程式の場合の積分の外側で見つかった pの最初の出現時の引数か `firstkind`方程式の中の積分変数を除いた唯一の残りの変数です。 もし xを探す企てが失敗したら、ユーザーは独立変数を提供するよう尋ねられるでしょう。

  tech: `first`

  n: 1

  guess: `none` とすると、 `neumann`と `firstkindseries`は初期推測として `f(x)`を使うようになります。

  Categories: Integral equations

オプション変数: ieqnprint

  デフォルト値: `true`

  `ieqnprint`は `ieqn`コマンドが返す結果の振る舞いを決めます。 `ieqnprint`が `false`の時、 `ieqn`関数が返すリストは形式

  [solution, technique used, nterms, flag]

  を取ります。

  ここでもし解が厳密なら flagはありません。

  そうでないなら、厳密でない解か閉じていない形の解かに対応してそれぞれ、単語 `approximate`か `incomplete`です。 もし級数法が使われたら、 ntermsは取った項の数を与えます。 （もしエラーが更なる項の生成を防いだなら、項の数は `ieqn`に与えたnよりも小さいこともあり得ます。）

  Categories: Integral equations

関数: lhs (expr)

  exprの演算子が関係演算子 `< <= = # equal notequal >= >`の１つか 割り当て演算子 `:= ::= : ::`の１つ、 `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

  Categories: Expressions

関数: linsolve ([expr_1, …, expr_m], [x_1, …, x_n])

  変数のリストに関して連立線形方程式のリストを解きます。 それぞれの式は変数に関する多項式でなければならず、等式も受け付けます。

  `globalsolve`が `true`の時、 解くべき変数それぞれは方程式の解の値にバインドされます。

  `backsubst`が `false`の時、 `linsolve`は方程式を三角行列化した後、後退代入を実行しません。 これは後退代入が極端に大きな式の生成の原因となる非常に大きな問題に対して 必要とされるかもしれません。

  `linsolve_params`が `true`の時、 `linsolve`は `algsys`の下のマニュアルの中で記述された任意のパラメータを表すのに使われる `%r`シンボルも生成します。 そうでないなら、 `linsolve`は他を使って表されたいくつかの変数を使って決定中の方程式系を解きます。 (solves an under-determined system of equations with some variables expressed in terms of others.)

  `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]

  Categories: Linear equations

オプション変数: linsolvewarn

  デフォルト値: `true`

  `linsolvewarn`が `true`の時、 `linsolve`はメッセージ"Dependent equations eliminated"を表示します。

  Categories: Linear equations

オプション変数: linsolve_params

  デフォルト値: `true`

  `linsolve_params`が `true`の時、 `linsolve`は `algsys`の下のマニュアルに記述された任意のパラメータを表すのに使われる `%r`シンボルも生成します。 それでないなら、`linsolve`は他を使って表されたいくつかの変数を使って 決定中の方程式系を解きます。

  Categories: Linear equations

システム変数: multiplicities

  デフォルト値: `not_set_yet`

  `multiplicities`は `solve`や `realroots`が返す個々の解の重複度のリストに設定されます。

  Categories: Algebraic equations · Polynomials

関数: nroots (p, low, high)

  半開区間 `(low, high]`の中の実数一変数多項式 pの実根の数を返します。 区間の端点は `minf`か `inf`かもしれません。

  `nroots`は、Sturm列の方法を使います。

      (%i1) p: x^10 - 2*x^4 + 1/2$
      (%i2) nroots (p, -6, 9.1);
      (%o2)                           4

  Categories: Polynomials · Numerical methods

関数: nthroot (p, n)

  pは整数係数多項式で、 nは正の整数です。 `q^n = p`のような整数上の多項式 `q`を返すか、 pが完全な n番目のべき (a perfect nth pwer)でないことを示すエラーメッセージを表示します。 このルーチンは `factor`より、また `sqfr`よりさえもっと速いです。

  Categories: Polynomials

オプション変数: polyfactor

  デフォルト値: `false`

  オプション変数 `polyfactor`が `true`の時、 `allroots`と `bfallroots`は もし多項式が実数なら実数上で、もし多項式が複素数なら複素数上で多項式を因数分解します。

  例は `allroots`を参照してください。

  Categories: Polynomials · Numerical methods

オプション変数: programmode

  デフォルト値: `true`

  `programmode`が `true`の時、 `solve`, `realroots`, `allroots`, `linsolve`はリストの中の要素として解を返します。 (`backsubst`が `false`設定されている時を除きます― その場合は`programmode: false`が仮定されます―)

  `programmode`が `false`の時、 `solve`などは中間式ラベル `%t1`, `%t2`など生成し、解をそれらに割り当てます。

  Categories: Algebraic equations · Polynomials

オプション変数: realonly

  デフォルト値: `false`

  `realonly`が `true`の時、 `algsys`は `%i`を含まないそれらの解だけを返します。

  Categories: Algebraic equations

関数: realroots
`realroots` (expr, bound)
`realroots` (eqn, bound)
`realroots` (expr)
`realroots` (eqn)

  変数多項式 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]

  Categories: Polynomials · Numerical methods

関数: rhs (expr)

  exprの演算子が関係演算子 `< <= = # equal notequal >= >`の１つか、 割り当て演算子`:= ::= : ::`の１つ、 `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

  Categories: Expressions

オプション変数: rootsconmode

  デフォルト値: `true`

  `rootsconmode`は `rootscontract`コマンドの振る舞いを決定します。 詳細は `rootscontract`を参照してください。

  Categories: Expressions · Simplification flags and variables

関数: rootscontract (expr)

  根の積を積の根に変換します。 例えば、 `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)`をもたらします。

  以下のように `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

  Categories: Simplification functions

オプション変数: rootsepsilon

  デフォルト値: 1.0e-7

  `rootsepsilon`は `realroots`関数が見つけた根に関する信頼区間を確立する許容誤差です。

  Categories: Polynomials · Numerical methods

関数: solve
`solve` (expr, x)
`solve` (expr)
`solve` ([eqn_1, …, eqn_n], [x_1, …, x_n])

  代数等式 exprを xについて解き、 xの解等式のリストを返します。 もし exprが等式でなければ、等式 `expr = 0`を仮定します。 xは関数(例えば `f(x)`)でも他のアトムでない式でも問題ありません。 （sumやproductは除きます。） exprが変数を１つだけ含む場合 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`は２次方程式、３次方程式、4次方程式の解の公式を必要に応じて使います。

  Eが解くべき変数のある関数（以下 `F(X)`)の多項式の場合， 最初に `F(X)`について解き（結果をCと呼びます）、 関数 Fの逆関数がわかっている場合、等式 `F(X)=C`をXについて解きます。

  もし `breakup`が `false`なら、 `solve`は３次もしくは４次方程式の解を、 デフォルトの、いくつかの共通部分式から成る表現ではなく、 単一の式で表現します。

  `multiplicities`は `solve`や `realroots`, `allroots`が返す多数の独立の解のリストに設定されます。 `solve`に影響するスイッチについては `apropos (solve)`を試してください。 スイッチの目的がはっきりしない時は、 `describe`で個々のスイッチ名を調べましょう。

  `solve ([eqn_1, ..., eqn_n], [x_1, ..., x_n])`は `linsolve`か `algsys`をコールすることで， 同時（線形もしくは非線形）代数方程式系を解き、変数の解リストのリストを返します。 `linsolve`の場合、このリストは解の単一リストを含みます。 引数に２つのリストを取ります。 最初のリストは解くべき等式を示し、２番目のリストは決定すべき未知数のリストです。 もし等式の変数の総数が等式の数に等しいなら、２番目の引数リストは省略できます。

  `programmode`が `false`の時、 `solve`は中間式 (`%t`)ラベルを持つ解を表示し、ラベルのリストを返します。

  `globalsolve`が `true`でかつ、問題が２つ以上の線形方程式を解くことである場合、 それぞれの解くべき変数は方程式の解の値にバインドされます。

  例:

      (%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`を参照してください。

  Categories: Algebraic equations

オプション変数: solvedecomposes

  デフォルト値: `true`

  `solvedecomposes`が `true`の時、 もし多項式を解くように頼まれたなら、 `solve`は `polydecomp`をコールします。

  Categories: Algebraic equations

オプション変数: solveexplicit

  デフォルト値: `false`

  `solveexplicit`が `true`の時、 `solve`が陰解―すなわち、`F`がある関数である形式`F(x) = 0`の解― を返すことを抑制します。

  Categories: Algebraic equations

オプション変数: solvefactors

  デフォルト値: `true`

  `solvefactors`が `false`の時、 `solve`は式を因数分解しようとしません。 `false`設定は因数分解が不要ないくつかの場合に望まれるかもしれません。

  Categories: Algebraic equations

オプション変数: solvenullwarn

  デフォルト値: `true`

  `solvenullwarn`が `true`の時、 もし空の等式リストか空の変数リストを引数にコールされたら `solve`は警告メッセージを表示します。 例えば `solve ([], [])`は２つの警告メッセージを表示し、 `[]`を返します。

  Categories: Algebraic equations

オプション変数: solveradcan

  デフォルト値: `false`

  `solveradcan`が `true`の時、 `solve`は `radcan`をコールします。 `solve`は遅くなりますが、指数と対数を含むある問題が解けるようになります。

  Categories: Algebraic equations

オプション変数: solvetrigwarn

  デフォルト値: `true`

  `solvetrigwarn`が `true`の時、 `solve`は、方程式を解くために逆三角関数を使い そのため解を失っていることを示す メッセージを表示するかもしれません。

  Categories: Algebraic equations

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

This document was generated by 市川雄二 on June, 21 2016 using texi2html 1.76.