Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/34: Рейтинг темы: голосов - 34, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 18.03.2016
Сообщений: 7
1

Численное интегрирование методом Гаусса I = exp^(-(x/2))dx

18.03.2016, 17:23. Показов 6214. Ответов 6

Author24 — интернет-сервис помощи студентам
Help me, please
возникли трудности с написанием программы(новичек в программировании) вычисления интегрирования методом Гаусса на с#
I = exp^(-(x/2))dx
Пределы интегрирования - от 0 до х.
Сам метод разобрать более менее получилось, а в коде запуталась
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.03.2016, 17:23
Ответы с готовыми решениями:

Численное интегрирование методом трапеций
доброго времени суток уважаемые форумчане. вообщем у меня возник вопрос связанный с численным...

Численное интегрирование методом Гаусса (Квадратурная формула Гаусса)
Есть задание: реализовать численное интегрирование методом Гаусса функции определённой на...

Численное интегрирование методом Гаусса
Здравствуйте. Нужна помощь в написании программы рассчитать интеграл (3xe^3x)dx, написать нужно в...

Численное интегрирование методом Гаусса
Здравствуйте, необходимо реализовать численное интегрирование методом Гаусса ,я написал код на си...

6
1494 / 1209 / 821
Регистрация: 29.02.2016
Сообщений: 3,614
18.03.2016, 19:17 2
Но надо проверять
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
   class Program
    {
        public static double Legendre(double x, int deg)
        {
            double P0 = 1.0;
            double P1 = x;
            double P2 = (3.0 * x * x - 1) / 2.0;
            int n = 1;
            if (deg < 0)
                throw new Exception("Bad Hermite polynomial: deg < 0");
            if (deg == 0)
                return P0;
            else if (deg == 1)
                return P1;
            else
            {
                while (n < deg)
                {
                    P2 = 2.0 * x * P1 - P0 - (x * P1 - P0) / (deg + 1);
                    P0 = P1;
                    P1 = P2;
                    n++;
                }
                return P2;
            }
        }
        public static double GaussLegendre(Function f, double a, double b, int n)
        {
            double[] x, w;
            LegendreNodesWeights(n, out x, out w);
 
            double sum = 0.0;
            for (int i = 0; i < n; i++)
            {
                sum += 0.5 * (b - a) * w[i] * f(0.5 * (a + b) + 0.5 * (b - a) * x[i]);
            }
            return sum;
        }
        public static void LegendreNodesWeights(int n, out double[] x, out double[] w)
        {
            double c, d, p1, p2, p3, dp;
 
            x = new double[n];
            w = new double[n];
 
            for (int i = 0; i < (n + 1) / 2; i++)
            {
                c = Math.Cos(Math.PI * (4 * i + 3) / (4 * n + 2));
                do
                {
                    p2 = 0;
                    p3 = 1;
                    for (int j = 0; j < n; j++)
                    {
                        p1 = p2;
                        p2 = p3;
                        p3 = ((2 * j + 1) * c * p2 - j * p1) / (j + 1);
                    }
                    dp = n * (c * p3 - p2) / (c * c - 1);
                    d = c;
                    c -= p3 / dp;
                }
                while (Math.Abs(c - d) > 1e-12);
                x[i] = c;
                x[n - 1 - i] = -c;
                w[i] = 2 * (1 - x[i] * x[i]) / (n + 1) / (n + 1) / Legendre(x[i], n + 1) / Legendre(x[i], n + 1);
                w[n - 1 - i] = w[i];
            }
        }
        public delegate double Function(double x);
        static void TestGaussLegendre()
        {
            Console.WriteLine("\nResult from Gauss-Legendre method:\n");
            double result;
            for (int n = 1; n < 9; n++)
            {
                result = GaussLegendre(f2, 1, 2, n);
                Console.WriteLine(" n = {0}, result = {1}", n, result);
            }
        }
        static double f2(double x)
        {
            return Math.Exp(-x /2.0);
        }
 
        static void Main(string[] args)
        {
             TestGaussLegendre();
        }
    }
1
0 / 0 / 0
Регистрация: 18.03.2016
Сообщений: 7
20.03.2016, 21:14  [ТС] 3
спасибо огромное. но можно еще несколько комментариев по коду? Особенно по переменным
0
1494 / 1209 / 821
Регистрация: 29.02.2016
Сообщений: 3,614
20.03.2016, 21:59 4
Лучший ответ Сообщение было отмечено Psilon как решение

Решение

