Parallel.java

/*
 * $Id: Parallel.java,v 1.10 2008/03/23 23:41:55 koga Exp $
 *
 * Copyright (C) 2004 Koga Laboratory. All rights reserved.
 */
package org.mklab.tool.control;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.mklab.nfc.matrix.DoubleMatrix;
import org.mklab.tool.matrix.Diag;


/**
 * 2つ線形システムを並列結合したシステムを求めるクラスです。
 * 
 * <p>Parallel connection of two systems
 * 
 * @author koga
 * @version $Revision: 1.10 $
 * @see org.mklab.tool.control.Series
 */
public class Parallel {

  /**
   * システム1
   * 
   * <pre><code>
   * 
   * . x1 = A1 x1 + B1 u1 y1 = C1 x1 + D1 u1 </code></pre>
   * 
   * とシステム2
   * 
   * <pre><code>
   * 
   * . x2 = A2 x2 + B2 u2 y2 = C2 x2 + D2 u2 </code></pre>
   * 
   * を並列結合(y = y1 + y2)したシステム
   * 
   * <pre><code> . [x1] = [A1 0] [x1] + [B1 0] [x2] [0 A2] [x2] + [0 B2]
   * 
   * y = y1 + y2 = [C1 C2] [x1] + [D1 D2] [u1] [x2] [u2] </code></pre>
   * 
   * を生成します。
   * 
   * @param A1 A1行列
   * @param B1 B1行列
   * @param C1 C1行列
   * @param D1 D1行列
   * @param A2 A2行列
   * @param B2 B2行列
   * @param C2 C2行列
   * @param D2 D2行列
   * @return 並列結合したシステム (connected system)
   */
  public static List<DoubleMatrix> parallel(DoubleMatrix A1, DoubleMatrix B1, DoubleMatrix C1, DoubleMatrix D1, DoubleMatrix A2, DoubleMatrix B2, DoubleMatrix C2, DoubleMatrix D2) {
    String message1;
    if ((message1 = Abcdchk.abcdchk(A1, B1, C1, D1)).length() > 0) {
      throw new RuntimeException(message1);
    }
    String message2;
    if ((message2 = Abcdchk.abcdchk(A2, B2, C2, D2)).length() > 0) {
      throw new RuntimeException(message2);
    }

    DoubleMatrix A = Diag.diag(A1, A2);
    DoubleMatrix B = Diag.diag(B1, B2);
    DoubleMatrix C = C1.appendRight(C2); // [C1 C2];
    DoubleMatrix D = D1.appendRight(D2); // [D1 D2];

    return new ArrayList<>(Arrays.asList(new DoubleMatrix[] {A, B, C, D}));
    //return new MatxList(new Object[] {A, B, C, D});
  }
}