Main Content

シンボリック方程式、シンボリック不等式、およびシンボリック条件ステートメントのチェック

Symbolic Math Toolbox™ には、シンボリック オブジェクトを含むシンボリック方程式、シンボリック不等式、およびシンボリック条件ステートメントをチェックするいくつかの関数が用意されています。この例では、これらの関数の使用事例について説明します。

  • isequalを使用して、2 つのシンボリック入力がコーディングの観点から見て等しいかどうかをチェックする。

  • logicalを使用して、関係演算子 (&、|、>、~= など) を含むシンボリック条件が真かどうかをチェックする。

  • isAlwaysを使用して、シンボリック条件が数学的に常に真かどうかをチェックする。

これらの関数について、もう少し詳しく説明します。

  • isequal(A,B) は、AB のサイズが同じであり、それらの内容がコーディングの観点から見て等しいかどうかをチェックします。isequal は、数学的な変換や単純化を適用せずに 2 つの式が等しいかどうかのチェックのみを行う場合に便利です。isequal は、AB が同じ式である場合にスカラーの logical 値 1 (true) を返します。その他の場合は logical 0 (false) を返します。isequalNaN (Not a Number) 値を等しいと見なさない点に注意してください。NaN 値を等しいと見なすには、isequalnを使用します。

  • logical(cond) は、数学的な変換や単純化を適用せずに、cond 内のシンボリック ステートメントが成り立つかどうかをチェックします。またこれは、シンボリック変数に関する仮定を無視します。logical は、cond 内の真である要素に対して要素 1 (true)、cond 内の偽である要素に対して要素 0 (false) をもつ logical 配列を返します。

  • isAlways(cond) は、cond 内のシンボリック変数が取り得るすべての値について、cond 内のシンボリック ステートメントが常に真となるかどうかをチェックします。isAlways は、cond の検証時に数学的な変換と単純化を適用します。また、isAlways は、cond 内の変数に関するすべての仮定を考慮します。isAlways は、cond 内の数学的に真である要素に対して要素 1 (true)、cond 内の数学的に真でない要素に対して要素 0 (false) をもつ logical 配列を返します。ほとんどの場合、isAlways を使用して、シンボリック方程式、シンボリック不等式、およびシンボリック条件ステートメントをチェックできます。

式が等しいかどうかのチェック

isequal(a,b) は、ab の内容が同じかどうかのみをチェックし、それらが数学的に等しいかどうかはチェックしません。たとえば、(x+1)2x2+2x+1 のように異なる式を isequal でチェックした場合、これらが数学的に等しい場合でも 0 (false) が返されます。

syms x
tf = isequal((x+1)^2,x^2+2*x+1)
tf = logical
   0

(x+1)2 を展開し、展開した式が x2+2x+1 と等しいかどうかを isequal でテストします。

expr = expand((x+1)^2)
expr = x2+2x+1
tf = isequal(expr,x^2+2*x+1)
tf = logical
   1

次に、isAlways を使用して、x のすべての値について方程式 tan(x)=sin(x)cos(x) が真となるかどうかをチェックします。

tf = isAlways(tan(x) == sin(x)/cos(x))
tf = logical
   1

tan(x)sin(x)cos(x) が等しいかどうかをテストします。これらは数学的に等しくても式が異なるため、関数 isequal0 (false) を返します。

tf = isequal(tan(x),sin(x)/cos(x))
tf = logical
   0

tan(x)sin(x)cos(x) で書き換えます。rewritetan(x)sin(x)cos(x) に正しく書き換えるかどうかをテストします。

expr = rewrite(tan(x),"sincos")
expr = 

sin(x)cos(x)

tf = isequal(expr,sin(x)/cos(x))
tf = logical
   1

単純化を行う場合と行わない場合の方程式のチェック

単純化が必要な方程式をチェックするには、isAlways を使用します。たとえば、x+1(x2+2x+1)/(x+1) が等しいかどうかをチェックします。

syms x
tf = isAlways(x+1 == (x^2+2*x+1)/(x+1))
tf = logical
   1

両辺の式が異なる場合、logical を使用して等しいかどうかをチェックすると、0 (false) が返されます。

tf = logical(x+1 == (x^2+2*x+1)/(x+1))
tf = logical
   0

simplify を使用して、シンボリック方程式で表される条件を単純化します。この方程式は x のすべての値について常に真となるため、関数 simplify はシンボリック logical 定数 symtrue を返します。

cond = simplify(x+1 == (x^2+2*x+1)/(x+1))
cond = symtrue

symtruelogical を使用すると、logical 1 (true) に変換されます。

