public static double[,] optionprice(double S0, double K, double vol, double T, int N, double r, double del, bool type, bool optiontype)
 {
     double[,] intrinsic = IntriValues.intrinsicvalues(S0, K, vol, T, N, r, del, type, optiontype);
     double[,] Option    = new double[N + 1, 2 * N + 1];
     double[,] american  = American.amer(S0, K, vol, T, N, r, del, type, optiontype);
     if (optiontype)//European: Option price is the same as intrinstic prices
     {
         for (int i = 0; i < intrinsic.GetLength(0); i++)
         {
             for (int j = 0; j < intrinsic.GetLength(1); j++)
             {
                 Option[i, j] = intrinsic[i, j];
             }
         }
     }
     else//American: Option price is the same as american prices
     {
         for (int i = 0; i < intrinsic.GetLength(0); i++)
         {
             for (int j = 0; j < intrinsic.GetLength(1); j++)
             {
                 Option[i, j] = american[i, j];
             }
         }
     }
     return(Option);
 }
            public static double[,] amer(double S0, double K, double vol, double T, int N, double r, double del, bool type, bool optiontype)
            {
                double[,] intrinsic = IntriValues.intrinsicvalues(S0, K, vol, T, N, r, del, type, optiontype);
                double[,] american  = new double[N + 1, 2 * N + 1];
                //the probabilities using during the discount process
                double pu   = GetValues.getvalues(S0, K, vol, T, N, r, del, type, optiontype)[4];
                double pm   = GetValues.getvalues(S0, K, vol, T, N, r, del, type, optiontype)[5];
                double pd   = GetValues.getvalues(S0, K, vol, T, N, r, del, type, optiontype)[6];
                double disc = GetValues.getvalues(S0, K, vol, T, N, r, del, type, optiontype)[7];

                //use the same price as intrinstic price in the last row
                for (int j = 0; j < intrinsic.GetLength(1); j++)
                {
                    int i = intrinsic.GetLength(0) - 1;
                    american[i, j] = intrinsic[i, j];
                }
                // Option price is the larger one of intrinstic prices and discounted prices
                double[,] underlyvalues = UnderlyingValues.underlyingvalues(S0, K, vol, T, N, r, del, type, optiontype);
                for (int i = intrinsic.GetLength(0) - 2; i >= 0; i--)
                {
                    for (int j = N - i; j <= N + i; j++)
                    {
                        american[i, j] = disc * (pu * american[i + 1, j + 1] + pm * american[i + 1, j] + pd * american[i + 1, j - 1]);
                        if (type)//call
                        {
                            american[i, j] = Math.Max(underlyvalues[i, j] - K, american[i, j]);
                        }
                        else//put
                        {
                            american[i, j] = Math.Max(K - underlyvalues[i, j], american[i, j]);
                        }
                    }
                }
                return(american);
            }