Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

長い式の共通項の略記

長い式は、同一部分式のインスタンスをいくつか含むことがよくあります。こういった式は、部分式を略語で置き換えるとより短く見えます。sympref を使用して、ライブ スクリプトのシンボリック式の略記された出力形式を使用するかどうかを指定できます。

たとえば、solve を使用して方程式 x+1x=1 を解きます。

syms x
sols = solve(sqrt(x) + 1/x == 1, x)
sols = 

(118σ2+σ22+13-σ12118σ2+σ22+13+σ12)where  σ1=319σ2-σ2i2  σ2=2554-231081081/3[(1/(18*(sym(25/54) - (sqrt(sym(23))*sqrt(sym(108)))/108)^sym(1/3)) + (sym(25/54) - (sqrt(sym(23))*sqrt(sym(108)))/108)^sym(1/3)/2 + sym(1/3) - (sqrt(sym(3))*(1/(9*(sym(25/54) - (sqrt(sym(23))*sqrt(sym(108)))/108)^sym(1/3)) - (sym(25/54) - (sqrt(sym(23))*sqrt(sym(108)))/108)^sym(1/3))*sym(1i))/2)^sym(2); (1/(18*(sym(25/54) - (sqrt(sym(23))*sqrt(sym(108)))/108)^sym(1/3)) + (sym(25/54) - (sqrt(sym(23))*sqrt(sym(108)))/108)^sym(1/3)/2 + sym(1/3) + (sqrt(sym(3))*(1/(9*(sym(25/54) - (sqrt(sym(23))*sqrt(sym(108)))/108)^sym(1/3)) - (sym(25/54) - (sqrt(sym(23))*sqrt(sym(108)))/108)^sym(1/3))*sym(1i))/2)^sym(2)]

関数 solve はシンボリック式として厳密解を返します。既定では、ライブ スクリプトは略記された出力の形式でシンボリック式を表示します。シンボリック設定では内部アルゴリズムを使用して略記する部分式を選択します。入れ子になった略語もこれに含まれます。たとえば、項 σ1σ2 として略記された部分式を含みます。シンボリック設定で、略記する部分式の選択を設定することはできません。

'AbbreviateOutput' の設定を false にすると、略記された出力の形式を無効にできます。返された結果は、長くて読みにくい式です。

sympref('AbbreviateOutput',false);
sols
sols = 

(1182554-231081081/3+2554-231081081/32+13-3192554-231081081/3-2554-231081081/3i221182554-231081081/3+2554-231081081/32+13+3192554-231081081/3-2554-231081081/3i22)[(1/(18*(sym(25/54) - (sqrt(sym(23))*sqrt(sym(108)))/108)^sym(1/3)) + (sym(25/54) - (sqrt(sym(23))*sqrt(sym(108)))/108)^sym(1/3)/2 + sym(1/3) - (sqrt(sym(3))*(1/(9*(sym(25/54) - (sqrt(sym(23))*sqrt(sym(108)))/108)^sym(1/3)) - (sym(25/54) - (sqrt(sym(23))*sqrt(sym(108)))/108)^sym(1/3))*sym(1i))/2)^sym(2); (1/(18*(sym(25/54) - (sqrt(sym(23))*sqrt(sym(108)))/108)^sym(1/3)) + (sym(25/54) - (sqrt(sym(23))*sqrt(sym(108)))/108)^sym(1/3)/2 + sym(1/3) + (sqrt(sym(3))*(1/(9*(sym(25/54) - (sqrt(sym(23))*sqrt(sym(108)))/108)^sym(1/3)) - (sym(25/54) - (sqrt(sym(23))*sqrt(sym(108)))/108)^sym(1/3))*sym(1i))/2)^sym(2)]

sympref を使用して設定した内容は、現在およびこれ以降の MATLAB® セッションを通じて維持されます。'default' オプションを指定して、'AbbreviateOutput' の既定値に戻します。

sympref('AbbreviateOutput','default');

