DoubleSigma.java

/*
 * $Id: Sigma.java,v 1.24 2008/05/15 09:36:06 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.DoubleComplexMatrix;
import org.mklab.nfc.matrix.DoubleMatrix;
import org.mklab.nfc.matrix.misc.LogarithmicallySpacedVector;
import org.mklab.nfc.scalar.DoubleComplexNumber;


/**
 * シグマプロットを描画するためのデータを求めるクラスです。
 * 
 * <p>Sigma plot data
 * 
 * @author koga
 * @version $Revision: 1.24 $
 */
public class DoubleSigma {

  /** システム */
  private DoubleLinearSystem system;

  /**
   * 新しく生成された<code>Sigma</code>オブジェクトを初期化します。
   * 
   * @param system 線形システム
   */
  public DoubleSigma(final DoubleLinearSystem system) {
    this.system = (DoubleProperLinearSystem)system.clone();
    this.system.setTimeDomainType(TimeDomainType.CONTINUOUS);
  }

  /**
   * シグマプロットを描画するためのデータを求める
   * 
   * @return {s, g} (特異値の列, 周波数の列) sigma plot data
   */
  public List<DoubleMatrix> getSigma() {
    DoubleMatrix angularFrequencies = LogarithmicallySpacedVector.create(-2.0, 3.0, 100);
    return getSigma(angularFrequencies);
  }

  /**
   * シグマプロットを描画するためのデータを求める
   * 
   * @param angularFrequencies 評価する周波数の列
   * @return {s, g} (特異値の列, 周波数の列) sigma plot data
   */
  public List<DoubleMatrix> getSigma(DoubleMatrix angularFrequencies) {
    //final DoubleNumber unit = angularFrequencies.getElement(1, 1);
    final DoubleComplexNumber j = new DoubleComplexNumber(0,1);
    final DoubleComplexMatrix jw = new DoubleComplexMatrix(angularFrequencies).multiply(j);
    final List<DoubleComplexMatrix> gjw = new DoubleFrequencyResponse(this.system).getResponse(jw);

    int size = angularFrequencies.length();
    DoubleMatrix sigma = angularFrequencies.createZero(1, size);
    for (int i = 1; i <= size; i++) {
      DoubleComplexMatrix Gjw = gjw.get(i - 1);
      sigma.setElement(1, i, Gjw.maxSingularValue().getRealPart());
    }

    return new ArrayList<>(Arrays.asList(new DoubleMatrix[] {sigma, angularFrequencies}));
  }

}