Main Content

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

vpasolve

方程式の数値的な求解

説明

S = vpasolve(eqn,var) は、変数 var について方程式 eqn を数値的に解きます。var を指定しない場合、vpasolvesymvar により決定される既定の変数について解きます。たとえば、vpasolve(x + 1 == 2, x) は方程式 x + 1 = 2 を数値的に解いて x を求めます。

S = vpasolve(eqn,var,init_param) は、初期推定または検索範囲 init_param を使用して、変数 var について方程式 eqn を数値的に解きます。

Y = vpasolve(eqns,vars) は、変数 vars について方程式系 eqns を数値的に解きます。この構文は、解が含まれている構造体配列 Y を返します。構造体配列のフィールドは、vars で指定された変数と対応します。vars を指定しない場合、vpasolvesymvar により決定される既定の変数について解きます。

Y = vpasolve(eqns,vars,init_param) は、初期推定または検索範囲 init_param を使用して、変数 vars について方程式系 eqns を数値的に解きます。

[y1,...,yN] = vpasolve(eqns,vars) は、変数 vars について方程式系 eqns を数値的に解きます。この構文では、解を変数 y1,...,yN に代入します。vars を指定しない場合、vpasolvesymvar により決定される既定の変数について解きます。

[y1,...,yN] = vpasolve(eqns,vars,init_param) は、初期推定または検索範囲 init_param を使用して、変数 vars について方程式系 eqns を数値的に解きます。

___ = vpasolve(___,'Random',true) は、ランダムな初期推定を使用して解を求めます。この入力を使用して、非多項方程式に対して同じ解を繰り返し返すのを回避します。すべての変数について初期推定を指定すると、'Random'true に設定しても影響はありません。

すべて折りたたむ

多項方程式を解きます。多項方程式の場合、vpasolve はすべての解を返します。

syms x
S = vpasolve(2*x^4 + 3*x^3 - 4*x^2 - 3*x + 2 == 0, x)
S = 

(-2.0-1.00.51.0)[-vpa('2.0'); -vpa('1.0'); vpa('0.5'); vpa('1.0')]

非多項方程式を解きます。非多項方程式の場合、vpasolve は最初に見つかった解を返します。

S = vpasolve(sin(x) == 1/2, x)
S = 0.52359877559829887307710723054658vpa('0.52359877559829887307710723054658')

vpasolve を使用する場合に、初期推定を指定して方程式 200sin(x)=x3-1 の複数の解を求めます。

方程式の左辺と右辺をプロットします。

syms x
eqnLeft = 200*sin(x);
eqnRight = x^3 - 1;
fplot([eqnLeft eqnRight])
title([texlabel(eqnLeft) ' = ' texlabel(eqnRight)])

プロットにより、この方程式には 3 つの解があることが示されます。初期推定を指定しない場合、vpasolve は最初に見つかった解を返します。

S1 = vpasolve(eqnLeft == eqnRight, x)
S1 = -0.0050000214585835715725440675982988-vpa('0.0050000214585835715725440675982988')

別の解を見つけるには、その解に近い初期推定を指定します。

S2 = vpasolve(eqnLeft == eqnRight, x, -3)
S2 = -3.0009954677086430679926572924945-vpa('3.0009954677086430679926572924945')
S3 = vpasolve(eqnLeft == eqnRight, x, 4)
S3 = 3.0098746383859522384063444361906vpa('3.0098746383859522384063444361906')

方程式系の解を求めます。出力引数の 1 つを使用して、解を構造体配列の形式で返します。

syms u v
Y = vpasolve([v^3 + 2*u == v, v^2 == u], [u,v])
Y = struct with fields:
    u: [3x1 sym]
    v: [3x1 sym]

構造体配列 Y のフィールドにアクセスして、解を表示します。

uSol = Y.u
uSol = 

(05.82842712474619009760337744841940.1715728752538099023966225515806)[sym(0); vpa('5.8284271247461900976033774484194'); vpa('0.1715728752538099023966225515806')]

vSol = Y.v
vSol = 

