シンボリック方程式、シンボリック不等式、およびシンボリック条件ステートメントのチェック
Symbolic Math Toolbox™ には、シンボリック オブジェクトを含むシンボリック方程式、シンボリック不等式、およびシンボリック条件ステートメントをチェックするいくつかの関数が用意されています。この例では、これらの関数の使用事例について説明します。
これらの関数について、もう少し詳しく説明します。
isequal(A,B)
は、A
とB
のサイズが同じであり、それらの内容がコーディングの観点から見て等しいかどうかをチェックします。isequal
は、数学的な変換や単純化を適用せずに 2 つの式が等しいかどうかのチェックのみを行う場合に便利です。isequal
は、A
とB
が同じ式である場合にスカラーの logical 値1
(true
) を返します。その他の場合は logical0
(false
) を返します。isequal
はNaN
(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)
は、a
と b
の内容が同じかどうかのみをチェックし、それらが数学的に等しいかどうかはチェックしません。たとえば、 と のように異なる式を isequal
でチェックした場合、これらが数学的に等しい場合でも 0
(false
) が返されます。
syms x
tf = isequal((x+1)^2,x^2+2*x+1)
tf = logical
0
式 を展開し、展開した式が と等しいかどうかを isequal
でテストします。
expr = expand((x+1)^2)
expr =
tf = isequal(expr,x^2+2*x+1)
tf = logical
1
次に、isAlways
を使用して、 のすべての値について方程式 が真となるかどうかをチェックします。
tf = isAlways(tan(x) == sin(x)/cos(x))
tf = logical
1
式 と が等しいかどうかをテストします。これらは数学的に等しくても式が異なるため、関数 isequal
は 0
(false
) を返します。
tf = isequal(tan(x),sin(x)/cos(x))
tf = logical
0
式 を と で書き換えます。rewrite
が を に正しく書き換えるかどうかをテストします。
expr = rewrite(tan(x),"sincos")
expr =
tf = isequal(expr,sin(x)/cos(x))
tf = logical
1
単純化を行う場合と行わない場合の方程式のチェック
単純化が必要な方程式をチェックするには、isAlways
を使用します。たとえば、 と が等しいかどうかをチェックします。
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
に logical
を使用すると、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
式 を単純化します。isequal
を使用して、単純化された式が と等しいかどうかをチェックします。
expr = simplify((x^2+2*x+1)/(x+1))
expr =
tf = isequal(x+1,expr)
tf = logical
1
仮定を使用した方程式のチェック
整数 のすべての値について方程式 が成り立つかどうかをチェックします。 をシンボリック変数として作成すると、Symbolic Math Toolbox はこれを一般的な複素量として扱います。この方程式が整数について成り立つかどうかをテストするには、 に仮定を設定し、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
は、条件をチェックする際に数学的な変換と単純化を適用しません。
たとえば、条件 AND をテストします。条件で exp
や log
などの他の関数が使用されている場合、それらの関数は条件の定義時に評価されます。
syms x
cond1 = 1 < 2 & exp(log(x)) == x
cond1 =
isAlways
を使用してこの条件をチェックします。
tf = isAlways(cond1)
tf = logical
1
数学的な変換や単純化を必要としない場合は、logical
を使用して条件をチェックすることもできます。
tf = logical(cond1)
tf = logical
1
数学的な変換が必要な場合は、条件が成り立つかどうかをチェックするのに logical
を使用しないでください。たとえば、logical
を使用して条件ステートメント OR をテストすると、エラーが返されます。代わりに、isAlways
を使用してこの条件ステートメントをテストしてください。
cond2 = sin(x)^2 + cos(x)^2 == 1 | x^2 > 0
cond2 =
tf = isAlways(cond2)
tf = logical
1
複数の条件のチェック
複数の条件をチェックするために、それらをシンボリック配列として表すことができます。
たとえば、それぞれ 3 つの異なる式をもつ 2 つのシンボリック配列を作成します。
syms x
expr1 = [tan(x); x+1; exp(log(x))]
expr1 =
expr2 = [sin(x)/cos(x); (x^2+2*x+1)/(x+1); x]
expr2 =
これらの式を比較するには、関係演算子 ==
を使用して、条件ステートメントから成るシンボリック配列を作成します。
cond = expr1 == expr2
cond =
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 =
logical
を使用して、expr2
内の単純化された各式が expr1
内の対応する式と等しいかどうかをチェックします。
tf = logical(expr1 == expr2)
tf = 3x1 logical array
1
1
1
isequal
を使用して、expr2
内の単純化されたすべての式が expr1
と等しいかどうかをチェックします。
tf = isequal(expr1,expr2)
tf = logical
1