subexpr は長い式を短くするために使用できる別の関数です。この関数は、sympref とは異なり、1 つの共通の部分式のみを略記し、入れ子になった略語はサポートしません。sympref および subexpr はまた、置き換える部分式を選択できません。

subexpr の 2 番目の入力引数を使用して、共通の部分式を置き換える変数名を指定します。たとえば、sols 内の共通の部分式を変数 t で置き換えます。

[sols1,t] = subexpr(sols,'t')
sols1 = 

(t2+118t+13+3t-19ti22t2+118t+13-3t-19ti22)[(t/2 + 1/(18*t) + sym(1/3) + (sqrt(sym(3))*(t - 1/(9*t))*sym(1i))/2)^2; (t/2 + 1/(18*t) + sym(1/3) - (sqrt(sym(3))*(t - 1/(9*t))*sym(1i))/2)^2]

t = 

2554-231081081/3(sym(25/54) - (sqrt(sym(23))*sqrt(sym(108)))/108)^sym(1/3)

sympref および subexpr は置き換える部分式を選択する方法を提供していませんが、それらの部分式をシンボリック変数として定義し、解を手動で書き換えることができます。

たとえば、新しいシンボリック変数 a1a2 を定義します。

syms a1 a2

a1a2 の値を代入する前に解 solsa1a2 で書き換えて、sols の評価を回避します。

sols = [(1/2*a1 + 1/3 + sqrt(3)/2*a2*1i)^2;...
        (1/2*a1 + 1/3 - sqrt(3)/2*a2*1i)^2]
sols = 

(a12+13+3a2i22a12+13-3a2i22)[(a1/2 + sym(1/3) + (sqrt(sym(3))*a2*sym(1i))/2)^2; (a1/2 + sym(1/3) - (sqrt(sym(3))*a2*sym(1i))/2)^2]

a1a2 に、値 (t+19t)(t-19t) をそれぞれ代入します。

a1 = t + 1/(9*t)
a1 = 

192554-231081081/3+2554-231081081/31/(9*(sym(25/54) - (sqrt(sym(23))*sqrt(sym(108)))/108)^sym(1/3)) + (sym(25/54) - (sqrt(sym(23))*sqrt(sym(108)))/108)^sym(1/3)

a2 = t - 1/(9*t)
a2 = 

2554-231081081/3-192554-231081081/3(sym(25/54) - (sqrt(sym(23))*sqrt(sym(108)))/108)^sym(1/3) - 1/(9*(sym(25/54) - (sqrt(sym(23))*sqrt(sym(108)))/108)^sym(1/3))

subs を使用して sols を評価します。結果はこの例の最初の出力と同じになります。

sols_eval = subs(sols)
sols_eval = 

(118σ2+σ22+13-σ12118σ2+σ22+13+σ12)where  σ1=319σ2-σ2i2  σ2=2554-231081081/3[(1/(18*(sym(25/54) - (sqrt(sym(23))*sqrt(sym(108)))/108)^sym(1/3)) + (sym(25/54) - (sqrt(sym(23))*sqrt(sym(108)))/108)^sym(1/3)/2 + sym(1/3) - (sqrt(sym(3))*(1/(9*(sym(25/54) - (sqrt(sym(23))*sqrt(sym(108)))/108)^sym(1/3)) - (sym(25/54) - (sqrt(sym(23))*sqrt(sym(108)))/108)^sym(1/3))*sym(1i))/2)^sym(2); (1/(18*(sym(25/54) - (sqrt(sym(23))*sqrt(sym(108)))/108)^sym(1/3)) + (sym(25/54) - (sqrt(sym(23))*sqrt(sym(108)))/108)^sym(1/3)/2 + sym(1/3) + (sqrt(sym(3))*(1/(9*(sym(25/54) - (sqrt(sym(23))*sqrt(sym(108)))/108)^sym(1/3)) - (sym(25/54) - (sqrt(sym(23))*sqrt(sym(108)))/108)^sym(1/3))*sym(1i))/2)^sym(2)]