예제 #1
0
        private static double[,] GetBoundaryMatrix(BoundaryInput input, int count)
        {
            double h = (input.b - input.a) / count;
            int    N = count - 1;

            double Alpha(int i) => i == N ? -input.d2 : 1 - (input.p(i * h) * h) / 2.0;
            double Beta(int i) => i == 0 ? h * input.c1 - input.c2 : i == N ? h * input.d1 + input.d2 : input.q(i * h) * h * h - 2;
            double Gamma(int i) => i == 0 ? input.c2 : 1 + input.p(i * h) * h / 2.0;
            double Phi(int i) => i == 0 ? h * input.c : i == N ? h * input.d : input.f(i * h) * h * h;

            var outputMatrix = new double[count, count + 1];

            for (int i = 0; i < count; i++)
            {
                if (i != 0)
                {
                    outputMatrix[i, i - 1] = Alpha(i);
                }
                outputMatrix[i, i] = Beta(i);
                if (i != N)
                {
                    outputMatrix[i, i + 1] = Gamma(i);
                }
                outputMatrix[i, count] = Phi(i);
            }

            return(outputMatrix);
        }
예제 #2
0
        /// <summary>
        /// Решает краевую задачу с заданными параметрами
        /// </summary>
        /// <param name="input">Структура, представляющая входные параметры</param>
        /// <param name="count">Количество значений</param>
        public static double[] GetBoundaryValue(BoundaryInput input, int count)
        {
            var boundaryMatrix = GetBoundaryMatrix(input, count);
            var outputArray    = Sweep.SweepMatrix(boundaryMatrix);

            return(outputArray);
        }