/*
* 作成日: 2008/09/24
*/
package jp.ac.fit.asura.nao.misc;
import jp.ac.fit.asura.nao.misc.Filter.FloatFilter;
/**
* 合成シンプソン公式による数値積分フィルタ.
*
* h := 1
*
* 最大誤差 := -h^4/180*(b-a)*f''''(x)
*
* @author $Author: sey $
*
* @version $Id: $
*
*/
public class IntegralFilter {
protected int length;
public void clear() {
length = 0;
}
public boolean isFilled() {
return length != 0;
}
public static class Float extends IntegralFilter implements FloatFilter {
private float first;
private float last;
private float even;
private float odd;
private float lastValue;
public Float() {
super();
length = 0;
even = odd = 0;
}
@Override
public void clear() {
super.clear();
even = odd = 0;
}
@Override
public void eval() {
throw new UnsupportedOperationException();
}
@Override
public float eval(float value) {
if (length == 0) {
first = value;
}
if (length % 2 == 0) {
last = value;
lastValue = (first + last + even * 2 + odd * 4) / 3;
even += value;
} else {
// 合成シンプソン公式は偶数個の要素のみなので、台形公式で近似
lastValue += (last + value) / 2;
odd += value;
}
length++;
return lastValue;
}
public float value() {
return lastValue;
}
}
}