ドキュメンテーション

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

vpasolve

構文

  • S = vpasolve(eqn)
  • S = vpasolve(eqn,var)
  • S = vpasolve(eqn,var,init_guess)
  • Y = vpasolve(eqns)
  • Y = vpasolve(eqns,vars)
  • Y = vpasolve(eqns,vars,init_guess)
  • [y1,...,yN] = vpasolve(eqns)
  • [y1,...,yN] = vpasolve(eqns,vars)
  • [y1,...,yN] = vpasolve(eqns,vars,init_guess)
  • ___ = vpasolve(___,Name,Value)

説明

S = vpasolve(eqn) は、symvar で指定された変数について式 eqn を数値的に解きます。

S = vpasolve(eqn,var) は、var で指定された変数について式 eqn を数値的に解きます。

S = vpasolve(eqn,var,init_guess) は、var で指定された変数について、開始点または init_guess で指定された検索範囲を使用して式 eqn を数値的に解きます。var を指定しない場合、vpasolvesymvar により指定された変数について解きます。

Y = vpasolve(eqns) は、symvar で指定された変数について連立方程式 eqns を数値的に解きます。この構文では Y が構造体配列として返されます。この配列にインデックスを付けて、解にアクセスすることができます。

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

Y = vpasolve(eqns,vars,init_guess) は、開始値または検索範囲 init_guess を使って、変数 vars について連立方程式 eqns を数値的に解きます。

[y1,...,yN] = vpasolve(eqns) は、symvar で指定された変数について連立方程式 eqns を数値的に解きます。この構文は、変数 y1,...,yN に解を代入します。

[y1,...,yN] = vpasolve(eqns,vars) は、vars で指定された変数について連立方程式 eqns を数値的に解きます。

[y1,...,yN] = vpasolve(eqns,vars,init_guess) は、vars で指定された変数について、開始値または検索範囲 init_guess を使用して連立方程式 eqns を数値的に解きます。

___ = vpasolve(___,Name,Value) は、1 つ以上の Name,Value のペアの引数により指定された追加オプションを使用して、変数または式について連立方程式を数値的に解きます。

多項方程式を解く

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

syms x
vpasolve(4*x^4 + 3*x^3 + 2*x^2 + x + 5 == 0, x)
ans =
 - 0.88011377126068169817875190457835 + 0.76331583387715452512978468102263i
 - 0.88011377126068169817875190457835 - 0.76331583387715452512978468102263i
   0.50511377126068169817875190457835 + 0.81598965068946312853227067890656i
   0.50511377126068169817875190457835 - 0.81598965068946312853227067890656i

非多項方程式を解く

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

syms x
vpasolve(sin(x^2) == 1/2, x)
ans =
-226.94447241941511682716953887638

構造体配列への解の代入

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

syms x y
S = vpasolve([x^3 + 2*x == y, y^2 == x], [x, y])
S = 
    x: [6x1 sym]
    y: [6x1 sym]

構造体配列 S の要素にアクセスして、解を表示します。

S.x
ans =
                                         0.2365742942773341617614871521768
                                                                         0
 - 0.28124065338711968666197895499453 + 1.2348724236470142074859894531946i
 - 0.28124065338711968666197895499453 - 1.2348724236470142074859894531946i
   0.16295350624845260578123537890613 - 1.6151544650555366917886585417926i
   0.16295350624845260578123537890613 + 1.6151544650555366917886585417926i
S.y
ans =
                                         0.48638903593454300001655725369801
                                                                          0
   0.70187356885586188630668751791218 + 0.87969719792982402287026727381769i
   0.70187356885586188630668751791218 - 0.87969719792982402287026727381769i
 - 0.94506808682313338631496614476119 + 0.85451751443904587692179191887616i
 - 0.94506808682313338631496614476119 - 0.85451751443904587692179191887616i

方程式系の求解時に変数に解を代入

連立方程式の解を求める際、複数の出力引数を使用して解を出力変数に直接代入します。解が正しい順序で返されるようにするには、変数を明示的に指定します。変数が指定される順序によって、ソルバーが解を返す順序が決まります。

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.90707209659114864849280774681
 
sol_y =
0.00000000000013470479710676694388973703681918

開始点を指定して複数の解を求める

方程式の両辺をプロットし、このプロットを使用して解の初期推定を指定します。

方程式 200*sin(x) = x^3 - 1 の左辺と右辺をプロットします。

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

この方程式には 3 つの解があります。初期推定 (ゼロ近似) を指定しない場合、vpasolve は最初に見つけた解を返します。

vpasolve(200*sin(x) == x^3 - 1, x)
ans =
-0.0050000214585835715725440675982988

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

vpasolve(200*sin(x) == x^3 - 1, x, -4)
ans =
-3.0009954677086430679926572924945
vpasolve(200*sin(x) == x^3 - 1, x, 3)
ans =
3.0098746383859522384063444361906

解の範囲の指定

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

syms x
vpasolve(x^8 - x^2 == 3, x)
ans =
                                         -1.2052497163799060695888397264341
                                          1.2052497163799060695888397264341
 - 0.77061431370803029127495426747428 + 0.85915207603993818859321142757163i
 - 0.77061431370803029127495426747428 - 0.85915207603993818859321142757164i
                                        -1.0789046020338265308047436284205i
                                         1.0789046020338265308047436284205i
   0.77061431370803029127495426747428 + 0.85915207603993818859321142757164i
   0.77061431370803029127495426747428 - 0.85915207603993818859321142757163i

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

