Classiclll's Blog

an old boy

アルファテスト終了(2/2) VfuncとEqSysとMatとVec

アルファテスト終了(2/2) VfuncとEqSysMatVec


妄想中のVec, MatVfuncEqSysの実装は済んで、とりあえずアルファテストが終わった。
  (最新仕様は各ページ更新済み)

記事原稿が5000文字制限を超えたので、分割した残骸がこの記事。記事前半から読んでくれるとありがたい。(って読む人いるのかな?)

Vfunc、EqSysのテスト用実装クラス

これらのクラスは、VfuncおよびEqSysの使用例にもなっていることに留意すること。
import lll.Loc.*;

public class SimpleFunc extends Vfunc {
	public SimpleFunc() {
		super(1,0);
	}
	public double valueAt(Vec x, Vec p) {
		return x.mul(2).sub(5).elem(0);	// f(x) = 2x-5
	}
	public Vec gradAt(Vec x, Vec p) {
		return new Vec(new double[]{2});// f'(x) = 2
	}
	public Vec gradParamAt(Vec x, Vec p) {
		return Vec.NaN.copy();	// no parameter fitting needed
	}
}

public class PolyFunc extends Vfunc {
	public PolyFunc() {
		super(1,0);
	}
	public double valueAt(Vec x, Vec p) {// f(x) = x^3 + 3x^2 + 4x + 2
		double v = x.elem(0);
		return v*v*v + 3*v*v + 4*v + 2;
	}
	public Vec gradAt(Vec x, Vec p) {	// f'(x) = 3x^2 + 6x + 4
		double v = x.elem(0);
		return new Vec(3*v*v+6*v+4, 1);
	}
	public Vec gradParamAt(Vec x, Vec p) {// no parameter fitting needed
		return Vec.NaN.copy();
	}
}

public class LinearFunc extends EqSys {
	public LinearFunc() {
		super(3,3);
	}
	public Vec valueAt(Vec x) {	// f(X) = { x+y+z-1, y+z-1, x+z-1 }
		double xx=x.elem(0), yy=x.elem(1), zz=x.elem(2);
		return new Vec(new double[]{xx+yy+zz-1, yy+zz-1, xx+zz-1});
	}
	public Mat jacobAt(Vec x) {	// Jacobian of f(X)={f0(X), f1(X), f2(X)}
		double[][] jacobi = { {1, 1, 1},  // { {dxf0(X), dyf0(X), dzf0(X)}
				      {0, 1, 1},  //   {dxf1(X), dyf1(X), dzf1(X)}
				      {1, 0, 1} };//   {dxf2(X), dyf2(X), dzf2(X)} }
		return new Mat(jacobi);
	}
	public Mat jacobParamAt(Vec x) {
		return Mat.NaN.copy();
	}
}