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}));
}
}