assume(x, 'real')
vpasolve(x^8 - x^2 == 3, x)
ans =
                                         -1.2052497163799060695888397264341
                                          1.2052497163799060695888397264341
 - 0.77061431370803029127495426747428 + 0.85915207603993818859321142757163i
 - 0.77061431370803029127495426747428 - 0.85915207603993818859321142757164i
                                        -1.0789046020338265308047436284205i
                                         1.0789046020338265308047436284205i
   0.77061431370803029127495426747428 + 0.85915207603993818859321142757164i
   0.77061431370803029127495426747428 - 0.85915207603993818859321142757163i

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

vpasolve(x^8 - x^2 == 3, x, [-Inf Inf])
ans =
 -1.2052497163799060695888397264341
  1.2052497163799060695888397264341

非負の解のみを返します。

vpasolve(x^8 - x^2 == 3, x, [0 Inf])
ans =
1.2052497163799060695888397264341

検索範囲には複素数を使用できます。次の例では、vpasolve が複素平面の矩形検索領域を使用しています。

vpasolve(x^8 - x^2 == 3, x, [-1, 1 + i])
ans =
 - 0.77061431370803029127495426747428 + 0.85915207603993818859321142757164i
   0.77061431370803029127495426747428 + 0.85915207603993818859321142757164i

非多項方程式の複数の解を求める

既定の設定により、vpasolve はすべての呼び出しで同じ解を返します。非多項方程式の複数の解を求めるためには、randomtrue に設定します。これにより、vpasolve はランダム開始値を使用するようになり、連続する呼び出しで異なる解を求めることができます。

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

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

randomtrue に設定されている場合、vpasolve はすべての呼び出しで異なる解を返します。

syms x 
f = x-tan(x);
for n = 1:3 
  vpasolve(f,x,'random',true) 
end
ans =
 -227.76107684764829218924973598808
 ans =
 102.09196646490764333652956578441
 ans =
 61.244730260374400372753016364097

random は、検索範囲と併用することができます。

vpasolve(f,x,[10 12],'random',true)
ans =
10.904121659428899827148702790189

入力引数

すべて折りたたむ

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

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

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

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

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

init_guess が数値または (多変数方程式の場合は) 数値のベクトルである場合、数値ソルバーはこれを開始点として使用します。多変数方程式で init_guess がスカラーと指定されている場合は、数値ソルバーはこのスカラー値をすべての変数の開始点として使用します。

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

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

既定の設定により、vpasolve は開始点および検索範囲を独自に内部で選択します。

名前/値のペアの引数

例: vpasolve(x^2 - 4 == 0,x,'random',true)

すべて折りたたむ

複数の解を求めるために、random と値 (true またはfalse) を含むコンマ区切りのペアをランダムな開始点として使用します。すべての解を求める一般的な方法がない非多項方程式を解く場合に役に立ちます。値が false の場合、vpasolve はすべての呼び出しで同じ開始値を使用します。したがって、複数の解が存在する場合であっても、同じ入力を使用する複数の vpasolve の呼び出しは常に同じ解を求めます。しかし、値が true の場合、内部検出の開始値は検出範囲からランダムに選択されます。したがって、同じ入力を使用する複数の vpasolve の呼び出しが異なる解を検出する可能性があります。すべての変数の開始値を指定すると、randomtrue に設定しても影響はないことに注意してください。

出力引数

すべて折りたたむ

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

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

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

詳細

すべて折りたたむ

ヒント

  • vpasolve は、多項方程式に対してのみすべての解を返します。非多項方程式の場合、すべての解を求める一般的な方法はありません。非多項方程式または複数の解をもつ連立方程式で数値的な解を求める場合、既定では、vpasolve は解がある場合は 1 つのみ返します。複数の解を求めるには、random を true に設定します。これで、連続して vpasolve を呼び出すと複数の異なる解が返される可能性があります。

  • すべての変数を一意に決定するには方程式が不十分な連立方程式で解を求める場合、vpasolve の動作は連立方程式が多項式または非多項式であるかによって異なります。多項式の場合、vpasolve は任意のパラメーターを採用してすべての解を返します。非多項式の場合、解が存在する場合は 1 つの数値的な解を返します。

  • 有理数の連立方程式系を解く場合、その分母を払って多項式方程式系に変換します。vpasolve は、こうした分母の根でもある解を含め、結果として得られる多項式方程式系のすべての解を返します。

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

  • init_guess で検索範囲 [a,b] を指定し、値 a,b が複素数である場合、vpasolve は複素平面の矩形検索領域内で解を検索します。ここで、a は矩形検索領域の左下隅を指定し、b はその右上隅を指定します。

  • 出力変数 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 に代入します。

  • 方程式および式は引数リストの左側に、変数は右側に配置します。vpasolve は右側から変数を確認し、最初の方程式または式にたどり着くと左側がすべて方程式または式であると仮定します。

  • 可能であれば、まず solve を使って方程式をシンボリックに求解してから、取得されたシンボリックな結果を vpa で近似します。この方法を使うと、シンボリック ソルバーで見つかったすべての解の数値近似が求められます。シンボリック ソルバーを使用してその結果を後処理する場合、数値的な方法を直接使用するより時間がかかります。これにより、パフォーマンスが大幅に低下することがあります。

アルゴリズム

  • randomtrue に設定し、変数の検索範囲を指定すると、内部の乱数発生器により検索範囲内でランダムな開始点が選択されます。有限の検索範囲内の開始点の分布は一様です。

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

R2012b で導入

この情報は役に立ちましたか?