(0-2.41421356237309504880168872420970.4142135623730950488016887242097)[sym(0); -vpa('2.4142135623730950488016887242097'); vpa('0.4142135623730950488016887242097')]

vpasolve で解を求められない場合は、空のオブジェクトを返します。

syms x
eqns = [3*x+2, 3*x+1];
Y = vpasolve(eqns,x)
 
Y =
 
Empty sym: 0-by-1
 

方程式系の解を求める際、複数の出力引数を使用して解を出力変数に直接代入します。ソルバーが解を返す順序は、変数を指定する順序に従います。

syms x y
[sol_x, sol_y] = vpasolve([x*sin(10*x) == y^3, y^2 == exp(-2*x/3)], [x,y])
sol_x = 88.90707209659114864849280774681vpa('88.90707209659114864849280774681')
sol_y = 0.00000000000013470479710676694388973703681918vpa('0.00000000000013470479710676694388973703681918')

方程式の解の範囲を指定することができます。たとえば、検索範囲を実数解のみに制限する場合、vpasolve は仮定を無視するため、仮定は使用できません。代わりに、検索区間を指定します。次の方程式では、範囲を指定しない場合、数値ソルバーは方程式の 6 つの解をすべて返します。

syms x
S = vpasolve(x^6 - x^2 == 3, x)
S = 

(-1.29294233500847243691965504363821.2929423350084724369196550436382-0.50188125716943915856832436499602-1.0429452224956770037495194222175i-0.50188125716943915856832436499602+1.0429452224956770037495194222175i0.50188125716943915856832436499602-1.0429452224956770037495194222175i0.50188125716943915856832436499602+1.0429452224956770037495194222175i)[-vpa('1.2929423350084724369196550436382'); vpa('1.2929423350084724369196550436382'); - vpa('0.50188125716943915856832436499602') - vpa('1.0429452224956770037495194222175i'); - vpa('0.50188125716943915856832436499602') + vpa('1.0429452224956770037495194222175i'); vpa('0.50188125716943915856832436499602') - vpa('1.0429452224956770037495194222175i'); vpa('0.50188125716943915856832436499602') + vpa('1.0429452224956770037495194222175i')]

この方程式の実数解のみが必要であると仮定します。vpasolve は仮定を無視するので、変数についての仮定は使用できません。

assume(x,'real')
S = vpasolve(x^6 - x^2 == 3, x)
S = 

(-1.29294233500847243691965504363821.2929423350084724369196550436382-0.50188125716943915856832436499602-1.0429452224956770037495194222175i-0.50188125716943915856832436499602+1.0429452224956770037495194222175i0.50188125716943915856832436499602-1.0429452224956770037495194222175i0.50188125716943915856832436499602+1.0429452224956770037495194222175i)[-vpa('1.2929423350084724369196550436382'); vpa('1.2929423350084724369196550436382'); - vpa('0.50188125716943915856832436499602') - vpa('1.0429452224956770037495194222175i'); - vpa('0.50188125716943915856832436499602') + vpa('1.0429452224956770037495194222175i'); vpa('0.50188125716943915856832436499602') - vpa('1.0429452224956770037495194222175i'); vpa('0.50188125716943915856832436499602') + vpa('1.0429452224956770037495194222175i')]

検索範囲を指定して、返される結果を特定の範囲に制限します。たとえば、この方程式の実数解のみを返すには、探索区間を [-Inf Inf] に指定します。

S = vpasolve(x^6 - x^2 == 3, x, [-Inf Inf])
S = 

(-1.29294233500847243691965504363821.2929423350084724369196550436382)[-vpa('1.2929423350084724369196550436382'); vpa('1.2929423350084724369196550436382')]

非負の解を返すには、探索区間を [0 Inf] に指定します。

S = vpasolve(x^6 - x^2 == 3, x, [0 Inf])
S = 1.2929423350084724369196550436382vpa('1.2929423350084724369196550436382')

[-1, 1+2i] のように、検索範囲に複素数を含めることもできます。この場合、vpasolve は、複素数平面で -1 が探索領域の左下隅を、1+2i が領域の右上隅を指定する矩形検索領域を使用します。

