197 lines
12 KiB
Markdown
197 lines
12 KiB
Markdown
|
||
Лекция: Введение в математическое моделирование. Метод половинного деления
|
||
|
||
1. Что такое математическое моделирование?
|
||
|
||
Математическое моделирование – это процесс создания математического описания реального объекта, явления или процесса. Модель представляет собой набор формул, уравнений, неравенств, которые отражают самые важные свойства изучаемого объекта.
|
||
|
||
Зачем это нужно программисту? Любая компьютерная программа, которая предсказывает погоду, рассчитывает траекторию в игре, управляет роботом или прогнозирует продажи, основана на некоторой математической модели. Программист должен уметь переводить задачу с обычного языка на язык математики, чтобы компьютер мог её решить.
|
||
|
||
Пример.
|
||
Нужно узнать, через сколько секунд камень, брошенный с высоты 10 метров, упадёт на землю. Мы знаем физический закон: высота тела при свободном падении вычисляется по формуле
|
||
|
||
h(t) = h_0 - \frac{g t^2}{2},
|
||
\]
|
||
|
||
где h_0 = 10 м – начальная высота, g \approx 9.8 м/с² – ускорение свободного падения, t – время.
|
||
|
||
Момент падения – это когда высота равна нулю. Получаем уравнение:
|
||
|
||
10 - \frac{9.8 t^2}{2} = 0.
|
||
\]
|
||
|
||
Это и есть математическая модель нашей задачи. Решив её, найдём t \approx 1.43 секунды.
|
||
|
||
2. Этапы математического моделирования
|
||
|
||
Любая реальная задача проходит через несколько этапов, прежде чем мы получим ответ. Запишем их:
|
||
|
||
1. Постановка задачи.
|
||
Что известно? Что нужно найти? Какие ограничения?
|
||
2. Формализация.
|
||
Запись задачи в виде математических соотношений (уравнений, систем, неравенств, функций).
|
||
3. Выбор метода решения.
|
||
Если возможно – аналитическое решение (по формулам). Если нет – численное (приближённое) решение.
|
||
4. Реализация.
|
||
Написание алгоритма, программы или вычисления вручную.
|
||
5. Тестирование и анализ.
|
||
Проверка на простых примерах, оценка точности, интерпретация результатов.
|
||
|
||
Сегодня мы подробно разберём все этапы на примере решения одного уравнения.
|
||
|
||
3. Зачем нужны численные методы?
|
||
|
||
Многие уравнения легко решаются аналитически: линейные, квадратные, некоторые тригонометрические. Но как только уравнение становится сложнее, формул для его решения может не существовать. Например:
|
||
|
||
x^5 - x - 1 = 0,
|
||
|
||
e^x = 3x,
|
||
|
||
\cos x = x.
|
||
|
||
Такие уравнения невозможно решить точно, выразив x через элементарные функции. Поэтому применяют численные методы – алгоритмы, которые находят корень приближённо с любой заданной точностью.
|
||
|
||
Что значит «приближённо»?
|
||
Мы задаём точность ε (эпсилон) – максимально допустимую ошибку. Например, ε = 0.01 означает, что найденный корень отличается от истинного не более чем на 0.01. Для большинства практических задач этого достаточно.
|
||
|
||
4. Отделение корня
|
||
|
||
Прежде чем применять численный метод, нужно найти отрезок, на котором находится корень, и притом только один. Этот процесс называется отделением корня.
|
||
|
||
Признак существования корня на отрезке [a, b]:
|
||
Если функция f(x) непрерывна на [a, b] и принимает на его концах значения разных знаков ( f(a) \cdot f(b) < 0 ), то внутри отрезка есть хотя бы один корень уравнения f(x)=0 . Если функция при этом строго монотонна (возрастает или убывает), то корень единственный.
|
||
|
||
Как найти такой отрезок?
|
||
Обычно строят график функции или подбирают значения наугад, проверяя знаки.
|
||
|
||
Пример.
|
||
Дано уравнение f(x) = x^2 - 2 = 0 .
|
||
Вычислим: f(1) = 1 - 2 = -1 < 0 , f(2) = 4 - 2 = 2 > 0 .
|
||
Знаки разные, значит на отрезке [1, 2] есть корень. Из графика параболы видно, что он единственный.
|
||
|
||
Теперь мы готовы искать корень численно.
|
||
|
||
5. Метод половинного деления (бисекции)
|
||
|
||
Это один из самых простых и надёжных методов. Его идея напоминает игру «угадай число»: мы каждый раз делим отрезок пополам и оставляем ту половину, где находится корень.
|
||
|
||
5.1. Алгоритм метода
|
||
|
||
Пусть дано уравнение f(x) = 0 и отрезок [a, b], на котором f(a) \cdot f(b) < 0 . Задана точность ε.
|
||
|
||
1. Проверяем условие остановки. Если длина отрезка |b - a| \le ε , то корень найден с нужной точностью: x \approx \frac{a+b}{2} . Останавливаемся.
|
||
2. Вычисляем середину отрезка: c = \frac{a+b}{2} .
|
||
3. Вычисляем значение функции в середине: f(c) .
|
||
4. Определяем, в какой половине корень.
|
||
· Если f(a) \cdot f(c) < 0 , то корень лежит на левой половине [a, c]. Тогда правую границу сдвигаем: b = c .
|
||
· Если f(a) \cdot f(c) > 0 , то корень лежит на правой половине [c, b]. Тогда левую границу сдвигаем: a = c .
|
||
· Если f(c) = 0 , то c – точный корень, останавливаемся.
|
||
5. Возвращаемся к шагу 1.
|
||
|
||
Процесс повторяется, пока отрезок не станет достаточно маленьким.
|
||
|
||
5.2. Блок-схема алгоритма
|
||
|
||
```
|
||
Начало
|
||
│
|
||
├─ Ввод a, b, ε
|
||
│
|
||
├─ Пока |b - a| > ε:
|
||
│ │
|
||
│ ├─ c = (a + b) / 2
|
||
│ │
|
||
│ ├─ Если f(c) = 0, то вывод c, конец
|
||
│ │
|
||
│ ├─ Если f(a) * f(c) < 0, то b = c
|
||
│ │
|
||
│ └─ Иначе a = c
|
||
│
|
||
├─ Корень = (a + b) / 2
|
||
│
|
||
└─ Вывод корня
|
||
Конец
|
||
```
|
||
|
||
5.3. Пример ручного расчёта
|
||
|
||
Решим уравнение x^2 - 2 = 0 на отрезке [1, 2] с точностью ε = 0.1.
|
||
|
||
Шаг 0. Проверяем: f(1) = -1 , f(2) = 2 . Знаки разные – корень есть. Длина отрезка 2-1 = 1 > 0.1 .
|
||
|
||
Итерация 1.
|
||
c = (1+2)/2 = 1.5
|
||
f(1.5) = 1.5^2 - 2 = 2.25 - 2 = 0.25 > 0
|
||
Так как f(1) = -1 < 0 и f(1.5) > 0 , корень на [1, 1.5].
|
||
Новый отрезок: [1, 1.5], длина 0.5.
|
||
|
||
Итерация 2.
|
||
c = (1+1.5)/2 = 1.25
|
||
f(1.25) = 1.5625 - 2 = -0.4375 < 0
|
||
f(1.25) < 0 , f(1.5) > 0 , значит корень на [1.25, 1.5].
|
||
Новый отрезок: [1.25, 1.5], длина 0.25.
|
||
|
||
Итерация 3.
|
||
c = (1.25+1.5)/2 = 1.375
|
||
f(1.375) = 1.890625 - 2 = -0.109375 < 0
|
||
Корень на [1.375, 1.5].
|
||
Новый отрезок: [1.375, 1.5], длина 0.125.
|
||
|
||
Итерация 4.
|
||
c = (1.375+1.5)/2 = 1.4375
|
||
f(1.4375) = 2.06640625 - 2 = 0.06640625 > 0
|
||
Корень на [1.375, 1.4375].
|
||
Новый отрезок: [1.375, 1.4375], длина 0.0625.
|
||
|
||
Длина отрезка стала 0.0625 ≤ 0.1, поэтому останавливаемся.
|
||
|
||
Приближённый корень:
|
||
|
||
x \approx \frac{1.375 + 1.4375}{2} = 1.40625.
|
||
|
||
Проверим: \sqrt{2} \approx 1.41421... . Ошибка составляет около 0.008, что меньше заданной точности 0.1. Отлично.
|
||
|
||
5.4. Оценка числа итераций
|
||
|
||
Длина исходного отрезка равна b-a . После каждой итерации длина уменьшается вдвое. После n итераций длина станет \frac{b-a}{2^n} . Чтобы достичь точности ε, нужно, чтобы
|
||
|
||
\frac{b-a}{2^n} \le ε.
|
||
\]
|
||
|
||
Отсюда получаем формулу для минимального числа итераций:
|
||
|
||
n \ge \log_2 \left( \frac{b-a}{ε} \right).
|
||
|
||
Пример. Для нашего случая b-a = 1 , ε = 0.1:
|
||
\log_2(10) \approx 3.32 , значит нужно минимум 4 итерации. Мы сделали 4 итерации (потому что на 4-й длина стала 0.0625, что уже меньше 0.1). Всё сходится.
|
||
|
||
6. Практическое задание
|
||
|
||
Решите методом половинного деления уравнение
|
||
|
||
f(x) = x^3 - x - 1 = 0
|
||
\]
|
||
|
||
на отрезке [1, 2] с точностью ε = 0.1.
|
||
|
||
Указания.
|
||
|
||
1. Проверьте, что на концах отрезка функция имеет разные знаки.
|
||
2. Заполните таблицу итераций по образцу:
|
||
|
||
№ итерации a b c = (a+b)/2 f(a) f(c) Знак f(a)*f(c) Новый отрезок [a,b] Длина отрезка
|
||
0 1 2 – -1 – [1, 2] 1
|
||
1
|
||
…
|
||
|
||
3. Остановитесь, когда длина отрезка станет ≤ 0.1.
|
||
4. Запишите приближённый корень x \approx \frac{a+b}{2} .
|
||
|
||
7. Домашнее задание
|
||
|
||
1. Выучить: этапы математического моделирования, определение метода половинного деления, формулу оценки числа итераций.
|
||
2. Решить письменно:
|
||
Найти корень уравнения f(x) = \cos x - x = 0 на отрезке [0, 1] с точностью ε = 0.05. Заполнить таблицу итераций (аналогично классной работе).
|
||
3. Творческое
|
||
Придумайте пример реальной задачи, которая сводится к решению уравнения. Укажите, какое уравнение получится и какой отрезок можно взять для отделения корня.
|