アルファテスト終了(2/2) VfuncとEqSysとMatとVec
アルファテスト終了(2/2) VfuncとEqSysとMatとVec
記事原稿が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(); } }