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