S = vpasolve(x^6 - x^2 == 3, x, [-1 1+2i])
S = 

(-0.50188125716943915856832436499602+1.0429452224956770037495194222175i0.50188125716943915856832436499602+1.0429452224956770037495194222175i)[- vpa('0.50188125716943915856832436499602') + vpa('1.0429452224956770037495194222175i'); vpa('0.50188125716943915856832436499602') + vpa('1.0429452224956770037495194222175i')]

次の方程式系の解を求めます。

syms x y
eqn1 = exp(-x^2-y^2)*(x-4) - exp((-x^2-y^2)/2)*(x-2) == 0
eqn1 = 

e-x2-y2x-4-e-x22-y22x-2=0exp((- x^2 - y^2))*(x - 4) - exp((- x^2/2 - y^2/2))*(x - 2) == 0

eqn2 = exp(-x^2-y^2)*(y-2) - exp((-x^2-y^2)/2)*(y-4) == 0
eqn2 = 

e-x2-y2y-2-e-x22-y22y-4=0exp((- x^2 - y^2))*(y - 2) - exp((- x^2/2 - y^2/2))*(y - 4) == 0

初期推定を指定しないで変数 x および変数 y についての解を求めます。vpasolve は解を求めることができず、空のオブジェクトを返します。

[solX, solY] = vpasolve([eqn1 eqn2],[x y])
 
solX =
 
Empty sym: 0-by-1
 
 
solY =
 
Empty sym: 0-by-1
 

ここで初期推定 x = 2 および y = 4 を指定します。vpasolve は初期推定に近い解を返します。

[solX, solY] = vpasolve([eqn1 eqn2],[x y],[2; 4])
solX = 1.9999092125057125429174334656647vpa('1.9999092125057125429174334656647')
solY = 4.0000907874942874570825665343353vpa('4.0000907874942874570825665343353')

既定では、vpasolve は呼び出しごとに同じ解を返します。非多項方程式の複数の解を求めるには、'Random'true に設定します。これにより、vpasolve はランダムな初期推定を使用するようになり、連続する呼び出しで異なる解を求めることができます。

'Random' が指定されていない場合、vpasolve はすべての呼び出しで同じ解を返します。

syms x
f = x-tan(x);
for n = 1:3
    S = vpasolve(f,x)
end
S = 0sym(0)
S = 0sym(0)
S = 0sym(0)

'Random' が true に設定されている場合、vpasolve は呼び出しのたびにそれぞれ別の解を返します。

for n = 1:3
    S = vpasolve(f,x,'Random',true)
end
S = -227.76107684764829218924973598808-vpa('227.76107684764829218924973598808')
S = 102.09196646490764333652956578441vpa('102.09196646490764333652956578441')
S = 61.244730260374400372753016364097vpa('61.244730260374400372753016364097')

'Random' オプションは、検索範囲と併用することができます。

S = vpasolve(f,x,[10 12],'Random',true)
S = 10.904121659428899827148702790189vpa('10.904121659428899827148702790189')

入力引数

すべて折りたたむ

解を求める方程式。シンボリック方程式またはシンボリック式として指定します。シンボリック方程式は、関係演算子 == により定義されます。eqn がシンボリック式 (右辺なし) の場合、ソルバーは右辺が 0 であると仮定し、方程式 eqn == 0 の解を求めます。

方程式を解くための変数。シンボリック変数として指定します。var が指定されていない場合、symvar は変数を決定します。

解を求める方程式系または式。シンボリック ベクトル、行列、または方程式または式の配列として指定します。また、これらの方程式または式はコンマで区切ることができます。方程式がシンボリック式 (右辺なし) の場合、ソルバーは方程式の右辺が 0 であると仮定します。

方程式系を解くための変数。シンボリック ベクトルとして指定します。これらの変数はベクトルまたはコンマ区切りのリストとして指定されます。vars が指定されていない場合、symvar は変数を決定します。

解の初期推定または検索範囲。数値、ベクトルまたは 2 列の行列として指定します。

