DoubleMathematicalFunction.java
/*
* $Id: MathematicalFunction.java,v 1.14 2008/07/16 03:51:37 koga Exp $
*
* Copyright (C) 2004 Koga Laboratory. All rights reserved.
*
*/
package org.mklab.tool.control.system.math;
import org.mklab.nfc.matrix.DoubleMatrix;
import org.mklab.tool.control.system.continuous.DoubleBaseContinuousStaticSystem;
import org.mklab.tool.control.system.parameter.Parameter;
import org.mklab.tool.control.system.parameter.StringExternalizable;
/**
* 数学関数を表わすクラスです。
*
* @author Koga Laboratory
* @version $Revision: 1.14 $, 2004/11/12
*/
public class DoubleMathematicalFunction extends DoubleBaseContinuousStaticSystem implements StringExternalizable {
/** 数学関数の種類 */
@Parameter(name = "functionType", description = "MathematicalFunction.1", internationalization = true)
private MathematicalFunctionType type;
/**
* 新しく生成された<code>MathFunction</code>オブジェクトを初期化します。
*/
public DoubleMathematicalFunction() {
this(MathematicalFunctionType.EXP);
}
/**
* @see org.mklab.tool.control.system.SystemOperator#toString()
*/
@Override
public String toString() {
return this.type.toString();
}
/**
* 新しく生成された<code>MathFunction</code>オブジェクトを初期化します。
*
* @param type 数学関数の種類
*/
public DoubleMathematicalFunction(final MathematicalFunctionType type) {
super(-1, -1);
this.type = type;
setAutoSize(true);
setHasDirectFeedthrough(true);
}
/**
* {@inheritDoc}
*/
@Override
public DoubleMatrix outputEquation( final double t, final DoubleMatrix u) {
switch (this.type) {
case CONJ:
return u.conjugate();
case EXP:
return u.expElementWise();
case HERMITIAN:
return u.conjugateTranspose();
case LOG:
return u.logElementWise();
case LOG10:
return u.log10ElementWise();
case MAGNITUDE2:
return u.absElementWise().powerElementWise(2);
case SQUARE:
return u.powerElementWise(2);
case SQRT:
return u.sqrtElementWise();
case RECIPROCAL:
return u.inverseElementWise();
case TEN_POW:
return DoubleMatrix.powerElementWise(10, u);
case TRANSPOSE:
return u.transpose();
case POW:
case REM:
case MOD:
case HYPOT:
final int size = u.getRowSize();
final DoubleMatrix u1 = u.getSubVector(1, size / 2);
final DoubleMatrix u2 = u.getSubVector(size / 2 + 1, size);
if (this.type == MathematicalFunctionType.POW) {
return u1.powerElementWise(u2);
} else if (this.type == MathematicalFunctionType.REM) {
return u1.remainderElementWise(u2);
} else if (this.type == MathematicalFunctionType.MOD) {
return u1.modulusElementWise(u2);
}
return u1.powerElementWise(2).add(u2.powerElementWise(2)).sqrtElementWise();
default:
assert false : "never reached"; //$NON-NLS-1$
}
return new DoubleMatrix(u.getRowSize(), 1);
}
/**
* @see org.mklab.tool.control.system.SystemOperator#setInputSize(int)
*/
@Override
public void setInputSize(final int size) {
super.setInputSize(size);
if (this.type == MathematicalFunctionType.POW || this.type == MathematicalFunctionType.REM || this.type == MathematicalFunctionType.MOD || this.type == MathematicalFunctionType.HYPOT) {
super.setOutputSize(size / 2);
} else {
super.setOutputSize(size);
}
}
/**
* @see org.mklab.tool.control.system.SystemOperator#setOutputSize(int)
*/
@Override
public void setOutputSize(final int size) {
super.setOutputSize(size);
if (this.type == MathematicalFunctionType.POW || this.type == MathematicalFunctionType.REM || this.type == MathematicalFunctionType.MOD || this.type == MathematicalFunctionType.HYPOT) {
super.setInputSize(size * 2);
} else {
super.setInputSize(size);
}
}
/**
* @see org.mklab.tool.control.system.parameter.StringExternalizable#getString(java.lang.String)
*/
public String getString(String key) {
return Messages.getString(key);
}
/**
* 関数の式を返します。
*
* @return 関数の式
*/
public String getFunction() {
return this.type.getFunction();
}
/**
* 数学関数の種類を取得します。
*
* @return 数学関数
*/
public MathematicalFunctionType getType() {
return this.type;
}
/**
* 数学関数を設定します。
*
* @param type 数学関数
*/
public void setType(MathematicalFunctionType type) {
this.type = type;
}
/**
* @see org.mklab.tool.control.system.SystemOperator#equals(java.lang.Object)
*/
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!super.equals(o)) {
return false;
}
if (o == null) {
return false;
}
if (o.getClass() != getClass()) {
return false;
}
DoubleMathematicalFunction castedObj = (DoubleMathematicalFunction)o;
return ((this.type == null ? castedObj.type == null : this.type.equals(castedObj.type)));
}
/**
* @see org.mklab.tool.control.system.SystemOperator#hashCode()
*/
@Override
public int hashCode() {
int hashCode = super.hashCode();
hashCode = 31 * hashCode + (this.type == null ? 0 : this.type.hashCode());
return hashCode;
}
/**
* @see org.mklab.tool.control.system.SystemOperator#clone()
*/
@Override
public DoubleMathematicalFunction clone() {
DoubleMathematicalFunction inst = (DoubleMathematicalFunction)super.clone();
inst.type = this.type;
return inst;
}
}