// Golden Section Search method for Black Scholes
        public double GoldenSearchBS(double a, double b, double tol, int MaxIter, MSsetBS mssettings)
        {
            MSExpansionBS MS = new MSExpansionBS();
            double        x1, x2, x3, x4, f1, f2, f3, f4;
            double        GR = (Math.Sqrt(5.0) - 1.0) / 2.0;
            int           k  = 0;

            while (Math.Abs(b - a) > tol)
            {
                k  = k + 1;
                x1 = a;
                x2 = a + (1.0 - GR) * (b - a);
                x3 = a + GR * (b - a);
                x4 = b;
                f1 = -MS.MSPutBS(x1, mssettings);
                f2 = -MS.MSPutBS(x2, mssettings);
                f3 = -MS.MSPutBS(x3, mssettings);
                f4 = -MS.MSPutBS(x4, mssettings);
                if ((f1 > f2) & (f2 < f3))
                {
                    b = x3;
                }
                else if ((f2 > f3) & (f3 < f4))
                {
                    a = x2;
                }
                if (k > MaxIter)
                {
                    break;
                }
            }
            return((a + b) / 2.0);
        }
        public double MSPriceBS(double S, double K, double T, double sigma, double r, double q, int MaxIter, double Tol, double b, double dt)
        {
            MSsetBS mssettings = new MSsetBS();

            mssettings.theta = Math.Log(K / S) / sigma / Math.Sqrt(T);
            mssettings.K     = K;
            mssettings.sigma = sigma;
            mssettings.r     = r;
            mssettings.q     = q;
            mssettings.T     = T;
            Tol     = 1e-5;
            MaxIter = 50;
            double a = Math.Max(1.25, 0.95 * mssettings.theta);

            b = 3.0;

            // Golden section search method to find y
            GoldenSearch GS = new GoldenSearch();
            double       y  = GS.GoldenSearchBS(a, b, Tol, MaxIter, mssettings);

            // Bisection algorithm to find y
            //double y = BisectionBS(mssettings,a,b,Tol,MaxIter,dt);


            if (y < mssettings.theta)
            {
                y = mssettings.theta;
            }
            MSExpansionBS MS = new MSExpansionBS();

            return(MS.MSPutBS(y, mssettings));
        }
        // Derivative of the MS approximation
        public double MSPutBSdiff(double y, MSsetBS mssettings, double dy)
        {
            MSExpansionBS MS = new MSExpansionBS();

            return((MS.MSPutBS(y + dy, mssettings) - MS.MSPutBS(y - dy, mssettings)) / 2.0 / dy);
        }