方程式と不等式の操作

方程式
「変数の定義」において,xy に等しくすることを表す x=y のような割当てについて述べた.ここでは,等号関係を判定するいわゆる方程式について説明していく.xy に等しいかどうかを判定する方程式は,x==y と記述する.
これは,2+24に等しいかを判定する.結果はシンボルTrueである:
ここで x=yx==y の記述を混乱しないように注意してほしい.x=y は,命令的な表現であり,実際に割当てを実行するためにある.これに対して,x==y は,単に xy が等しいかどうかを判定するだけのためにあり,それで何かが実行されるというようなことはない.C言語を使ったことのあるユーザなら,Wolfram言語で使われる割当て(assignment)と判定(testing)の操作がC言語のものと同じであることに気が付いたであろう.
x=y
yx に割り当てる
x==y
xy が等しいかどうか判定する
割当てと判定
xに値4を割り当てる:
xを参照すると,割り当てられている値,すなわち,4が返される:
x4に等しいかどうかを判定する.この場合は等しい:
x4に等しいが,6には等しくない:
こうすると,xに割り当てられてある値が消去される:
これまでの例では,両辺がともに数のときの等号関係の判定を見てきた.必ずTrueまたはFalseの答が得られた.記号で表された数式を判定することもできる.
xに特定の数値が与えられない限り,Wolfram言語は,この判定に対して確定した結果を出すことができない:
xを特定の数値4におくと,判定結果はFalseになる:
記号で表された数式に対する判定でも,ケースによっては,確定した結果を得ることができる.ここで重要なケースとして,2つの同値の式に対して等号関係を判定することがある.これらの両方の式の変数がどんな数値であろうが,Wolfram言語は,式が常に等しいものと正確に解釈する.
左右の式は全く同じである.したがって,xがどんな値を取ろうが結果はTrueになる:
Wolfram言語は,これらの式が等しいかどうかは判断しない.この場合は,Expandを使えば,同じ形にすることができる:
Wolfram言語では,x==4のような式は方程式を表す.Wolfram言語には方程式の変形や解法のために各種の関数が用意されている.
これは,Wolfram言語における方程式を表している.方程式をxについて解く方法は「方程式の解法」で説明する:
方程式に名前を付けることも可能である:
eqnを参照すると,もとの方程式を得ることができる:
方程式の解法
x^2+2x-7==0のような式は,Wolfram言語では方程式を表す.このような方程式を解くことがしばしば必要になる.それには等号関係を真とするxの値を見出せばよい.
二次方程式 を解く.解は2つ求まり,xの変換規則として返される:
こうすると,数値解を得ることができる:
置換演算子を使いSolveにより生成された規則をxに適用することで,xの実際の解をリスト形式で得ることができる:
これらの規則は,xを含んだ他の式にも同様に適用することができる:
Solve[lhs==rhs,x]
方程式を解く(答は x への置換規則のリストとして出力する)
x/.solution
答の置換規則を作用させ x 値のみをリスト出力する
expr/.solution
答の置換規則を作用させ式の値をリスト出力する
方程式の解法と解の代入
Solveを使うと,必ず方程式の解の明示的な式の導出が試みられる.しかし,数学の基本的な結果として判明しているように,式が十分に複雑ならば,根基による明示的な形の解を得ることは不可能である.変数が1つしかなく,最大でも次数が四次以下なら,Wolfram言語は必ずその解を式として求めることができる.しかし,五次以上の方程式では,すべての解を明示的な代数式として求めることは数学的に不可能である.
単一変数で五次より低い代数方程式なら,Wolfram言語は必ず解くことができる:
方程式によっては,それより高次でも解くことができる:
いくつかの方程式は,解は存在してもそれを明示的な式として表すことは不可能である.ここでは,Rootオブジェクトで解が表現される:
明示的な式が得られなくても,数値的に解を評価することは可能である:
Wolfram言語は,純粋な代数方程式だけでなく,種類は限られているが特殊な関数を含んだ方程式を解くこともできる.
ここではWolfram言語は方程式の完全解を返す:
警告が出るが,方程式に対して1つの解が求まる:
のような方程式の解は無限個あることに気を付けなければいけない.しかし,Solveは,デフォルトで1つの解だけしか返さない.ただし,他に可能な解が存在する旨を伝えるメッセージは表示する.Reduceを用いるとより詳しい情報が得られる.
この式のような超越方程式には,「代数閉体内」の解は存在しない:
FindRootを使い,xの初期値を与えることで,近似数値解を求めることができる:
Solveを使い未知の関数を含んだ方程式を解くことも可能である.その場合も,警告が発せられるが,形式的な逆関数を使った結果を得ることができる.
Wolfram言語はfの正式な逆関数として結果を返す:
Solve[{lhs1==rhs1,lhs2==rhs2,},{x,y,}]
変数 x, y, について連立方程式を解く
連立方程式の解法
Wolfram言語を使い,連立方程式も解くことができる.解きたい方程式の組を列挙したリストを与え,解く対象となる変数を列挙したリストを指定するだけでよい.
2つの連立方程式をリスト形式で列挙し,変数xyについて解く:
少々複雑な連立方程式を解いてみる.出力される2つの解はxyの2組の変換規則のリストとして与えられる:
求まった解を使い式x+yを評価してみる:
Wolfram言語は,連立した線形方程式あるいは整方程式ならどんな組合せのものでも解くことができる.
複数の変数について連立方程式を解く場合,キャンセルできる変数があればあらかじめ打ち消しておくと解が得やすくなる.
以下のようにして,2つの方程式からyを打ち消し,xの方程式にまとめ直す:
複数の方程式があるとき,特定の変数について連立解がひとつでも存在するという保証はない.
これらの方程式において矛盾しない解は存在しない.このため,Wolfram言語は解の集合が空であることを示したリスト{}を返してくる:
ほとんどすべてのaの値について,これらの方程式の連立解は存在しない:
一般に連立方程式が解を持つか持たないかは極めて微妙な問題である.例えば,連立方程式{x==1,x==a}において,aのほとんどの値に対して連立方程式は矛盾するため,xの解は存在しない.唯一,a1に等しいときに,連立方程式は解を持つ.Solveは,方程式の一般解を求めるように設定されている,パラメータ間の特別な制約条件が満たされるときだけに存在する解は切り捨てられる.
Solveの代りにReduceを使えば,Wolfram言語は,パラメータに関する特別条件を満足する特殊解を含む,連立方程式のすべての可能な解を保持しておく.
これは,方程式がa==1のときのみ解を持つことを示す.a==1&&x==1という表記はa==1 x==1がともにTrueであるという条件を表す:
これは,方程式の可能な解の完全な集合を与える.答は簡約された方程式の組合せとして表される.&&は,同時に満たされなければならない方程式を示し,||は代替条件を示す:
こうするとより複雑な式の組合せが与えられる:
これはすべての解の記号表示である:
Solve[lhs==rhs,x]
x について方程式を解く
Solve[{lhs1==rhs1,lhs2==rhs2,},{x,y,}]
x, y, について連立方程式を解く
Eliminate[{lhs1==rhs1,lhs2==rhs2,},{x,}]
連立方程式において x, を消去する
Reduce[{lhs1==rhs1,lhs2==rhs2,},{x,y,}]
連立方程式を変形・簡約し,条件付きであっても解を探す
方程式の解法と整理を行う関数
Reduceは実数や整数の方程式を扱う強力な機能も備えている.これについては「領域上の等式と不等式」でより詳しく説明する.
これはxyが複素数であると仮定して式を簡約する:
これにはxyが実数であるという制約条件が含まれる:
これは整数解しか与えない:
方程式と解の表現
Wolframシステムは方程式を論理構文として扱う.x^2+3x==2と方程式を入力すると,Wolframシステムはこれをx^2+3x2に等しいとする構文として解釈する.xに特定の値を割り当てると(例えば,x=4というように),Wolframシステムが判断できるようになり,論理構文x^2+3x==2Falseであることが判明する.
一方,xに特定の値を与えなければ,判断不能なままなので,x^2+3x==2TrueなのかFalseなのか判明しない.そして,方程式はそのままの記号代数式の形x^2+3x==2で残される.
Wolframシステムでは,記号代数式の方程式に各種の操作を施せる.方程式をまとめ直すには,特定の変数の組について解けた形にするのが普通であろう.
シンボル的な方程式を例に見てみる:
Reduceを使って,xの「解」が得られるように整理し直す.得られる式も,もとの方程式と同じように論理構文として見ることができる:
二次方程式x^2+3x==2は,xの値について暗示的な構文と考えられる.上の例で示したように,関数Reduceを使えば,より明示的にxの値を表した式に書き換えられる.Reduceが生成する式はx==r1||x==r2の形を取る.この式もまた論理構文であり,「xr1に等しい.あるいはxr2に等しい」の意味を持つ.この論理構文を満たすxの値は,もとの二次方程式を満たすxの値と全く同じである.ただし,多くの場合,Reduceで得られる式の方がもとの方程式よりはるかに有用である.
方程式は他の論理構文と同じように組み合せたり,操作したりすることが可能である.||&&等の論理結合記号を使い,代替や連立の条件を設定できる.また,LogicalExpandFullSimplifyのような関数を使い,方程式の組を簡約することも可能である.
方程式は,通常,論理構文として変形操作すると便利である.しかし,場合によっては,求められた方程式の解を他の計算に利用したい.そのような場合は,方程式を lhs==rhs のもとの形から lhsrhs の変換規則の形に置き換えておくとよい.解を変換規則の形にしておけば,置換記号/.を使い簡単に解を式に代入できるようになる.
Reduceを適用すると,二次方程式の根に相当するxの値に関した論理構文が生成される:
ToRulesを作用させ,論理構文から変換規則のリストを作成する:
変換規則を使い,xの解をxを含む式に代入することができる:
Solveを使うと,解が変換規則の形で生成される:
一変数の方程式
Solveやこれに関連したWolfram言語の関数は,主に整方程式(代数方程式)を扱う.
xの一次方程式は簡単に解ける:
二次方程式も簡単な公式を適用すればだれでも解ける:
Wolfram言語では,三次方程式の厳密な解も求めることができる.ここでは,比較的単純な三次方程式の最初の解を求めてみる:
方程式が三次と四次になると解は非常に複雑になりがちだが,それでも,Wolfram言語は四次までの方程式なら明示的な式として解を必ず見付けることができる.
解として与えられる式の重要な特徴は,根基(ベキ根)のみを含むということである.つまり,平方根,3乗根,さらに高次の根に四則演算を施した形で表される.
数学的に証明されている基本的事項であるが,一般に,五次以上の方程式にはベキ根を使った明示的な式で解を表すことができない.
限られた方程式についてはそのような解が存在することもあるが,多くの方程式では存在しない.
六次方程式を構築する:
この例の式のように因数に分解する多項式なら,Solveを使うだけで簡単に根が見付かる:
八次式を構築する:
この多項式は因数分解できないが,多項式の多項式という形をしているので,Solveで明示的な解を求めることができる.(今の例では,二次式の二次式の二次式という構造をしているので二次方程式を3回解くことになる.)
Root[f,k]
方程式 f[x]==0における k 番目の根を返す
根を陰的に表すオブジェクト
この方程式にはベキ根で表せるような解が存在しない.このため,Wolfram言語はシンボル的に解を表す:
これは各根の数値近似を求める:
最終的に数値解がほしいのであれば,はじめからNSolveを使った方が速いことが多い:
Rootオブジェクトは多項式の根の陰的ではあるが厳密な表現を与える.これはSqrt[2]あるいは厳密な数値を表すその他の表現と同じように扱うことができる.
これは上で論じた多項式の最初の根を表すRootオブジェクトである:
これはその値の数値近似である:
Roundは根に最も近い整数を求める厳密計算を行う:
この根をもとの多項式に代入し,結果を簡約すると零になる:
もとの多項式のすべての根の積を求める:
第3根の複素共役は第2根である:
方程式に存在する唯一の記号パラメータがそれについて解こうとしている変数の場合,方程式のすべての解はただの数になる.しかし,方程式にこの他のパラメータがあれば,一般に解はそれらのパラメータの関数になる.
この方程式の解もまたRootオブジェクトで表すことができる.しかしここでは,各Rootオブジェクトがパラメータaを含んでいる:
a1を代入すると,Rootオブジェクトは簡約され,中には明示的な根として与えられるものもある:
これはaの関数としての第1根の動きを示している:
これはaについての第1根の導関数を求める:
Solve 次の整方程式を与えると,厳密に 個の解を返す.ただし,解の中にはRootオブジェクトで表されるものもある.中に変質した解がある場合,その特定の解が現れる回数はその重複度に一致する.
Solveはこの方程式に2つの同一の解を与える:
これは十次方程式の最初の4つの解である.解はペアで与えられる:
Wolfram言語は明示的に多項式の形式を持たない方程式の解き方も知っている.
これは平方根を含む方程式である:
これは対数を含む方程式である:
方程式を何らかの多項式の形に簡約できる限り,Wolfram言語は常にその解をRootオブジェクトによって表現することができる.しかし,より一般的な,例えば超越関数を含む方程式の場合,Rootオブジェクトを使う系統立った方法はなく,数値近似を求める必要もない.
これはxについての単純な超越方程式である:
標準的な関数を使ってこの方程式を解くことはできない:
しかし,Wolfram言語はこの場合でも数値解を求めることができる:
1変数の整方程式は有限個の解を持つ.しかし超越方程式はしばしば無限の解を持つことがある.関数が事実上無限の可能な逆方程式を持つから,というのがその理由である.しかし,デフォルトのオプション設定InverseFunctionsTrueだと,Solveはこのような関数には1つの逆関数があると仮定する.この場合,Solveはこの逆関数について特定の解を返すことができる場合がある.
Wolfram言語はProductLogについて特定の解を返し,併せて他の解が失われる可能性を示す警告メッセージを表示する:
fのような任意の関数を含んだ方程式をSolveに解かせると,デフォルトにより逆関数が使われ形式的な解が構築される.
Solveはデフォルトで関数fの形式的な逆関数を使う:
これは逆関数の構造である:
InverseFunction[f]
f の逆関数
InverseFunction[f,k,n]
n 個の引数を持つ関数 fk 番目の引数についての逆関数
逆関数
これは明示的な逆関数を返す:
Wolfram言語は逆関数について形式的な操作を行うことができる:
Solveは式の特定の解しか返さないが,Reduceはすべての解のセットの表現を返すことができる.超越方程式の場合は例えば値の範囲がすべての可能な整数に及ぶような新たなパラメータを導入してしまうことがある.
これは解の集合の完全な表現である:
これは一般的な解の表現である:
「領域上の等式と不等式」で詳しく説明してあるように,Reduceを使うと変数の領域を制限することができる.これによって超越方程式の具体的な解を生成したり,あるいはそれが存在しないことを示したりできることがある.
xの領域を制限すると,これは有限解を与える:
xを実数に限ると可能な解は1つになる:
Reduceを使うと解が存在しないことが分かる:
多項式の根の数と分離

