Main Content

方程式を解くための問題ベースのワークフロー

メモ

Optimization Toolbox™ には、方程式を解くためのアプローチが 2 通りあります。このトピックでは、問題ベースのアプローチについて説明します。ソルバーベースの最適化問題の設定では、ソルバーベースのアプローチについて説明しています。

方程式系を解くには、以下の手順を実行します。

  • eqnproblem を使用して、方程式問題オブジェクトを作成します。問題オブジェクトは、方程式を定義するコンテナーです。方程式問題オブジェクトは、問題と、問題変数に存在する範囲を定義します。

    例として、方程式問題を作成します。

    prob = eqnproblem;
  • optimvar を使用して、名前付き変数を作成します。最適化変数は、方程式を記述するために使用するシンボリック変数です。変数定義に範囲を含めます。

    たとえば、'x' という名前の変数の 15 行 3 列の配列を作成し、下限を 0、上限を 1 とします。

    x = optimvar('x',15,3,'LowerBound',0,'UpperBound',1);
  • 問題変数の方程式を定義します。以下に例を示します。

    sumeq = sum(x,2) == 1;
    prob.Equations.sumeq = sumeq;

    メモ

    多項式、有理式、および初等関数 (exp など) で構成されていない非線形関数がある場合は、その関数を fcn2optimexpr を使用して最適化式に変換します。詳細については、非線形関数から最適化式への変換最適化変数および式でサポートされる演算を参照してください。

    必要に応じて、方程式にワークスペース変数として追加のパラメーターを含めます。問題ベースのアプローチでの追加パラメーターの受け渡しを参照してください。

  • 非線形問題の場合、フィールドが最適化変数名となっている構造体として、初期点を設定します。以下に例を示します。

    x0.x = randn(size(x));
    x0.y = eye(4); % Assumes y is a 4-by-4 variable
  • solve を使用して問題を解きます。

    sol = solve(prob);
    % Or, for nonlinear problems,
    sol = solve(prob,x0)

これらの基本的な手順に加え、show または write を使用して、問題を解く前に問題定義を確認することができます。既定のソルバーまたはオプションの変更で説明されているように、optimoptions を使用して solve のオプションを設定します。

警告

問題ベースのアプローチでは、目的関数、非線形等式、および非線形不等式における複素数値はサポートされていません。関数の計算に複素数値が含まれていると、それが中間値としてであっても、最終結果が不正確になる場合があります。

メモ

最適化問題に含まれるすべての名前は一意でなければなりません。特に、すべての変数名、目的関数名、および制約関数名は異なっている必要があります。

多項式を使用した基本的な方程式の解法の例については、非線形多項式系の解法、問題ベースを参照してください。一般的な非線形の例については、非線形方程式系の解法、問題ベースを参照してください。より広範囲な例については、非線形方程式系を参照してください。

参考

| | | | | |

関連するトピック