Sigma.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.List;

import org.mklab.nfc.matrix.ComplexNumericalMatrix;
import org.mklab.nfc.matrix.RealNumericalMatrix;
import org.mklab.nfc.matrix.misc.LogarithmicallySpacedVector;
import org.mklab.nfc.scalar.ComplexNumericalScalar;
import org.mklab.nfc.scalar.RealNumericalScalar;


/**
 * シグマプロットを描画するためのデータを求めるクラスです。
 * 
 * @param <RS> type of real scalar
 * @param <RM> type of real matrix
 * @param <CS> type of complex scalar
 * @param <CM> type of complex matrix
 * <p>Sigma plot data
 * 
 * @author koga
 * @version $Revision: 1.24 $
 */
public class Sigma<RS extends RealNumericalScalar<RS,RM,CS,CM>, RM extends RealNumericalMatrix<RS,RM,CS,CM>, CS extends ComplexNumericalScalar<RS,RM,CS,CM>, CM extends ComplexNumericalMatrix<RS,RM,CS,CM>> {

  /** システム */
  private LinearSystem<RS,RM,CS,CM> system;

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

  /**
   * シグマプロットを描画するためのデータを求める
   * 
   * @return {s, g} (特異値の列, 周波数の列) sigma plot data
   */
  public List<RM> getSigma() {
    RS sunit = this.system.getA().getElement(1, 1).createUnit();
    RM angularFrequencies = LogarithmicallySpacedVector.create(sunit.create(-2), sunit.create(3), 100);
    return getSigma(angularFrequencies);
  }

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

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

    List<RM> ans = new ArrayList<>();
    ans.add(sigma);
    ans.add(angularFrequencies);
    return ans;
  }

}