2 * Functions and Variables for to_poly_solve::
5 @node Functions and Variables for to_poly_solve, , to_poly_solve, to_poly_solve
6 @section Functions and Variables for to_poly_solve
8 パッケージ @code{to_poly}と @code{to_poly_solve}は実験的なものです;
9 これらのパッケージの関数の仕様は変更の可能性があり、
10 これらのパッケージの関数のいくつかは他のMaxima関数にマージされるかもしれません。
12 Barton Willis (University of Nebraska at Kearneyの数学科の教授)が
13 @code{to_poly}と @code{to_poly_solve}パッケージと
14 これらのパッケージのための英語のユーザードキュメンテーションを書きました。
16 @deffn {Operator} %and
18 @fnindex Logical conjunction
21 演算子 @code{%and}は整理化(simplifying)非短絡論理積です。
23 @code{%and}式をtrueかfalseか論理的に同値ですが整理された式に整理します。
24 演算子 @code{%and}は結合的で可換でべき等的です。
27 @code{%and}の引数は非冗長なソートされたリストを形成します;
31 (%i1) a %and (a %and b);
35 もし積の引数の1つが @i{明示的に}もう一つの引数の否定なら、
36 @code{%and}はfalseを返します:
44 たとえ他のメンバーが明白に非ブーリアンでも積はfalseに整理されます;
52 inequation(すなわち、不等もしくは等式)の@code{%and}式の任意の引数は
53 Fourier消去パッケージを使って整理されます。
55 すべてでないですがいくつかの非線形inequationを線形inequationに変換する
58 @code{abs(x) + 1 > 0}を trueに整理します。だから、
61 (%i4) (x < 1) %and (abs(x) + 1 > 0);
68 オプション変数 @code{prederror}は
69 @code{%and}式の整理を変え@i{ません}。
73 演算子 @code{%and, %or}と @code{not}を含む複合式は完全に括弧でくくらなくてはいけません。
76 Maxima演算子 @code{and}と @code{or}はどちらも短絡的です。
77 なので @code{and}は結合的でなかったり可換ではなかったりします。
81 @b{制限} 積 @code{%and}はinequationを
82 @i{大域的にではなく局所的に}整理します。
83 これは以下のような積はfalseに整理@i{されない}ことを意味します。
86 (%i5) (x < 1) %and (x > 1);
87 (%o5) (x > 1) %and (x < 1)
90 また、 Fourier消去コードは事実データベースを@i{無視します}。
95 (%i7) (x > 1) %and (x > 2);
96 (%o7) (x > 1) %and (x > 2)
99 最終的に、同値の線形inequationに容易に変換されない非線形inequationは整理されません。
101 @code{%or}上に @code{%and}を分配するためのサポートはありません;
102 @code{%and}上に論理否定を分配するサポートもありません。
104 @b{利用のためには} @code{load("to_poly_solve")}
106 @b{関連関数} @code{%or, %if, and, or, not}
108 @b{状況} 演算子 @code{%and}は実験的です;
110 その機能は他のMaxima関数にマージされるかもしれません。
114 @deffn {演算子} %if (@var{bool}, @var{a}, @var{b})
116 @fnindex conditional evaluation
119 演算子 @code{%if}は整理化条件文です。
120 @i{条件} @var{bool}はブーリアン値でなければいけません。
121 条件がtrueの時、二番目の引数を返します;
122 条件がfalseの時、三番目の引数を返します;
125 Maxima inequations (不等式か等式)はブーリアン値では@i{ありません};
126 例えば、 Maximaは @math{5 < 6}をtrueに整理 @i{しません}し、
127 @math{5 = 6}をfalseに整理しません;
128 しかしながら、 to false; however, in
129 the context of a conditional to an
130 @code{%if}文への条件の文脈では、
131 Maximaは @i{自動的に}inequationの真値を決定しようとします。
135 (%i1) f : %if(x # 1, 2, 8);
136 (%o1) %if(x - 1 # 0, 2, 8)
137 (%i2) [subst(x = -1,f), subst(x=1,f)];
141 もし条件がinequationを含むなら、
142 MaximaはFourier消去パッケージを使ってそれを整理します。
148 もし条件が明白に非ブーリアンなら、Maximaは名詞形を返します:
158 Maxima演算子 @code{if}はn項演算子ですが、演算子 @code{%if}は n項演算子@i{ではないです}。
162 同値の線形inequationに容易に変換可能な非線形inequationだけを
165 @b{利用には:} @code{load("to_poly_solve")}
167 @b{状況:} 演算子 @code{%if}は実験的です;
169 機能は他のMaxima関数にマージされるかもしれません。
175 @fnindex Logical disjunction
178 演算子 @code{%or}は整理化非短絡論理和です。
180 @code{%or}式をtrueかfalseか論理的に同値ですが整理された式に整理します。
181 演算子 @code{%or}は結合的で可換でべき等です。
184 @code{%or}の引数は非冗長なソートされたリストを形成します;
188 (%i1) a %or (a %or b);
192 もし和のメンバーの1つが@i{明示的に}他のメンバーの否定なら、
193 @code{%or}はtrueを返します:
201 たとえ和の他のメンバーが明白に非ブーリアンでも和はtrueに整理されます。
209 inequation(不等式か等式)である @code{%or}式の任意の引数は
210 Fourier消去パッケージを使って整理されます。
211 Fourier消去コードは @code{abs(x) + 1 > 0}をtrueに整理します。
215 (%i4) (x < 1) %or (abs(x) + 1 > 0);
222 オプション変数 @code{prederror}は
223 @code{%or}式の整理を変更@i{しません}。
226 演算子 @code{%and, %or}, @code{not}を含む複合式は括弧でくくらなければいけません;
227 これらの演算子の結合力は期待と一致しないことがあります。
230 Maxima演算子 @code{and}と @code{or}はどちらも短絡的です。
231 なので @code{or}は結合的でないか可換でないかです。
235 @b{制限} 和 @code{%or}はinequationを
236 @i{大域的にではなく、局所的に}整理します。
237 これは以下のような和はtrueに整理@i{されない}ことを意味します。
239 @c TODO: IN MAXIMA 5.24POST THIS SIMPLIFIES TO TRUE.
242 (%i1) (x < 1) %or (x >= 1);
243 (%o1) (x > 1) %or (x >= 1)
246 更に Fourier消去コードは事実データベースを無視します:
251 (%i3) (x > 1) %and (x > 2);
252 (%o3) (x > 1) %and (x > 2)
255 最終的に、同値の線形inequationに容易に変換されない非線形inequationは整理されません。
257 両方ともfalseである項を探すアルゴリズムは弱いものです;
258 また、@code{%and}上に @code{%or}を分配するためのサポートはありません;
259 @code{%or}上に論理否定を分配するサポートもありません。
261 @b{利用のためには} @code{load("to_poly_solve")}
263 @b{関連関数} @code{%or, %if, and, or, not}
265 @b{状況} 演算子 @code{%or}は実験的です;
267 機能は他のMaxima関数にマージされるかもしれません。
271 @deffn {関数} complex_number_p (@var{x})
274 @code{a + %i * b}, @code{a}, @code{%i b}, @code{%i}のいずれかなら、
275 述語論理 @code{complex_number_p}はtrueを返します。
276 ここで @code{a}と @code{b}は有理数か(多倍長浮動小数点数を含む)浮動小数点数です;
278 @code{complex_number_p}はfalseを返します; 例えば
281 (%i1) map('complex_number_p,[2/3, 2 + 1.5 * %i, %i]);
282 (%o1) [true, true, true]
283 (%i2) complex_number_p((2+%i)/(5-%i));
285 (%i3) complex_number_p(cos(5 - 2 * %i));
289 @b{関連関数} @code{isreal_p}
291 @b{利用するには} @code{load("to_poly_solve")}
293 @b{状況} 関数 @code{complex_number_p}は実験的です;
295 機能は他のMaxima関数にマージされるかもしれません。
299 @deffn {関数} compose_functions (@var{l})
301 関数コール @code{compose_functions(l)}は
302 リスト @var{l}の中の関数の合成をラムダ形を返します。
303 関数は@i{右}から @i{左}へ適用されます; 例えば
306 (%i1) compose_functions([cos, exp]);
308 (%o1) lambda([%g151], cos(%e ))
314 関数リストが空のとき、恒等関数を返します:
317 (%i3) compose_functions([]);
318 (%o3) lambda([%g152], %g152)
326 Maximaがリストメンバーがシンボルやラムダ形でないか決める時、
327 (@code{compose_functions}@i{ではなく}) @code{funmake}がエラーをシグナルします:
331 (%i5) compose_functions([a < b]);
333 funmake: first argument must be a symbol, subscripted symbol,
334 string, or lambda expression; found: a < b
335 #0: compose_functions(l=[a < b])(to_poly_solve.mac line 40)
336 -- an error. To debug this try: debugmode(true);
342 関数 @code{new_variable}が決めます。
347 (%i6) compose_functions([%g0]);
348 (%o6) lambda([%g154], %g0(%g154))
349 (%i7) compose_functions([%g0]);
350 (%o7) lambda([%g155], %g0(%g155))
356 Maximaはこれらのラムダ形が意味的に等しいことを演繹できます:
360 (%i8) is(equal(%o6,%o7));
364 @b{利用するには} @code{load("to_poly_solve")}
366 @b{状況} 関数 @code{compose_functions}は実験的です;
368 機能は他のMaxima関数にマージされるかもしれません。
371 @deffn {関数} dfloat (@var{x})
375 @code{float}が IEEE 倍精度浮動小数点数に評価するのを失敗した時、
377 @code{rectform}を適用します; 例えば
380 (%i1) float(4.5^(1 + %i));
383 (%i2) dfloat(4.5^(1 + %i));
384 (%o2) 4.48998802962884 %i + .3000124893895671
392 数値評価には不完全で合わないかもしれません--例えば、
393 直交形は不必要に浮動小数点数の差(桁落ち)を含むかもしれません。
396 識別子 @code{float}は(デフォルト値がfalseの)オプション変数であり
401 @b{関連関数} @code{float, bfloat}
403 @b{利用するには} @code{load("to_poly_solve")}
405 @b{状況} 関数 @code{dfloat}は実験的です;
407 機能は他のMaxima関数にマージされるかもしれません。
411 @deffn {関数} elim (@var{l}, @var{x})
414 集合もしくはリスト @code{l}内の等式から
415 集合もしくはリスト@code{x}内の変数を消去します。
416 @code{x}のメンバーそれぞれはシンボルでなければいけません;
417 must be a symbol; the members of
418 @code{l}のメンバーは等式か零に等しいと仮定される式であり得ます。
420 関数 @code{elim}は2つのリストのリストを返します;
424 @code{elim}が変数を消去するのに使った式のリストです。
429 (%i1) elim(set(x + y + z = 1, x - y - z = 8, x - z = 1),
431 (%o1) [[2 z - 7], [y + 7, z - x + 1]]
434 @code{x}と @code{y}の消去は一つの等式 @code{2 z - 7 = 0}をもたらします;
435 等式 @code{y + 7 = 0}と @code{z - z + 1 = 1}がピボットとして使われました。
436 これらの等式から3つの変数すべての消去は、線形系を三角化します:
439 (%i2) elim(set(x + y + z = 1, x - y - z = 8, x - z = 1),
441 (%o2) [[], [2 z - 7, y + 7, z - x + 1]]
444 もちろん、等式は線形である必要はありません:
447 (%i3) elim(set(x^2 - 2 * y^3 = 1, x - y = 5), [x,y]);
449 (%o3) [[], [2 y - y - 10 y - 24, y - x + 5]]
452 ユーザーは変数が消去される順序を制御しません。
454 最良のピボットと最良の消去順序を選ぼうとする発見的方法を使います。
460 関連関数 @code{eliminate}と違い、
461 等式の数が変数の数と等しい時、関数 @code{elim}は
462 @code{solve}を呼び出し@i{ません}。
465 関数 @code{elim}は終結式を適用することで機能します;
466 オプション変数 @code{resultant}は
467 Maximaがどのアルゴリズムを使うか決めます。
468 @code{sqfr}を使って、 Maximaは
473 @code{elim}は多項式方程式の非線形一式を三角化します;
475 三角化されていない集合の解集合よりも大きい@i{かもしれません}。
477 三角化された方程式は@i{見せかけの}解を持ち得ます。
480 @b{関連関数} @i{elim_allbut, eliminate_using, eliminate}
482 @b{オプション変数} @i{resultant}
484 @b{利用するには} @code{load("to_poly")}
486 @b{状況} 関数 @code{elim}は実験的です;
488 機能は他のMaxima関数にマージされるかもしれません。
492 @deffn {関数} elim_allbut (@var{l}, @var{x})
497 リスト @code{x}内の変数を @i{除いて}
501 (%i1) elim_allbut([x+y = 1, x - 5*y = 1],[]);
502 (%o1) [[], [y, y + x - 1]]
503 (%i2) elim_allbut([x+y = 1, x - 5*y = 1],[x]);
504 (%o2) [[x - 1], [y + x - 1]]
507 @b{利用するには} @code{load("to_poly")}
509 @b{オプション変数} @i{resultant}
511 @b{関連関数} @i{elim, eliminate_using, eliminate}
513 @b{状況} 関数 @code{elim_allbut}は実験的です;
515 機能は他のMaxima関数にマージされるかもしれません。
519 @deffn {関数} eliminate_using (@var{l}, @var{e}, @var{x})
521 Using @code{e} as the pivot, eliminate the symbol @code{x} from the
522 list or set of equations in @code{l}. The function @code{eliminate_using}
526 (%i1) eq : [x^2 - y^2 - z^3 , x*y - z^2 - 5, x - y + z];
528 (%o1) [- z - y + x , - z + x y - 5, z - y + x]
529 (%i2) eliminate_using(eq,first(eq),z);
531 (%o2) @{y + (1 - 3 x) y + 3 x y - x - x ,
533 y - x y + 13 x y - 75 x y + x + 125@}
534 (%i3) eliminate_using(eq,second(eq),z);
536 (%o3) @{y - 3 x y + x + 5, y - x y + 13 x y - 75 x y + x
538 (%i4) eliminate_using(eq, third(eq),z);
540 (%o4) @{y - 3 x y + x + 5, y + (1 - 3 x) y + 3 x y - x - x @}
543 @b{オプション変数} @i{resultant}
545 @b{関連関数} @i{elim, eliminate, elim_allbut}
547 @b{利用するには} @code{load("to_poly")}
549 @b{状況} 関数 @code{elimimate_using}は実験的です;
551 機能は他のMaxima関数にマージされるかもしれません。
555 @deffn {関数} fourier_elim ([@var{eq1}, @var{eq2}, @dots{}], [@var{var1}, @var{var}, @dots{}])
558 Gauss消去の線形inequation(等式か不等式)に関する類似物です。
559 関数コール @code{fourier_elim([eq1, eq2, ...], [var1, var2, ...]}は
560 線形inequationsのリスト @code{[eq1, eq2, ...]}上の
561 変数 @code{[var1, var2, ...]}に関するFourier消去です;
565 (%i1) fourier_elim([y-x < 5, x - y < 7, 10 < y],[x,y]);
566 (%o1) [y - 5 < x, x < y + 7, 10 < y]
567 (%i2) fourier_elim([y-x < 5, x - y < 7, 10 < y],[y,x]);
568 (%o2) [max(10, x - 7) < y, y < x + 5, 5 < x]
571 Eliminating first with respect to
572 最初に @math{x}を次に @math{y}を消去することは
573 @math{y}に依存する、@math{x}に関する下限と上限、
574 そして@math{y}に関する下限と上限(それらは数です)ををもたらします。
576 @math{x}依存の@math{y}の下限と上限、
577 そして@math{x}の数値的下限と上限を与えます。
579 必要な時、 @code{fourier_elim}はinequationのリストの@emph{論理和}を返します:
582 (%i3) fourier_elim([x # 6],[x]);
583 (%o3) [x < 6] or [6 < x]
586 解集合が空の時、 @code{fourier_elim}は @code{emptyset}を返し、
587 解集合が実数すべての時、 @code{fourier_elim}は @code{universalset}を返します;
591 (%i4) fourier_elim([x < 1, x > 1],[x]);
593 (%i5) fourier_elim([minf < x, x < inf],[x]);
597 非線形inequationに対して、 @code{fourier_elim}は
598 (幾分) 整理されたinequationsのリストを返します:
601 (%i6) fourier_elim([x^3 - 1 > 0],[x]);
604 (%o6) [1 < x, x + x + 1 > 0] or [x < 1, - (x + x + 1) > 0]
606 (%i7) fourier_elim([cos(x) < 1/2],[x]);
607 (%o7) [1 - 2 cos(x) > 0]
611 @code{fourier_elim}の一番目の引数は
615 (%i8) fourier_elim((x + y < 5) and (x - y >8),[x,y]);
617 (%o8) [y + 8 < x, x < 5 - y, y < - -]
619 (%i9) fourier_elim(((x + y < 5) and x < 1) or (x - y >8),[x,y]);
620 (%o9) [y + 8 < x] or [x < min(1, 5 - y)]
623 関数 @code{fourier_elim}は
624 inequation演算子 @code{<, <=, >, >=, #}, @code{=}をサポートします。
627 絶対値や最小、最大関数を含むいくつかの非線形inequationを
631 線形項の積か商であるいくつかの式を扱います:
634 (%i10) fourier_elim([max(x,y) > 6, x # 8, abs(y-1) > 12],[x,y]);
635 (%o10) [6 < x, x < 8, y < - 11] or [8 < x, y < - 11]
636 or [x < 8, 13 < y] or [x = y, 13 < y] or [8 < x, x < y, 13 < y]
638 (%i11) fourier_elim([(x+6)/(x-9) <= 6],[x]);
639 (%o11) [x = 12] or [12 < x] or [x < 9]
640 (%i12) fourier_elim([x^2 - 1 # 0],[x]);
641 (%o12) [- 1 < x, x < 1] or [1 < x] or [x < - 1]
644 @b{利用するには} @code{load("fourier_elim")}
648 @deffn {関数} isreal_p (@var{e})
650 述語論理 @code{isreal_p}は、
652 @code{e}が実数線@i{全体}上で実数値であることを
656 実数線の空でないある部分集合上で@code{e}が実数値で @i{ない}ことを
662 (%i1) map('isreal_p, [-1, 0, %i, %pi]);
663 (%o1) [true, true, false, true]
666 Maxima変数は実と仮定されます; たとえば
673 関数 @code{isreal_p}は事実データベースを検査します:
676 (%i3) declare(z,complex)$
683 頻繁すぎるほど @code{isreal_p}は
684 falseを返すことができる時に名詞形を返します;
685 対数函数は実数線全体で実数値ではありません。
686 だから @code{isreal_p(log(x))}はfalseを返すべきです;
690 (%i5) isreal_p(log(x));
691 (%o5) isreal_p(log(x))
694 @b{利用するには} @code{load("to_poly_solve")}
696 @b{関連関数} @i{complex_number_p}
698 @b{状況} 関数 @code{real_p}は実験的です;
700 機能は他のMaxima関数にマージされるかもしれません。
704 @deffn {関数} new_variable (type)
706 @code{%[z,n,r,c,g]k}という形のユニークなシンボルを返します。
708 @math{type}に許される値は @i{integer, natural_number, real, natural_number,} @i{general}です。
709 (自然数(natural number)は @i{非負整数}を意味します;
711 自然数の定義のすべてではありませんがいくつかは零を@i{除外します}。)
713 @math{type}が許される値の1つでない時、
714 @math{type}は @math{general}にデフォルト設定されます。
716 Maximaは自動的にこの情報を事実データベースに追加します。
719 (%i1) map('new_variable,
720 ['integer, 'natural_number, 'real, 'complex, 'general]);
721 (%o1) [%z144, %n145, %r146, %c147, %g148]
722 (%i2) nicedummies(%);
723 (%o2) [%z0, %n0, %r0, %c0, %g0]
724 (%i3) featurep(%z0, 'integer);
726 (%i4) featurep(%n0, 'integer);
730 (%i6) featurep(%c0, 'complex);
734 @b{注釈} 一般に、@code{new_variable}の引数はクォートすべきです。
740 (%i8) new_variable(integer);
742 (%i9) new_variable('integer);
746 @b{関連関数} @i{nicedummies}
748 @b{利用するには} @code{load("to_poly_solve")}
750 @b{状況} 関数 @code{new_variable}は実験的です;
752 機能は他のMaxima関数にマージされるかもしれません。
756 @deffn {関数} nicedummies
758 関数 @code{nicedummies}は
759 @code{new_variable}が導入した式の中の変数を零から再インデックスします;
762 (%i1) new_variable('integer) + 52 * new_variable('integer);
763 (%o1) 52 %z136 + %z135
764 (%i2) new_variable('integer) - new_variable('integer);
766 (%i3) nicedummies(%);
770 @b{関連関数} @i{new_variable}
772 @b{利用するには} @code{load("to_poly_solve")}
774 @b{状況} 関数 @code{nicedummies}は実験的です;
776 機能は他のMaxima関数にマージされるかもしれません。
780 @deffn {関数} parg (@var{x})
783 複素偏角関数 @code{carg}の整理化バージョンです;
787 (%i1) map('parg,[1,1+%i,%i, -1 + %i, -1]);
789 (%o1) [0, ---, ---, -----, %pi]
793 一般に非定数入力に対して @code{parg}は名詞形を返します;例えば
796 (%i2) parg(x + %i * sqrt(x));
797 (%o2) parg(x + %i sqrt(x))
800 @code{sign}を使って入力が正の実数か負の実数か決めることができる時
801 @code{parg}は非定数入力に対して非名詞形を返します。
804 @c TODO: THE FIRST RESULT IS A NOUNFORM IN MAXIMA 5.24POST
813 @b{注釈} @code{sign}関数は
814 複素数と宣言された変数(@code{declare(x,complex)})を
817 @code{parg}は間違った値を返す可能性があります;
820 @c TODO: IN MAXIMA 5.24POST THE RESULT IS A NOUNFORM.
823 (%i1) declare(x,complex)$
829 @b{Related function} @i{carg, isreal_p}
831 @b{利用するには} @code{load("to_poly_solve")}
833 @b{状況} 関数 @code{parg}は実験的です;
835 機能は他のMaxima関数にマージされるかもしれません。
839 @deffn {関数} real_imagpart_to_conjugate (@var{e})
841 関数 @code{real_imagpart_to_conjugate}は
842 @code{realpart}と @code{imagpart}をすべて
843 @code{conjugate}を含む代数的に同値な式に置き換えます。
846 (%i1) declare(x, complex)$
848 (%i2) real_imagpart_to_conjugate(realpart(x) + imagpart(x) = 3);
849 conjugate(x) + x %i (x - conjugate(x))
850 (%o2) ---------------- - --------------------- = 3
854 @b{利用するには} @code{load("to_poly_solve")}
856 @b{状況} 関数 @code{real_imagpart_to_conjugate}は実験的です;
858 機能は他のMaxima関数にマージされるかもしれません。
862 @deffn {関数} rectform_log_if_constant (@var{e})
864 関数 @code{rectform_if_constant}は
865 @code{ log(c)}の形の項をすべて
866 @code{rectform(log(c))}に変換します。
867 ここで @code{c}は宣言された定数式か明示的に宣言された定数です。
870 (%i1) rectform_log_if_constant(log(1-%i) - log(x - %i));
872 (%o1) - log(x - %i) + ------ - ------
874 (%i2) declare(a,constant, b,constant)$
876 (%i3) rectform_log_if_constant(log(a + %i*b));
879 (%o3) ------------ + %i atan2(b, a)
883 @b{利用するには} @code{load("to_poly_solve")}
885 @b{状況} 関数 @code{rectform_log_if_constant}は実験的です;
887 機能は他のMaxima関数にマージされるかもしれません。
891 @deffn {関数} simp_inequality (@var{e})
893 関数 @code{simp_inequality}は
894 inequationの論理積と論理和にいくつかの整理を適用します。
896 @b{制限} 関数 @code{simp_inequality}は少なくとも2つの点で制限されます;
899 @c TODO: IN MAXIMA 5.24POST THE RESULT IS SIMPLIFIED.
902 (%i1) simp_inequality((x > minf) %and (x < 0));
903 (%o1) (x>1) %and (x<1)
906 第二に @code{simp_inequality}は事実データベースを参照しません:
911 (%i3) simp_inequality(x > 0);
915 @b{利用するには} @code{load("to_poly_solve")}
917 @b{状況} 関数 @code{simp_inequality}は実験的です;
919 機能は他のMaxima関数にマージされるかもしれません。
923 @deffn {関数} standardize_inverse_trig (@var{e})
926 恒等式 @code{cot(x) = atan(1/x), acsc(x) = asin(1/x),}と
927 @code{asec, acoth, acsch} @code{asech}に関する類似
929 Abramowitz and Stegun,
930 Eqs. 4.4.6 から 4.4.8までと 4.6.4から 4.6.6までを参照してください。
932 @b{利用するには} @code{load("to_poly_solve")}
934 @b{状況} 関数 @code{standardize_inverse_trig}は実験的です;
936 機能は他のMaxima関数にマージされるかもしれません。
939 @deffn {関数} subst_parallel (@var{l}, @var{e})
941 @code{l}が単一の等式か等式のリストの時、
942 それぞれの等式の右辺側を左辺に代入します。
946 (%i1) load("to_poly_solve")$
948 (%i2) subst_parallel([x=y,y=x], [x,y]);
955 (%i3) subst([x=y,y=x],[x,y]);
959 関数 @code{subst_parallel}は
960 @code{subst_parallel}は非アトムの代入を許すことを除いて
965 (%i4) subst_parallel([x^2 = a, y = b], x^2 * y);
967 (%i5) sublis([x^2 = a, y = b], x^2 * y);
970 sublis: left-hand side of equation must be a symbol; found: x
971 -- an error. To debug this try: debugmode(true);
974 @code{subst_parallel}が行う代入は文字通りであり意味論的ではありません;
976 @code{subst_parallel}は
977 @math{x * y}が @math{x^2 * y}の部分式であることを認識@i{しません}
980 (%i6) subst_parallel([x * y = a], x^2 * y);
985 関数 @code{subst_parallel}は整理の@i{前に}すべての代入を完了します。
986 これは、もし整理が前に行われていたらエラーが起こるような
990 (%i7) subst_parallel([x = 0], %if(x < 1, 5, log(x)));
992 (%i8) subst([x = 0], %if(x < 1, 5, log(x)));
994 log: encountered log(0).
995 -- an error. To debug this try: debugmode(true);
998 @b{関連関数} @i{subst, sublis, ratsubst}
1000 @b{利用するには} @code{load("to_poly_solve_extra.lisp")}
1002 @b{状況} 関数 @code{subst_parallel}は実験的です;
1004 機能は他のMaxima関数にマージされるかもしれません。
1008 @deffn {関数} to_poly (@var{e}, @var{l})
1012 inequation制約を伴う多項式系に変換しようとします;
1015 非公式には @code{to_poly}は
1016 等式 @var{e}を多項式化しようとします;
1020 (%i1) load("to_poly_solve")$
1022 (%i2) to_poly(sqrt(x) = 3, [x]);
1024 (%o2) [[%g130 - 3, x = %g130 ],
1026 [- --- < parg(%g130), parg(%g130) <= ---], []]
1030 条件 @code{-%pi/2<parg(%g6),parg(%g6)<=%pi/2}は
1031 @code{%g6}が平方根関数の範囲内であることを告げます。
1033 @code{sqrt(x) = 3}に設定された解は
1034 @code{%g6-3,x=%g6^2}に設定された解と同じです。
1039 @code{to_poly}が返す三番目のリスト内で返されます;
1043 (%i3) to_poly(cos(x),[x]);
1045 (%o3) [[%g131 + 1], [2 %g131 # 0], [%g131 = %e ]]
1048 数字1が変数リストのメンバーでない限り定数項は多項式化されません;
1052 (%i4) to_poly(x = sqrt(5),[x]);
1053 (%o4) [[x - sqrt(5)], [], []]
1054 (%i5) to_poly(x = sqrt(5),[1,x]);
1056 (%o5) [[x - %g132, 5 = %g132 ],
1058 [- --- < parg(%g132), parg(%g132) <= ---], []]
1062 根の1つとして@math{sqrt(5) + sqrt(7)}を持つ多項式を生成するには、
1066 (%i6) first(elim_allbut(first(to_poly(x = sqrt(5) + sqrt(7),
1069 (%o6) [x - 24 x + 4]
1072 @b{関連関数} @i{to_poly_solve}
1074 @b{利用するには} @code{load("to_poly")}
1076 @b{状況:} 関数 @code{to_poly}は実験的です;
1078 機能は他のMaxima関数にマージされるかもしれません。
1082 @deffn {関数} to_poly_solve (@var{e}, @var{l}, [options])
1084 関数 @code{to_poly_solve}は
1086 変数 @math{l}について解こうとします。
1087 等式 @math{e}は単一の式か式の集合もしくはリストでありえます;
1088 同様に @math{l}は単一のシンボルかシンボルの集合のリストでありえます;
1089 @math{e}のメンバーが明示的に等式でない時(例えば @math{x^2 -1})、
1092 @code{to_poly_solve}の基本戦略は
1093 入力を多項式形に変換するために @code{to_poly}を使い、
1094 多項式系上で @code{algsys}をコールします。
1095 なので Thus user options that affect
1096 @code{algsys}に影響を与えるユーザーオプション、特に
1097 @code{algexact}は @code{to_poly_solve}にも影響を与えます。
1098 @code{algexact}のデフォルト値はfalseですが、
1099 @code{to_poly_solve}のためには、、一般的に @code{algexact}はtrueであるべきです。
1100 関数 @code{to_poly_solve}は
1101 @code{algexact}を局所的にtrueに設定しません。
1102 @code{algsys}が厳密は解を決定することができない時
1103 trueに設定すると近似解を見つけることが不可能になるためです。
1105 @code{to_poly_solve}が解集合を決定できる時、
1107 @code{%union}オブジェクト内のリストです:
1110 (%i1) load("to_poly_solve")$
1112 (%i2) to_poly_solve(x*(x-1) = 0, x);
1113 (%o2) %union([x = 0], [x = 1])
1116 @code{to_poly_solve}が解集合を決定@i{できない}時
1117 @code{%solve}名詞形が返されます。(この場合、警告が印字されます。)
1120 (%i3) to_poly_solve(x^k + 2* x + 1 = 0, x);
1122 Nonalgebraic argument given to 'to_poly'
1125 (%o3) %solve([x + 2 x + 1 = 0], [x])
1128 @code{%solve}名詞形への代入は時々解に帰着します。
1131 (%i4) subst(k = 2, %);
1132 (%o4) %union([x = - 1])
1136 ソルバは時々任意整数の導入を必要とします。
1138 @code{%zXXX}という形を持ちます。
1139 ここで @code{XXX}は整数です;
1143 (%i5) to_poly_solve(sin(x) = 0, x);
1144 (%o5) %union([x = 2 %pi %z33 + %pi], [x = 2 %pi %z35])
1147 これらの変数を零から再インデックスするには @code{nicedummies}を使います:
1150 (%i6) nicedummies(%);
1151 (%o6) %union([x = 2 %pi %z0 + %pi], [x = 2 %pi %z1])
1155 @code{%cXXX}という形の任意複素数か
1156 @code{%rXXX}という形の任意実数を導入します。
1157 関数 @code{nicedummies}はこれらの識別子を零から再インデックスします。
1161 @code{%and}か, @code{%or}, @code{%if}を含む様々な論理演算子の
1166 (%i7) sol : to_poly_solve(abs(x) = a, x);
1167 (%o7) %union(%if(isnonnegative_p(a), [x = - a], %union()),
1168 %if(isnonnegative_p(a), [x = a], %union()))
1169 (%i8) subst(a = 42, sol);
1170 (%o8) %union([x = - 42], [x = 42])
1171 (%i9) subst(a = -42, sol);
1175 空集合は @code{%union}によって表現されます。
1177 関数 @code{to_poly_solve}は
1178 有理数や非有理べき、絶対値、三角関数、最小最大を含む等式の(すべてではありませんが)
1180 Lambert W 函数を使って解くことができるいくつかの等式も解くことができます;
1184 (%i1) load("to_poly_solve")$
1186 (%i2) to_poly_solve(set(max(x,y) = 5, x+y = 2), set(x,y));
1187 (%o2) %union([x = - 3, y = 5], [x = 5, y = - 3])
1188 (%i3) to_poly_solve(abs(1-abs(1-x)) = 10,x);
1189 (%o3) %union([x = - 10], [x = 12])
1190 (%i4) to_poly_solve(set(sqrt(x) + sqrt(y) = 5, x + y = 10),
1194 (%o4) %union([x = - ------------, y = ------------],
1198 [x = ------------, y = - ------------])
1200 (%i5) to_poly_solve(cos(x) * sin(x) = 1/2,x,
1201 'simpfuncs = ['expand, 'nicedummies]);
1203 (%o5) %union([x = %pi %z0 + ---])
1205 (%i6) to_poly_solve(x^(2*a) + x^a + 1,x);
1210 (%o6) %union([x = -----------------------------------],
1217 (- sqrt(3) %i - 1) %e
1218 [x = -------------------------------------])
1222 (%i7) to_poly_solve(x * exp(x) = a, x);
1223 (%o7) %union([x = lambert_w(a)])
1226 @i{線形}不等式に対して、 @code{to_poly_solve}は自動的にFourier消去を行います:
1229 (%i8) to_poly_solve([x + y < 1, x - y >= 8], [x,y]);
1231 (%o8) %union([x = y + 8, y < - -],
1234 [y + 8 < x, x < 1 - y, y < - -])
1238 @code{to_poly_solve}のオプション引数のそれぞれは等式でなければいけません;
1239 一般にこれらのオプションの順序は問題になりません.
1243 @code{simpfuncs = l},
1244 ここで @code{l}は函数のリストです。
1245 lのメンバーの合成をそれぞれの解に適用します。
1249 (%i1) to_poly_solve(x^2=%i,x);
1251 (%o1) %union([x = - (- 1) ], [x = (- 1) ])
1252 (%i2) to_poly_solve(x^2= %i,x, 'simpfuncs = ['rectform]);
1254 (%o2) %union([x = - ------- - -------], [x = ------- + -------])
1255 sqrt(2) sqrt(2) sqrt(2) sqrt(2)
1260 時々追加の整理は整理を戻すことがあります;
1265 (%i3) to_poly_solve(x^2=1,x);
1266 (%o3) %union([x = - 1], [x = 1])
1267 (%i4) to_poly_solve(x^2= 1,x, 'simpfuncs = [polarform]);
1269 (%o4) %union([x = 1], [x = %e ]
1275 関数リスト @code{l}のそれぞれのメンバーが純粋に整理であるかチェックしようとしません;
1280 (%i5) to_poly_solve(x^2 = %i,x, 'simpfuncs = [lambda([s],s^2)]);
1281 (%o5) %union([x = %i])
1286 それぞれの解を倍精度浮動小数点数に変換するには
1287 @code{simpfunc = ['dfloat]}を使います:
1291 (%i6) to_poly_solve(x^3 +x + 1 = 0,x,
1292 'simpfuncs = ['dfloat]), algexact : true;
1293 (%o6) %union([x = - .6823278038280178],
1294 [x = .3411639019140089 - 1.161541399997251 %i],
1295 [x = 1.161541399997251 %i + .3411639019140089])
1300 @code{use_grobner = true}
1302 解を企てる前に関数 @code{poly_reduced_grobner}が
1305 関数 @code{algsys}の弱みに対する応急措置を提供します。
1310 (%i7) to_poly_solve([x^2+y^2=2^2,(x-1)^2+(y-1)^2=2^2],[x,y],
1311 'use_grobner = true);
1313 sqrt(7) - 1 sqrt(7) + 1
1314 (%o7) %union([x = - -----------, y = -----------],
1317 sqrt(7) + 1 sqrt(7) - 1
1318 [x = -----------, y = - -----------])
1320 (%i8) to_poly_solve([x^2+y^2=2^2,(x-1)^2+(y-1)^2=2^2],[x,y]);
1326 @code{maxdepth = k},
1327 ここで @code{k}は正の整数です。
1328 この関数はソルバの最大再帰深さを制御します。
1329 @code{maxdepth}のデフォルト値は5です。
1330 再帰深さを越えた時、ソルバはエラーをシグナルします:
1334 (%i9) to_poly_solve(cos(x) = x,x, 'maxdepth = 2);
1338 (%o9) %solve([cos(x) = x], [x], maxdepth = 2)
1343 @code{parameters = l},
1344 ここで @code{l}はシンボルのリストです。
1346 リスト @code{l}のメンバーすべてに有効な解を返そうとします;
1351 (%i10) to_poly_solve(a * x = x, x);
1352 (%o10) %union([x = 0])
1353 (%i11) to_poly_solve(a * x = x, x, 'parameters = [a]);
1354 (%o11) %union(%if(a - 1 = 0, [x = %c111], %union()),
1355 %if(a - 1 # 0, [x = 0], %union()))
1360 @code{(%o2)}で、ソルバはダミー変数を導入しました;
1361 これらのダミー変数を再インデックスするには、
1362 関数 @code{nicedummies}を使います:
1366 (%i12) nicedummies(%);
1367 (%o12) %union(%if(a - 1 = 0, [x = %c0], %union()),
1368 %if(a - 1 # 0, [x = 0], %union()))
1371 @math{f(a) = f(b)}という形の等式を解くために
1372 @code{to_poly_solve}は
1373 ハッシュ配列 @code{one_to_one_reduce}に記憶されたデータを使います。
1374 割り当て @code{one_to_one_reduce['f,'f] : lambda([a,b], a=b)}は
1375 @code{to_poly_solve}に
1376 @math{f(a) = f(b)}の解集合が@math{a=b}の解集合に等しいことを告げます;
1380 (%i13) one_to_one_reduce['f,'f] : lambda([a,b], a=b)$
1382 (%i14) to_poly_solve(f(x^2-1) = f(0),x);
1383 (%o14) %union([x = - 1], [x = 1])
1387 割り当て @code{one_to_one_reduce['f,'g] : lambda([a,b], w(a, b) = 0}は
1388 @code{to_poly_solve}に
1389 @math{f(a) = f(b)}の解集合が @math{w(a,b) = 0}の解集合に等しいことを告げます;
1393 (%i15) one_to_one_reduce['f,'g] : lambda([a,b], a = 1 + b/2)$
1395 (%i16) to_poly_solve(f(x) - g(x),x);
1396 (%o16) %union([x = 2])
1399 加えて、@math{f(a) = b}という形の等式を解くために
1400 関数 @code{to_poly_solve}は
1401 ハッシュ配列 @code{function_inverse}に記憶されたデータを使います。
1402 割り当て @code{function_inverse['f] : lambda([s], g(s))}は
1403 @code{to_poly_solve}に
1404 @code{f(x) = b}に設定された解が
1405 @code{x = g(b)}に設定された解に等しいことを知らせます;
1409 (%i17) function_inverse['Q] : lambda([s], P(s))$
1411 (%i18) to_poly_solve(Q(x-1) = 2009,x);
1412 (%o18) %union([x = P(2009) + 1])
1413 (%i19) function_inverse['G] : lambda([s], s+new_variable(integer));
1414 (%o19) lambda([s], s + new_variable(integer))
1415 (%i20) to_poly_solve(G(x - a) = b,x);
1416 (%o20) %union([x = b + a + %z125])
1424 解く変数はシンボルである必要はありません;
1425 @code{fullratsubst}が適切に代入できる時、
1430 (%i1) to_poly_solve([x^2 + y^2 + x * y = 5, x * y = 8],
1431 [x^2 + y^2, x * y]);
1433 (%o1) %union([x y = 8, y + x = - 3])
1444 (%i1) declare(x,complex)$
1446 (%i2) to_poly_solve(x + (5 + %i) * conjugate(x) = 1, x);
1448 (%o2) %union([x = - -----------])
1450 (%i3) declare(y,complex)$
1452 (%i4) to_poly_solve(set(conjugate(x) - y = 42 + %i,
1453 x + conjugate(y) = 0), set(x,y));
1455 (%o4) %union([x = - -------, y = - -------])
1462 @code{to_poly_solve}は
1468 (%i1) to_poly_solve(abs(x) = 6, x);
1469 (%o1) %union([x = - 6], [x = 6])
1470 (%i2) declare(z,complex)$
1472 (%i3) to_poly_solve(abs(z) = 6, z);
1473 (%o3) %union(%if((%c11 # 0) %and (%c11 conjugate(%c11) - 36 =
1474 0), [z = %c11], %union()))
1479 @i{これはソルバが事実データベースを参照する唯一の状況です。例えば、もし解く変数が整数と宣言されていたら、@code{to_poly_solve}はこの宣言を無視します}。
1482 @b{Relevant option variables} @i{algexact, resultant, algebraic}
1484 @b{関連関数} @i{to_poly}
1486 @b{利用するには} @code{load("to_poly_solve")}
1488 @b{状況:} 関数 @code{to_poly_solve}は実験的です;
1490 機能は他のMaxima関数にマージされるかもしれません。