Курсовая работа по Численным Методам. Отчёт курсовой работы ЧМ. Численное решение интегральных уравнений Вольтерра 2го рода
Скачать 439.22 Kb.
|
МИНИСТЕРСТВО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ Федеральное государственное бюджетное учреждение высшего профессионального образования Московский Авиационный Институт (Национальный Исследовательский Университет) Факультет №8 «Информационные технологии и прикладная математика» Кафедра 806 «Вычислительная математика и программирование» КУРСОВАЯ РАБОТА по курсу «Численные методы» VI семестр На тему: «Численное решение интегральных уравнений Вольтерра 2-го рода» Выполнил студент 3-го курса, 305-ой группы Милюков А. В. _________________ (подпись) Научный руководитель Пивоваров Д. E. __________________ (подпись) Работа защищена «__»___________ 2021 Оценка___________ Москва, 2021 ОГЛАВЛЕНИЕ Теория 3 1. Метод квадратур 3 2. Метод простой итерации 4 Реализация методов на языке Python 6 Вывод 10 Теория Линейное уравнение Вольтерра II рода имеет следующий вид: Здесь y(x) — неизвестная функция, K(x, s) — ядро интегрального уравнения, f(x) — свободный член (правая часть) интегрального уравнения. Однородное уравнение (при f ≡ 0) имеет только тривиальное решение, а условия существования решения неоднородного уравнения связаны с различными ограничениями на ядро K(x, s) и правую часть f(x) В частности , решение существует и единственно в классе непрерывных на отрезке [a, b] функций, если ядро непрерывно внутри и на сторонах треугольника, ограниченного прямыми s = a, x = b, x = s, а функция f(x) непрерывна на [a, b]. Далее рассмотрим несколько методов численного решения уравнений Вольтерра II рода. 1. Метод квадратур При численном решении интегральных уравнений входящие в них интегралы обычно заменяют конечными суммами. Согласно методу квадратур интегральные операторы заменяют суммами, полученными с помощью различных квадратурных формул Здесь a ≤ x 1 < x 2 < · · · < x n ≤ b — узлы, A i , i = 1, 2, . . . , n — веса, а R — ошибка аппроксимации квадратурной формулы. Чтобы применить метод квадратур к решению уравнения, необходимо использовать следующие равенства: Они получаются из исходного уравнения при фиксированных значениях xi независимой переменной x. Узлы сетки x i могут быть выбраны специальным образом или заданы заранее, если, например, правая часть f задана таблицей. Примем значения x i в качестве узлов квадратурной формулы и заменим с ее помощью интеграл в конечной суммой. Получим систему: Достаточно простым и во многих случаях эффективным является применение формулы трапеций. Для равномерной сетки с шагом h имеем: Тогда формула примет следующий вид: 2. Метод простой итерации Запишем линейное уравнение Вольтерра II рода в удобном для применения метода простой итерации виде: Построим последовательность функций y k (x), k = 0, 1, 2, . . . , с помощью рекуррентного соотношения: Если правая часть f(x) непрерывна на отрезке [a, b], а ядро K(x, s) непрерывно в замкнутом треугольнике a ≤ s ≤ x ≤ b, эта последовательность сходится при любом начальном приближении y 0 (x). Скорость сходимости зависит от свойств ядра и правой части уравнения. Ясно, что число итерационных шагов для получения аппроксимации необходимой точности зависит от степени близости начального приближения к искомому решению. В качестве начального приближения часто выбирают f(x), если нет дополнительной информации о решении. При численной реализации итерационных методов интеграл вычисляется посредством квадратурных формул. Воспользуемся квадратурной формулой трапеций с равномерной сеткой и шагом h. Узлы сетки обозначим x i , i = 0, 1,. . . , n. Пусть K ij = K(x i , x j ), y ki = y k (x i ). Получим расчетное выражение: где i = 0, 1, . . . , n. Для окончания итерационного процесса, будем использовать условие: где ||y|| = max |y(x)| на отрезке [a,b] , ε — заданная относительная ошибка. Данное условие означает, что в процессе решения необходимо сравнивать результаты, полученные для двух смежных итерационных шагов; близость полученных при этом приближений свидетельствует о достигнутой точности. Таким образом, количество итерационных шагов зависит также от требований к точности результата. Реализация методов на языке Python import matplotlib.pyplot as plt , numpy as np def K ( x , s ): return 1 def f ( x ): return 1 def y (x): return np.e**x #Метод квадратур def q_method (a , b , h): x = np.arange(a , b + h , h) y = np.zeros( len (x)) y[ 0 ] = f(x[ 0 ]) for i in range ( 1 , len (x)): sum = 0 if i > 1 : for j in range ( 1 , i): sum = K(x[i] , x[j]) * y[j] + sum y[i] = (( 1 - h / 2 * K(x[i] , x[i]))**(- 1 )) * ((f(x[i])) + (h / 2 ) * K(x[i] , x[ 0 ]) * y[ 0 ] + h * sum) return y # Нормализация вектора def normaliztion (b): norm = 0 for i in range ( len (b)): norm += b[i]*b[i] return np.sqrt(norm) def count_yk (x , y): yk = np.zeros( len (y)) for i in range ( len (yk)): for j in range ( 0 , i + 1 ): yk[i] = yk[i] + 2 * K(x[i] , x[j]) * y[j] yk[i] = yk[i] - K(x[i] , x[ 0 ]) * y[ 0 ] - K(x[i] , x[i]) * y[i] yk[i] = f(x[i]) + yk[i] * h / 2 return yk def simple_iteration (a , b , h , e): x = np.arange(a , b + h , h) y = np.zeros( len (x)) for i in range ( len (x)): y[i] = f(x) yk = count_yk(x , y) while (normaliztion(yk - y) / normaliztion(yk)) > e: y = yk yk = count_yk(x , y) return y def main (a , b , h , e): x = np.arange(a , b + h , h) y = np.zeros( len (x)) for i in range ( len (y)): y[i] = y(x[i]) q_y = q_method(a , b , h) si_y = simple_iteration(a , b , h , e) ( "Решения уравнения \n " ) ( " X " , x) ( " Точное значение Y: " , y) ( " Метод квадратур: " , *np.around(q_y , 4 )) ( "Метод простой итерации: " , *np.around(si_y , 4 ) , " \n " ) ( "Разница от точного значения" ) ( " Метод квадратур: " , *np.around(q_y - y , 4 )) ( "Метод простой итерации: " , *np.around(si_y - y , 4 )) plt.title( "График точного решения функции и результ работы методов" ) plt.xlabel( "x" ) plt.ylabel( "y" ) plt.grid() plt.axis([- 0.1 , 2.1 , 0 , 8 ]) plt.plot(x , y , label = "Точное решение" ) for i in range ( len (x)): plt.scatter(x[i] , q_y[i]) plt.plot(x , q_y , label = "Значения Y методом квадратур" ) for i in range ( len (x)): plt.scatter(x[i] , si_y[i]) plt.plot(x , si_y , label = "Значения Y методом простых итераций" ) plt.legend() plt.show() a = 0 b = 2 h = 0.2 e = 0.005 main(a , b , h , e) Код приведён для численного решения следующего уравнения Вольтерра II рода Точное решение этого уравнения y(x) = 1 Результаты тестов: Выводы При решении уравнений Вольтерра II рода чаще всего используются два этих метода. Однако метод квадратур с каждым шагом выдаёт всё большую погрешность в вычислениях, в отличие от метода простых итераций. Это связано с тем, что замена интеграла квадратурной формулой, влечёт за собой слагаемое ошибки аппроксимации квадратурной формулы. Для работы алгоритма, это слагаемое считают достаточно маленьким, чтобы принебречь им, однака при каждой новой итерации – это слагаемое возрастает всё больше и больше. Поэтому погрешность в методе квадратур возрастает непрерывно. В методе простых итераций тоже используются квадратурные формулы, однако задаваемое точность в этом итерационном методе позволяет уменьшить влияние ошибки апроксимации на конечный результат, из-за чего погрешность скачет в определённых пределах, в чём можно убедиться в вышеизложенных тестах. |