Главная страница
Навигация по странице:

  • КУРСОВАЯ РАБОТА

  • ОГЛАВЛЕНИЕ Теория3 1.Метод квадратур3 2.Метод простой итерации4Реализация методов на языке Python6Вывод10 Теория

  • 1. Метод квадратур

  • 2. Метод простой итерации

  • Реализация методов на языке Python

  • Курсовая работа по Численным Методам. Отчёт курсовой работы ЧМ. Численное решение интегральных уравнений Вольтерра 2го рода


    Скачать 439.22 Kb.
    НазваниеЧисленное решение интегральных уравнений Вольтерра 2го рода
    АнкорКурсовая работа по Численным Методам
    Дата26.03.2023
    Размер439.22 Kb.
    Формат файлаpdf
    Имя файлаОтчёт курсовой работы ЧМ.pdf
    ТипКурсовая
    #1016148

    МИНИСТЕРСТВО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ
    Федеральное государственное бюджетное учреждение высшего
    профессионального образования
    Московский Авиационный Институт (Национальный Исследовательский
    Университет)
    Факультет №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)
    print
    (
    "Решения уравнения
    \n
    "
    )
    print
    (
    "
    X
    "
    ,
    x)
    print
    (
    "
    Точное значение Y:
    "
    ,
    y)
    print
    (
    "
    Метод квадратур:
    "
    ,
    *np.around(q_y
    ,
    4
    ))
    print
    (
    "Метод простой итерации: "
    ,
    *np.around(si_y
    ,
    4
    )
    ,
    "
    \n
    "
    )
    print
    (
    "Разница от точного значения"
    )
    print
    (
    "
    Метод квадратур:
    "
    ,
    *np.around(q_y - y
    ,
    4
    ))
    print
    (
    "Метод простой итерации: "
    ,
    *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 рода чаще всего используются два этих метода. Однако метод квадратур с каждым шагом выдаёт всё большую погрешность в вычислениях, в отличие от метода простых итераций. Это связано с тем, что замена интеграла квадратурной формулой, влечёт за собой слагаемое ошибки аппроксимации квадратурной формулы. Для работы алгоритма, это слагаемое считают достаточно маленьким, чтобы принебречь им, однака при каждой новой итерации – это слагаемое возрастает всё больше и больше. Поэтому погрешность в методе квадратур возрастает непрерывно. В
    методе простых итераций тоже используются квадратурные формулы, однако задаваемое точность в этом итерационном методе позволяет уменьшить влияние ошибки апроксимации на конечный результат, из-за чего погрешность скачет в определённых пределах, в чём можно убедиться в вышеизложенных тестах.


    написать администратору сайта