Esempio n. 1
0
        public void ExtremumCal(double up, double down, string exp,
                                out double min, out double max,
                                int concurr_num = 50000)
        {
            if (up < down)
            {
                throw new Exception("上界不可小于下界!");
            }
            taskList.Clear();
            MinMaxVal result = new MinMaxVal();

            funcExp = exp;
            Function.Function function = new Function.Function(exp);
            result.MaxVal = function.GetValue(down);
            result.MinVal = function.GetValue(down);

            ProduceTask(up, down, concurr_num, result, function);
            Task.WaitAll(taskList.ToArray());

            foreach (Task <MinMaxVal> t in taskList)
            {
                result.MinVal = Math.Min(result.MinVal, t.Result.MinVal);
                result.MaxVal = Math.Max(result.MaxVal, t.Result.MaxVal);
            }
            min = result.MinVal;
            max = result.MaxVal;
        }
Esempio n. 2
0
        //梯形逼近法计算函数积分
        public double IntegCal(double up, double down, string exp, int concurr_num = 50000)
        {
            taskList.Clear();
            double sign   = 1;
            double result = 0;

            funcExp = exp;
            Function.Function function = new Function.Function(exp);
            if (up < down)
            {
                double temp = up;
                up   = down;
                down = temp;
                sign = -1;
            }
            result += function.GetValue(up);
            result += function.GetValue(down);

            ProduceTask(up, down, concurr_num, ref result, function);
            Task.WaitAll(taskList.ToArray());
            foreach (Task <double> t in taskList)
            {
                result += t.Result;
            }
            return(sign * result * precision / 2);
        }
Esempio n. 3
0
        public double DerivCal(double x, string exp)
        {
            Function.Function function = new Function.Function(exp);
            double            up       = function.GetValue(x + precision);
            double            down     = function.GetValue(x - precision);

            return((up - down) / (2 * precision));
        }
Esempio n. 4
0
        private MinMaxVal ThreadCalMutiple(double x)
        {
            Function.Function function = new Function.Function(funcExp);
            MinMaxVal         temp     = new MinMaxVal();

            temp.MaxVal = function.GetValue(x);
            temp.MinVal = temp.MaxVal;
            for (double t = precision; t < interval; t += precision)
            {
                double result = function.GetValue(x);
                temp.MaxVal = Math.Max(temp.MaxVal, result);
                temp.MinVal = Math.Min(temp.MinVal, result);
            }
            return(temp);
        }
Esempio n. 5
0
 private void ProduceTask(double up, double down,
                          int concurr_num, ref double result, Function.Function function)
 {
     if (concurr_num >= (int)((up - down) / precision))
     {
         for (double x = down + precision; x < up; x += precision)
         {
             double        temp = x;
             Task <double> task = Task.Run(() => ThreadCalSingle(temp));
             taskList.Add(task);
         }
     }
     else
     {
         interval = (up - down) / (2 * concurr_num);
         double x = down + interval;
         for (; x < up; x += interval)
         {
             double        temp = x;
             Task <double> task = Task.Run(() => ThreadCalMutiple(temp));
             taskList.Add(task);
         }
         double sum = 0;
         for (x = (x - interval + precision); x < up; x += precision)
         {
             sum += 2 * function.GetValue(x);
         }
         result += sum;
     }
 }
Esempio n. 6
0
        private double ThreadCalSingle(double x)
        {
            Function.Function function = new Function.Function(funcExp);
            double            temp     = 2 * function.GetValue(x);

            return(temp);
        }
Esempio n. 7
0
        private MinMaxVal ThreadCalSingle(double x)
        {
            Function.Function function = new Function.Function(funcExp);
            MinMaxVal         temp     = new MinMaxVal();

            temp.MaxVal = function.GetValue(x);
            temp.MinVal = temp.MaxVal;
            return(temp);
        }
Esempio n. 8
0
        private double ThreadCalMutiple(double x)
        {
            Function.Function function = new Function.Function(funcExp);
            double            temp     = 0;

            for (double t = 0; t < interval; t += precision)
            {
                temp += 2 * function.GetValue(x - t);
            }
            return(temp);
        }
Esempio n. 9
0
 private void ProduceTask(double up, double down,
                          int concurr_num, MinMaxVal result, Function.Function function)
 {
     if (concurr_num >= (int)((up - down) / precision))
     {
         for (double x = down + precision; x < up; x += precision)
         {
             double           temp = x;
             Task <MinMaxVal> task = Task.Run(() => ThreadCalSingle(temp));
             taskList.Add(task);
         }
         result.MinVal = Math.Min(result.MinVal, function.GetValue(up));
         result.MaxVal = Math.Max(result.MaxVal, function.GetValue(up));
     }
     else
     {
         interval = (up - down) / (2 * concurr_num);
         double x = down + interval;
         for (; x < up; x += interval)
         {
             double           temp = x;
             Task <MinMaxVal> task = Task.Run(() => ThreadCalMutiple(temp));
             taskList.Add(task);
         }
         for (x = (x - interval + precision); x < up; x += precision)
         {
             result.MinVal = Math.Min(result.MinVal, function.GetValue(x));
             result.MaxVal = Math.Max(result.MaxVal, function.GetValue(x));
         }
         result.MinVal = Math.Min(result.MinVal, function.GetValue(up));
         result.MaxVal = Math.Max(result.MaxVal, function.GetValue(up));
     }
 }
Esempio n. 10
0
 private void btnAnswer_Click(object sender, EventArgs e)
 {
     try
     {
         if (HandleEquation.IsGeneralOp(equation.Last()))
         {
             MessageBox.Show("请在算式最后输入参与计算的数字!");
         }
         else
         {
             Function.Function func = new Function.Function(equation);
             equation = richTxtEquation.Text = func.GetValue().ToString();
         }
     }
     catch
     {
         MessageBox.Show("不支持计算此算式,请重新输入!");
     }
 }