Численные методы. Учебное пособие для СПО
.pdf
y_fit = polyval(p, x);
plot(x, y, 'o', x, y_fit, '-');
model = @(b, x) b(1)*exp(b(2)*x); % Экспоненциальная мо-
дель
beta0 = [1, 0.1]; % Начальные значения beta = lsqcurvefit(model, beta0, x, y);
Самостоятельная работа
Теоретические вопросы:
1.Что такое аппроксимация функций?
2.В чем разница между функциональной и точечной аппроксимацией?
3.Какие преимущества дает использование интерполяционного полинома Лагранжа?
4.Чем отличается сплайн-интерполяция от обычной полиномиальной интерполяции?
5.Когда полезно применение сплайн-интерполяции?
6.Как работает метод наименьших квадратов?
7.В чем заключаются трудности при подборе оптимальной аппроксимирующей функции?
8.Как определить степень сплайна?
9.Возможно ли возникновение проблем с устойчивостью при высоких степенях интерполяционного полинома?
10.Всегда ли метод наименьших квадратов находит наилучшее приближение?
Практические задания:
1.Реализуйте интерполяцию Лагранжа для набора то-
чек (1,2), (2,3), (3,5) на Python.
2.Используя метод наименьших квадратов, найдите аппроксимирующий полином для данных [(1,2), (2,3), (3,5)].
51
3.Реализуйте кубическую сплайн-интерполяцию для данных [1,2,3] и соответствующих значений [2,3,5] на Python.
4.Сравните качество аппроксимации методом наименьших квадратов и сплайн-интерполяцией.
5.Применение метода наименьших квадратов для оценки параметров экспоненциальной регрессии.
6.Оцените эффект увеличения степени интерполяционного полинома на стабильность результата.
7.Реализуйте процедуру автоматической адаптации шага для сплайн-интерполяции.
8.Представьте результаты интерполяции в наглядной визуализации.
9.Исследуйте зависимость качества аппроксимации от плотности узлов интерполяции.
10.Реализуйте адаптивный метод наименьших квадратов для обработки зашумленных данных.
52
5. ЧИСЛЕННОЕ ИНТЕГРИРОВАНИЕ
Численное интегрирование — это приближенное вычисление определенного интеграла, когда аналитическое нахождение первообразной затруднительно или невозможно. Оно основано на замене подынтегральной функции более простой (например, кусочно-линейной) функции и вычислении площади под ее графиком. Основные применяемые методы — это метод прямоугольников, трапеций и парабол (Симпсона). Рассмотрим каждый из них.
5.1. МЕТОД ПРЯМОУГОЛЬНИКОВ
Метод прямоугольников заключается в разбиении отрезка интегрирования на небольшие отрезки и приближении площади под кривой как суммы площадей прямоугольников. Высота каждого прямоугольника может определяться значением функции в начале, конце или середине отрезка. Формула срединных прямоугольников:
∫ |
( ) ≈ ∑ −1 |
( + ( + 0.5) ), |
= |
− |
. |
|
|||||
|
=0 |
|
|
|
|
Реализация на языке Python
def rectangle_method(f, a, b, n): h = (b - a) / n
integral = 0
for i in range(n):
x = a + (i + 0.5) * h # средняя точка integral += f(x)
return integral * h
53
# Пример использования: f = lambda x: x**2
a, b = 0, 2 n = 1000
print(rectangle_method(f, a, b, n))
Реализация на языке Matlab
tic %Начало отсчета времени
n = 100; %Точность вычисления
a1 = 1; %Начало определенного интеграла b1 = 10; %Конец определенного интеграла h = (b1-a1) / n; %Находим шаг
x=a1:h:b1; %Задаем шаг %Реализуем метод прямоугольников for i=1:n-1
s=(sin(x(i))/x(i));
end;
s=s*h
%Выводим результат disp s
toc %Конец отсчета времени
5.2.МЕТОД ТРАПЕЦИЙ
Вэтом методе подынтегральная функция приближается ломаной линией, а площадь вычисляется как сумма площадей трапеций, соответственно формула будет выглядеть так:
|
|
−1 |
− |
|
|
||||
∫ ( ) ≈ |
( ( ) + ( ) + 2 ∑( ( + ))) , = |
|||
|
|
|||
2 |
|
|||
|
|
=0 |
|
|
|
|
|
54
Реализация на языке Python
def trapezoidal_method(f, a, b, n): h = (b - a) / n
integral = (f(a) + f(b)) / 2 for i in range(1, n):
x = a + i * h integral += f(x)
return integral * h
# Пример использования: print(trapezoidal_method(f, a, b, n))
5.3. МЕТОД ПАРАБОЛ (СИМПСОНА)
Метод Симпсона требует четного числа разбиений n и часто дает более точный результат по сравнению с методами прямоугольников и трапеций. Здесь функция приближается параболами на каждом отрезке, что приводит к более высокой точности, а формула будет иметь вид:
|
|
/2 |
|
|
|
|
|
|
|||
∫ ( ) ≈ |
( ( ) + ( ) + 4 ∑( ( + (2 − 1) )) |
||||
|
|||||
3 |
|||||
|
|
=0 |
|
|
|
|
|
|
|
||
|
/2−1 |
− |
|||
+ 2 ∑ ( ( + 2 ))) , = |
|||||
|
|
||||
|
|||||
=0
55
Реализация на языке Python
def simpson_method(f, a, b, n): if n % 2 != 0:
raise ValueError("n должно быть четным") h = (b - a) / n
integral = f(a) + f(b) for i in range(1, n):
x = a + i * h if i % 2 == 0:
integral += 2 * f(x) else:
integral += 4 * f(x) return integral * h / 3
# Пример использования: print(simpson_method(f, a, b, n))
Самостоятельная работа
Теоретические вопросы:
1.Зачем нужны численные методы интегрирования?
2.Чем различаются методы прямоугольников, трапеций
иСимпсона?
3.Почему метод Симпсона считается более точным, чем другие методы?
4.В каких случаях целесообразно использовать метод прямоугольников?
5.Есть ли гарантия точной оценки интеграла методом трапеций?
6.Какие факторы влияют на точность численного интегрирования?
56
7. Почему важен правильный выбор шага интегрирова-
ния?
8.Влияет ли гладкость функции на эффективность численных методов?
9.Существует ли универсальный метод интегрирова-
ния?
10.В чем преимущества комбинированных подходов в численном интегрировании?
Практические задания:
1.Реализуйте на Python метод прямоугольников для функции ( ) = sin ( ).
2.Оцените интеграл функции ( ) = 2 на промежутке [0,1] методом трапеций.
3.Рассчитайте интеграл функции ( ) = − на промежутке [0,1] методом Симпсона.
4.Проанализируйте влияние величины шага на точность методов прямоугольников и трапеций.
5.Исследуйте поведение ошибки интегрирования при увеличении количества шагов.
6.Осуществите сравнение методов прямоугольников, трапеций и Симпсона для сложной функции.
7.Примените метод Симпсона для функции с разрывами и оцените его эффективность.
8.Разработайте схему автоматического выбора оптимального шага интегрирования.
9.Изучите проблему недостаточной гладкости функции
ипредложите способ улучшения интеграции.
10.Оцените границы применимости численных методов интегрирования.
57
6. ЧИСЛЕННОЕ РЕШЕНИЕ ОБЫКНОВЕННЫХ ДИФФЕРЕНЦИАЛЬНЫХ УРАВНЕНИЙ
Дифференциальными называются уравнения, в которых неизвестными являются функции, которые входят в уравнения вместе со своими производными.
Численное решение обыкновенных дифференциальных уравнений — это приближенный метод нахождения значений искомой функции в дискретных точках, когда аналитическое решение невозможно или слишком сложно. ОДУ описывают зависимость функции от одной переменной и ее производных, например:
= ( , ), (0) = 0,
где:
( ) — неизвестная функция, ( , ) — заданная функция (правая часть уравнения),0 — начальное условие.
Так как многие ОДУ не имеют точного решения в элементарных функциях, применяются численные методы, которые позволяют получить приближенное решение в виде таблицы значений.
Задача нахождения частного решения дифференциального уравнения при заданных начальных условиях называется задачей
Коши.
Задача нахождения частного решения дифференциального уравнения при заданных краевых условиях называется краевой
задачей.
58
Наиболее распространенным и универсальным численным методом решения дифференциальных уравнений является метод
конечных разностей.
Численные методы решения ОДУ широко применяются в физике, инженерии, биологии и экономике для моделирования динамических систем.
6.1.РЕШЕНИЕ ЗАДАЧИ КОШИ
6.1.1.Метод Эйлера
Одним из простейших разностных методов решения обыкновенного дифференциального уравнения является метод Эйлера, который заключается в аппроксимации производной разностным отношением.
Формула:
+1 = + ( , ),
где — шаг интегрирования.
В графической интерпретации решение движется по касательной к интегральной кривой на каждом шаге, погрешность решения.
Реализация на языке Python
def euler_method(f, t0, y0, h, n_steps): t = [t0]
y = [y0]
for _ in range(n_steps):
y_next = y[-1] + h * f(t[-1], y[-1]) t_next = t[-1] + h
59
y.append(y_next) t.append(t_next)
return t, y
# Пример: y' = -2y, y(0) = 1 f = lambda t, y: -2 * y
t, y = euler_method(f, 0, 1, 0.1, 20)
Реализация на языке Matlab
function y = Euler
%h - шаг, xn - правая граница рассматриваемого отрезка [x0, xn]
x0 = 0;
y0 = 1; h = 0.01; xn = 2.5;
count = ceil((xn-x0)/h); xlist = 1:count;
xlist = x0 + h * xlist;
eulerlist = zeros(count,1); exactList = zeros(count,1); c = 100000;
mean = 0; for c = 1:c t0 = tic(); eulerFunc;
mean = mean + toc(t0); end
mean = mean/c exactFunc plot(xlist, eulerlist) hold on
plot(xlist, exactList)
60
