Augment.java

/*
 * $Id: Augment.java,v 1.11 2008/03/23 14:29:08 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;


/**
 * 拡張システムを生成するクラスです。
 * 
 * <p>Augmented system
 * 
 * @author koga
 * @version $Revision: 1.11 $
 * @see org.mklab.tool.control.Series
 * @see org.mklab.tool.control.Parallel
 */
public class Augment {

  /**
   * 2つの線形システムから拡張システムを生成します。
   * 
   * <p>生成されるシステムは、以下の通りです。
   * 
   * <pre><code> . [x1] = [A1 0] [x1] + |B1 0] |u1] [x2] [0 A2] [x2] + [0 B2] |u2]
   * 
   * [y1] = [C1 0] [x1] + |D1 0] |u1] [y2] [0 C2] [x2] + [0 D2] |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 A,B,C,D(拡張システム)(augmented system)
   */
  public static List<DoubleMatrix> augment(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 IllegalArgumentException(message1);
    }
    String message2;
    if ((message2 = Abcdchk.abcdchk(A2, B2, C2, D2)).length() > 0) {
      throw new IllegalArgumentException(message2);
    }

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

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

}