OgitaRumpOishiMethod.java
/*
* Created on 2008/01/21
* Copyright (C) 2008 Koga Laboratory. All rights reserved.
*
*/
package org.mklab.cga.linear;
import org.mklab.cga.interval.matrix.IntervalNumericalMatrix;
import org.mklab.cga.interval.scalar.IntervalNumericalScalar;
import org.mklab.nfc.matrix.NormType;
import org.mklab.nfc.matrix.NumericalMatrix;
import org.mklab.nfc.scalar.NumericalScalar;
/**
* 線形方程式の精度保証付き解を(丸めの変更を行わない)Ogita-Rump-Oishiの方法で求めるクラスです。
*
* @author yano
* @version $Revision: 1.3 $, 2008/01/21
* @param <IS> 区間スカラーの型
* @param <IM> 区間行列の型
* @param <S> 成分の型
* @param <M> 行列の型
*/
public class OgitaRumpOishiMethod<IS extends IntervalNumericalScalar<IS,IM,S,M>, IM extends IntervalNumericalMatrix<IS,IM,S,M>, S extends NumericalScalar<S,M>, M extends NumericalMatrix<S,M>> implements LinearEquationVerifier<IS,IM,S,M> {
/** 係数行列 */
private M A;
/** 右辺係数ベクトル */
private M b;
/** 係数行列 */
private IM IA;
/** 右辺係数ベクトル */
private IM Ib;
/** 精度保証付き解 */
private IM solution;
/**
* 新しく生成された<code>OgitaMethod</code>オブジェクトを初期化します。
*
* @param A 係数行列
* @param b 右辺係数ベクトル
*/
public OgitaRumpOishiMethod(final IM A, final IM b) {
this.IA = A;
this.Ib = b;
}
// /**
// * {@inheritDoc}
// */
// public void solve(IM A, M b) {
// throw new RuntimeException("Not implemented"); //$NON-NLS-1$
// }
//
// /**
// * @see org.mklab.cga.linear.LinearEquationVerifier#solve(org.mklab.nfc.matrix.NumericalMatrix, org.mklab.cga.interval.matrix.IntervalMatrix)
// */
// public void solve(M A, IM b) {
// throw new RuntimeException("Not implemented"); //$NON-NLS-1$
// }
//
// /**
// * @see org.mklab.cga.linear.LinearEquationVerifier#solve(org.mklab.nfc.matrix.NumericalMatrix, org.mklab.nfc.matrix.NumericalMatrix)
// */
// public void solve(M A, M b) {
// throw new RuntimeException("Not implemented"); //$NON-NLS-1$
// }
/**
* {@inheritDoc}
*/
public void solve() {
//this.IA = IA;
this.A = this.IA.getMiddle();
//this.Ib = Ib;
this.b = this.Ib.getMiddle();
M R = this.A.inverse();
M xtilde = R.multiply(this.b);
M alpha = alphaStd(this.A, R);
M beta = beta(this.A, xtilde, this.b, R);
this.solution = null;
}
/**
* @see org.mklab.cga.linear.LinearEquationVerifier#getSolution()
*/
public IM getSolution() {
return this.solution;
}
/**
* @param a a
* @param xtilde xtilde
* @param b b
* @param r r
* @return beta
*/
private M beta(M a, M xtilde, M b, M r) {
return null;
}
/**
* @param A A
* @param R R
* @return alphaStd
*/
private M alphaStd(M A, M R) {
S alpha1 = ((R.multiply(A).subtract((A.createUnit(A.getRowSize(), A.getColumnSize())))).norm(NormType.INFINITY));
if (alpha1.isGreaterThanOrEquals(1)) {
throw new RuntimeException("verification failed"); //$NON-NLS-1$
}
return null;
}
}