多点拘束は相互依存することがあります。例えば以下のような例が挙げられます。
5.u1(10) + 8.u1(23) + 2.3u2(12) = 0 | (385) |
u1(23) - 3.u1(2) + 4.u1(90) = 0 | (386) |
1つ目の方程式は2つ目の方程式に依存しています。u1(24) は1つ目の方程式の独立項に属していますが、これは2つ目の方程式の従属項でもあるからです(MPC の1つ目の項は従属項で全体系から取り除かれ、他の項は独立項)。従属項は取り除かれるので、2つ目の方程式を1つ目に代入して1つ目の方程式を展開(方程式が滝の様に「カスケード」するので「デ・カスケード」と呼びます)する必要があります。すると以下の様になります。
5.u1(10) + 24.u1(2) + 32.u1(90) + 2.3u2(12) = 0 | (387) |
少なくとも他に依存する MPC が線形である場合にはこれはサブルーチン cascade.c で行なわれます。次に対応する項が展開され、可能な場合には MPC が展開された式で置き換えられます。
一方で他に依存する MPC が非線形である場合には展開は行なわれません。非線形 MPC では cascade.c が呼び出された段階で MPC の係数は実際には未知なのです。またほとんどの場合、これら係数はまだ未知なままの解に依存します。この解は反復処理の結果求まります。従って非線形 MPC では、項が求解中に消え(係数ゼロ)それによって MPC の間の依存関係が変わることがあるのです。このため依存関係は各イテレーションごとに新しく決定する必要があり、サブルーチン cascade.c は繰り返し処理中にサブルーチン nonlingeo.c から呼び出されます。これについては後で議論します。
cascade.c には MPC をデ・カスケードするためのプロシージャが2つあります。1つ目(今のところ実用性的な唯一のものです)はヒューリスティックなもので、依存関係が消えるまで繰り返し MPC の展開を行なうものです。このプロシージャは今までのところは非常にうまく動作していますが、理論的な収束性についての証明がありません。2つ目のプロシージャは動作が保証されています。これは線形方程式の解法に基づくもので、SPOOLES を使用します。従属項は左辺に、独立項は右辺に集められ、独立項の1つを1に、他を0にすることで得られる一連の方程式を解きます。以下のような方程式系
[A]{Ud} = [B]{Ui} | (388) |
は以下の様に変形されます。
{Ud} = [A]-1[B]{Ui} | (389) |
ここで {Ud} は従属項、{Ui} は独立項です。ただし実際には MPC はそれほど深く相互依存しないので、SPOOLES による求解はヒューリスティックな方法よりも低速になります。