Текст кода(немного изменен) с комментариями
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
    class Program
    {
 
        public static double Legendre(double x, int deg)
        {
// полином Лежандра степени n в точке X
            double P0 = 1.0;
            double P1 = x;
            double P2 = (3.0 * x * x - 1) / 2.0;
            int n = 1;
            if (deg < 0)
                throw new Exception("Bad Hermite polynomial: deg < 0");
            if (deg == 0)
                return P0;
            else if (deg == 1)
                return P1;
            else
            {
                while (n < deg)
                {
                    P2 = 2.0 * x * P1 - P0 - (x * P1 - P0) / (deg + 1);
                    P0 = P1;
                    P1 = P2;
                    n++;
                }
                return P2;
            }
        }
        public static double GaussLegendre(Function f, double a, double b, int n)
        {
// Формула Гаусса
            double[] x, w;
            LegendreNodesWeights(n, out x, out w);
 
            double sum = 0.0;
            for (int i = 0; i < n; i++)
            {
                sum += 0.5 * (b - a) * w[i] * f(0.5 * (a + b) + 0.5 * (b - a) * x[i]);
            }
            return sum;
        }
        public static void LegendreNodesWeights(int n, out double[] x, out double[] w)
        {
// веса полиномов Лежандра
            double c, d, p1, p2, p3, dp;
 
            x = new double[n];
            w = new double[n];
 
            for (int i = 0; i < (n + 1) / 2; i++)
            {
                c = Math.Cos(Math.PI * (4 * i + 3) / (4 * n + 2));
                do
                {
                    p2 = 0;
                    p3 = 1;
                    for (int j = 0; j < n; j++)
                    {
                        p1 = p2;
                        p2 = p3;
                        p3 = ((2 * j + 1) * c * p2 - j * p1) / (j + 1);
                    }
                    dp = n * (c * p3 - p2) / (c * c - 1);
                    d = c;
                    c -= p3 / dp;
                }
                while (Math.Abs(c - d) > 1e-12);
                x[i] = c;
                x[n - 1 - i] = -c;
                w[i] = 2 * (1 - x[i] * x[i]) / (n + 1) / (n + 1) / Legendre(x[i], n + 1) / Legendre(x[i], n + 1);
                w[n - 1 - i] = w[i];
            }
        }
        public delegate double Function(double x);
 
        static double f2(double x)
        {
            return Math.Exp(-x * x);
        }
 
        static void Main(string[] args)
        {
// формулы взяты из [url]https://en.wikipedia.org/wiki/Gaussian_quadrature[/url]
 
            Console.WriteLine("\nResult from Gauss-Legendre method:\n");
            double a,b,result;
 
            // f2 - интегрируемая функция
            // a,b - пределы интегрирования
            // n - степень полинома Лежандра
 
            a = 0;
            b = 10;
            for (int n = 1; n < 9; n++)
            {
                result = GaussLegendre(f2, a, b, n);
                Console.WriteLine(" n = {0}, result = {1}", n, result);
            }
        }
    }
2
0 / 0 / 0
Регистрация: 18.03.2016
Сообщений: 7
20.03.2016, 22:10  [ТС] 5
public delegate double Function(double x) - для чего нам нужен делегат в данном случае?
0
1494 / 1209 / 821
Регистрация: 29.02.2016
Сообщений: 3,614
20.03.2016, 22:24 6
делегат позволяет производить вычисления с разными функциями

Добавлено через 6 минут
Кстати, здесь можно взять Handbook of Mathematical Functions with Formulas, Graphs, and Mathematical Tables
http://people.math.sfu.ca/~cbm... stegun.pdf
0
0 / 0 / 0
Регистрация: 18.03.2016
Сообщений: 7
20.03.2016, 23:07  [ТС] 7
afront, спасибо!
если возникнут вопросы, я снова Вас побеспокою)
0
20.03.2016, 23:07
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.03.2016, 23:07
Помогаю со студенческими работами здесь

Численное интегрирование функции методом Гаусса.
Помогите, очень надо. F(x)=\frac{1}{\sqrt{9+{x}^{2}}} На интервале =, количество разбиений n=200...

Численное интегрирование. Формула Гаусса
памогите плиз ... надо написать программу в visual basic по теме &quot;Численное интегрирование.Формула...

Численное интегрирование методом прямоугольника, методом трапеции, методом Симпсона
ничего в этом не понимаю, хелп ми!!! в конце еще нужна оценка погрешности...

Численное интегрирование методом Симпсона и методом трапеций
Нужно написать программу по численному интегрированию: 1)метод симпсона 2)метод трапеций Очень...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru