- •6.1. Общая постановка задачи 318
- •0. Введение
- •0.1. Приближенные вычисления
- •0.2. Численные методы и программирование
- •0.3. Особенности машинных вычислений
- •0.4. Структура учебного пособия
- •1. Специальные классы математических объектов и операции над ними
- •1.1. Комплексные числа
- •1.1.1. Основные понятия
- •1.2. Векторы
- •1.2.1. Основные понятия
- •1.2.2. Определение программного класса многомерных векторов
- •1.3. Полиномы
- •1.3.1. Общие сведения
- •1.3.2. Операции над полиномами
- •1.3.3. Вычисление значений полиномов
- •1.3.4. Вычисление корней полиномов
- •1.3.5. Определение программного класса полиномов
- •2. Матрицы и задачи линейной алгебры
- •2.1. Общие сведения о матрицах и матричных операциях
- •2.2. Методы решения основных задач линейной алгебры
- •2.2.1. Методы решения систем линейных алгебраических уравнений (слау)
- •2.2.1.1. Метод Гаусса для решения слау, вычисления определителей и обращения матриц
- •2.2.1.2. Предварительная факторизация матриц (разложение в произведение двух матриц) в задачах решения слау
- •2.2.1.2.1. Факторизация матриц по методу Холецкого
- •2.2.1.3. Метод ортогонализации для решения слау
- •2.2.1.4. Итерационные методы решения слау
- •2.2.1.4.1. Проблема сходимости итерационных методов
- •2.2.2. Методы вычисления собственных значений матриц
- •2.2.2.1. Метод неопределенных коэффициентов
- •2.2.2.2. Метод Данилевского
- •2.2.2.4. Метод Леверрье-Фаддеева
- •2.2.2.5. Итерационный степенной метод
- •2.2.2.6. Метод Крылова
- •2.2.3. Метод наименьших квадратов (мнк)
- •2.3. Программная реализация матричного класса
- •2.3.1. Общее описание структуры матричного класса
- •2.3.2. Интерфейсный файл реализации матричного класса matrix.H
- •2.4. Программная реализация методов вычисления собственных значений и собственных векторов матриц
- •2.4.1. Метод неопределенных коэффициентов
- •2.4.2. Программная реализация метода Крылова вычисления собственных значений
- •2.4.3. Метод Леверрье-Фаддеева вычисления коэффициентов характеристического полинома
- •2.5. Элементы линейного программирования
- •2.5.1. Общая постановка задачи
- •2.5.2. Примеры задач линейного программирования
- •2.5.2.1. Задача о пищевом рационе
- •2.5.2.2. Задача о распределении ресурсов
- •2.5.2.3. Задача планирования перевозок (транспортная задача)
- •2.5.3. Симплекс-метод решения задачи линейного программирования
- •2.5.3.1. Приведение системы к стандартной, удобной для преобразований форме
- •2.5.3.2. Алгоритм замены базисных переменных
- •2.5.3.3. Алгоритм поиска опорного решения озлп
- •2.5.3.3.1. Алгоритм выбора разрешающего элемента для приближения к опорному решению
- •2.5.3.4. Алгоритм поиска оптимального решения
- •2.5.4. Транспортная задача линейного программирования
- •2.5.4.1. Общие сведения
- •2.5.4.2. Формирование опорного плана
- •2.5.4.3. Циклические переносы перевозок для улучшения плана
- •2.5.4.4. Метод потенциалов
- •2.5.5. Транспортная задача при небалансе запасов и заявок
- •2.5.6. Транспортная задача с временным критерием
- •2.6. Программная реализация задач линейного программирования
- •2.6.1. Симплекс-метод решения озлп
- •2.6.2. Программная реализация метода решения транспортной задачи
- •3. Аналитическое приближение функций, заданных таблично
- •3.1. Общая постановка задачи
- •3.2. Общая методика решения задач аппроксимации
- •3.2.1. Алгебраическая интерполяция
- •3.2.1.1. Классический интерполяционный полином
- •3.2.1.2. Метод интерполяции Лагранжа
- •3.2.1.3. Интерполяционный полином Ньютона
- •3.2.1.4. Интерполяция сплайнами
- •3.2.1.5. Аппроксимация функций по методу наименьших квадратов
- •3.2.2. Программная реализация класса аппроксимирующих функций
- •4.1.2. Программная реализация методов численного интегрирования
- •4.2.Численное дифференцирование
- •5. Введение в численные методы решения дифференциальных уравнений
- •5.1. Обыкновенные дифференциальные уравнения (общие сведения)
- •5.2. Процессы как объект исследования и управления
- •5.3. Операционное исчисление и его применение к исследованию динамики линейных систем
- •5.3.1. Общие сведения
- •5.3.1.1. Правила операционного исчисления
- •5.3.2. Решение линейных уравнений с постоянными коэффициентами
- •5.3.2.1. Передаточные функции линейных динамических систем
- •5.3.2.2. Частотные характеристики динамических систем
- •5.3.2.3. Фазовые портреты динамических систем
- •5.3.2.4. Ограничения области применения символического метода
- •5.3.3. Программная реализация класса символического метода
- •5.4. Конечно-разностные методы решения задачи Коши для линейных и нелинейных оду
- •5.4.1. Одношаговые методы
- •5.4.1.1. Метод Эйлера
- •5.4.1.2. Методы Рунге-Кутта 2-го порядка
- •5.4.1.3. Метод Рунге-Кутта 4-го порядка
- •5.4.2. Многошаговые методы (методы Адамса)
- •5.4.3. Проблема устойчивости
- •5.4.4. Программная реализация численных методов решения задачи Коши
- •5.5. Двухточечные краевые задачи
- •5.5.1. Метод конечных разностей для линейных краевых (граничных) задач
- •5.5.2. Метод стрельбы для граничных задач
- •5.5.3. Программная реализация класса граничных задач
- •6. Численные методы решения систем нелинейных уравнений (сну) и поиска экстремумов функций
- •6.1. Общая постановка задачи
- •6.2. Решение нелинейных уравнений
- •6.2.1. Функция одной переменной при отсутствии помех
- •6.2.1.1. Методы последовательного сокращения интервала неопределенности
- •6.2.1.2. Рекуррентные методы уточнения текущей оценки значения корня
- •6.2.2. Уточнение корня функции одной переменной в условиях помех
- •6.2.2.1. Методы стохастической аппроксимации
- •6.3. Методы поиска экстремума функций
- •6.3.1. Унимодальные функции одного аргумента при отсутствии помех
- •6.3.1.1. Метод дихотомии
- •6.3.1.2. Метод Фибоначчи
- •6.3.1.3. Метод золотого сечения
- •6.3.2. Многомерный поиск экстремума
- •6.3.2.1. Метод координатного спуска
- •6.3.2.2. Метод градиента (наискорейшего спуска или крутого восхождения или метод Бокса-Уилсона)
- •6.3.2.3. Последовательный симплексный поиск (псм) субоптимальной области в многомерном пространстве
- •6.3.2.3.1. Вводные замечания
- •6.3.2.3.2. Алгоритм последовательного симплексного метода
- •6.3.2.3.3. Подготовительные операции
- •6.3.2.3.4. Алгоритм поиска
- •6.3.2.3.5. Преимущества метода
- •6.3.2.3.6. Недостатки метода
- •6.4. Программная реализация класса подпрограмм для поиска экстремума унимодальных в заданном интервале функций одной переменной
- •6.5. Программная реализация класса подпрограмм для многомерного поиска экстремума унимодальных функций
- •Приложение. Как переносить данные в Ехсеl и отображать графики зависимостей
- •Литература
- •324050, Кривой Рог-50, пр. Металлургов, 28.
1.3.2. Операции над полиномами
Основные операции с полиномами хорошо известны из элементарной алгебры, поэтому здесь мы остановимся подробно только на операции деления многочленов и процедурах вычисления значений и корней полиномов. Эти операции и основанные на них основные результаты будут нами часто использоваться и поэтому заслуживают подробного рассмотрения – насколько это возможно в кратком курсе численных методов. Методы определения корней многочленов, как правило (за исключением решений, получаемых в квадратурах для полиномов порядка не выше четвертого), пригодны и для вычисления корней уравнений неалгебраического типа (трансцендентных).
Деление многочленов осуществляют по правилам, принятым для целочисленного деления, при котором в качестве результата получают частное и остаток. Проще всего реализовать его по известным правилам деления «в столбик» по методу Евклида.
В качестве первого элемента частного от деления полинома f1(z) на полином f2(z) берут переменную z в степени, равной разности порядков полиномов делимого и делителя с коэффициентом, равными частному от деления коэффициента при старшей степени делимого на коэффициент делителя при старшей степени делителя; этот элемент умножают на делитель и результат вычитают из делимого.
С полученным разностным полиномом пониженного порядка все действия повторяют, получая второй и последующие элементы частного, пока его порядок не станет ниже порядка делителя – этот полином представляет собой остаток от деления.
1.3.3. Вычисление значений полиномов
Вспомнив теорему Безу о том, что остаток от деления многочлена на двучлен (z–a) равен значению полинома при z=a, можно использовать для вычисления значения полинома операцию деления на двучлен. Схему деления для этого частного случая можно упростить, используя a вместо (z–a) и суммирование вместо вычитания, а также используя запись только коэффициентов без степеней z; отсутствующие степени обозначаются нулевыми коэффициентами. Такая схема вычислений известна как схема Горнера.
1.3.4. Вычисление корней полиномов
Для решения этой часто возникающей на практике задачи предложено много методов и их количество говорит об отсутствии одного, обладающего убедительными преимуществами над другими. Наиболее общим естественно считать метод, позволяющий находить комплексные корни многочленов; при этом можно ограничиться подклассом многочленов с вещественными коэффициентами, так как именно они обычно возникают в практических расчетах.
Численные методы решения этой задачи строятся по одному и тому же шаблону: выбирается первое (при отсутствии априорных данных – произвольное) значение корня и вычисляется значение функции при этом значении; теперь стоит задача скорректировать текущее значение xk так, чтобы соответствующее значение полинома оказалось ближе к нулю.
xk+1=xk+d.
Приходится определять направление и величину шага коррекции d.
Для нашего случая, когда левая часть нелинейного уравнения – полином P(z), то есть легко дифференцируемая функция, наиболее подходящим будет видимо классический метод Ньютона или его модификации. Алгоритм Ньютона получается из простых геометрических соотношений – шаг коррекции можно определить как катет прямоугольного треугольника, другим катетом которого является значение полинома в текущей точке, а тангенс противолежащего ему угла есть производная полинома в той же текущей точке:
d=–P(zk)/P(1)(zk),
zk+1=zk–P(zk)/P(1)(zk), где k – номер итерации.
Можно вычислить производную только в точке первого приближения и использовать ее значение на всех последующих шагах, пожертвовав некоторым снижением скорости сходимости:
zk+1=zk–P(zk)/P(1)(z0).
Неприятности могут ожидать нас на пологих участках функции, когда первая производная близка к нулевому значению – в этом случае слишком большой шаг коррекции «выбросит» нас в далекую от корня область. Это особенно неприятно, если мы используем только однократное дифференцирование в точке первого приближения – случайное попадание на пологий участок в этом первом приближении вызовет эффект «рыскания» поисковой процедуры с большим шагом. Для устранения этого эффекта можно ограничить величину шага некоторым допустимым значением, например, делая его пропорциональным не первой производной, а той, которая достаточно далека от нулевого значения или использовать другие приемы ухода с пологого участка кривой. В этом случае алгоритм может выглядеть например так:
,
где j – порядок очередной производной с достаточно удаленным от нуля значением, t – коэффициент шага коррекции, выбираемый так, чтобы P(zk+1) было меньше P(zk).
Перед началом поиска корней можно избавиться от кратных делением исходного полинома на его НОД с первой производной, но потом придется определять кратность корней, пока их количество не станет равным порядку полинома.
Методы определения корней для полиномов степеней ниже пятой, известные из курса элементарной алгебры, рассмотрены кратко при описании программной реализации.