多項式の根を数える

CountRoots[poly,x]
x の多項式 poly の実数根の数を返す
CountRoots[poly,{x,a,b}]
である x の多項式 poly の根の数を返す
多項式の根を数える
CountRootsはガウス有理係数を持つ多項式を取る.根の数には多重根も含まれる.
の実数根の数を求める:
閉区間におけるの根を数える:
から までの縦軸部分でのの根は,の三重根と の1つの根からなる:
閉単位正方形における17次の1のベキ根を数える:
多項式の係数はガウス有理数でもよい:

分離区間

であるような集合 は,根 の多項式 の一意根のとき,多項式 の根 の「分離集合」という.多項式の根を分離させるということは,その他公式の解すべてに対して隣接しない分離集合を見付けるということである.
RootIntervals[{poly1,poly2,}]
polyi のいずれかの実数根に対する隣接しない分離区間のリストとともに,実際に各連続根を持つ多項式のリストを返す
RootIntervals[poly]
単独の多項式の実数根に対する隣接しない分離区間を返す
RootIntervals[polys,Complexes]
polys の複素数根に対する隣接しない分離区間または矩形を返す
IsolatingInterval[a]
代数的数 a に対して分離区間を返す
IsolatingInterval[a,dx]
幅が最大で dx の分離区間を返す
多項式の根を分離する関数
RootIntervalsは有理数係数の多項式を取る.
実数根 の場合,返される分離区間は あるいは となるような有理数のペアである.非実数根 のときは,返される分離矩形は,であり,であるようなガウス有理数のペアである.
の実数根に対する分離区間である:
2つ目のリストは,どの区間にどの多項式の根が含まれているかを示している:
の複素数根すべてに対する分離区間を返す:
三次あるいは四次の1のベキ根に対する分離区間である.2つ目の区間には,両方の多項式に共通の根が含まれている:
七次の多項式の根に対する分離区間である:
幅が最大での分離区間を返す:
区間の中の数はすべて10桁の数であるという共通点がある:
代数的数
Root[f,k]
方程式 f[x]==0における k 番目の根を返す
代数的数の表し方
Rootの式を入力すると,その中に多項式があれば,式は自動的に最小な形に約される:
多項式を表す純粋な関数を抽出し,xに適用する:
Wolfram言語では,代数的数,つまり有理数を係数とする代数方程式の根はRootを用いた式で表記される.代数的数は,ある代数演算を施したなら,演算結果は必ず単一の代数的数で得られる,という性質を持つ.
代数的数の平方根を求める:
RootReduceを使い,単一のRoot式に約す.別な代数方程式の根であることが分かる:
代数的数を含むもっと複雑な式を例に見てみる:
この例でも,単一なRoot式として根が求まる.ただし,かなり複雑になってしまう:
RootReduce[expr]
expr を単一なRoot式に約す
ToRadicals[expr]
Root式を明示的なベキ根に変換する
代数的数を使った変形操作
簡単なRoot式なら,直ちにベキ根として表してくれる:
三次の多項式だと,Rootは自動的にはベキ根で表してくれない:
ToRadicalsを使い,可能な場合にはRoot式をベキ根で表す:
SolveToRadicalsを使っても整方程式の解がベキ根の形で得られないなら,ほとんどの場合,そのような変形ははじめから数学的に無理だからである.ただし,式によっては基本的に可能だが,Wolframシステムで求められないときもある.そのような状況が の式に当てはまるが,この方程式の解をベキ根で表すと非常に複雑になってしまう.もそのような式の1つである.この場合には,が1つの解である.
六次の多項式を持つRoot式が得られる:
ベキ根を使い簡単な形で表せるはずだが,ToRadicalsでは求まらない:
四次以上になると,ほとんどの多項式では,ベキ根で表せる根は存在しなくなる.一つ例外があり,それは式が五次の場合で,そのときは楕円関数や超幾何関数で表せることが知られている.それでも,得られる形が複雑過ぎて実際には使えない.
RootSum[f,form]
整方程式 f[x]==0を満足する のすべての値について form[x]の和を取る
Normal[expr]
RootSumRootの明示的な和で代替した形で式 expr を再構築する
根の和
の根を探し,根の逆数の和を取る:
対数の形はベキ根では表せない:
RootSumRootを使った明示的な和の形に変換する:
RootApproximant[x]
x を,それを最もよく近似する「最も簡単な」代数的数のひとつに変換する
RootApproximant[x,n]
x を近似する最大 n 次の代数的数を見付ける
以下は,数値近似からを回復する:
この場合,結果は最大次数4である:
Root式はに対応していないことを確認する:
連立方程式
Solveを使い連立方程式が解ける.方程式はリスト形式で与える.Solveは,非常に多くの連立多項方程式について明示的な解を見出すことができる.
未知数を2つ持つ簡単な線形連立方程式を解いてみる:
もっと複雑な式を解いてみる.得られる解は複数あり,リスト形式で出力される.それぞれの解は,変数についての変換規則として与えられる:
解のリストに置換記号/.を使うこともできる:
Solveで明示的な解が求まらないときでも,多くの場合,連立方程式を「ほどく」ことは可能であり,Rootを使いシンボル的に解を表せる:
Nを適用し,数値近似的な解を得る:
Solveの対象にする式の指定で,使う変数は単一の代数記号である必要はない.例えば,連立方程式をたくさん設けるとき,便宜のため,a[i]のような変数を使ってもよい.
a[i]を変数とした方程式を3つ作っておく:
a[i]のうちのいくつかを未知数として,この連立方程式を解かせる:
Solve[eqns,{x1,x2,}]
オブジェクト xi について,連立方程式 eqns を解く
Solve[eqns]
連立方程式の持つすべてのオブジェクトについて eqns を解く
連立方程式の解法
何について解くのかSolveに指定しないと,方程式に含まれるすべての変数について解法が試される:
Solve[{lhs1==rhs1,lhs2==rhs2,},vars]
Solve[lhs1==rhs1&&lhs2==rhs2&&,vars]
Solve[{lhs1,lhs2,}=={rhs1,rhs2,},vars]
Solveへの連立方程式の与え方
行列とベクトルで連立方程式を構成したければ,リスト形式を使う:
Solveはリストで表現された方程式を解のリスト,つまり等式のリストで返す:
LogicalExpandを使い,リストで表現された方程式を明示的な方程式のリストに変換できる:
計算の種類によっては明示的な式の代りに係数の配列を使うとよいことがある.そのような配列はCoefficientArraysを使って方程式から構築できる.
一般的な解と一般的ではない解
方程式が2x==0なら,唯一の可能な解がx0であることは明白である.しかし,方程式がax==0になると,話は少々複雑になる.a0以外のとき,解はx0のみであるが,a0のときは,xはどのような値でもよい.Reduceを使うとこれが分かる.
Solveでは,パラメータaが特殊な値0を取らないことを前提に解法が進められる:
一方,Reduceではaについて何も仮定されず,可能なすべての解が求まる:
ReduceSolveの基本的な違いは,Reduceでは与えた方程式について可能なすべての解が求まるのに対して,Solveでは「一般的な」解だけが求まる.ここで,一般的な解とは,解法の対象になった変数に関連した条件は考慮するが,他のパラメータに関する条件は入らない解を意味する.さらに,ReduceSolveの違いに,解の出力形式としてReduceが等式の組合せとして解を返すのに対して,Solveは変換規則として返すということもある.
Solve[eqns,vars]
方程式の「一般的な」解を求める
Reduce[eqns,vars]
すべての解を含む形で,方程式を簡約する
方程式の解法
Solveを使い,任意の一次方程式を解く:
Reduceを使い解いてみる.a==b==0の条件も考慮した完全な解法が得られる.得られた出力において,&&||より優先度が高いことに注意:
一般二次方程式の持つすべての解を求める.結果として3組の解が得られる.aが0以外のとき,二次方程式はxについて2つの解を持つ.aが0のとき,方程式は一次式になる.また,abcが0のとき,xの値は何でもよい:
いくつかの連立方程式があるとき,Reduceを使うとどのような条件下でそれらの方程式が解を持つかが分かる.Solveは一般的な解があるかどうかを示す.
これらの連立方程式を同時に満足させるxの値は存在しない:
a1のときに限り解が存在する:
存在する解は一般的な解ではないので,Solveを使うと何も求まらない:
a1であるという制約を付けると,今度は,Solveでも解が求まる:
この方程式はxがどのような値を取っても成立する:
方程式が常に成立するとき,Solveの返す解はこのように表記される:
連立一次方程式を解くとき,一般的な解を求めるにはSolveを使い,解が存在するためのパラメータの値を調べるにはReduceを使うのがよいだろう.
()要素が である行列を例に見てみる:
行列式はゼロになる:
3つの方程式を連立させる:
Solveでは解けず,一般的な解は存在しないことが分かる:
それでも,Reduceを使うと,パラメータがa==2b-cになる特殊な条件のもとでは,解が存在し得ることが判明する:
非線形な方程式では,解が存在するための条件がはるかに複雑になることがある.
連立した単純な非線形方程式を例に見てみる:
Solveでは解が求まらず,一般的な解が存在しないことが分かる:
それでも,Reduceを使うと,解が存在するための条件が得られる:
変数の消去
Wolfram言語で連立方程式を設定するということは,変数と変数の間に制約条件を設ける,ということになる.一般的に言って,Solveを使うということは,与えられた方程式の制約条件に従いながら,変数のうちのいくつかを用いて残りの変数を表現することである.
Solve[eqns,vars,elims]
変数 elims を消去し,変数 vars について解を求める
Eliminate[eqns,elims]
方程式を整理し,変数 elims を消去する
変数の消去
変数として xy を持ち,パラメータに ab を持つ方程式を2つ入力する:
xy について同時に解く.ab に依存した形で解が得られる:
xa について解いても,同じように,yb に依存した形で解が得られる:
x についてだけ解法を得たいときは,yab のどれかを消去しておく.この例では y を消去するので,ab に依存した形で解が得られる:
また,a を消去すると,今度は,yb による解が得られる:
特定の変数を消去した明示的な方程式がほしい場合もある.そのときにはEliminateを使う.
リストeqnにある2つの方程式の持つ変数 a を消去することで1つの式にまとめる:
a の代りに y を消去してみる:
Eliminateのもっと高等な応用として, を「基本対称式」 および で書き換えるという問題を考えてみる.
この問題を解くためには,もとの変数 xy を消去しておき,fab でまとめ直しさえすればよい:
方程式の集合を取り扱う際,よく,特定の文字を真の「変数」としてとらえ,他は「助変数(パラメータ)」とみなすようにする.そのとき,変数間の特定の関係が常に満たされるのは,パラメータがどのような値を取るときであるかということを知る必要が生ずることもある.
SolveAlways[eqns,vars]
方程式 eqns を任意の vars の値について常に満足させるようなパラメータの値を求める
関係を満足させるパラメータの取得
これでこの式がすべての x を満足するようなパラメータ値を求める:
これは2つの級数を同等とみなす:
これで未定係数の値を求める:
関係演算子と論理演算子
x==y
xy に等しい(xy としても入力可)
x!=y
xy に等しくない(xy としても入力可)
x>y
xy より大きい
x>=y
xy に等しいより大きい(xy としても入力可)
x<y
xy より小さい
x<=y
xy に等しいより小さい (xy としても入力可)
x==y==z
すべて等しい
x!=y!=z
すべて等しくない(全部違う値)
x>y>z
真に減少
関係演算子
107より小さいかどうかを判定する.結果は Falseである.
すべての数が違うわけではない.したがって,Falseになる.
<<=は混ぜて使っても構わない.
両方とも数値的な量を表すので,Wolfram言語は,この関係がTrueであると判断できる.
これは,TrueFalseか分からず,判断されない.
!p
否定(¬pとしても入力可)
p&&q&&
論理積 (pqとしても入力可)
p||q||
論理和(pqとしても入力可)
Xor[p,q,]
排他的論理和(pqとしても入力可)
Nand[p,q,]
Nor[p,q,]
否定論理積と否定論理和( および としても入力可)
If[p,then,else]
関係 pTrueであれば then の式を評価し,Falseであれば else の式を評価する
LogicalExpand[expr]
論理演算式を展開する
論理演算
2つの関係は同時に正しいので,Trueの結果が得られる.
記述上, ==&&||の論理演算子はすべて二重綴りであることに注意してほしい.C言語を使ったことのあるユーザなら,このような記号に見覚えがあるだろう.
Wolfram言語は真偽の判断ができない.
この例も同様で,入力の形のまま式が返される:
LogicalExpandを作って項を展開してみる.
論理結合した方程式の解法
リスト形式で複数の方程式をSolveに与えると,方程式が連立したものとみなされすべてを同時に満足するような解法が試みられる.Solveは,さらに複雑な論理結合した方程式を解くことも可能である.
Solveは,方程式x+y==1x-y==2が連立しているものとして扱う:
論理関係記号&&を使った別の形で式を提示する:
この例では,x+y==1またはx-y==2が別々の条件下で満たされるように解を求めるよう指示している.このため,Solveで2つの関係に別々に対応した2組のxの解が返ってくる:
Solveにより3つの解が返される:
x!=0の条件を付加すると,上で得られた解が1つなくなる:
やや複雑な式を解いてみる.||の演算順位が &&より低いため,与えた関係式はx^3==x&&(x!=1||x^2==2)ではなく,(x^3==x&&x!=1)||x^2==2と解釈されることに注意:
Solveを使うと,解は変換規則の形で出力される.一方,ReduceEliminateを使うと,さらなる変換操作が可能な論理関係式の形で解が出力される.
方程式x^2==xの解を表す論理構文が得られる:
得られるxの値はx^5==xを満足するが,x^2==xの解(実際は論理関係式)は満足しない:
Reduceが生成する論理構文は方程式の解の集合と考えられる.そのとき,&&||等の論理関係記号は同集合に作用する演算子に相当する.
eqns1||eqns2
解の集合の和集合
eqns1&&eqns2
解の集合の交わり
!eqns
解の集合の補集合
Implies[eqns1,eqns2]
eqns2を含む eqns1の部分集合
解の集合に機能する演算
「演算子」で説明してあるように特別な論理結合記号を用いると便利なことがある.
この入力はImpliesOrに特別な記号を用いている:
不等式
方程式x^2+3x==2x^2+3x2と等しいことを表すように,不等式x^2+3x>2x^2+3x2より大きいことを表す.Wolfram言語では,Reduceは方程式だけでなく不等式にも使用できる.
Reduce[{ineq1,ineq2,},x]
x における不等式の組を約す
一変量の不等式の操作
この1組の不等式は単一の不等式に約すことができる:
これらの不等式を同時に満足するのは無理である:
Reduce[ineq,x]は,方程式に適用されると x==r1, という形式の x についての単純な方程式からなる結果を得ようとする.Reduce[ineq,x]は不等式に適用されても全く同じことをしようと試み,l1<x<r1, という形式の x についての単純な不等式からなる結果を得ようとする.
これは二次方程式をxについての2つの簡単な方程式に約す:
これは二次不等式をxについての2つの簡単な不等式に約す:
Reduce[ineq,x]によって生成された結果は,不等式で表現された一連の区間を表すものだと考えることができる.次数 の多項式のグラフは最高 回まで上下できるので,次数 の多項不等式は最大 の異なる区間を誘発することができる.
この不等式は3つの異なる区間を与える:
区間の終点は根と極点である:
この不等式を解くためにはProductLogを導入する必要がある:
のような超越関数は昇降を無限に繰り返すので,無数の区間が生成される.
2番目の不等式は有限個の区間しか許容しない:
Reduceは次のようにして無限個の区間を表す:
比較的単純な入力でかなり複雑な結果が得られることもある:
<=<を含む不等式の場合,不等式が満足される孤立した点がある場合がある.Reduceは方程式を与えることでそのような点を表す.
この不等式は孤立した2つの点でのみ満足される:
これは区間と孤立した点の両方を与える:
Reduce[{ineq1,ineq2,},{x1
,
x2
, }]
不等式の組をいくつかの変数に約す
多変量不等式
多変量の不等式の場合,Reduceは実際には区間指定のネストした組を与える.この指定では後の方の変数は前の方の変数に依存する境界を持つ.
これはxyについてのネストした不等式としての単位円板を表す:
幾何学的な用語を使えば,いかなる線形不等式も空間を二等分する.ゆえに,線形不等式のリストは境界があったりなかったりする多面体を定義する.Reduceはそのような多面体をネストした不等式で表す.多面体の頂点は常にこれらの不等式の終点に当たる.
これは平面上に三角形の領域を定義する:
1つの三角形でも2つの要素として表す必要があることもある:
一般に不等式のリストは幾何学的なオブジェクトの間の重複する領域を表す.これらの表現は往々にして複雑になる.
これは線の片側の単位円版上の部分を表す:
これは2つの円板の共通部分である:
円板間の距離が大きいと共通部分はなくなる:
これは超越不等式を含んだ例である:
パラメータを含む不等式の場合,Reduceは方程式の場合と同じように起りうる個々のケースを自動的に処理する.
区間の形式はaの値に依存する:
aの値によって双曲的な,あるいは楕円形の領域が得られる:
Reduceは不等式によって定義された領域の完全な記述を与えようとする.しかし,不等式を満足する変数の値の個々の例を求めたいこともあるだろう.そのような場合はFindInstanceを使うとよい.
FindInstance[ineqs,{x1,x2,}]
ineqs を満足する xi の例を求めようとする
FindInstance[ineqs,vars,n]
n 個の例を求めようとする
不等式を満足する個々の点を求める
これは不等式を満足する特定の例を求める:
これはこの不等式を満足する方法がないことを示している:
FindInstanceと不等式の関係はSolveと等式の関係に例えることができ,Solveのように変数の特定の値を与える規則のリストを返す.しかし,方程式の場合はこれらの値が一般的にすべての解を正確に表すのに対し,不等式の場合は不等式によって記述された領域内の孤立したサンプル点に相当するに過ぎない.
特定の入力で呼ばれるたびにFindInstanceは同じ出力を返す.そして,特別の限定的な何らかの点に対応する例が存在する場合はそれらを優先的に返す.しかし一般的にはFindInstanceが返す例の分布は大抵の場合ランダムに見える.だが,各々の例は実際には与えた不等式が実際に満足できることの建設的な証明となっている.
円板上のある一点を求めるとFindInstanceは原点を返す:
これは単位円版上の500の点を求める:
分布はランダムに見える:
領域上の等式と不等式
Wolfram言語は通常,方程式の変数は任意の複素数を表すことができると仮定する.しかしReduceを使うときは変数がもっと限定された領域内のオブジェクトを表すことを明示的にWolfram言語に伝えることができる.
Reduce[expr,vars,dom]
領域 dom 内で eqns を約す
Complexes
複素数
Reals
実数
Integers
整数
領域内で解く
Reduceはデフォルトでxが複素数であり得ると仮定し,5つの複素解すべてを与える:
しかしここではxが実数であると仮定して実数解のみを返す:
ここではxが整数であると仮定して整数解のみを返す:
一変数の単一の多項式は常に有限個の離散解を持つ.そのような場合,Reduce[eqns,vars,dom]は領域 dom 内にある解を選択することで解のフィルタの働きをしていると考えることができる.
しかし変数が増えると,ある変数の値が他の変数の値に依存するといったようなことが起り得るパラメトリックな曲線や曲面に方程式の解が対応し,途端に話は複雑になる可能性がある.このような依存関係はしばしば方程式あるいは不等式の集合で表現される.しかし,その形式はある領域から別の領域に移動すると甚だしく変化することがある.
これは複素数の解を簡単な式で与える:
実数の解を表すためには不等式を導入する必要がある:
整数の場合,解は離散点の方程式として表される:
入力に含まれるのが等式のみであれば,Reduceはデフォルトによってすべての変数が複素数であると仮定する.しかし入力に不等式が含まれている場合は,不等式は実数のみしか比較できないのでReduceは含まれる代数的変数はどれも実数であると仮定する.
変数は不等式の中にあるので実数であると仮定される:
Complexes
polynomial!=0xi==Root[]
Reals
Root[]<xi<Root[]xi==Root[]
Integers
恣意的に複雑
整方程式と不等式の解のためのブロック構築の概略
実領域と複素領域上の多項式の系の場合,解は常に有限個の要素からなり,その要素内で代数あるいは関数によって変数の値が与えられる.
ここでは要素がxについての方程式あるいは不等式によって区別されている:
ここでは要素がxについての不等式で区別されている:
原則としてReduceは実変数と複素変数を持った整方程式と不等式のどのような集合についても常に完全な解を求めることができるが,変数の数が増えるにつれて要素の数が指数関数的に増加するため,結果は非常に複雑になることが多い.
変数が3つの場合,解は常に8つの要素を含む:
SinExpのような関数を導入した途端に,変数が実変数あるいは複素変数1つの方程式でも解の要素が無限になることがある.Reduceは新たなパラメータを導入してこれらの要素にラベルを付ける.デフォルトでは与えられた解の 番目のパラメータにC[n]という名前が付けられる.一般的には,オプション設定GeneratedParameters->f を使ってそれが f[n]という名前になるように指定することができる.
ここの要素には整数パラメータc1によるラベルが付けられている:
Reduceは実変数と複素変数を持つ方程式だけでなく整数領域の方程式も扱うことができる.ディオファントス(Diophantus)方程式のようなものを解くのは大変難しいことが多い.
実数上でのこの方程式の解を表すのは極めて簡単である:
整数領域での解には8の約数が含まれる:
このような方程式を効果的に解くのには大きな数を因数分解する必要がある:
Reduceは整数領域のどのような線形方程式の系も不等式の系も解くことができる. 変数の 個の線形方程式では,一般に 個のパラメータが必要である.しかし不等式の場合ははるかに多くのパラメータが必要なことが多い.
変数は2つしかないが,ここでは3つのパラメータが必要である:
変数が2つの場合,Reduceは整数についてのいかなる二次方程式も解くことができる.結果はフィボナッチ列に類似しており二次無理数のベキによって表される.
これはペル(Pell)方程式の解である:
以下は特定のC[1]の整数値における値である:
Reduceは整数についての方程式の多くの特定のクラスを扱うことができる.
ここでReduceを使ってThue方程式の解を求める:
右辺を3にすると式には解がなくなる:
整数についての方程式はときに全くランダムな解の集合を持つように見えることがある.そして,方程式にほんの少し変更を加えただけで解が全くなくなることがある.
実数と複素数についての整方程式の場合,解が存在するかどうかを決定するための確かな「アルゴリズム」が存在する.しかし整数についての整方程式の場合は,ヒルベルト(Hilbert)の第10問題が解けないことから分かるように,そのような一般的な方法は決して存在しない.
特定のクラスの方程式の場合は,そのようなアルゴリズムを見付けるのは可能であり,実際に多くがReduceに実装されている.しかし異なったクラスの方程式を扱うことは数論の全く違った分野と全く違った種類の計算を必要とするように見えることが多い.実際に,いくつかの変数を埋めることにより,他の変数の解が可能なすべてのプログラムの出力に対応するようにできる「普遍的な」整数の整方程式の存在が知られている.ここから,このような方程式には一般的に代数関数のように固定要素によって構築される解で構成される閉じた形は決して存在しないことになる.
Sinのような関数が含まれるようにすると,実数と複素数を含む方程式についても同じ問題が起り得る.
ここのReduceは事実上整数についての方程式を解かなくてはならない:
Reduce[eqns,vars,Modulus->n]
モジュロ n の解を求める
モジュロ n の整数を含む方程式の処理
モジュロ n の整数方程式の可能な解の数は有限なので,Reduceはシステマティックにその解を求めることができる.
これはモジュロ4のすべての解を求める:
Reduceはいくつかの異なる剰余を持つ方程式を扱うことができる.
これは2つの異なる剰余を持つ方程式である:
Reduce[expr,vars,dom]
すべての変数のデフォルトの領域を指定する
Reduce[{expr1,,x1dom1,},vars]
変数の明示的な各領域を指定する
変数の領域を指定する別の方法
これはxは整数であるがyは実数であると仮定する:
Reduceは通常複素変数を単一のオブジェクトとして扱う.しかし,解析的ではなかったり分岐切断線を持つ関数を扱う際は,複素変数を実数部分Re[z]と虚数部分Im[z]の2つの部分に分割する必要があることがある.
結果には実数部分と虚数部分が別々に含まれている:
ここでもまた虚数部分に独立した条件が付いている:
Reduceはデフォルトにより不等式に代数的に表れる数は実数であると仮定する.しかしComplexesをデフォルトの領域として明示的にこれを上書きすることもできる.そのような場合は特定の変数がなお実数であると指定することができると便利である.
Reduceはデフォルトによりxが実数であると仮定する:
こうするとReducexが複素数である場合を考慮するようになる:
xは代数的に表れてはいないので,Reduceはすぐにこれが複素数であると仮定する:
ここではxは実数だがyは複素数にもなり得る:
FindInstance[expr,{x1,x2,},dom]
expr を満足する dom 中の xi の例を見付けようとする
FindInstance[expr,vars,dom,n]
n 個の例を見付けようとする
Complexes
複素数 の領域
Reals
実数 の領域
Integers
整数 の領域
Booleans
ブール数(TrueFalse の領域
領域中の特定の解を求める
Reduceは常に連立方程式あるいは連立不等式の解を完全に表すものを返す.しかし,特定の解の例だけを求めたい場合もあるだろう.そのようなときはFindInstanceを使うとよい.
FindInstance[expr,vars,dom]{}を返した場合は,expr が指定領域にある変数のいかなる値によっても満足されないことをWolfram言語が事実上証明したことを意味している.expr が満足される場合は,「方程式と不等式の操作:不等式」の不等式についての項で説明してあるように,FindInstanceは一般に極めて恣意的に満足する値を取り出す.
特に整数方程式の場合,たとえReduceが完全な解を求めることができなくても,FindInstanceが方程式の特定の解を求めることができることがしばしばある.そのような場合には方程式の最も小さな解のうちのいずれかが返される.
これは楕円曲線上で最小の整数点を求める:
FindInstanceの特徴のひとつに,変数がTrueあるいはFalseという値を持ち得るブール式と一緒にも使える点が挙げられる.式がTrueとなるような変数の真理値が選べるようにFindInstanceを使って特定の式が「満足可能」であるかどうかを検証することができる.
pqに何を選んでもこの式を満足することはできない:
こちらは満足することができる:
解の集合の表示
方程式や不等式のいかなる組合せも,何らかの空間における領域を暗示的に定義しているものと考えることができる.Reduceの基本的な機能はこの種の暗示的な表示を明示的にすることである.
変数の値によって指定された点が領域内にあるかどうかをテストするだけなら,方程式や不等式についての記述が暗示的であっても問題ない.しかし,領域の構造を理解するためには,あるいはその中で点を生成するためには,Reduceが提供するようなより明示的な説明が必要であろう.
これは半円の領域を暗示的に定義する不等式である:
これは点がこの領域内にあることを示している:
Reduceはこの領域をより明示的に表す:
最初の不等式と矛盾しないxの値を選ぶと,yについての明示的な不等式が得られる:
Reduce[expr,{x1,x2,}]は,まず最初に x1についての固定した条件を与え,次に x1に依存する x2についての条件を与え,次に x1x2に依存する x3についての条件を与え,というようにして領域を表現するようになっている.この構造には,Tableのような関数で反復子を使うのと同じように各 xi の値を連続的に選ぶことで点が選べるという特徴がある.
これは最初にyの値を,次にxの値を選ぶ領域の表示を与える:
単純なケースでは,方程式あるいは不等式の系によって定義された領域に結局要素が1つしかないことがある.そのような場合はReduceの出力は e1&&e2の形式になる.ここで各 ei は最高 xi 個までの変数を含む方程式か不等式である.
しかし,ほとんどの場合には複数の要素が u1||u2||のような形式を含む出力で表される.Reduceは領域を表すために使う要素数を最小にしようとする.しかし場合によっては単一の接続した要素をカバーするのに複数のパラメータ化が必要なこともある.その各々はReduceの出力中で別々の要素として現れる.
解の集合を表す際に,複数の要素が&&(u1||u2)&&のような形式を使って一緒に表現できることがある.Reduceは結果をできるだけコンパクトにするためにデフォルトでこれを行う.LogicalExpandを使って各要素が別々に現れる展開された形を生成することもできる.
最もコンパクトな形を生成するために,Reduceは必要以上に後半の変数 xi が前半の変数 xi に依存する条件を課してしまうことがある.オプションBacksubstitutionTrueを与えることで,特定の xi がより前の変数 xi に必要最低限しか依存しないような結果をReduceに生成させることができる.こうすると解釈しやすくなることがあるが,出力ははるかに大きくなることが多い.
デフォルトでReduceyの条件をxについて表現する:
後方に置換するとxに関係なくyの制約条件を付けることができる:
CylindricalDecomposition[expr,{x1,x2,}]
expr により定義された領域の円筒代数分解を生成する
GenericCylindricalDecomposition[expr,{x1,x2,}]
expr で定義された領域の分解の全次元の部分と,領域の残りの部分を含む超曲面とを見付ける
SemialgebraicComponentInstances[expr,{x1,x2,}]
expr により定義された各連結成分に少なくとも1つの点を与える
円筒代数分解
実数領域の整方程式や不等式の場合,Reduceが返す結果の形式は通常「円筒代数分解」すなわち「CAD」である.Reduceはより単純な形を与えることもある.いずれにせよ,CylindricalDecompositionを使うことで完全なCADを得ることができる.不等式のみを含む系では,GenericCylindricalDecompositionで解集合のほとんどが求められ,通常こちらの方が速い.
双曲線により囲まれた領域の円筒代数分解:
解集合の二次元部分とともに,境界を含む曲線を返す:
解集合の両方の部分から解を求める:
結果には,それぞれの解集合からの点が数個ずつ含まれる:
限定子
x^4+x^2>0のような命題で,Wolfram言語は変数xを特定はされていないが限定的な値を持つものとして扱う.しかし,場合によってはxが取り得る可能な値の集合についての陳述を行うことができると便利である.そのような場合には「限定子」を使うとよい.
ForAll[x,expr]
x のすべての値で成り立つ expr
ForAll[{x1,x2,},expr]
すべての xi のすべての値で成り立つ expr
ForAll[{x1,x2,},cond,expr]
cond を満たすすべての xi で成り立つ expr
Exists[x,expr]
expr が成り立つ値 x が存在する
Exists[{x1,x2,},expr]
expr が成り立つ複数の値 xi が存在する
Exists[{x1,},cond,expr]
cond を満たす expr が成り立つ複数の値 xi が存在する
量限定子の構造
Wolfram言語では方程式,不等式,論理結合等と同じように量限定子も扱うことができる.ほとんどの場合,量限定子は評価によってすぐに変化はしない.しかし,FullSimplifyReduceのような関数を使って量限定子を簡約することができる.
これは,この不等式が成立する値xが存在することを宣言している.ここでの出力は入力を別の形にフォーマットしたものに過ぎない:
FullSimplifyによって宣言が真であることが確認される:
xがゼロのときは不等式が成立しないので,この場合はFalseが返される:
Wolfram言語は述語論理と純粋数学で使われている量限定子の標準的な表記によるバージョンをサポートしている.\[ForAll]あるいはEscfaEscとして入力できる.また,\[Exists]あるいはEscexEscとして入力できる.表記を厳密にするために,Wolfram言語は限定子の付いた変数を下付き文字にする.変数の条件もまたコンマで区切った下付き文字にする.
xexprForAll[x,expr]
{x1,x2,}exprForAll[{x1,x2,},expr]
x,condexprForAll[x,cond,expr]
xexprExists[x,expr]
{x1,x2,}exprExists[{x1,x2,},expr]
x,condexprExists[x,cond,expr]
量限定子の表記法
量限定子を含む命題を,量限定子を除去した等価の命題に変換できる場合がある.量限定子の除去は,すべての x あるいは特定の x について真であるという黙示的な宣言を,これが成立する条件に関する明示的な宣言に変換する点で,方程式を解くのに似ている.
Resolve[expr]
expr から量限定子を除去しようとする
Resolve[expr,dom]
領域 dom 中にあると仮定されるすべての変数の量限定子を除去しようとする
量限定子の除去
これはこの方程式を真にするxが存在することを示している:
これは,cが特定の条件に従った場合にのみこの方程式が満たされることを示している:
Resolveは,複素領域と実数領域の任意の整方程式と不等式から常に量限定子を除去することができる.また論理式からも量限定子が除去できる.
これは実数領域の二次方程式の制約条件が正であることを示している:
これはこの式が真になるようにpqに真値を割り当てる方法があることを示している:
Reduceでも量限定子を使うことができる.Reduceに方程式あるいは不等式の集合を与えると,Reduceは完全な解の集合の詳細に渡る表現を作成しようとする.しかし,ときには解が x のすべての値を網羅している,あるいはこの値を全くカバーしていないといった,より大域的な問いに対する答がほしい場合もあるだろう.量限定子は,このような問いを指定する便利な方法を提供している.
これは解の集合の完全な構造を与える:
一方これは解が存在するための条件だけを与える:
量限定子を使って多くの数学的な問題を形成することができる.
これは円を任意の円錐曲線内に入れる条件を求める:
これは線が円を横切る条件を求める:
これはqが主係数が1の一般的な四次方程式であると定義する:
これで,四次方程式のすべての根のペアについての条件が等しいことが分かる:
整数について量限定子を除去するのは一般的に,計算上不可能な問題であるが,Wolfram言語は特別な場合に限ってこれを行うことができる.
これはが有理数ではあり得ないことを示している:
は有理数である:
最小化と最大化
Minimize[expr,{x1,x2,}]
expr を最小にする
Minimize[{expr,cons},{x1,x2,}]
制約条件 cons に従って expr を最小にする
Maximize[expr,{x1,x2,}]
expr を最大にする
Maximize[{expr,cons},{x1,x2,}]
制約条件 cons に従って expr を最大にする
最小化と最大化
MinimizeMaximizeは最大あるいは最小に達した値のリストを,最大と最小になる場所を特定する規則とともに与える.
これは二次関数の最小値を求める:
xの規則を適用すると最小の位置における値が与えられる:
これはxyについて最大にする:
Minimize[expr,x]xからのすべての可能な値の範囲で expr を最小にする.Minimize[{expr,cons},x]は制約条件 cons が満足されるという条件の下で expr を最小にする.制約条件は方程式と不等式のどのような組合せでもよい.
これは制約条件 に従って最小を求める:
これは単位円上で最大を求める:
これは楕円内で最大を求める.結果はかなり複雑になる:
これは線に沿って最大を求める:
MinimizeMaximizeは目的関数 expr と制約条件 cons の両方が線形にのみ変数 を含んでいるどのような「線形計画法」の問題も解くことができる.
これは典型的な線形計画法の問題である:
これらは原則として,目的関数と制約条件が任意の変数についての多項式関数を含むいかなる「線形計画法」の問題も解くことができる.これを使って形成できる幾何学その他の重要な問題がたくさんある.
これは辺の長さの合計が一定の長方形の面積を最大にする簡単な幾何学問題を解く:
これは単位球内の立方体の最大体積を求める:
MinimizeMaximizeの重要な特徴は,これらが常に「大域的」最小値と最大値を求められる点である.関数はそこで導関数が消失するさまざまな極大値と極小値を持つことが多い.しかし,MinimizeMaximizeは大域的な方法を用いて極小値と極大値だけでなく絶対最小値と絶対最大値も求める.
これは多くの極大値と極小値を持つ関数である:
Maximizeは大域的最大値を求める:
境界を持たない関数を与えるとMinimizeMaximizeを最小と最大として返す.また,決して満足し得ない制約条件を与えると,が最大と最小として返され,Indeterminateが変数の値として返される.
MinimizeMaximize という形式の「厳密ではない」不等式と という形式の「厳密な」不等式の両方を受け入れる.厳密ではない不等式の場合,最小と最大が境界 上にあっても全く問題ないが,厳密な不等式の場合は最小と最大は原則として少なくともほんのわずかでも境界の内側になければならない.
厳密な不等式の場合,Wolfram言語は警告メッセージを出し,次いで境界上の点を返す:
MinimizeMaximizeは通常与えられたすべての変数が実数であると仮定する.xIntegersのような制約条件を与えて変数が整数でなければならないと指定することもできる.
これはxyの整数値についてのみ最大化を行う:
MinimizeMaximizeは,有界の多面体上中の整数上で線形関数の最大値と最小値を計算することができる.これは整数線形計画法として知られるものである.
次は三角形内のxyの整数値上で最大化を行う:
MinimizeMaximizeは,パラメータを持つ多項式の最適化問題について,厳密な記号結果を生成することができる.
一般的な二次多項式の最小値を求める:
MinValue[{f,cons},{x,y,}]
制約条件 cons を前提として f の最小値を与える
MaxValue[{f,cons},{x,y,}]
制約条件 cons を前提として f の最大値を与える
ArgMin[{f,cons},{x,y,}]
制約条件 cons を前提として f が最小化される位置を与える
ArgMax[{f,cons},{x,y,}]
制約条件 cons を前提として f が最大化される位置を与える
最大・最小の値と位置の計算
Maximizeは最大の値と位置の両方を与える:
最大値だけが必要な場合はMaxValueを使う:
多項式の厳密な不等式制約条件では,最大値だけを計算した方がずっと速い:
ArgMaxは最大値が得られた位置を与える: