Exemplo n.º 1
0
    private FdmBase <double> GetFdm(ISde <double> sde)
    {
        Console.WriteLine("Create FDM");
        Console.WriteLine("1. Euler, 2. Extrapolated Euler, 3. Milstein, 4. Predictor-Corrector (PC),");
        Console.WriteLine("5. PC adjusted, 6. PC midpoint, 7. Exact, 8. Discrete Milstein,");
        Console.WriteLine("9. Karhunen Loeve, 10. Platen 1.0 strong scheme, 11. Heun");
        int c = Convert.ToInt32(Console.ReadLine());

        FdmBase <double> fdm;

        int NT = 500;

        Console.Write("How many NT? ");
        NT = Convert.ToInt32(Console.ReadLine());

        double a, b;

        switch (c)
        {
        case 1:

            fdm = new EulerFdm <double>(sde, NT);
            break;

        case 2:

            fdm = new ExtrapolatedEulerFdm <double>(sde, NT);
            break;

        case 3:

            fdm = new MilsteinFdm <double>(sde, NT);
            break;

        case 4:
            a   = 0.5;
            b   = 0.5;
            fdm = new PredictorCorrectorFdm <double>(sde, NT, a, b);
            break;

        case 5:
            a   = 0.5;
            b   = 0.5;
            fdm = new ModifiedPredictorCorrectorFdm <double>(sde, NT, a, b);
            break;

        case 6:
            a   = 0.5;
            b   = 0.5;
            fdm = new MidpointPredictorCorrectorFdm <double>(sde, NT, a, b);
            break;

        case 7:
            fdm = new ExactFdm <double>(sde, NT);
            break;

        case 8:
            fdm = new DiscreteMilsteinFdm <double>(sde, NT);
            break;

        case 9:
            int           N   = 100; // Series truncation value
            IRng <double> rng = new PolarMarsaglia <double>();

            fdm = new KarhunenLoeve(sde, NT, N, rng);
            break;

        case 10:
            fdm = new Platen_01_Explicit(sde, NT);
            break;

        case 11:
            fdm = new Heun(sde, NT);
            break;

        default:
            fdm = new ExtrapolatedEulerFdm <double>(sde, NT);
            break;
        }

        return(fdm);
    }