Zp2tfn.java

/*
 * $Id: Zp2tfn.java,v 1.18 2008/05/12 10:47:58 koga Exp $
 *
 * Copyright (C) 2004 Koga Laboratory. All rights reserved.
 */
package org.mklab.tool.control;

import java.util.List;

import org.mklab.nfc.matrix.DoubleComplexMatrix;
import org.mklab.nfc.matrix.DoubleMatrix;
import org.mklab.nfc.scalar.DoubleRationalPolynomial;


/**
 * 極とゼロ点から伝達関数(有理多項式)に変換するクラスです。
 * 
 * <p>Zero-pole to transfer function conversion
 * 
 * @author koga
 * @version $Revision: 1.18 $
 * @see org.mklab.tool.control.Zp2tf
 * @see org.mklab.tool.control.Zp2tfm
 * @see org.mklab.tool.control.Zp2ss
 * @see org.mklab.tool.control.Tfn2zp
 */
public class Zp2tfn {

  /**
   * 極<code>p</code>、ゼロ点<code>z</code>、ゲイン<code>k</code>である1入力1出力システム
   * 
   * <pre><code> (s-z1)(s-z2)...(s-zn) g(s) = k --------------------- (s-p1)(s-p2)...(s-pn) </code></pre>
   * 
   * の伝達関数を返します。
   * 
   * @param zeros ゼロ点の集合
   * @param poles 極の集合
   * @param gain ゲイン
   * @return 伝達関数 (transfer function)
   */
  public static DoubleRationalPolynomial zp2tfn(DoubleComplexMatrix zeros, DoubleComplexMatrix poles, DoubleMatrix gain) {
    int outputNumber = 1;
    return zp2tfn(zeros, poles, gain, outputNumber);
  }

  /**
   * 1入力多出力システムの<code>inputNumber</code>番目の入力から出力までの伝達関数を返します。
   * 
   * @param zeros ゼロ点の集合
   * @param poles 極の集合
   * @param gain ゲイン
   * @param outputNumber 出力番号
   * @return 伝達関数 (transfer function)
   */
  public static DoubleRationalPolynomial zp2tfn(DoubleComplexMatrix zeros, DoubleComplexMatrix poles, DoubleMatrix gain, int outputNumber) {
    final DoubleMatrix k = gain.getSubVector(outputNumber, outputNumber);
    final List<DoubleMatrix> ans;
    if (zeros.getColumnSize() == 0) {
      ans = Zp2tf.zp2tf(zeros, poles, k);
    } else {
      ans = Zp2tf.zp2tf(zeros.getRowVector(outputNumber), poles, k);
    }
    final DoubleMatrix numerator = ans.get(0);
    final DoubleMatrix denominator = ans.get(1);
    return Tf2tfn.tf2tfn(numerator, denominator);
  }

}