tf = logical(cond)
tf = logical
   1

前のセクションで説明したように、異なる式を isequal でチェックすると、0 (false) が返されます。

tf = isequal(x+1,(x^2+2*x+1)/(x+1))
tf = logical
   0

(x2+2x+1)/(x+1) を単純化します。isequal を使用して、単純化された式が x+1 と等しいかどうかをチェックします。

expr = simplify((x^2+2*x+1)/(x+1))
expr = x+1
tf = isequal(x+1,expr)
tf = logical
   1

仮定を使用した方程式のチェック

整数 n のすべての値について方程式 sin(2nπ)=0 が成り立つかどうかをチェックします。n をシンボリック変数として作成すると、Symbolic Math Toolbox はこれを一般的な複素量として扱います。この方程式が整数について成り立つかどうかをテストするには、n に仮定を設定し、isAlways を使用してこの方程式をチェックします。

syms n
assume(n,"integer")
tf = isAlways(sin(2*n*pi) == 0)
tf = logical
   1

logical は変数に関する仮定を無視することに注意してください。次の場合、logical 0 (false) が返されます。

tf = logical(sin(2*n*pi) == 0)
tf = logical
   0

方程式および不等式を含む条件のチェック

方程式および不等式を含む条件をチェックするには、logical または isAlways を使用できます。ただし、logical は、条件をチェックする際に数学的な変換と単純化を適用しません。

たとえば、条件 1<2 AND exp(log(x))=x をテストします。条件で explog などの他の関数が使用されている場合、それらの関数は条件の定義時に評価されます。

syms x
cond1 = 1 < 2 & exp(log(x)) == x
cond1 = x=x

isAlways を使用してこの条件をチェックします。

tf = isAlways(cond1)
tf = logical
   1

数学的な変換や単純化を必要としない場合は、logical を使用して条件をチェックすることもできます。

tf = logical(cond1)
tf = logical
   1

数学的な変換が必要な場合は、条件が成り立つかどうかをチェックするのに logical を使用しないでください。たとえば、logical を使用して条件ステートメント sin(x)2+cos(x)2=1 OR x2>0 をテストすると、エラーが返されます。代わりに、isAlways を使用してこの条件ステートメントをテストしてください。

cond2 = sin(x)^2 + cos(x)^2 == 1 | x^2 > 0
cond2 = 0<x2cos(x)2+sin(x)2=1
tf = isAlways(cond2)
tf = logical
   1

複数の条件のチェック

複数の条件をチェックするために、それらをシンボリック配列として表すことができます。

たとえば、それぞれ 3 つの異なる式をもつ 2 つのシンボリック配列を作成します。

syms x
expr1 = [tan(x); x+1; exp(log(x))]
expr1 = 

(tan(x)x+1x)

expr2 = [sin(x)/cos(x); (x^2+2*x+1)/(x+1); x]
expr2 = 

(sin(x)cos(x)x2+2x+1x+1x)

これらの式を比較するには、関係演算子 == を使用して、条件ステートメントから成るシンボリック配列を作成します。

cond = expr1 == expr2
cond = 

(tan(x)=sin(x)cos(x)x+1=x2+2x+1x+1x=x)

isAlways を使用して、これらの複数の条件が数学的に常に真であるかどうかをチェックします。各条件は数学的に真であるため、isAlways は logical 値 1 (true) から成る 3 行 1 列の配列を返します。

tf = isAlways(cond)
tf = 3x1 logical array

   1
   1
   1

logical を使用して、これらの条件が成り立つかどうかをチェックします。logical は数学的な変換や単純化を適用しないため、logical は最初の 2 つの要素が 0 (false) である 3 行 1 列の配列を返します。

tf = logical(cond)
tf = 3x1 logical array

   0
   0
   1

isequal を使用して、3 行 1 列の 2 つのシンボリック配列 expr1 および expr2 の対応する各要素が等しいかどうかをチェックします。対応する要素のいくつかが等しくないため、isequal は logical スカラー 0 (false) を返します。

tf = isequal(expr1,expr2)
tf = logical
   0

次に、simplify を使用して 2 番目のシンボリック配列を単純化します。

expr2 = simplify(expr2,Steps=10)
expr2 = 

(tan(x)x+1x)

logical を使用して、expr2 内の単純化された各式が expr1 内の対応する式と等しいかどうかをチェックします。

tf = logical(expr1 == expr2)
tf = 3x1 logical array

   1
   1
   1

isequal を使用して、expr2 内の単純化されたすべての式が expr1 と等しいかどうかをチェックします。

tf = isequal(expr1,expr2)
tf = logical
   1

参考

| | |