init_param が数値または (多変数方程式の場合は) 数値のベクトルである場合、数値ソルバーはこれを初期推定として使用します。多変数方程式で init_param がスカラーと指定されている場合は、数値ソルバーはこのスカラー値をすべての変数の初期推定として使用します。例については、初期推定を指定して複数の解を求めるを参照してください。

init_param が 2 列の行列である場合、行の 2 つの入力は対応する変数の初期推定の境界を指定します。検索範囲の行列の初期推定を指定するには、両方の列を初期推定の値として指定します。

init_param を検索範囲 [a b] として指定し、値 a,b が複素数である場合、vpasolve は複素平面の矩形検索領域内で解を検索します。ここで、a は矩形検索領域の左下隅を指定し、b はその右上隅を指定します。例については、解の範囲の指定を参照してください。

変数の検索範囲を省くには、その変数の検索範囲を init_param[NaN, NaN] として設定します。init_param での NaN のその他すべての使用はエラーになります。

出力引数

すべて折りたたむ

一変数方程式の解。シンボリック値またはシンボリック配列として返します。シンボリックな配列のサイズは、解の数と一致します。

方程式系の解。構造体配列として返します。構造体配列のフィールド数は、方程式系の解を求める変数の数と一致します。

方程式系に代入する解である変数。数値の配列またはシンボリック変数として返します。出力変数の数またはシンボリックな配列の数は、求める変数の数と等しくなければなりません。複数の独立変数 vars を陽的に指定すると、ソルバーは同じ順序で解を返します。vars を指定しない場合、ツールボックスは独立変数をアルファベット順に並べ替えてから、それらの変数の解を出力変数またはシンボリック配列に代入します。

ヒント

  • vpasolve で解を求められない場合は、空のオブジェクトを返します。初期推定を行い、ソルバーが解を求められるようにします。例については、初期推定を使用した求解を参照してください。

  • 多項方程式の場合、vpasolve はすべての解を返します。非多項方程式の場合、すべての解を求める一般的な方法はありません。vpasolve は既定では 1 つの解のみを返します。非多項式の異なる複数の解を求めるには、'Random' を true に設定し、vpasolve を繰り返し使用することができます。

  • 一意ではない解をもつ方程式系を解く場合、vpasolve の動作は方程式系が多項式か非多項式であるかによって異なります。多項式の場合、vpasolve は任意のパラメーターを採用してすべての解を返します。非多項式の場合、解が存在する場合は 1 つの数値的な解を返します。

  • 有理方程式系を解く場合、vpasolve はその分母を乗算することで方程式を多項式に変換します。vpasolve は、結果として得られる多項式系のすべての解を返します。これには、分母の根も含まれます。

  • vpasolve は変数に設定された仮定を無視します。引数 init_param を使用して適切な検索範囲を指定し、返される結果を特定の範囲に制限できます。

  • 出力変数 y1,...,yN は、vpasolve で方程式または方程式系を解く対象となる変数を指定しません。y1,...,yNeqns に含まれる変数であっても、vpasolve(eqns) が正しい順序で y1,...,yN に解を代入することは保証されません。したがって、[a,b] = vpasolve(eqns) の呼び出しでは a の解が b に代入されたり、その逆になる可能性もあります。

    返される解の順序を確定するには、変数 vars を指定します。たとえば、呼び出し [b,a] = vpasolve(eqns,[b,a]) は、a の解を a に、b の解を b に代入します。

  • solve を使用して方程式をシンボリックに解いてから、vpa を使用してその結果を数値的に近似することができます。この方法を使うと、シンボリック ソルバーで見つかったすべての解の数値近似が求められます。ただし、シンボリックに求解してからその結果を後処理することは、数値ソルバー vpasolve を直接使用するよりも時間がかかるため、計算速度が低下する可能性があります。

アルゴリズム

  • 'Random'true に設定し、変数の検索範囲を指定すると、内部の (一様分布をもつ) 乱数発生器により検索範囲内でランダムな初期推定が選択されます。

  • 'Random'true に設定し、変数の検索範囲を指定しない場合、半値幅 100 のコーシー分布に従ってランダムな初期推定が生成されます。そのため、初期推定は実数値で、繰り返し呼び出す値の範囲が広くなります。

R2012b で導入