/// <summary>ローゼンブロックの方程式を解くテスト</summary> public static void Test() { MultiRoot mRoots = new MultiRoot(MultiRoot.SolverType.ScalingHybrid, 2); //ローゼンブロックの方程式 double a = 1; double b = 10; GSLFunctions.DArrayToDArray eFnc = delegate(double[] inputs, ref double[] outputs) { outputs[0] = a * (1 - inputs[0]); outputs[1] = b * (inputs[1] - inputs[0] * inputs[0]); return(GSLNET.ErrorNumber.GSL_SUCCESS); }; //収束計算 int iterNum; double[] initX = new double[] { -10, -5 }; mRoots.Solve(eFnc, ref initX, 1.0e-7, 1.0e-7, 100, out iterNum); Console.WriteLine(initX[0] + " , " + initX[1]); mRoots.Solve(eFnc, ref initX, 1.0e-7, 100, out iterNum); Console.WriteLine(initX[0] + " , " + initX[1]); }
/// <summary>非線形最小二乗法テスト</summary> public void Test() { Multifit mFit = new Multifit(Multifit.SolverType.LevenbergMarquardtWithScaling, 40, 3); //学習データ作成 double[] ops = new double[40]; Random rnd = new Random(); //出力式 GSLFunctions.DArrayToDArray fnc = delegate(double[] inputs, ref double[] outputs) { double a = inputs[0]; double lambda = inputs[1]; double b = inputs[2]; for (int i = 0; i < outputs.Length; i++) { double t = i; double yi = a * Math.Exp(-lambda * t) + b; outputs[i] = yi - (1.0 + 5 * Math.Exp(-0.1 * t)); } return(GSLNET.ErrorNumber.GSL_SUCCESS); }; int iterNum; double[] param = new double[] { 1, 0, 0 }; GSLNET.ErrorNumber eNum = mFit.Solve(fnc, ref param, 1e-5, 500, out iterNum); //メモリ解放 mFit.Dispose(); Console.WriteLine("終了"); Console.Read(); }