Показать сообщение отдельно
Старый 28.02.2019, 10:47   #9 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Alessandro4 Посмотреть сообщение
Объясните, пожалуйста, ваши блоки и сам метод)
Пожалуйста.
Интеграл берется аналитически, и первообразная (кстати, в методичке, как обычно бывает, это слово употреблено безграмотно, на самом деле первообразная, она же "неопределенный интеграл", это функция, дифференцирование которой даёт подынтегральное выражение, поэтому первообразная определяется с точностью до произвольной константы) есть
Ln(Ln(x))+С.
Отсюда определенный интеграл с переменным верхним пределом (который эти умники называют "первообразной") есть
Ln(Ln(x)) - Ln(Ln(a)).
Уж откуда эти ... взяли числовой коэффициент — не ведаю. Впрочем, догадываюсь: скорее всего, подынтегральная функция предполагалась не 1/(xLn(x)), как у них в таблице, а 1/(xLg(x)), т.е. с десятичным, а не натуральным логарифмом. Тогда действительно возникает коэффициент Ln(10). Идиоты!
Всё это считается в программе через функцию Antiderivative.

Теперь, собственно, о численном интегрировании.

1. Вспомним формулу Симпсона для вычисления интеграла на промежутке (a,b):
а) разбиваем промежуток на 2N частей (тут важна чётность).
б) вводим
h = (b - a)/(2N)
Xj = a + h*j, j = 0, 1, ... 2N
Yj = f(Xj), где f — подынтегральная функция.
тогда интеграл есть
(h/3)*(Y0 + 4*Y1 + 2*Y2 + 4*Y3 + ... + Y2N)

2. Тут опять "уважаемые" преподаватели бьют бедных студиозусов ключом (разводным или шведским) по голове. Видите ли, можно либо зафиксировать число разбиений интервала, тогда точность — уж как получится, либо задать точность и дробить интервал до тех пор, пока мы этой точности не достигнем. А то и другое сразу, как предписывают эти корифеи, НЕВОЗМОЖНО. Поэтому я выбрал второй вариант — вычисление интеграла с заданной точностью. Вычисление делается в функции Simpson.

3. В этой функции организован следующий цикл:
а) Вычисляется значение интеграла при 2N = 2. Обозначим это значение Sum1.
б) Удваиваем N и повторяем вычисление. Получаем величину Sum2.
в) Если |Sum1-Sum2|< ε, то на этом заканчиваем, в противном случае величине Sum1 присваиваем значение Sum2, снова вдвое дробим интервал и повторяем вычисление, в результате которого получаем новое значение Sum2, которое сравниваем с Sum1.
г) Делаем так до тех пор, пока не выполнится условие малости разницы результатов двух итераций.

Далее в программе сделан вывод таблицы результатов, где сопоставляется значение численного расчета при изменении верхнего предела интеграла с точным значением.
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070