示例#1
0
        //龙贝格表格
        public void Romberg(double a, double b, FuncOfOneVar F)
        {
            double[,] TCSR = new double[20, 6];

            for (int i = 0; i < 5; i++)
            {
                TCSR[i, 0] = Math.Pow(2, i);
                if (TiXing(a, b, (int)TCSR[i, 0], out double y, F))
                {
                    TCSR[i, 1] = y;
                }
                if (i > 0)
                {
                    TCSR[i, 2] = (4 * TCSR[i, 1] - TCSR[i - 1, 1]) / 3;
                    if (i > 1)
                    {
                        TCSR[i, 3] = (16 * TCSR[i, 2] - TCSR[i - 1, 2]) / 15;
                        if (i > 2)
                        {
                            TCSR[i, 4] = (64 * TCSR[i, 3] - TCSR[i - 1, 3]) / 63;
                        }
                    }
                }
            }
            for (int i = 0; i < 5; i++)
            {
                Console.WriteLine($"i: {i}\tn: {TCSR[i, 0]}\t" +
                                  $"T: {TCSR[i, 1]}\tS: {TCSR[i, 2]}\t" +
                                  $"C: {TCSR[i, 3]}\tR: {TCSR[i, 4]}");
            }
        }
        //二分法计算
        public void Bs(double a, double b, double ep, FuncOfOneVar function)
        {
            //
            int num = 2;

            //二分循环
            while (b - a >= ep)
            {
                num *= 2;
                double x = (b + a) / 2.0;

                if (function(x, out double y1) && function(a, out double y2) && y1 * y2 > 0)
                {
                    a = x;
                }
                else
                {
                    b = x;
                }
            }
            //生成计算误差
            //生成计算结果
            //生成输出字符串
            Console.WriteLine($"\t计算误差: {(b - a) / num}\t计算结果: {(b + a) / 2.0}");
        }
示例#3
0
 public Function(FuncOfOneVar _Function, double _min, bool _minAllow, double _max, bool _maxAllow)//构造函数2
 {
     function = _Function;
     valueMin = _min;
     minAllow = _minAllow;
     valueMax = _max;
     maxAllow = _maxAllow;
 }
示例#4
0
 public Function(FuncOfOneVar mainFunction, double min, double max)//构造函数2
 {
     function = mainFunction;
     valueMin = min;
     minAllow = false;
     valueMax = max;
     maxAllow = false;
 }
示例#5
0
        //逐次分半加速
        public void QuBanTiXing(double a, double b, double ep, FuncOfOneVar F)
        {
            n = 1;
            double Tn, T2n;

            Tn = 0;
            while (true)
            {
                this.TiXing(a, b, n, out T2n, F);
                Console.WriteLine("n: {" + n + "}\tT2n: {" + T2n + "+}\t|T2n-Tn|: {" + Math.Abs(T2n - Tn) / 3 + "}");
                if (Math.Abs((T2n - Tn) / 3) > ep)
                {
                    Tn = T2n;
                    n  = n * 2;
                }
                else
                {
                    break;
                }
            }
        }
示例#6
0
        private bool TiXing(double a, double b, int n, out double res, FuncOfOneVar F)
        {
            h = (b - a) / n;
            double sum = 0;

            F(a, out double fa);
            F(b, out double fb);
            for (int i = 1; i < n; i++)
            {
                if (F(a + i * h, out double s))
                {
                    sum += s;
                }
                else
                {
                    Console.WriteLine($"错误:梯形公式计算错误");
                    res = 0;
                    return(false);
                }
            }
            res = h / 2 * (fa + fb + sum * 2);
            return(true);
        }
示例#7
0
 //构造函数
 public Function(FuncOfOneVar mainFunction)//构造函数1
 {
     valueMin = double.MinValue;
     valueMax = double.MaxValue;
     function = mainFunction;
 }