Домашнее задание#
Задание 1. Двухточечная квадратура Гаусса.#
Постройте квадратурную формулу Гаусса, интегрирующую точно многочлены степеней вплоть до третьей на интервале \([a, b]\). Заметим, что для этого достаточно построить двухточечную квадратуру.
Напишите функцию, которая возвращает веса, \(w_1\) и \(w_2\), и узлы, \(x_1\) и \(x_2\), двухточечной квадратурной формулы Гаусса с весовой функцией \(w(x) = 1\), т.е., интегралы вида
def gauss_2(a, b):
r"""Return nodes and weights for a two-point Gauss quadrature on [a, b].
Parameters
----------
a, b : float
Boundaries of the integration interval
Returns
-------
x1, x2, w1, w2 : float
Nodes and weights of the quadrature.
"""
# YOUR CODE HERE
raise NotImplementedError()
from numpy.testing import assert_allclose
x1, x2, w1, w2 = gauss_2(0, 1)
def f(x, n):
return x**n
for n in [0, 1, 2, 3]:
assert_allclose(w1*f(x1, n=n) + w2*f(x2, n=n),
1./(n+1), atol=1e-14)
---------------------------------------------------------------------------
NotImplementedError Traceback (most recent call last)
Cell In [2], line 3
1 from numpy.testing import assert_allclose
----> 3 x1, x2, w1, w2 = gauss_2(0, 1)
5 def f(x, n):
6 return x**n
Cell In [1], line 15, in gauss_2(a, b)
2 r"""Return nodes and weights for a two-point Gauss quadrature on [a, b].
3
4 Parameters
(...)
12 Nodes and weights of the quadrature.
13 """
14 # YOUR CODE HERE
---> 15 raise NotImplementedError()
NotImplementedError:
Задание 2. Вычитание интегрируемых сингулярностей.#
Вычислите определённый интеграл методом трапеций с вычитанием сингулярности
Вам могут пригодиться значения следующих определенных интегралов:
Преобразуйте данный интеграл, вычитая сингулярности. Выпишите расчетные формулы. Cоставьте функцию, возвращающую значение интеграла методом трапеций.
def integ(npts=10):
"""Compute the value of the integral above.
Subtract the singularities and use the trapezoid rule.
Parameters
----------
npts : int
The number of points for the trapezoid rule
Returns
-------
I : float
The computed value of the integral
"""
# YOUR CODE HERE
raise NotImplementedError()
Задание 3*. Интеграл от осциллирующей функции.#
Рассмотрим определенный интеграл
Вычислите значение данного интеграла с относительной точностью \(10^{-6}\). Для упрощения задачи можете воспользоваться функционалом scipy.integrate.quad
.
Заметим, что «из коробки» интеграл вычислить не удается, и нужно что-то придумать. И даже wolfram тут даёт неправильный ответ.
from math import sin, cos
from scipy.integrate import quad
quad(lambda x: sin(x) * cos(cos(x)) / x, 0, float('inf'))
Задание 4. Вычисление интеграла с внутренней особенностью.#
Найти \(\delta_{1}\) и \(\delta_{2}\) такие, чтобы при вычислении интеграла
модуль \(|\rho|<\varepsilon\), где \(\varepsilon-\) требуемая точность расчетов.
Задание 5. Интеграл от быстроосциллирующей функции.#
Вычислите интеграл от быстроосциллирующей функции $\( \int_{0}^{\pi} \mathrm{e}^{-x} \sin k x d x \)\( для различных значений \)k\( по методу Симпсона, а затем используя прием, описанный ранее, заменяя функцию \)\mathrm{e}^{-x}$ ее интерполяционным полиномом второй степени (третьей степени). Совпадает-ли точность расчетов с ожидаемой? Сравните с точным значением интеграла, который равен
Задание 6*. Интегрирование с помощью ортогональных полиномов.#
Вычислите значение следующего интеграла:
используя соответствующий базис ортогональных полиномов. Найдите степень полинома (количество узлов), при которой точность превысит ошибку плавающей точки. Можете пользоваться вольфрамом или sympy.