- •Программирование в excel
- •Симферополь 2000
- •Факультет "Механизация сельского хозяйства" Программирование в excel
- •1. Основы программирования на vba
- •1.1. Создание, редактирование и запись программ
- •1.1.1. Запись макроса
- •1.1.2. Как найти макрос в проекте
- •1.1.3. Написание новой процедуры
- •Чем макрос отличается от процедуры
- •1.1.4. Процедуры типа Sub и Function
- •1.1.5. Закрытые и открытые процедуры
- •1.1.6. Использование значения, возвращаемого функцией
- •1.1.7. Выполнение процедуры Sub
- •1.1.8. Передача аргументов в процедуру
- •1.1.9. Именованные аргументы
- •1.1.10. Написание процедур для обработки событий
- •1.1.11. Где хранится код обработки события
- •1.1.12. Средства, ускоряющие написание программ
- •1.1.13. Как написать легкочитаемую программу
- •1.2. Переменные, константы и типы данных
- •1.2.1. Типы данных в Visual Basic
- •1.2.2. Объявление константы, переменной или массива
- •1.2.3. Объявление объектной переменной
- •1.2.4. Встроенные константы
- •1.3. Управляющие конструкции
- •1.3.1. Операторы ветвления
- •1.3.2. Операторы циклов
- •1.3.3. Вложение управляющих конструкций
- •1.3.4. Выход из циклов и процедур
- •1.4. Структура программы
- •2. Сортировка данных
- •2.1. Алгоритм сортировки обменами (алгоритм “пузырька”)
- •2.2. Алгоритм сортировки вставками
- •2.3. Алгоритм сортировки выбором элемента
- •2.4. Алгоритм быстрой сортировки (метод Хоора)
- •2.5. Алгоритм пирамиды (метод Уильямса-Флойда)
- •2.6. Учебные задачи по программированию сортировки данных
- •3. Работа vba с объектами Excel
- •3.1. Как получить справку по Visual Basic для Microsoft Excel
- •3.2. Объекты Microsoft Excel
- •3.3. Работа с объектом Application
- •3.4. Работа с объектом Workbook
- •3.4.1. Открытие рабочей книги
- •3.4.2. Закрытие рабочей книги
- •3.4.3. Создание и сохранение рабочей книги
- •3.5. Работа с объектом Range
- •3.6. Строковые ссылки в стиле а1 или имена диапазонов
- •3.6.1. Числовые индексы строк и колонок
- •3.6.2. Свойство Offset
- •3.6.3. Свойства CurrentRegion и UsedRange
- •3.6.4. Организация циклов для перебора ячеек диапазона
- •3.6.5. Применение свойства Address для отладки кода, работающего с объектом Range
- •3.7. Работа с событиями
- •3.7.1. Включение и отключение обработки событий
- •3.7.2. Использование событий, связанных с рабочими листами
- •3.7.3. События на уровне рабочего листа
- •3.7.4. События на уровне диаграммы
- •3.7.5. События на уровне рабочей книги
- •3.7.6. События на уровне приложения
- •3.7.7. Модули классов и события
- •4. Численные методы математики
- •4.1. Методы решения нелинейных уравнений
- •4.1.2. Метод деления отрезка пополам (метод дихотомии).
- •4.1.3. Метод Ньютона (касательных).
- •4.1.4. Метод хорд (секущих).
- •4.1.5. Метод итераций (метод последовательных приближений).
- •4.2.1. Теоретические сведения
- •4.2.2. Метод Крамера
- •4.2.3. Метод Гаусса
- •4.2.6. Метод Зейделя
- •4.3. Обработка экспериментальных данных
- •4.3.1. Задачи, которые возникают при обработке экспериментальных данных.
- •4.3.2. Интерполяция
- •4.3.2.1. Интерполяция функций
- •4.3.3.2. Определение параметров эмпирической формулы
- •4.4. Методы численного интегрирования
- •4.4.1. Метод трапеций
- •4.4.2. Метод Симпсона
- •4.4.3. Оценка точности формул численного интегрирования. Выбор шага интегриров-ания
- •4.4.3.1. Выбор шага интегрирования по оценке остаточного члена (ошибки)
- •4.4.3.2. Выбор шага интегрирования с помощью двойного пересчета
- •4.5.1. Теоретические сведения
- •4.5.2. Одноступенчатые методы
- •4.5.2.1. Решение с помощью рядов Тейлора
- •4.5.2.2 Метод Эйлера
- •4.5.2.3. Модифицированный метод Эйлера
- •4.5.2.4. Метод Эйлера-Коши
- •4.5.2.5 Метод Рунге-Кутта
- •4.5.3. Многоступенчатые методы
- •4.5.3.1. Методы прогноза и коррекции
- •4.6. Методы решения линейной краевой задачи для обыкновенных дифференциальных уравнений
- •4.6.1. Постановка задачи
- •4.6.2. Метод конечных разностей
- •4.6.3. Метод прогонки
- •4.6.4. Алгоритм решения краевой задачи методом прогонки.
4.5.2.5 Метод Рунге-Кутта
Наиболее распространенным в практике интегрирования обычных дифференциальных уравнений есть методы Рунге-Кутта разнообразного порядка точности. Преимуществом этих методов есть то, что при их использовании не надо вычислять производные выше первого порядка, а их главный недостаток - значительный объем вычислений на каждом шаге. К методам Рунге-Кутта относятся метод Эйлера - метод Рунге-Кутта первого порядка точности; модифицированный метод Эйлера и метод Эйлера-Коши - метод Рунге-Кутта второго порядка.
Метод Рунге-Кутта четвертого порядка точности - один из наиболее применяемых методов интегрирования дифференциальных уравнений. Вообще его называют просто "методом Рунге-Кутта". Этот метод описывается системой пяти уравнений:
-
Yi+1=Yi+h/6*(K1+2K2+2K3+K4)
(4.45)
где K1=f(Xi,Yi)
(4.46)
K2=f(Xi+h/2,Yi+hK1/2)
(4.47)
K3=f(Xi+h/2,Yi+hK2/2)
(4.48)
K4=f(Xi+h,Yi+hK3)
(4.49)
Интегрирование по методу Рунге-Кутта заключается в следующем. Для любой і-ой точки (i=1, 2, .. , n-1) по (4.46) - (4.49) вычисляют значения Кj (j=1, 2, 3, 4). Потом по (4.45) последовательно определяют значения Yi (i=1, 2, .., n).
4.5.3. Многоступенчатые методы
4.5.3.1. Методы прогноза и коррекции
Отличительной особенностью методов Рунге-Кутта есть то, что при расчете следующей точки (Xi+1,Yi+1) используется информация только о точке (Xi,Yi).
В методах второго порядка и выше приходится высчитывать значения функции в одной или нескольких промежуточных точках. Это не всегда рационально, поскольку, если процесс интегрирования уже продвинулся на несколько шагов, то уже располагаем той дополнительной информацией (о предшествующих точках решения), для использования которой не нужно вычислять значения функций. Методы прогноза и коррекции отличаются тем свойством, что с их помощью невозможно начать решение дифференциального уравнения, так как в них необходимо использовать информацию о предшествующих точках решения. Для начала решения уравнения, имея только одну точку, определенную первоначальным условием, необходимо использовать методы типа Рунге-Кутта. Из названия метода понятно, что сначала "прогнозируется" значение
Y(0)i+1 =Yi-1+2hf(Xi,Yi), |
(4.50) |
где верхний индекс (0) означает начальное приближение к Yi+1, то есть прогнозируемое значение. Из (4.50) видно, что с ее помощью невозможно вычислить Yi. Поэтому для вычисления Yi используется метод Рунге-Кутта. Все следующие точки будут вычисляться с использованием информации о предшествующих точках решения без дополнительных вычислений значения функции. Это позволяет классифицировать методы прогноза и коррекции как многоступенчатые методы решения дифференциальных уравнений.
Алгоритм решения уравнения методом прогноза и коррекции следующий.
По (4.50) вычисляется прогнозируемое значение Y(0)i+1. Геометрически предсказание сводится к тому, что находим угол наклона касательной в точке (Xi,Yi) (прямая L1 на рис.4.22). После этого через точку (Xi-1,Yi-1) проводится прямая L'1, параллельная L1.
Рис.4.22 Рис.4.23
Прогнозируемое значение Yi+1 будет расположено там, где прямая L'1 пересечет ординату X=Xi+1. Теперь требуется некоторый метод коррекции прогнозированного значения. Исходя из того, что величина Y(0)i+1 известна, можно вычислить наклон касательной в точке (Xi+1,Yi+1). Эта касательная отображена на рис.4.23 и обозначена L2. Прямая L'1 на рис.4.23 представляет собой то же, что и на рис.4.22. Усреднив тангенсы углов наклона линий L'1 и L2, получаем линию L-(с чертой). Через точку (Xi,Yi) проводим прямую L, параллельную L-(с чертой). Точка пересечения этой линии с ординатой X=Xi+1 дает новое приближение к Yi+1. Назовем это приближение скорректированным значением Y(1)и+1. Вычислить это скорректированное значение можно по формуле
Y(1)i+1=Yi+h/2*[f(Xi,Yi)+f(Xi+1,Y(0)i+1)] |
(4.51) |
Можно найти новое, возможно, еще лучше всего приближение к Yi+1, используя найденное значение Yi+1 и корректируя снова. В общем случае, k-тое приближение к Yi+1 исчисляется по формуле:
Y(k)i+1=Yi+h/2[(f(Xi,Yi)+f(Xi+1,Y(k-1)i+1)] |
(4.52) |
для k=1,2,3,... . Итерационный процесс завершается, если
|Y(k+1)i+1–Y(k)i+1|< |
(4.53) |
Выбирая шаг для метода прогноза и коррекции, необходимо пользоваться следующим эмпирическим правилом: минимальный объем вычислений (и минимальные затраты машинного времени) достигаются при числе итераций, которое равняется 2. Другими словами, шаг интегрирования нужно выбирать так, чтобы условие (4.53) выполнялась после двух итераций. При большем числе итераций шаг h необходимо уменьшать.
Пример
Используя метод прогноза и коррекции, найти с точностью =0.001 значения Y=Y(2) и Y=Y(3) решения Y=Y(X) дифференциального уравнения (4.42) с начальным условием Y(0)=0. Шаг h=1.
Принимая во внимание то, что для использования формулы (4.50) необходимая информация о двух точках, то значение Y1=Y(1) возьмем из предшествующего примера, вычисленного с помощью метода Эйлера-Коши, Y1=0.0486. Теперь по формуле (4.50) вычислим прогнозируемое значение в точке Y(0)2:
Y(0)2=Y0+2hf(X1,Y1)=0+210.0473=0.0972.
Коррекцию оптимального значения выполним по формуле (4.51).
Первое приближение:
Y(1)2=Y1+h/2[f(X1,Y1)+f(X2,Y(0)2)]=0.0486+1/2(0.0473+0.0446)=0.0944.
Второе приближение:
Y(2)2=Y1+h/2[f(X1,Y1)+f(X2,Y(1)2)]=0.0486+1/2(0.0473+0.0446)=0.0946.
Проверка выполнения условия (4.53):
|Y(2)2-Y(1)2|<.
В связи с тем, что условие (4.53) выполняется, то принимаем Y2 =0.0946.
Далее по (4.50) вычисляем прогноз в точке Y3:
Y(0)3=Y1+2hf(X2,Y2)=0.0486+210.0446=0.1378
Коррекцию полученного значения выполним по формуле (4.51).
Первое приближение:
Y(1)3=Y2+h/2[f(X2,Y2)+f(X3,Y(0)3)]=0.0946+1/2(0.0446+0.0421)=0.1380.
Второе приближение:
Y(2)3=Y2+h/2[f(X2,Y2)+f(X3,Y(1)3)]=0.0946+1/2(0.0446+0.0421)=0.1380.
Проверка выполнения условия (4.53): |Y(2)3-Y(1)3|<.
В связи с тем, что условие (4.53) выполняется, то принимаем Y=0.1380. Метод прогноза и коррекции более точный, чем ранее рассмотренные методы второго порядка точности.
Каждое ОДУ 2-го порядка и выше равносильно системе ОДУ 1-го порядка:
, что позволяет применять описанные методы для их решения.