Ответы по МК в ХТ

На вкладке "Вид" поставьте галочку на "область навигации" или "схема документа", щелкните мышкой на листе. Слева появится содержание. Нажимая по названию, можно переходить в нужный раздел.

Для перехода на нужный ответ наведите курсор на вопрос и нажмите на левую кнопку мыши, удерживая клавишу “Ctrl”.
Вопросы по курсу МКХТП

13 LINK \l "_Метод_деления_отрезка" 14Алгоритм программы деления отрезка пополам15
13 LINK \l "_Метод_золотого_сечения" 14Алгоритм программы золотого сечения15
13 LINK \l "_Алгоритм_вычисления_интеграла" 14Алгоритм программы интегрирования методом трапеции15
13 LINK \l "_Метод_итераций" 14Алгоритм программы нахождения корня методом итераций15
13 LINK \l "_Метод_касательных(хорд)" 14Алгоритм программы нахождения корня методом касательных (хорд)15
13 LINK \l "_Аналитический_способ_нахождения" 14Аналитический способ нахождения экстремума.15
Восстановление первообразной функции из дифференциального уравнения или системы дифуравнений (геометрическая интерпретация метода).
13 LINK \l "_Ме
·тоды_Ру
·нге_" 14Восстановление первообразной функции из дифференциального уравнения или системы дифуравнений (метод Рунге-Кутте).15

13 LINK \l "_Понятие_первообразной_(метод" 14Восстановление первообразной функции из дифференциального уравнения или системы дифуравнений (метод Эйлера).15
Вычисление второй производной функции (вывод формулы из левой и правой разностей).
Вычисление первой производной функции (левая, правая и центральная разности).
Дифференциал, область применения в решениях.
Дифференциал, физический смысл и геометрическое представление.
Интеграл, области применения данных задач.
13 LINK \l "_Интеграл,_физический_смысл" 14Интеграл, физический смысл и геометрическое представление.15
13 LINK \l "_Корень_уравнения,_геометрический" 14Корень уравнения, геометрический смысл, методы нахождения.15




а)13 LINK \l "_Вычисления_интеграла_по" 14Методы вычисления интеграла по площади криволинейной трапеции15. Б)13 LINK \l "_Вычисления_интеграла_по" 14Определение площади криволинейной трапеции при ее аппроксимации полиномом второго порядка15
13 LINK \l "_Метод_вычисления_интеграла" 14Метод вычисления интеграла по площади трапеции15.
13 LINK \l "_Метод_вычисления_интеграла_1" 14Метод вычисления интеграла по прямоугольнику с высотой в средней точке отрезка.15
Метод градиентного подъема поиска экстремума многомерной функции.
13 LINK \l "_Метод_деления_отрезка" 14Метод деления отрезка пополам для нахождения корня уравнения.15
13 LINK \l "_Метод_золотого_сечения" 14Метод золотого сечения для нахождения экстремума.15
13 LINK \l "_Метод_итераций" 14Метод итераций для нахождения корня уравнения.15
13 LINK \l "_Метод_касательных" 14Метод касательных и метод хорд для нахождения корня уравнения.15
Метод покоординатного подъема для поиска экстремума многомерной функции.
Метод Рунге-Кутта для восстановления функций из дифференциальных уравнений.
13 LINK \l "_Нахождение_корней_уравнения" 14Нахождение корней систем уравнений.15
Нахождение экстремума многомерной функции.
Понятие погрешности, как используется погрешность для достижения заданной точности решения.
13 LINK \l "_Построение_таблицы" 14Построение таблицы в среде MS Excel15.
Применение погрешности для получения результата интегрирования с заданной точностью.
13 LINK \l "_Способы_вычисления_интегралов," 14Способы вычисления интегралов, сравнение их точности.15
Типы уравнений и основные методы для нахождения их корней.
13 LINK \l "_Экстремумы_уравнений,_их" 14Экстремумы уравнений, их определение.15
Экстремумы уравнений, их применение в работе. Лабораторная работа № 1
Основные приемы работы в среде MS Excel и VBA Введение
Прежде чем начинать непосредственно занятия по методам кибернетики, вспомним ряд основных приемов работы в электронной таблице MS Excel.
MS Excel предназначена для создания электронных таблиц на листах, которые собраны в книги Excel. Книги могут содержать любое количество листов, часть из которых является таблицами другие диаграммами. В дальнейших работах нам надо будет уметь строить таблицы и графики, которые позволят убедиться в правильности полученных решений.
Работа с таблицей и диаграммами в Excel
Построение таблицы
Для начала попробуйте самостоятельно решить следующую задачу: постройте таблицу с данными для функции вида – Y=3·(Х-0,2)3+15·Ln(X) при изменении параметра Х от 0,1 до 2,1 с шагом 0,1. В результате должна быть получена таблица, показанная на рис.1 и график на рис.2.

Рис.2. График функции по данным таблицы
Кто получил данные результаты, может переходить к работе в VBA.
Для тех, кто не смог кратко вспомним порядок выполнения операций:
открываем MS Excel, который сразу же создает новую книгу с именем «Книга1»;
на первом листе «Лист1» создаем таблицу. Сначала вводим в первую и вторую ячейки первой строки (A1, B1) имена столбцов («Х» и «Y»). Это будут заголовки столбцов готовой таблицы в будущий отчет по проделанной работе;
заполняем столбец параметра (Х) необходимыми данными, используя прогрессию. Для этого можно просто ввести во вторую строку 0,1, а в третью 0,2. Потом выделить эти две ячейки и растянуть их за правый нижний угол выделения курсором в виде черного плюса (+) на весь диапазон. Либо ввести первое число и вызвать команду «Правка» – «Заполнить» – «Прогрессия». В окне (рис.3) задать необходимые данные – «Расположение» – по столбцам, «Шаг» – 0,1, «Предельное значение» – 2,1 и нажать «Ok»;
в столбец функции (Y) вводим формулу вычисляемой функции. Ввод начинаем со знака равно «=», потом вводим постоянную часть формулы – «3*(» и мышкой указываем ячейку откуда берется значение параметра Х, в нашем случае из соседней слева ячейки. В строке формулы появится адрес этой ячейки «А2». Вводить адреса ячеек с клавиатуры не целесообразно, т.к. можно ошибиться как самим адресом, так и раскладкой клавиатуры (ввести адрес в русской раскладке), что сделает поиск таких ошибок проблемным. Теперь продолжаем ввод формулы с клавиатуры – «-0,2)^3+15*»Для ввода функции Ln() нажимаем кнопку fx слева от строки редактирования формулы и вызываем мастер построения функций (рис.4), что существенно упрощает их (функций) ввод. Сначала находим нужную функцию и затем заполняем необходимые для нее параметры.

а б
Рис.4 Окна Мастера построения функций а – выбор функции, б – ввод параметров
Завершаем ввод формулы кнопкой «Ok» и растягиваем ее на весь диапазон таблицы;
полученная таблица может быть отформатирована для более наглядного представления в отчете. Например, расположим заголовки по центру ячеек и обрамим рамкой всю таблицу. Для этого выделим две ячейки заголовка и определим форматирование ячейки по центру. Для построения границ ячеек выделим всю таблицу и вызовем команду форматирования ячейки «Формат» – «Ячейки » (рис.5) и на закладке «Граница» определим необходимые границы для выделенного диапазона. В этом же окне на других закладках можно найти все свойства ячейки, которые можно настроить по вашему желанию. Так для создания сложных заголовков надо воспользоваться закладкой «Выравнивание», где можно объединять ячейки в одну и располагать в них текст различными способами;
теперь строим график, для этого выделяем нашу таблицу, включая заголовки, и вызываем мастер построения диаграмм (рис.6). В нем выбираем «Тип:» – «Точечный» и его «Вид:» – точки, соединенные сглаженной линией. Используя кнопку «Далее», проходим по всем шагам мастера, настраивая график; На втором шаге (рис. 7.), отображается график, которые будет построен. Если этого не произошло, то скорее всего неправильно указана область данных для графика, которая может быть отредактирована. На закладку «Ряд» можем увидеть более подробную информацию о рядах графика Здесь для каждого набора данных (ряда) – показаны имя, набор значений Х и набор значений Y, которые можно отредактировать, добавить другие данные или удалить ненужные ряды. Если в данном окне не был получен график, как показано на рис.7, то это, скорее всего, связано с ошибками выбора области для построения графика или его типа. Проверьте правильность заполнения и нажмите кнопку «Далее». Следующему шагом мастера построения диаграммы (рис.8) настраиваем вид самого графика. В появившемся окне мастера построения диаграмм начинаем заполнять данными основные параметры собственно графика. На панели «Заголовки» (Рис.8а) заполняем заголовок графика и подписи по осям. Переходим на панель «Линии сетки» (Рис.8б) и устанавливаем вертикальные линии сетки. Можете познакомиться с остальными панелями и посмотреть, как изменяется график при изменении различных параметров на них. Переходим к последнему шагу «Размещение диаграммы» (рис.9) используя кнопку «Далее», где выбираем место расположения графика – «Отдельным листом». Данный выбор позволяет видеть график на отдельном листе книги и легко переносить его в другие приложения MS Office. Построение графика заканчиваем кнопкой «Готово».

а б
Рис.7. Настройка данные по каждому ряду а – закладка «Диапазон данных», б – закладка «Ряд».

а б
Рис. 8. Панель «Заголовки» параметров диаграммы а – закладка «Заголовки», б – закладка «Линии сетки».

Рис. 9. Последний шаг в построении диаграммы.
В результате выполнения данного мастера построена диаграмма, представленная на рис.10. К сожалению, диаграмма отформатирована не совсем, так как обычно требуется для печати. Выполним ряд операций по подготовке ее к печати. Для исправления любого объекта на диаграмме достаточно выделить его правой кнопкой мышки (выделенный объект отмечается на графике границей с кнопками управления на углах), что вызывает контекстное меню, в котором команда «Формат » этого объекта, обычно стоит на первом месте.
Внесем следующие изменения в графике:
уберем серый фон на области построения графика – для этого щелкнем в любой точки на сером фоне графика правой кнопкой мышки, что вызывает контекстное меню для области построения графика. Выберем команду – «Формат области построения» и в окне настройки формата (рис. 11), где в рамке «Заливка» устанавливаем радиокнопку «обычная» во включенное состояние и закрываем окно кнопкой «Ok»;
сделаем оси графика более видимыми на фоне линий сетки. Сначала выполним настройку оси Х. Щелкаем правой кнопкой мышки на линии оси Х и выбираем команду «Формат оси». На закладке «Вид» выбираем «толщина:» (рис.12а.) следующая после стоящей в выборе. Переходим на закладку «Шрифт», устанавливаем «Размер:» – 12, «Начертание:» – курсив и снимаем галочку «Автомасштабирование» Последние исключает изменение размера шрифта оси при изменении размеров графика. Завершает настройку кнопкой «Ok» и выполняем такие же настройки для оси Y. Рекомендую снять галочку «Автомасштабирование» для названия осей и заголовка графика, вызвав соответствующую команду.
легенда располагается за областью графика а, проще установить ее прямо на графике. Для этого щелкаем левой кнопкой мышки на области построения графика, появляется граница вокруг него. Посередине каждой из сторон и по углам имеются черные квадратные курсоры для изменения размеров области. Захватываем мышкой курсор на середине правой стороны и тянем его к границе листа. Потом выделяем легенду и, схватив ее за область внутри прямоугольника, перемещаем на свободное место на графике с помощью курсора мышки, удерживая ее левую кнопку.

а б
Рис. 12. Настройка осей графика а – закладка «Вид», б – закладка «Шрифт».
На этом наши изменения можно считать законченными. Полученный результат показан на график рис. 13.
Если на графике заданы заголовки и подписи под осями, то эти данные тоже можно брать прямо из ячеек листа. Для этого надо выделить нужный объект (заголовок или название оси) и в сроке редактирования формулы поставить знак равенства (=) и потом щелкнуть на ячейке с необходимым текстом. Объект будет содержать текст из ячейки, если мы изменим текст в ячейке, то он сразу же измениться и на графике.
Сохраняем результаты в файле с именем «МКХТП.xls».
Работа в VBA
Вспомним приемы программирования в среде VBA for Excel, для этого построим две функции, которые мы будем использовать дальше.
Первая из них – это функция пользователя, которая должна содержать нашу модель для исследования, чтобы ее каждый раз не набирать средствами Excel. В нашем случае это следующее уравнение – Y=3·(Х-0,2)3+15·Ln(X)
Открываем VBA, используя комбинацию клавиш «Alt+F11» или непосредственно вызывая команду из меню MS Excel – «Сервис»–«Макрос»–«Редактор Visual Basic». Вставляем в наш проект модуль командой «Insert»–«Module». В списке проекта появляется новый объект «Module1».
Встаем курсором мышки в окно модуля и вставляем в него процедуру командой «Insert»–«Procedure». В появившемся окне создания процедуры (Рис.14) в поле «Name» пишем имя «My_fun». Имя не должно начинаться с цифры и содержать пробелы, если надо разделить символы в имени процедуры надо использовать символ подчеркивания «_». Если функция должна иметь формальные параметры, которые она принимает при вызове, то их записываем уже в модуле при создании самого кода. Потом выбираем «Type» функции – (Function) и нажимаем кнопку «Ok». В модуле появляется заготовка функции, которая содержит строку с ее названием и последнюю строку со служебным словом «End Function».
Public Function My_fun()

End Function
Наша функция должна иметь один входной формальный параметр «Х». Поэтому в первой строке между скобками после имени функции пишем Х. Теперь надо записать саму процедуру вычисления функции. Возьмем ту же функцию, что и на листе Excel и введем ее в код функции между уже имеющимися строками, написав – Y=3*(Х-0.2)^3+15*Log(X). Здесь надо помнить, что разделителем десятичных знаков в коде программы является точка «.». Имена переменных лучше создавать латинскими буквами и не смешивать их с русскими, т.к. поиск ошибок в данном случае становится очень сложным из-за одинакового написания ряда символов. Чтобы сообщить системе, что надо возвращать из функции, дописываем еще одну строку – My_fun=Y. Можно было сразу же в первой строке вместо Y записать My_fun, мы сделали так для того, чтобы показать, что наша функция может быть очень сложной и только последний оператор передаст результат в основную программу.
Public Function My_fun(X)
Y = 3 * ((X - 0.2) ^ 3) + 15 * Log(X)
My_fun = Y
End Function
Проверим работоспособность нашей функции. Для этого перейдем снова на «Лист1» и в первую ячейку третьего столбце запишем заголовок «My_fun», во вторую ячейку введем нашу функции используя мастер построения функции (см. рис.4), сначала выберем категорию – «Созданные пользователем» и там видим единственную функцию, которую мы только что создали. Выбираем ее и в качестве параметра указываем значение в текущей строке столбца «Х». После ввода маркером заполнения (+) растянем формулу на весь столбец, как и делали это во время построения вычислений в предыдущем столбце. Данные двух столбцов должны совпадать.
Вторая функция, которая нам понадобиться в дальнейшем это вычисление производной для любой функции. Вычисление производной будем выполнять численным методом. Существует достаточно много формул для вычисления производной в заданной точке исследуемой функции. Рассмотрим самый простой из них (рис.15). От заданной точки Х отступим на достаточно малую величину
· по Х вправо и влево и найдем в них значения функции. Для вычисления производной воспользуемся формулой (1)
13 EMBED Equation.3 1415, (1)
где в числителе разность значений функции между правой и левой точками, а в знаменателе сумма двух шагов, на которые мы отступаем от точки. Надо помнить, что отнимать надо всегда от правой левую точку. Второй вопрос, как опередить шаг? Если мы ведем вычисления с точностью до 5%, то шаг должен быть не более 2% от значения аргумента Х. Принимаем шаг равный 1% от значения параметра, что приводит к следующему алгоритму расчета:
13 EMBED Equation.3 1415 (2)
есть Х=0 принимаем шаг равным 0,01, в других случаях шаг равняется 0,01 от значения Х.
Теперь создадим данную функцию, назвав ее «Difr». Для этого вставляем новую процедуру с этим именем и вводим следующие операторы:
Public Function Difr(Xt)
If Xt <> 0 Then
dH = 0.01 * Xt
Else
dH = 0.01
End If
Difr = (My_fun(Xt + dH) - My_fun(Xt - dH)) / (2 * dH)
End Function
Теперь проверим ее работу, добавив в нашу таблицу еще один столбец с производной. Дополним график новыми данными и получим следующий вид (рис.16).
Для добавления новых данных надо вызвать контекстное меню диаграммы и выбрать команду «Исходные данные». В открывшемся окне выбрать закладку «Ряд» (см. рис.7б) и, используя кнопку «Добавить», внести новые данные – «Имя:» – выберете заголовок столбца или можно написать «Производная», как показано на рис.16, «Значения Х:» – данные из столбца Х без заголовка и «Значения Y:» – данные из столбца Difr без заголовка.
Недостатком данной функции является необходимость каждый раз создавать новую подпрограмму для новой функции пользователя, переписывая строку, где записана наша модельная функция «My_Fun». Нашу функцию лучше передавать в подпрограмму как фактический параметр. Попробуем исправить эту проблему.
Сначала сделаем копию нашей подпрограммы «Difr». Теперь изменим заголовок функции на «Dif_Ur» и добавляем еще один формальный параметр «Fn», определив его как строковая переменная, для исключения возможных ошибок при вызове команды Run, которая требует ввода имени подпрограммы в формате строки. Потом введем два новых оператора для вычисления значений функций на левой (YL) и правой (YR) границах, используя команду приложения «Run». Здесь мы встречаемся в необходимостью ввода служебных слов. Для их выбора можно пользоваться командой Ctrl+J. Разберем порядок ввода таких слов. Встаем на новую строку и вводим первую букву служебного слова, затем вызываем список служебных слов (Ctrl+J) и продолжаем ввод символов, наблюдая за показанным списком, пока не будет выбрано нужное слово или просто прокрутим список с поиском этого слова. Когда слово найдено, просто вводим символ, который должен следовать за ним (это точка или скобка), после этого слово автоматически достраивается и предлагается список объектов для завершения команды. В нашем случае порядок действий будет следующим. Встаем в конец строки «End If» и нажимаем «Enter». Курсор перемещается на начало следующей строки. Вводим имя переменной «YL=» латинскую букву «А», потом нажимаем «Ctrl+J», появляется список служебных слов. Продолжаем ввод символов «ppl», в списке появляется слово «Application». Вводим «.», список меняется на перечень объектов «Application». Продолжаем ввод нужных символов «ru», как только появляется объект «Run» и завершаем ввод открывающей скобкой «(».
Теперь водим нужные параметры, сначала имя нашей функции «Fun» и потом через запятую значение параметра Х. Так же вводим вторую строку для вычисления YR и изменяем последнюю строку программы в которой исправляем имя функции и вместо двух вызовов нашей модельной функции ставим вычисленные значения функций. Наша новая подпрограмма готова.
Public Function Dif_Ur(Xt, Fn as String)
If Xt <> 0 Then
dH = 0.01 * Xt
Else
dH = 0.01
End If
YL = Application.Run(Fn, Xt - dH)
YR = Application.Run(Fn, Xt + dH)
Dif_Ur = (YR - YL) / (2 * dH)
End Function
Попробуйте решить практическую задачу. Мы имеем полином третьего порядка, который может иметь от одного до трех корней. Чтобы их локализовать, надо построить графики перовой и второй производных и найти на них точки пересечения оси Х.
Для это сначала создадим новую функцию «My_fun1» вида
Public Function My_fun1(X)
My_fun1 = 1 - 3 * X - 0.75 * X ^ 2 + 0.5 * X ^ 3
End Function
И создадим еще одну подпрограмму, которая будет находить вторую производную, которая будет использовать в качестве первого вычисления функцию обращения к подпрограмме «Dif_Ur». Данная подпрограмма имеет следующий код:
Public Function Dif_Ur2(Xt, Fn As String)
If Xt <> 0 Then
dH = 0.01 * Xt
Else
dH = 0.01
End If
YL = Dif_Ur(Xt - dH, Fn)
YR = Dif_Ur(Xt + dH, Fn)
Dif_Ur2 = (YR - YL) / (2 * dH)
End Function
Теперь на втором листе книги построим новую таблицу расчета этой функции и ее производных. В первой строке заполним заголовки столбцов. Параметр Х заполним прогрессией от -3 до 4, во второй столбец внесем функция «My_fun1» со ссылкой на соответствующую ячейку столбца «Х», в третьем столбце поместим функцию «Dif_Ur» с ссылками на параметр «Х» и заголовок функции, определив эту ссылку как абсолютную (используем клавишу «F4»). Для второй производной используем новую функцию «Dif_Ur2» с теми же параметрами, что и в предыдущей ячейке. Теперь три ячейки с функциями можем выделить и затем растянуть на всю таблицу Вид таблицы с формулами показан на рис.17, а полная таблица с данными на рис.18.

Рис.17. Заголовки столбцов таблицы и вид формул второй строки
На основании данных таблицы строим график функции, который показан на рис.19. Как видим, в точках экстремумов производные превращается в 0. Это нам дает возможность определять как сами экстремумы, так и локализовать возможные области корней для исследуемых уравнений, что нам понадобится в следующих работах.












Рис.19. График полинома третьего порядка и его производных
Заключение
В результате выполнения работы были восстановлены приемы работы в среде Excel и VBA, которые будут использованы в следующих работах курса, а так же при выполнении расчетов во время курсовых и дипломных работ.
Самостоятельная работа
Реализуйте данную работу для других функций:
13 EMBED Equation.3 1415
Контрольные вопросы
Что такое функция пользователя?
Как создается и записывается код функций пользователя?
Опишите алгоритм вычисления производных.

Лабораторная работа № 2
Нахождение корней уравнения Введение
Корень уравнения, геометрический смысл, методы нахождения.
Корнем уравнения считается число, при котором уравнения превращается в нуль. Существуют аналитические и численные методы нахождения корней уравнения. Первые из них позволяют получить алгебраическое выражение для вычисления корня, что бывает невозможно для ряда уравнений, которые называются трансцендентными. Вторые позволяют находить сами корни для любых уравнений с заданной точностью, но они часто требуют большого объема вычислений. Развитие вычислительной техники позволило в настоящее время широко использовать последние методы.
В графическом представлении корень показан на рис.1. К данной задаче можно привести и нахождение точки пересечения двух уравнений, используя их разность, как функцию, корень которой надо найти.
Уравнения могут содержать несколько корней. В этом случае для их поиска надо выделить области, в каждой из которых находится только один корень. Чтобы понять этот процесс рассмотрим уравнение с двумя корнями (квадратное уравнение), график которого показан на рис.2. Как видно из графика корни, если они существуют у уравнения, лежат справа и лева от экстремума данной функции. Следовательно, надо найти экстремум и потом искать корни в двух интервалах – от -
· до точки экстремума и от нее до
·. Данный подход может быть распространен и на уравнения с большим количеством корней. Однако часть корней могут быть иррациональными числами (комплексными). Чтобы выполнить данную проверку надо сравнивать значения функции на концах отрезков, которые содержат корни – если эти числа имеют разные знаки, то корень существует.
Как это выглядит графически показано на примере кубического уравнения (может быть до 3-х корней) (рис.3). Как видно области первого и второго корня лежат выше нуля оси Х, таким образом, они просто отсутствуют среди рациональных чисел.
Возникает вопрос, как найти экстремум функции. Наиболее простой вариант этого решения – взять производную для уравнения по Х и найти корень полученной функции. Вычисление производных так же можно выполнить численным методом, рассмотренным в предыдущей работе.
Алгоритмы методов
Рассмотрим алгоритмы численных методов нахождения корней уравнения. Среди них наиболее популярными являются:
Метод итераций
Метод итераций – трансцендентное уравнение приводится к виду X=f(X,Y) затем задается начальное значение Х, через указанную зависимость находится следующее значение Х и процедура повторяется пока разница между этим значением и предыдущим не станет меньше наперед заданной величины – погрешность вычисления erf. Алгоритм решения представлен на рис.4. Рассмотрим пример:
имеется уравнение – 13 EMBED Equation.3 1415. Мы не может явно разделить переменные;
преобразуем уравнение в вид – 13 EMBED Equation.3 1415. Для этого освободим Х от степени, разделив все члены уравнении на Х2. В результате получаем выражение 13 EMBED Equation.3 1415 и выделяем 13 EMBED Equation.3 1415. Считаем, что Х справа есть начальное значение, а слева следующее приближение к корню;
задаем начальные значения – Х=5 и Y=0, находим новое приближение и подставляем его в это выражение снова. Повторяем процедуру, пока разница между двумя Х не станет меньше erf=1E-5.
Метод касательных(хорд)
Метод касательных (хорд) – уравнение в заданной точке рассматривается как линейное, соответствующее касательной к заданному уравнению в этой точке. По ней находится корень (точка пересечения касательной с осью Х), который является следующим приближением к решению. Графическое представление метода показано на рис.5. Метод очень чувствителен к выбору начальной точки. Касательные можно заменять хордами, проведенными через две точки, равно отстоящие от заданной, как при вычислении производной (см. выше). Алгоритм метода показан на рис.7. Рассмотрим пример реализации решения:
если мы имеем уравнение с известным алгебраическим уравнением производной, то задача сводится лишь к нахождению точки пересечения линии с осью Х (об этом чуть ниже)
если алгебраического выражения производной нет, то надо построить уравнение прямой одним из двух методов – по углу наклона прямой и точке, через которую это уравнение проходит или по двум точкам, через которые это уравнение проходит. Реально угол наклона это собственно и есть первая производная уравнения в данной точке. Её мы можем найти по показанному выше алгоритму. Для второго варианта можно воспользоваться только двумя точками, которые мы имеем для вычисления производной;
теперь вспомним процедуры вычисления неизвестных коэффициентов линейного уравнения вида Y=a+b·X на основании имеющихся данных:
при известном угле наклона b и на основании известных координат заданной точки (X0, Y0) находим a по следующей формуле 13 EMBED Equation.3 1415;
по двум точкам (X+(, Y+() и (X-(, Y-() находим 13 EMBED Equation.3 1415 и 13 EMBED Equation.3 1415, используя одну их имеющихся точек.
имея уравнение прямой, находим точку пересечения его с осью Х.
Принимаем, что Y=0 и вычисляем 13 EMBED Equation.3 1415. Это значение является следующим приближением к корню. Повторяем процедуру, пока разница между двумя последними Х не станет меньше erf=1E-5.
При использовании метода хорд надо следить, чтобы две выбранные точки лежали с одной стороны от корня, то есть имели одинаковый знак.
Метод деления отрезка пополам
Метод деления отрезка пополам (дихотомии) – задается интервал, в котором имеется корень (проверка наличия корня внутри интервала выполняется вычислением значений функции на его границах с последующей проверкой этих значений на разные знаки через операцию умножения – если произведение меньше нуль, то знаки на границах интервала разные). Затем интервал разбивается на два и выбирается тот, в котором остался корень. Процедура повторяется, пока интервал не станет меньше погрешности erf. Алгоритм метода показан на рис.7. Обычно всегда проверяется левый интервал, а после проверки выбирается необходимый. Ответом является середина последнего интервала. Для ускорения работы алгоритма можно проверять и попадание в сам корень, в этом случае произведение становится равным нулю, а корень оказывается на одной из границ интервала. Разберем данную процедуру на примере:
задаем уравнение Y=f(X), погрешность вычисления и левую границу Хл;
задаем правую границу Хпр и проверяем произведения f(Xл)·f(Xпр). Если значение больше нуля повторяем ввод правой границы, если меньше переходим к реализации алгоритма, а если равен нулю, определяем границу, где найден корень;
находим середину интервала Хср=(Хпр+Хл)/2 и проверяем значение произведения для левой половины f(Xл)·f(Xср). Если значение равно нулю, то корень в средней точке, если значение меньше нулю, то левый интервал содержит корень и правую часть можно отбросить приравняв Хпр= Xср иначе корень находится в правой части и отбрасываем левую Хл= Xср;
процедуру повторяем, пока (Хпр-Хл)>erf. Ответом является среднее значение найденного интервала.
Реализация решений в среде Excel
Попробуем реализовать последний метод средствами листа Excel, то есть, не используя программ VBA, а потом тот же алгоритм реализуем программно средствами VBA.
Примем следующий алгоритм расчета – начальная строка таблицы задает исходные данные, а каждая следующая строка содержит результат очередной итерации при поиске решения.
Открываем книгу, которую создали на прошлом занятии. Так как в ней были макросы, система выдаст запрос (рис.8), в котором надо подтвердить открытие макросов щелчком на кнопке «Не отключать макросы» .Если данное окно не появляется, то это говорит о том, что система безопасности находится в состоянии «Высокая». Чтобы перейти на уровень безопасности «Средняя» надо выполнить команду «Сервис»–«Макрос»–«Безопасность» и на закладке «Уровень безопасности» выбрать «Средняя».
На новом листе книги «МКХТП.xls» делаем заготовку таблицы, которая нам нужна для реализации метода. Это собственно заголовок таблицы с именем метода и заголовки столбцов для каждой из точек, которые надо вычислять, а так же столбец со значениями ошибки (рис.9). Исходными данными будут значения параметра на левой и правой границах интервала. Отметим их цветом фона, чтобы помнить о необходимости ввода данных в эти ячейки.
Теперь начнем заполнять остальные ячейки формулами. В первую очередь вычислим значения «Y», которое будем вычислять по модельной функции, созданной на прошлом занятии «My_fun». Для этого встаем в первую ячейку столбца «Y» для левой границы, вводим «=» и вызываем мастера функций и выбираем созданную нами функцию. В ячейке должна быть получена следующая запись – =My_fun(A4). Теперь эту ячейку мы можем просто скопировать в столбцы «Y» для середины и правой границы, нажав комбинацию клавиш [Ctrl+C] или воспользовавшись командой меню или пиктограммой «Копировать». Встаем в нужные ячейки и выполняем команду «Вставить» [Ctrl+V] или через команды меню либо кнопками панели инструментов. Копирование ячейки можно выполнить и мышкой, для этого надо выделить нужную ячейку, потом захватить ее за границу (при этом курсор мышки измениться на стрелку с меленькими стрелками на конце) и нажать клавишу Ctrl (рядом с курсором появится значок плюс) теперь можно перетащить ячейку туда, куда надо выполнить копирование. Операция может быть сразу же повторена уже с новой ячейкой.
Так как в ячейке столбца «Х» для середины нет данных, то ответ будет вычислен от нулевого значения, что даст для нашей функции ошибку. Чтобы от нее избавиться вычислим данное значение по следующей формуле – =(A4+E4)/2, где А4 и Е4 адреса ячеек столбцов «Х» левой и правой границ. Остается только вычислить значение ошибки в последнем столбце таблицы в виде следующего выражения – =ABS(E4-A4).
Теперь остается ввести две последние формулы для вычисления новых значений Х на границах отрезка для следующей итерации. Левая граница вычисляется по выражении – =ЕСЛИ(B4*D4<0;A4;C4), где В4 и D4 указывают на значения функции «Y» для левой и средней точек, а А4 и С4 – значения параметров «Х» для тех же точек. Выражение для правой границы так же вычисляется от произведения левой и средней точек, так как иначе могут возникнуть противоречия в решении при попадании средней точки в корень (Y=0). Выражение «Х» для правой границы имеет вид – =ЕСЛИ(B4*D4<0;C4;E4).
Остальные формулы второй строки можно просто скопировать с первой строки. Для этого выделяем сначала три ячейка от «Y» для левой точки до «Y» в середине и растягиваем за угол на следующую строку. Повторяем эту же операцию и для двух последних ячеек первой строки («Y» для правой точки и ошибку). Теперь строка для итерации готова и ее можно просто копировать нужное число раз, пока значение ошибки не станет меньше заданного значения. При ошибке меньше 0,01 получаем результат, показанный на рис.10.
Как видим по результатам на каждой итерации ошибка уменьшается наполовину.
Теперь реализуем эту же задачу еще двумя способами:
Построим макрокоманду, которая будет строить решение задачи непосредственно на листе для заданных там же условий. Например, мы указываем начальные точки и записываем в определенную ячейку функцию, которую нам нужно решить. Этот подход позволяет наглядно показать метод решения задачи и построить графики приближения к решению на каждом шаге;
Создадим непосредственно функцию пользователя, которая сразу же возвращает точку корня, что обычно и нужно при решении прикладных задач.
Сначала разберем первую задачу, которая должна нам построить таблицу данных, подобную той, что мы только, что получили. Вначале определим структуру листа, где будет реализовываться макрос. Для этого подготовим лист следующим образом (рис.11). Переименуем лист в «МДОП1». На нем сделаем заголовок и определим ячейки, которые будут использоваться для ввода данных (отмечены светло-зеленым цветом). Ниже, под заголовками «Х» и «Y» зарезервируем ячейку для текущего значения «Х» и ячейку, куда собственно запишем саму функцию «Y». Чтобы сравнить результаты расчетов, в качестве функции используем «My_fun».
Переходим в VBA и пишем сам макрос. Сначала создаем заготовку для подпрограммы (макроса) с именем «Dihot1». Чтобы не создавать много программ в одном модуле, предварительно создаем еще один «Module2», и уже в него вставить сам макрос. Теперь надо считать с листа границы области поиска корня и точность решения «erf». Это реализуется следующим кодом:
ThisWorkbook.Sheets("МДОП1").Activate
ThisWorkbook.Sheets("МДОП1").Cells(2, 1).Select
X1 = ActiveCell.Offset(0, 1)
X2 = ActiveCell.Offset(0, 3)
Erf = ActiveCell.Offset(0, 5)
Разберем назначение каждого из операторов. В первой и второй строках делаем активным нужный нам лист и устанавливаем курсор ввода на первую ячейку второй строки листа «МДОП1». Это нам надо для определения точки, откуда мы будем иметь доступ к остальным ячейкам листа. Следующие три строку считывают данные их ячеек листа. Данный оператор находит ячейку относительно активной ячейки (которая была установлена вторым оператором) смещением на указанное число строк и столбцов соответственно. Так для левой границы от ячейки (2,1) надо переместиться на столбец вправо (+1). Знаки «+» можно опустить. Теперь вычисляем значения нашей функции в заданной точке.
ActiveCell.Offset(2, 2) = X1
Y1 = ActiveCell.Offset(2, 3)
If Y1 = 0 Then
MsgBox "Корень в точке " & Str(X1)
Exit Sub
End If
Первым оператором переносим значение «Х1» в ячейку для текущего «Х». Excel автоматически пересчитывает значение функции в ячейке «Y». Следующим оператором получаем значение функции в «Y1». Теперь надо проверить, не является ли данная точка корнем уравнения. Используем оператор «If» для проверки равенства значения «Y1» нуль. Если это так, то выводим окно с информацией, что эта точка является корнем функции с помощью оператора «MsgBox» и выходим из подпрограммы. Подобный фрагмент пишем и для правой границы с данными по «Х2» и «Y2», который показан ниже:
ActiveCell.Offset(3, 2) = X2
Y2 = ActiveCell.Offset(3, 3)
If Y2 = 0 Then
MsgBox "Корень в точке " & Str(X2)
Exit Sub
End If
Теперь проверяем наличие корня в заданном интервале:
If Y1 * Y2 > 0 Then
MsgBox "Корня в заданном интервале нет "
Exit Sub
End If
Для построения итоговой таблицы надо определить номер строку, откуда данная таблица должна начинаться. В нашем случае это строка 8 (см. рис.10) и от активной ячейки (2,1) нам нужно смещение в 6 строк:
i = 6
Теперь реализуем сам алгоритм поиска корня. Для этого задаем цикл с пост условием:
Do

Loop Until Abs(X2 - X1) < Erf
Выход из цикла реализуем по условию, что разница между Х1 и Х2 по абсолютной величине меньше заданной ошибки «erf».
Внутри цикла вычисляем середину интервала Х и значение функции в этой точке. Проверяем наличие в ней корня:
X = (X1 + X2) / 2
ActiveCell.Offset(3, 2) = X
Y = ActiveCell.Offset(3, 3)
If Y = 0 Then
MsgBox "Корень в точке " & Str(X)
Exit Sub
End If
Печатаем вычисленные значения в таблицу и увеличиваем номер строки последним оператором:
ActiveCell.Offset(i, 0) = X1
ActiveCell.Offset(i, 1) = Y1
ActiveCell.Offset(i, 2) = X
ActiveCell.Offset(i, 3) = Y
ActiveCell.Offset(i, 4) = X2
ActiveCell.Offset(i, 5) = Y2
ActiveCell.Offset(i, 6) = Abs(X2 - X1)
i = i + 1
Теперь находим интервал с корнем и переопределяем границы
If Y * Y1 < 0 Then
X2 = X: Y2 = Y
Else
X1 = X: Y1 = Y
End If
После оператора завершения цикла «Loop» надо повторить операторы вычисления Х, Y и вывода результатов расчета в таблицу. В конце можно добавить вывод результата расчета в окно сообщения оператором:
MsgBox "Корень в точке " & Str(X)
Теперь надо сохранить результаты работы и перейти на лист «МДОП1», внести необходимые данные для интервала поиска и точность решения. После этого можно запустить макрос, используя комбинацию горячих клавиш [Alt+F8], выбираем «Dihot1» и нажимаем кнопку «Выполнить». В результате работы макросы мы получаем таблицу (рис.12). Окно сообщения показано на рис. 13.
Как можно оптимизировать нашу программу? Реально в ней имеются два фрагмента, которые встречаются по нескольку раз. Это вычисление значения функции для данного Х и вывод данных в таблицу. Их можно перенести в подпрограммы. Попробуем сделать соответствующие изменения.
Сначала организуем вывод данных на лист. Создадим подпрограмму (Sub) с именем «Output» и сделаем ее «Private», чтобы не видеть ее среди макросов. Перенесем в нее строки вывода расчетных данных на лист и получим следующий фрагмент программы:
Private Sub Output()
ActiveCell.Offset(i, 0) = X1
ActiveCell.Offset(i, 1) = Y1
ActiveCell.Offset(i, 2) = X
ActiveCell.Offset(i, 3) = Y
ActiveCell.Offset(i, 4) = X2
ActiveCell.Offset(i, 5) = Y2
ActiveCell.Offset(i, 6) = Abs(X2 - X1)
i = i + 1
End Sub
И заменяем эти строки в основной программе обращение к подпрограмме по ее имени «Output». Но чтобы она заработала надо обеспечить доступ к переменным Х1 и т.д. Для этого первой строкой в модуле должна быть написана следующая строка:
Public X, X12, X2, Y, Y1, Y2, i
Она определяет перечень общих переменных для всего модуля.
Теперь создадим вторую подпрограмму, но она должна возвратить в основную программу наличие корня и обеспечить выход из основной программы. Поэтому сделаем ее функцией с именем «GetY» и перенесем в нее строки заполнения данными текущего Х, считывания Y и проверки наличия корня. Так как это функция, то входным параметром будет Х, назовем этот параметр именем «ХХ». Возвращает функция значение «YY»:
Private Function GetY(XX)
ActiveCell.Offset(3, 2) = XX
YY = ActiveCell.Offset(3, 3)
If YY = 0 Then
MsgBox "Корень в точке " & Str(XX)
End If
GetY = YY
End Function
Из условия убираем выход из процедуры и переносим его дополнительной строкой в основную программу с соответствующим «Y»:
If Y1 = 0 Then Exit Sub
Окончательно программа выглядит так:
Public X, X12, X2, Y, Y1, Y2, i

Public Sub Dihot1()
ThisWorkbook.Sheets("МДОП1").Activate
ThisWorkbook.Sheets("МДОП1").Cells(2, 1).Select
X1 = ActiveCell.Offset(0, 1)
X2 = ActiveCell.Offset(0, 3)
Erf = ActiveCell.Offset(0, 5)
Y1 = GetY(X1)
If Y1 = 0 Then Exit Sub
Y2 = GetY(X2)
If Y2 = 0 Then Exit Sub
If Y1 * Y2 > 0 Then
MsgBox "Корня в заданном интервале нет "
Exit Sub
End If
i = 6
Do
X = (X1 + X2) / 2
Y = GetY(X)
If Y = 0 Then Exit Sub
Output
If Y * Y1 < 0 Then
X2 = X: Y2 = Y
Else
X1 = X: Y1 = Y
End If
Loop Until Abs(X2 - X1) < Erf
X = (X1 + X2) / 2
Y = GetY(X)
If Y = 0 Then Exit Sub
Output
MsgBox "Корень в точке " & Str(X)
End Sub
Рассмотрим вторую задачу – получить сразу же ответ (корень уравнения), что бывает необходимо при решении больших задач, когда поиск корня является просто промежуточным решением. Сначала построим самое простое решение. Мы вводим границы интервала, ошибку решения и имя функции, корень которой мы ищем. После вычисления машина нам возвращает ответ или какое-то определенной число, говорящее нам, что корня в этом интервале нет.
Создаем новый модуль «Module3» и в нем создаем функцию «FDihot1». Функция имеет четыре формальных параметра «Х1», «Х2», «erf» и «Fn», которые записываем в заголовок функции между скобками. Ниже пишем саму программу:
Public Function FDihot1(X1, X2,
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
· FDihot1 = (X2 + X1) / 2
Else
FDihot1 = 7777
End If
End Function
Первая строка исключает ошибку в работе программы, когда «erf» не задано или ошибочно задано 0. Потом проверяем, нет ли корня на границах интервала. Затем проверяем, есть ли корень внутри интервала. В случае если его нет, просто выводим число 7777, иначе вычисляем сам корень.
Попробует сделать решение более универсальным, будем задавать только одну границу и точность решения. Существуют различные варианты нахождения интервала с корнем. Мы воспользуемся следующим – зададим небольшой шаг и начинаем искать интервал, удовлетворяющий нашим условиям, перемещая каждый раз обе границы. Это приводит к поиску корня в небольшом интервале, но с другой стороны поиска интервала можем быть долгим. Второй вопрос, который надо решить это направление поиска интервала. Его будем делать по следующей схеме: в начальной точке определяем значения функции и ее производной (для этого воспользуемся подпрограммой Dif_Ur, разработанной на прошлом занятии).
Для создания новой программы воспользуемся уже созданной функцией. Делам копию функции FDihot1, изменяем ее имя и все внутренние выходы на «FDihot2». Теперь внесем необходимые изменения. Заменяем строки по проверке Х2 на следующий фрагмент:
dY1 = Dif_Ur(X1, Fn
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
Определяем производную и потом направление поиска, если St<0 шаг отнимаем и наоборот. Потом в цикле «Do Loop» находим Х2 и вычисляем значения Y2. Выполняем проверку Y2 на наличие корня. Если корня нет, то проверяем наличие корня в интервале. Если он есть выходим из цикла иначе переопределяем Х1 на Х2 и Y1 на Y2 и повторяем поиск интервала. Проверка после завершения цикла обеспечивает переопределение точек по их возрастанию Х1<Х2, что необходимо в самом алгоритме деления отрезка пополам.
В нашем решении мы использовали шаг равный 5, но в ряде случаев этот шаг может перекрыть область с двумя корнями. Для исключения данной ситуации можно еще проверять и значение производной в точке Х2 и при условии что две производные имеют разный знак, просто уменьшаем наш шаг наполовину. Хотя наилучший вариант поиска корней это на первом этапе просто локализовать все возможные корни исследуемой функции и потом уже выполнять их поиск.
Проверим работу этих функций. Перейдем на лист «МДОП» и в нижней части листа организуем следующие записи (рис.14). В ячейках под заголовками «Х1», «Х2» и «erf» вносим необходимые числа. Под заголовком «Корень» записываем две созданные функции «FDihot1» и «FDihot2» соответственно. Под заголовком «Функция» соответственно исследуемая функция «My_fun».
Реализация решений типовыми командами Excel
Если функции, корни которых должны быть определены, несложные, то решения могут быть получены и стандартными средствами Excel.
Так нахождения корня однопараметрического уравнения может быть выполнено средствами команды Сервис – Подбор параметра. Для реализации такого решения надо на листе в одну ячейку ввести начальное приближение аргумента функции для поиска ее корня и в соседнюю соответственно саму функцию. Затем вызвать окно команды Подбор параметра (рис. 15) и ввести в его параметры необходимые данные:
«Установить в ячейке:» – указать адрес ячейки с функцией;
«Значение» – число равное 0;
«Изменяя значение ячейки:» – указать адрес ячейки с аргументом функции;
нажать «Ok» для выполнения подбора результата.
Если уравнение имеет несколько корней, то надо выполнить вначале его анализ и выбрать наилучшее приближение.
Для решения многопараметрических задач можно использовать стандартную надстройку «Поиск решения». При реализации данного решения в качестве целевой ячейки используется ячейка с функцией, ее значение должно в конце расчета равняться 0, а изменяемыми ячейками должны стать ячейки с аргументами. Однако надо помнить, что данное решение не всегда будет корректным и подбор начальных условий может быть сильно затруднен.
Примеры решения типовых задач
Данные решения могут быть реализованы в следующих решениях типовых задач химической технологии:
расчеты материального баланса процессов;
расчеты в задачах формальной кинетики.
Рассмотрим решения данных задач с использованием созданных выше функций. Необходимо решить следующую задачу:
Производительность установки по производству синильной кислоты – 270 кг/час.
Условия протекания реакции: Т=937(С, Р=1ата, Log(К) при Т=937(С = 1,6141.
Степень достижения равновесия – 0,9
Состав природного газа: метан – 99,0%
этан – 1,0%
Концентрация NH3 – 100%
Мольное соотношение СН4:NH3 = 1 : 1,2
Реакция: CH4 + NH3 HCN + 3H2
В результате решения получаем уравнение третьей степени с неизвестным количеством поданного CH4 – А:
13 EMBED Equation.3 1415
Записываем данную функцию либо как функцию пользователя или записываем ее как формулу на листе Excel
Заключение
В результате выполнения работы были разработаны программы для нахождения корней уравнения, которые могут быть использованы в следующих работах и курсах, а так же при выполнении расчетов во время курсовых и дипломных работ.
Самостоятельная работа
На отдельных листах книги Excel реализуйте методы итераций и касательных для следующих функций:
13 EMBED Equation.3 1415
Разработать фрагмент программы «FDihot2» на случай отсутствия корня по время поиска необходимого интервала?
Контрольные вопросы
Что такое корень уравнения?
Как реализуется алгоритм итераций?
Опишите алгоритм касательных для поиска корня.
Как реализуется метод деления отрезка пополам.






















Лабораторная работа № 3
Нахождение экстремумов уравнения. Введение
Экстремумы уравнений, их определение.

Экстремумами уравнения являются его точки, в которых значения функции принимают максимальные или минимальные значения. Экстремумы могут быть локальными (их может быть несколько) и глобальным (их не более двух – один их них максимум, а другой минимум), они является самым большим среди максимумов или минимумов функции. Примеры экстремумов показаны на рис.1. Здесь имеются два минимума (Хэ1 и Хэ3) причем первый из них локальный, а второй глобальный. Если предположить что дальше минимумов больше не будет. Хэ2 является максимумом функции.

Для нахождения экстремумов существуют аналитические и приближенные методы.

Аналитический способ нахождения экстремума.
Первые из них требуют знания производной данного уравнения с последующим нахождением ее корня – точки, в которой производная превращается в нуль, является экстремумом функции. Исключениями могут быть функции с перегибами, но для них имеет место сохранение знака производной до и после точки с нулевым значением.
Численные методы нахождения экстремума.

Численные методы позволяют находить экстремумы для любых уравнений с заданной точностью, они не требую вычисления производных и позволяют находить экстремумы, которые локализованы в определенном интервале, но они требуют большого объема вычислений. Развитие вычислительной техники позволило в настоящее время широко использовать последние методы.
Уравнения могут содержать несколько экстремальных точек, которые должны быть локализованы интервалами поиска. Ясно, что в точке экстремума производная превращается в нуль, а слева и справа от нее производные имеют различные знаки. Пользуясь этими условиями, мы может локализовать все возможные экстремумы функции.
Как обычно реализуются численные методы поиска экстремума, рассмотрим на графике, показанном на (рис.2). Задаем интервал поиска от Хлев до Хпр, содержащий искомую точку экстремума и начинаем его уменьшать. Но нам надо знать в каком из новых интервалов находится экстремум. Для этого мы вычисляем не одно, а два значения функции и принимаем, что нужный нам интервал находится вокруг большей из этих точек (см. точка Х1 рис.2), т.е. он должен быть взят от границы (Хлев) через максимальную точку (Х1) до второй вычисленной точки (Х2). Интервал от Х2 до Хпр мы отбрасываем. Данную процедуру повторяем пока расстояние между Хпр и Хлев не станет меньше заданной погрешности вычисления. Ответом будет одна из двух средних точек, имеющая максимальное значение. Остается последний вопрос? Как выбирать точки для вычисления новых значений. Желательно чтобы на каждом следующем шаге нам надо было бы вычислять только одно значение функции. Для этого предлагаются два метода – золотого сечения и чисел Фибоначчи.
Теперь возникает вопрос – можно ли совместить алгоритмы поиска максимума как мы только, что рассмотрели с поиском минимума. Если мы посмотрим на график (рис.1.) то можем сделать заключение, что любой минимум мы можем превратить в максимум функции ее умножением на -1. Следовательно, для реализации поиска максимума или минимума функции мы может использовать одну программу, но при вычислении функции нам надо умножать результат на соответствующий множитель: 1 для поиска максимума и (–1) для поиска минимума.
Алгоритмы методов
Рассмотрим алгоритмы численных методов нахождения экстремумов уравнения. Среди них более популярными является:
Метод золотого сечения
Метод золотого сечения – предполагает деление начального отрезка, где локализован экстремум функции в отношение: А:В = В:С (рис.3.) В результате, когда мы отбрасываем отрезок на одной из границ, нам надо построить только одну точку (Х1 или Х2). Для вычисления координат этих точек обычно используется соотношение золотого сечения – 13 EMBED Equation.3 1415. Алгоритм метода представлен на рис. 4. Рассмотрим его более подробно. После ввода данных выполняется проверка наличия экстремума внутри интервала, если он имеется, то вычисления продолжаются, иначе выводится сообщении об его наличии в заданном интервале. Так как значения Y1 и Y2 нам уже известны, то мы просто проверяем какое из этих двух значений больше и на основании этого отбрасываем один из интервалов слева или справа. Надо отметить, что в отличии от методов поиска корней нам надо было переопределить только одну точку, то здесь надо переопределять две точки, что требует обязательного сохранения порядка операций, которые указаны в алгоритме. Если мы например сначала переопределим Х1=Х2, а потом выполним приравнивание Хл=Х1, то в результате обе точку получат значения Х1, что является ошибкой.
После завершения поиска по достижению разности Хпр-Хл меньше ошибки erf нам надо вывести результат решения, который должен соответствовать наибольшему значению из Х1 и Х2
Выполнение работы
Попробуем реализовать данный метод прямо на листе Excel, то есть, не используя программы VBA, а потом тот же алгоритм запишем программно на VBA.
Как и в предыдущей работе с поиском корня уравнения примем следующий алгоритм расчета – начальная строка таблицы задает исходные данные, а каждая следующая строка содержит результат очередной итерации при поиске решения.
На пустом листе делаем заготовку таблицы, которая нам потребуется для реализации метода. Это заголовок таблицы с именем метода и заголовки столбцов для каждой из точек, которые надо вычислять, а так же столбец со значениями ошибки (рис.8). Исходные данные будем вводить в ячейки первой строки для столбцов «Х» левой и правой границах исследуемого интервала. Поэтому отметим их светло-зеленым цветом фона, чтобы помнить о необходимости ввода этих данных перед расчетом.

Рис. 5. Заголовок таблицы для реализации метода деления отрезка пополам
Далее начнем заполнять остальные ячейки формулами. В первую очередь вычислим значения «Y» по модельной функции, созданной на прошлом занятии «My_fun». Для этого встаем в первую ячейку столбца «Y» для левой границы и вызываем мастера функций кнопкой , далее выбираем категорию функций – «Определенные пользователем» и среди них находим созданную нами модельную функцию. В ячейке должна быть получена следующая запись – =My_fun(A4). Если вами была создана функция с другим именем, тогда вместо My_fun должно стоять имя вашей функции. Теперь эту ячейку мы можем просто скопировать в столбцы «Y» для средних точек и правой границы. Для этого копируем ячейку либо комбинацией клавиш [Ctrl+C] или воспользовавшись командой меню или пиктограммой «Копировать». Потом вставляем копии в нужные ячейки с помощью команды «Вставить» через комбинацию клавиш [Ctrl+V] либо через меню или панели инструментов.
Так как значений в ячейках столбцов «Х1» и «Х2» нет, то ответ будет вычислен от нулевого значения параметра, что даст для нашей функции ошибку #ЗНАЧ. Чтобы от нее избавиться вычислим данные значения по следующим формулам – =A4+(E4-A4)*0,39 и =A4+(E4-A4)*0,61 соответственно для Х1 и Х2. В последнем столбце таблицы вычисляем значение ошибки следующим выражением – =ABS(E4-A4). В формулах адреса А4 и Е4 соответствуют ячейкам столбцов «Х» левой и правой границ. На этом этапе мы получили полную строку информации.
Теперь надо ввести формулы вычисления новых значений Х для следующей итерации в ячейки, которые на первой итерации были заполнены исходными данными. Левая граница вычисляется по следующему выражении – =ЕСЛИ(D4>F4<0;A4;C4), где D4 и F4 указывают на адреса ячеек со значениями функции «Y» для первой и второй средних точек, а А4 и С4 – адреса значения «Хл» «Х1». Для выражения правой границы используем тоже условие, так как иначе могут возникнуть противоречия в решении при равенстве значений средних точек. Выражение «Х» для правой границы будет иметь вид – =ЕСЛИ(D4>F4;E4;F4), где E4 и А4 – адреса значения «Х2» «Хпр». Из формул видно, если у нас точка «Х1» больше «Х2» тогда левая граница остается неизменной, а правая смещается в точку «Х2» и наоборот если «Х2» больше то меняет значение левая граница на «Х1».
Остальные формулы этой строки можно просто скопировать из предыдущей строки. Для этого выделяем сначала пять ячеек от «Y» для левой точки до «Y» второй средней точки и растягиваем за угол на следующую строку. Повторяем эту же операцию и для двух последних ячеек первой строки («Y» для правой точки и ошибку). Теперь наша строка для итераций готова и ее можно просто копировать нужное число раз, пока значение ошибки не станет меньше заданного значения. При ошибке 0,01 получаем результат, показанный на рис.6.

Рис.6. Результат вычисления корня модельной функции.
Как видим по результатам, на каждой итерации ошибка уменьшается несколько больше чем на треть исходного интервала.
Теперь реализуем эту же задачу еще двумя способами:
Первым – построим макрокоманду, которая будет строить решение задачи непосредственно на листе для заданных там условий. Например, мы указываем начальные точки и записываем в определенную ячейку исследуемую функцию, для которой надо найти максимум.
Вторым – создадим непосредственно функцию пользователя, которая сразу же возвращает точку экстремума для записанной программно функции.
Начнем с первой задачи, которая должна нам построить таблицу данных, подобную той, что мы только, что получили. Для ее решения берем новый чистый лист и делаем необходимые заготовки.
Определим структуру листа, где будем реализовываться макрос. Для этого подготовим лист следующим образом (рис.7). Светло-зеленые ячейки используем для ввода данных. Ниже, под заголовками «Х» и «Y» зарезервируем ячейку для текущего значения «Х» и ячейку, куда собственно запишем саму функцию «Y». Чтобы сравнить результаты расчетов, в качестве функции используем нашу модельную функцию «My_fun».

Рис. 7. Образец заготовки для макроса
Здесь надо отметить, что верхний заголовок «Метод золотого сечения» отформатирован горизонтально как – «по центру выделения», а не с использованием объединения ячеек. Это нам будет необходимо для правильного обращения к ячейкам листа относительно активной, которой у нас будет первая ячейка листа.
Теперь все готово для написания программы. Переходим в VBA и начинаем писать сам макрос. Сначала создаем заготовку для подпрограммы (макроса) с именем «Zol_Sech», которая должна быть Sub и Public. Чтобы не создавать много программ в одном модуле, можно предварительно создать еще один «Module2», и уже в него вставить сам макроса.
Теперь начинаем писать сам макрос. Первая операция, которая должна быть выполнена – это получить с листа исходные данные по Х на границах области поиска экстремума и точность решения «erf». Для обращения к ячейкам листа воспользуемся свойством Offset, которое позволяет получить значение из ячейки указанной относительным смещением от текущей в данный момент ячейки. Этот подход существенно упрощает операции работы с листом и исключает постоянные пересчеты листа при смене активной ячейки, если на нем имеются еще другие формулы. Поэтому первоначально определяем нашу активную ячейку с координатами 1,1, что соответствует первой ячейке листа.
ActiveSheet.Cells(1, 1).Select
Использование объекта ActiveSheet позволяет использовать данный макрос для любого листа, который является в данный момент активным и имеет показанную выше структуру оформления. Теперь мы можем получить значения границ интервала и погрешность вычисления по следующим командам:
XL = ActiveCell.Offset(1, 1)
XR = ActiveCell.Offset(1, 3)
Erf = ActiveCell.Offset(1, 5)
Данный оператор находит ячейку относительно выбранной выше смещением на указанное число строк и столбцов соответственно. Так для левой границы от ячейки (1,1) надо переместиться на строку вниз (+1) и на столбец вправо (+1). Знаки «+» можно опустить. Получив исходные данные, можем переходить к вычислениям. Теперь переходим к вычислениям – вычисляем значения нашей функции на левой и правой границах, затем определяем первые две точки внутри интервала и значения функций в них и проверяем наличия экстремума внутри интервала:
ActiveCell.Offset(3, 2) = XL
YL = ActiveCell.Offset(3, 3)
ActiveCell.Offset(3, 2) = XR
YR = ActiveCell.Offset(3, 3)
X1=XL+(XR-XL)*0.39
ActiveCell.Offset(3, 2) = X1
Y1 = ActiveCell.Offset(3, 3)
X2=XL+(XR-XL)*0.61
ActiveCell.Offset(3, 2) = X2
Y2 = ActiveCell.Offset(3, 3)
If (Y1 > YL and Y1 > YR) and (Y2 > YL and Y2 > YR) Then
(Здесь будет записан основной код программы)
else
MsgBox "Максимума в заданном интервале нет"
Exit Sub
End If
Операции вычисления значений функции однотипны – первым оператором переносим значение параметра «Х» в ячейку для текущего «Х». Excel автоматически пересчитывает значение функции в ячейке под «Y». Следующим оператором получаем значение функции в «Y». Проверка на наличие максимума внутри интервала выполняется проверкой что Y1 и Y2 больше YL и YR.
Процедуру поиска экстремума записываем между оператором if и else, но предварительно здесь, же надо подготовить печать таблицы расчетных данных и вывести результаты первых вычислений. Задаем в переменной i смещение от активной ячейки до первой строки таблицы расчетных данных и затем выводим все данные в первую строку таблицы, затем увеличиваем смещение на 1:
i = 7
ActiveCell.Offset(i, 0) = XL
ActiveCell.Offset(i, 1) = YL
ActiveCell.Offset(i, 2) = X1
ActiveCell.Offset(i, 3) = Y1
ActiveCell.Offset(i, 4) = X2
ActiveCell.Offset(i, 5) = Y2
ActiveCell.Offset(i, 6) = XR
ActiveCell.Offset(i, 7) = YR
ActiveCell.Offset(i, 8) = Abs(XR - XL)
i = i + 1
Вводим саму процедуру поиска экстремума. Цикл проверки точности решения реализуется через Do Loop с условием Until abs(XR-XL) Do
If Y1 > Y2 Then
XR=X2
X2=X1: Y2=Y1
X1=XL+(XR-XL)*0.39
ActiveCell.Offset(3, 2) = X1
Y1 = ActiveCell.Offset(3, 3)
Else
XL=X1
X1=X2: Y1=Y2
X2=XL+(XR-XL)*0.39
ActiveCell.Offset(3, 2) = X2
Y2 = ActiveCell.Offset(3, 3)
End If
Loop Until abs(XR-XL)Для печати таблицы внутри цикла надо повторить команды вывода данных в ячейки таблицы перед оператором Loop.
ActiveCell.Offset(i, 0) = XL
ActiveCell.Offset(i, 1) = YL
ActiveCell.Offset(i, 2) = X1
ActiveCell.Offset(i, 3) = Y1
ActiveCell.Offset(i, 4) = X2
ActiveCell.Offset(i, 5) = Y2
ActiveCell.Offset(i, 6) = XR
ActiveCell.Offset(i, 7) = YR
ActiveCell.Offset(i, 8) = Abs(XR - XL)
i = i + 1
Теперь остается подготовить печать результатов решения. Ответом нашего решения должна стать точка с максимальным значением, поэтому вводим следующий код
If Y1 > Y2 Then
X = X1: Y = Y1
Else
X = X2: Y = Y2
End If
MsgBox "Экстремум функции получаем в Х=" & X & _
"Значение функции в точке экстремума " & Y
Теперь сохраняем результаты работы и переходим на рабочий лист, вносим необходимые данные по интервалу поиска и точность решения. После этого запускаем макрос, используя комбинацию горячих клавиш [Alt+F8], выбираем имя созданного макроса. В нашем случае это «Zol_Sech» и нажимаем кнопку «Выполнить». В результате работы макроса мы получаем следующую таблицу (рис.8).

Рис.8. Результат работы макроса «Zol_Sech»
Как можно оптимизировать нашу программу? Реально в ней имеются два фрагмента, которые встречаются по нескольку раз. Это вычисление значения функции для данного значения Х и вывод данных в таблицу. Их можно перенести в подпрограммы. Попробуем сделать соответствующие изменения.
Создадим подпрограмму (Sub) с именем «WriteTab» и сделаем ее «Private», чтобы не видеть ее среди макросов. Перенесем в нее строки вывода расчетных данных на лист и получим следующий фрагмент программы:
Private Sub WriteTab ()
ActiveCell.Offset(i, 0) = XL
ActiveCell.Offset(i, 1) = YL
ActiveCell.Offset(i, 2) = X1
ActiveCell.Offset(i, 3) = Y1
ActiveCell.Offset(i, 4) = X2
ActiveCell.Offset(i, 5) = Y2
ActiveCell.Offset(i, 6) = XR
ActiveCell.Offset(i, 7) = YR
ActiveCell.Offset(i, 8) = Abs(XR - XL)
i = i + 1
End Sub
И заменяем эти строки в основной программе обращение к подпрограмме по ее имени «WriteTab». Но чтобы она заработала надо обеспечить доступ к переменным, которые должны быть распечатаны. Для этого первой строкой в модуле должна быть написана следующая строка:
Public X, X12, X2, Y, Y1, Y2, i
Она определяет перечень общих переменных для всего модуля, таким образом, они становятся видимыми во всех подпрограммах модуля.
Теперь создадим вторую подпрограмму, но она должна возвратить в основную программу наличие функции в заданной точке. Создаем функцию с именем «Solve_Y» и перенесем в нее строки заполнения данными текущего Х и считывания Y. Так как это функция, то входным параметром будет Х, назовем этот параметр именем «ХХ»:
Private Function Solve_Y(XХ)
ActiveCell.Offset(3, 2) = X
Solve_Y = ActiveCell.Offset(3, 3)
End Function
Теперь делаем копию всего текста макроса Zol_Sech, переименовываем его в Zol_Sech1 и заменяем скопированные в подпрограммы строки на обращения к этим подпрограммам. Окончательно программа выглядит так:
Public Sub Zol_Sech1()
ActiveSheet.Cells(1, 1).Select
XL = ActiveCell.Offset(1, 1)
XR = ActiveCell.Offset(1, 3)
Erf = ActiveCell.Offset(1, 5)
YL = Solve_Y(XL)
YR = Solve_Y(XR)
X1 = XL + (XR - XL) * 0.39
Y1 = Solve_Y(X1)
X2 = XL + (XR - XL) * 0.61
Y2 = Solve_Y(X2)
If (Y1 > YL And Y1 > YR) And (Y2 > YL And Y2 > YR) Then
i = 7
WriteTab
Do
If Y1 > Y2 Then
XR = X2
X2 = X1: Y2 = Y1
X1 = XL + (XR - XL) * 0.39
Y1 = Solve_Y(X1)
Else
XL = X1
X1 = X2: Y1 = Y2
X2 = XL + (XR - XL) * 0.39
Y2 = Solve_Y(X2)
End If
WriteTab
Loop Until Abs(XR - XL) < Erf
If Y1 > Y2 Then
X = X1: Y = Y1
Else
X = X2: Y = Y2
End If
MsgBox "Экстремум функции получаем в Х=" & X & vbCr & _
"Значение функции в точке экстремума " & Y
Else
MsgBox "Максимума в заданном интервале нет"
Exit Sub
End If
End Sub
Рассмотрим вторую из поставленных задач – получить сразу же ответ (экстремум функции), что бывает необходимо при решении больших задач, когда экстремума является простой промежуточной целью решения. Сначала построим самое простое решение. Вводим две границы и ошибку решения. После вычисления машина нам возвращает ответ или какое-то определенное число, говорящее нам, что экстремума в этом интервале нет.
Создаем новый модуль «Module3» и в нем создаем функцию «GoldS». Функция имеет три формальных параметра «Х1», «Х2» и «erf», которые записываем в заголовок функции между скобками. Пишем саму программу:
Public Function GoldS(XL, XR, Erf)
If Erf =0 Then Erf=0.01
DL = Difr(XL): DR = Difr(XR)
If DL * DR > 0 Then
MsgBox "В выбранном интервале от" & vbCr & _
XL & " до " & XR & " экстремума нет" & vbCr & _
"Измените интервал поиска !!!", _
vbCritical + vbOKOnly
GoldS = 7777
Exit Function
End If
If DL > 0 And DR < 0 Then
Km = 1
Else
Km = -1
End If
X1 = XL + (XR - XL) * 0.39: Y1 = My_Fun(X1)
X2 = XL + (XR - XL) * 0.61: Y2 = My_Fun(X2)
Do
If Km * Y1 > Km * Y2 Then
XR = X2: X2 = X1: Y2 = Y1
X1 = XL + (XR - XL) * 0.39: Y1 = My_Fun(X1)
Else
XL = X1: X1 = X2: Y1 = Y2
X2 = XL + (XR - XL) * 0.61: Y2 = My_Fun(X2)
End If
Loop Until (XR - XL) < Erf
If Y1 > Y2 Then X = X1 Else X = X2
GoldS=Х
End Function
Разберем написанную выше программу. Первая строка исключает ошибку в работе программы, когда «erf» не задается или ошибочно задается 0. Потом через производные в заданных точках проверяем наличие экстремума внутри интервала и определяем тип экстремума (минимум или максимум), задавая коэффициент Km 1 для максимума и -1 для минимума. В случае если экстремума нет, просто выводим число 7777, иначе вычисляем значение параметра Х в точке экстремума.
Проверим результат работы функции. Для этого на любом из листов создадим область для ввода этой функции в виде, показанном на рис.9. Как и ранее в отмеченные цветом ячейки вводим исходные данные. В ячейку под заголовком «Экстремум» вводим подготовленную функцию пользователя GoldS. Формальные параметры функции должны указывать на отмеченные цветом ячейки левой и правой границ и ошибки вычисления. В ячейку подзаголовком «Функция» вводим нашу модельную функцию My_Fun со ссылкой на ячейку с найденным экстремумом.
Попробует сделать решение более универсальным, постараемся избавиться от задания правой границы. Существуют различные варианты нахождения интервала с корнем. Мы воспользуемся следующим – зададим небольшой шаг и начинаем искать интервал, удовлетворяющий нашим условиям, перемещая каждый раз обе границы. Это приводит к поиску корня в небольшом интервале, но с другой стороны, можем оказаться в условии очень долгого поиска интервала.
Используя код созданной функции, реализуем этот вариант. Делам копию кода функции и изменяем ее имя и все внутренние выходы на «GoldS1». Теперь вносим необходимые изменения. Заменяем строки по проверке наличия экстремума на следующий фрагмент кода:
XL = X: H = 10: DL = Difr(XL)
XR = XL + H: DR = Difr(XR)
If Abs(DR) > Abs(DL) Then H = -H
Do
XR = XL + H: DR = Difr(XR)
If DL * DR < 0 Then Exit Do
XL = XR: DL = DR
Loop
If H < 0 Then
X = XL: XL = XR: XR = X
D = DL: DL = DR: DR = D
End If
Сначала задаемся левой границей интервала из формального параметра функции и шагом поиска H=10. Потом находим первое значение правой границы и определяем направление поиска, изменяя при необходимости шаг на обратный. Потом в бесконечном цикле «Do Loop» находим интервал, который содержит экстремум функции. В этом алгоритме существенное значение имеют левая и правая границы интервала, если поиск интервала шел с отрицательным шагом, то нам надо изменить границы, что и делается в последних строках кода.
Проверим работу этой функций. Дополним строку в таблице (рис.9) еще одной строкой (рис.10). В ячейку под заголовком «Левая граница» вносим необходимое число, а под заголовком «Экстремум» запишем новую функции «GoldS1» со ссылкой на левую границу и ошибку. Под заголовком «Функция» соответственно исследуемую функцию «My_fun» со ссылкой на экстремум. Изменяя значение в левой границе можно убедиться, что функция работает в любых диапазонах.
Основным недостатком данных функций является жесткая привязка к имени исследуемой функции. Чтобы избавиться от этой проблемы воспользуемся следующим приемом. Имя функции будем передавать в подпрограмму как текстовую переменную, что потребует изменения заголовка подпрограммы:
Public Function FDihot3(X1, Erf, Fun As String)
а ее вызов организовывать через следующую строку программы:
Y1 = Application.Run(Fun, X1)
где переменная Fun является формальным параметром функции заданным в заголовке подпрограммы.
Заключение
В результате выполнения работы были разработаны программы для нахождения корней уравнения, которые могут быть использованы в следующих работах и курсах, а так же при выполнении расчетов во время курсовых и дипломных работ.
Самостоятельная работа
Реализуйте поиски экстремумов для следующих функций:
13 EMBED Equation.3 1415
Контрольные вопросы
Что такое экстремум уравнения?
Как можно локализовать экстремумы уравнения?
Как реализуется алгоритм поиска экстремума методом золотого сечения?


Лабораторная работа № 4
Интегрирование уравнений
Интегрирование уравнений Введение
Задачи, в которых требуется вычисление интегралов, возникают почти во всех областях прикладной математики. Иногда удается найти аналитическую формулу, т. е. Выразить неопределенный интеграл в виде комбинации алгебраических и трансцендентных функций, после чего остается вычислить значение определенного интеграла, подставляя в формулу пределы интегрирования.
Во многих случаях, однако, не удается найти никакой аналитической формулы или же она получается настолько сложной, что вычислять интеграл с ее помощью очень трудно. В таких ситуациях приходится применять численные методы интегрирования, которые основаны на том, что интеграл представляется в виде предела суммы площадей, и позволяют вычислить эту сумму с заданной точностью.
Интеграл, физический смысл и геометрическое представление
Вспомним немного об интегралах. Интегралы показывают выполненную работу, необходимую энергию или проделанный путь по известным уравнениям изменения силы, температуры или скорости от времени соответственно. Геометрически интеграл определяется площадью под кривой описанной заданной функцией (рис.1).

Способы вычисления интегралов, сравнение их точности.
Существуют аналитические и численные методы вычисления интегралов. Первые из них требуют знания интегралов уравнений и формул для вычисления определенных интегралов, что не всегда бывает доступно, особенно для сложных уравнений.
Вторые позволяют находить интегралы уравнений с заданной точностью, они разбивают интервал определения интеграла на n–сечений и находят площади каждого из них по упрощенным формулам, заменяя их площадями прямоугольников, трапеций или аппроксимируя функцию полиномами определенных порядков (обычно не более второй степени). Они обычно требуют большого объема вычислений, но стремительное развитие вычислительной техники позволило в настоящее время широко их использовать.
Сравнение точности см ниже.
Вычисления интеграла по площади криволинейной трапеции.

Рассмотрим механизм нахождения интеграла численным методом. Заданный интервал интегрирования делим на заданное число сечений n. Потом находим площади всех полученных сечений. Рассмотрим способы вычисления площади сечения (рис. 2). Как видим каждое сечение представляет собой криволинейную трапецию. Существует несколько вариантов решения данной задачи, каждый из которых отличается объемом вычислений и, соответственно, точностью полученного результата.
Метод вычисления интеграла по прямоугольнику с высотой в средней точке отрезка.
13 EMBED Equation.3 1415 по схеме рис.2 в

Самый простой способ – это нахождение площади сечения через площадь прямоугольника, построенного по начальной, конечной или средней высотам сечения (рис. 2 а, б, в).


13 EMBED Word.Picture.8 1415

а б в г д


Ясно, что первый и второй варианты имеют более грубую ошибку, чем третий, но последний требует дополнительного вычисления середины сечения.
Метод вычисления интеграла по площади трапеции
Четвертый способ – через площадь трапеции (рис. 2 д) близок по точности к третьему, но требует более сложных вычислений.
Вычисления интеграла по площади криволинейной трапециипри ее аппроксимации полиномом второго порядка
Последний вариант через определение площади криволинейной трапеции при ее аппроксимации полиномом второго порядка, явно повышает точность решения, но одновременно и существенно усложняет расчеты.
13 EMBED Word.Picture.8 1415
а б в г д
Рис.2 Схемы вычисления площади сечения: а – по начальной высоте; б – по конечной высоте; в – по средней высоте; г – через площадь прямолинейной трапеции; д – аппроксимацией криволинейной трапеций через полином второго порядка.
Формулы для каждого из методов представлены ниже:
13 EMBED Equation.3 1415 по схеме рис.2 а
13 EMBED Equation.3 1415 по схеме рис.2 б
13 EMBED Equation.3 1415 по схеме рис.2 в
13 EMBED Equation.3 1415 по схеме рис.2 г
13 EMBED Equation.3 1415 по схеме рис.2 д
Алгоритм вычисления интеграла
Построим алгоритм вычисления интеграла (рис.3):
задаем функцию (Y=F(X)), интервал интегрирования (Xн, Xк) и погрешность решения (Erf)
определяем начальное число (k=20), на которое будем делить интервал интегрирования для определения шага, вычисляем шаг (dH=(Xк-Xн)/k) и задаем нулевое значение для переменной (S1=0), которая будет накапливать сумму интеграла;
в цикле перебираем все сечения интервала интегрирования, определяем их площади по одной из показанных выше формул и накапливаем их в S1=S1+dH*F(Xt+dH/2);
увеличиваем число сечений k=k*2 и повторяем вычисление интеграла в другую переменную (S2)
проверяем достижение заданной погрешности как абсолютное значение разности двух сумм интеграла (Abs(S2 - S1) > Erf), если она больше заданной погрешности (Erf) то снова увеличиваем число сечений и повторяем вычислении интеграла, предварительно переопределив S1 = S2, иначе печатаем ответ S2 и завершаем программу.
Выполнение работы
Как и в предыдущих задачах реализуем решение несколькими способами – непосредственно на листе, с помощью макроса и через функцию пользователя с получением значения интеграла.
Для этого открываем новую книгу Excel, сразу же переходим в редактор VBA (Ctrl+F11) и создаем там модельную функцию, интеграл которой будем вычислять.
Public Function My_Fun(x)
My_Fun = 150 + 5.2 * x - 0.75 * x ^ 2
End Function
Теперь на первом листе книги готовим традиционную таблицу, которая должна иметь заголовок, потом подзаголовки с указанием формулы для решения и непосредственно столбца, которые нужны для расчета по этим формулам (рис.5).
Как обычно отмечаем светло-зеленым фоном ячейки, которые требуют ввода данных. В ячейку с размером шага записываем формулу dH=(Xк-Xн)/k, где все параметры в формуле ссылаются на ячейки отмеченные фоном. В ячейки 4 строки надо вписать формулу суммы всех площадей сечений для каждой формулы, так для столбца «Е» имеет вид =СУММ(E7:E26).Число охваченных формулой ячеек должно быть равным или больше чем значение k. После ввода первой формулы, остальные можно просто скопировать на остальные ячейки строки.

Рис.5. Заголовок основной таблицы
Теперь начнем заполнять остальные ячейки формулами. В первую очередь заполняем номера сечений, для этого в первую ячейку вводим 1 (рис.6), а последующие ячейки по данному столбцу заполняем формулой =A7+1.
Начальное значение X приравниваем Xн, а далее по столбцу прибавляем к предыдущему значению вычисленный шаг (рис.7). Теперь надо заполнить остальные ячейки для первого сечения. Для средней точки сечения к начальному значению X прибавляем половину шага и для конечной точки прибавляем целый шаг (рис.8). Как видите, все ссылки на шаг имеют абсолютную адресацию (после ввода адреса фиксируем ячейку клавишей F4).
Теперь надо ввести формулы для вычисления площади сечения. Сами формулы показаны выше, а варианты их ввода в данные ячейки имеют следующий вид:
=My_Fun(B7)*$H$3
=My_Fun(D7)*$H$3
=My_Fun(C7)*$H$3
=(My_Fun(B7)+My_Fun(D7))/2*$H$3
=(My_Fun(B7)+4*My_Fun(C7)+My_Fun(D7))/6*$H$3
Теперь остается скопировать все формулы от Хс до 2д и вставить их в следующую строку, а потом данную строку растянуть до необходимого числа сечений. Полученный результат, показанный на рис.9.

Рис.9. Результат вычисления интеграла модельной функции.
Как видим, результаты вычислений достаточно близки, говорит ли это об одинаковой точности всех этих формул. Попробуем провести анализ точности наших результатов в зависимости от используемой формулы. Для этого построим график нашей функции и попробуем найти интегралы на разных ее участках. Сначала формируем таблицу данных для нашего графика (рис.10), где берем интервал изменения параметра «Х» от -8 до 15, а «Y» определяем по нашей модельной функции. Теперь по этим данным строим график (рис.11).

Рис.11. График модельной функции
Интерес на графике могут представлять три интервала – слева от экстремума, в районе экстремума и справа от него. Можно так же посмотреть влияние на погрешности ширины интервала в области экстремума. Построим новую таблицу, куда занесем результаты наших расчетов для различных областей (рис.12). Чтобы заполнить эту таблицу, сначала вводим заданный интервал в основную таблицу и потом копируем результаты расчета интегралов в соответствующие ячейки. Так как в исходных ячейках у нас находятся формулы сумм, то копирование должно выполняться командой «Специальная вставка» с выбором режима «Значения». Для представления данных стоит построить гистограмму, но лучше использовать не абсолютные значения интегралов, а их разности. В качестве наилучшего из методов возьмем результаты вычисления по формуле 2д и буде брать разности между этим значением и всеми другими. Получаем новую таблицу (рис.13). Формулы в ней имеют следующий вид – =B31-$F31.Как видим, ссылка на формулу 2д имеет символ доллара пере именем столбца «F», что делает данный адрес абсолютно-относительным. Столбец будет закреплен, что позволит просто скопировать все формулы сначала по строке, а потом все ячейки по столбцам.
Построим гистограмму (рис.14). Как видно из гистограммы в интервале, где имеет место нарастание функции (положительная производная) первая формула существенно занижает значение интеграла, а вторая формула наоборот. Вычисления интегралов в области экстремумов выравнивает эти погрешности, но здесь возрастают ошибки третьей и четвертой формул. Если нет проблем с дополнительными вычислениями функции, то лучше пользоваться последней формулой.
Теперь реализуем эту же задачу средствами VBA – создадим непосредственно функцию пользователя, которая сразу же возвращает значение интеграла. Сначала поставим задачу:
входными параметрами в программе должны быть границы интервала, точность решения, имя функции, которая используется в решении и номер формулы, которую будем использовать в расчетах;
реализуем алгоритм, показанный на рис.4;
для вычисления площади сечения создадим внутреннюю подпрограмму-функцию, которая на основании значений начальной точки сечения, шага, имени функции и номера формулы вычисляет площадь;
Переходим в редактор VBA и в модуле создаем функцию «Integral». Вводим формальные параметры в заголовок функции и заполняем собственно тело программы:
Public Function Integral(xn, xk, Fn As String, _
N_form, erf, Show As Boolean)
If erf = 0 Then erf = 0.01
k = 10: h = (xk - xn) / k
s = 0: xt = xn
For i = 1 To k
s = s + GetFun(xt, h, Fn, N_form)
xt = xt + h
Next i
Do
k = k * 2: h = (xk - xn) / k
s1 = 0: xt = xn
For i = 1 To k
s1 = s1 + GetFun(xt, h, Fn, N_form)
xt = xt + h
Next i
If Abs(s1 - s) < erf Then Exit Do
s = s1
Loop
If Show Then
MsgBox "Заданная точность достигнута при k=" & k, _
vbInformation + vbOKOnly
End If
Integral = s1
End Function
Разберем программу более подробно. В первой строке проверяем задание точности вычисления для исключения ошибок при запуске программы. Потом задаем начальное значение k=10, вычисляем dH, обнуляем S и задаем Xt=Xн. В цикле от 1 до k суммируем площади сечений, обращаясь в внутренней функции GetFun и изменяем Xt. После организуем бесконечный цикл вычисления следующего значения интеграла в переменную S1, повторяя только, что описанные строки. Получив второе значение интеграла, проверяем условие достижения заданной точности в операторе If. При достижении заданного условия реализуем выход из цикла, иначе сохраняем значение S1 в S и повторяем вычисление интеграла еще раз. Для анализа скорости получения решения перед выходом из функции ставим вывод служебного окно (MsgBox) с сообщение числа k, при котором найдено решение. Если мы оставим это сообщение постоянно, то нам придется после каждого вычисления нажимать «Ok». Чтобы можно было управлять выводом этой информации внесем еще один формальный параметр «Show» как логическая переменная, которая может принимать два значения «ИСТИНА» и «ЛОЖЬ». Заключаем оператор с выводом окна в условный оператор «If». Теперь если переменная «Show» принимает значение «ИСТИНА», то вспомогательное окно выводится на экран.
Формируем программу вычисления площади «GetFun»:
Private Function GetFun(XX, dH, Fn, N)
Select Case N
Case 1
Y1 = Application.Run(Fn, XX)
Y = Y1 * dH
Case 2
Y1 = Application.Run(Fn, XX + dH)
Y = Y1 * dH
Case 3
Y1 = Application.Run(Fn, XX + 0.5 * dH)
Y = Y1 * dH
Case 4
Y1 = Application.Run(Fn, XX)
Y2 = Application.Run(Fn, XX + dH)
Y = (Y1 + Y2) / 2 * dH
Case 5
Y1 = Application.Run(Fn, XX)
Y2 = Application.Run(Fn, XX + dH)
Y3 = Application.Run(Fn, XX + dH / 2)
Y = (Y1 + Y3 * 4 + Y2) / 6 * dH
End Select
GetFun = Y
End Function
Теперь можем проверить работоспособность наших подпрограмм. На листе Excel подготовим табличку для вычисления интеграла модельной функции через разные формулы с различной точностью. Вносим заголовок таблицы и готовим комментарии к переменным, которые надо будет передавать для вычисления интеграла в функцию (рис.15). Как и ранее все ячейки с исходными данными окрашиваем светло-зеленым фоном. В ячейки строки «Интеграл» записываем формулу – =Integral($B$44;$D$44;$B$45;B46;$D$45;$F$43). Все фактические параметры имеют абсолютные адреса кроме номера формулы, который берется из ячейки сверху. Строку «k» можно заполнить вручную, если поставить в ячейку «Показать число k» значение «ИСТИНА» или «True». Программа выполнить расчет всех ячеек и выведет пять раз окно с информацией (рис.16).
Заключение
В результате выполнения работы были разработаны программы для вычисления интеграла с использованием различных квадратурных формул. Выполнен анализ точности расчетов по каждой из формул. Создана функция пользователя, которая может быть использована в расчетах, когда надо будет вычислять интегралы.
Самостоятельная работа
Машин двигалась следующим образом – за 2 минуты она разогналась от 0 до 50 км/час, потом ехала с постоянной скоростью 25 минут, затем, выехав за город увеличила скорость до 100 км/час затратив на это 3 минуты. Через 15 минут машина достигла конечного пункта и остановилась, торможение длилось 5 минут. Найти пройденный машиной путь? Построить два решения – а: ускорения на всех участках с изменением скорости были постоянными; б: ускорения были изменяемыми от минимума к максимуму и обратно.
Разработать фрагмент программы «FDihot2» на случай отсутствия корня по время поиска необходимого интервала?
Контрольные вопросы
Что такое интеграл функции?
Как реализуется алгоритм интегрирования функции?
Какие модели используются для вычисления площади сечений при вычислении интегралов?



Понятие первообразной (метод Эйлера)

Первообрбзной[ Cкачайте файл, чтобы посмотреть ссылку ] или примити
·вной функцией (иногда называют также антипроизводной) данной [ Cкачайте файл, чтобы посмотреть ссылку ] f называют такую F, [ Cкачайте файл, чтобы посмотреть ссылку ] которой (на всей области определения) равна f, то есть F  = f. Вычисление первообразной заключается в нахождении неопределённого интеграла, а сам процесс называется интегрированием.
Первообразные важны тем, что позволяют вычислять [ Cкачайте файл, чтобы посмотреть ссылку ]. Если F  первообразная интегрируемой функции f, то:

Это соотношение называется [ Cкачайте файл, чтобы посмотреть ссылку ].
Благодаря этой связи множество первообразных данной функции f называют неопределённым интегралом (общим интегралом) f и записывают в виде интеграла без указания пределов:

Если F  первообразная f, и функция f определена на каком-либо [ Cкачайте файл, чтобы посмотреть ссылку ], тогда каждая последующая первообразная G отличается от F на константу: всегда существует число C, такое что G(x) = F(x) + C для всех x. Число C называют [ Cкачайте файл, чтобы посмотреть ссылку ].
Каждая [ Cкачайте файл, чтобы посмотреть ссылку ] f имеет первообразную F, одна из которых представляется в виде интеграла от f с переменным верхним пределом:

Существует три основных правила нахождения первообразных функций. Они очень похожи на соответствующие правила дифференцирования.
Правило 1
Если F есть первообразная дл некоторой функции f, а G есть первообразная для некоторой функции g, то F + G будет являться первообразной для f + g.
По определению первообразной F’ = f. G’ = g. А так как эти условия выполняются, то по правилу вычисления производной для суммы функций будем иметь: 
(F + G)’ = F’ + G’ = f + g.
Правило 2
Если F есть первообразная для некоторой функции f, а k – некоторая постоянная. Тогда k*F есть первообразная для функции k*f. Это правило следует из правила вычисления производной сложной функции.
Имеем: (k*F)’ = k*F’ = k*f.



Правило 3
Если F(x) есть некоторая первообразная для функции f(x), а k и b есть некоторые постоянные, причем k не равняется нулю, тогда (1/k)*F*(k*x+b) будет первообразной для функции f(k*x+b).
Данное правило следует из правила вычисления производной сложной функции:
((1/k)*F*(k*x+b))’ = (1/k)*F’(k*x+b)*k = f(k*x+b).
Приближённое нахождение первообразных(метод Эйлера)
Пусть на интервале  задана непрерывная функция  , для которой нужно найти первообразную  . Согласно определению первообразной, для этого нужно решить уравнение

(1.6)


найдя неизвестную функцию  . Относительно этой неизвестной функции уравнение является дифференциальным уравнением первого порядка. Его можно приближённо решать разными способами, которые вы будете изучать в курсе дифференциальных уравнений. Опишем здесь простейший из них, называемый методом Эйлера.
Из всего семейства первообразных  будем отыскивать ту первообразную, которая в некоторой фиксированной точке  принимает фиксированное значение  . Это условие выделяет из семейства первообразных одну функцию: все остальные первообразные  отличаются от этой фиксированной первообразной на постоянное слагаемое  и, следовательно, не удовлетворяют условию  .
Заметим, что из уравнения ([ Cкачайте файл, чтобы посмотреть ссылку ]) следует, что

найденный дифференциал равен главной линейной части приращения функции:

откуда

Здесь мы учли начальное условие  . Тем самым, взяв некоторое приращение независимого переменного  , равное  , мы сможем приближённо найти значение первообразной  в "соседней" точке  :

Начав аналогичные вычисления с точки  вместо  , получаем

где  ; затем точно так же получаем

где  , и т. д. По найденным в известных точках  ,  ,  приближённым значениям первообразной  мы можем построить график функции  (разумеется, приближённо, поскольку значения  известны лишь приближённо). Выбирая  , мы построим этот график при  , то есть на  , а повторив процесс при  , построим часть графика на  .
Заметим, что шаг по оси  , то есть величину  , не обязательно выбирать одинаковым на всех этапах:  может зависеть от номера этапа  . Рекомендуется учитывать при этом выборе поведение функции  и уменьшать шаг  , если значения  увеличиваются, и увеличивать  , если значения  уменьшаются, чтобы величины приращений  были бы примерно одинаковы по абсолютной величине. Это даст возможность более точно построить график первообразной  .

Ме
·тоды Ру
·нге  Ку
·тты
Ме
·тоды Ру
·нге  Ку
·тты  важное семейство [ Cкачайте файл, чтобы посмотреть ссылку ] решения [ Cкачайте файл, чтобы посмотреть ссылку ] и их систем. Данные итеративные методы явного и неявного приближённого вычисления были разработаны около 1900 года немецкими математиками [ Cкачайте файл, чтобы посмотреть ссылку ] и [ Cкачайте файл, чтобы посмотреть ссылку ].
Формально, методом Рунге  Кутты является модифицированный и исправленный [ Cкачайте файл, чтобы посмотреть ссылку ], они представляют собой схемы второго порядка точности. Существуют стандартные схемы третьего порядка, не получившие широкого распространения. Наиболее часто используется и реализована в различных математических пакетах ([ Cкачайте файл, чтобы посмотреть ссылку ], [ Cкачайте файл, чтобы посмотреть ссылку ], [ Cкачайте файл, чтобы посмотреть ссылку ]) стандартная схема четвёртого порядка. Иногда при выполнении расчётов с повышенной точностью применяются схемы пятого и шестого порядков

Рассмотрим [ Cкачайте файл, чтобы посмотреть ссылку ]

Задано обыкновенное диф. уравнение первого порядка и начальное условие:


Тогда приближенное значение в последующих точках вычисляется по итерационной формуле:


Вычисление нового значения проходит в четыре стадии:






где   величина шага сетки по .

Прямые методы Рунге  Кутты
Семейство прямых методов Рунге  Кутты является обобщением метода Рунге  Кутты четвёртого порядка. Оно задаётся формулами

где   величина шага сетки по  и вычисление нового значения проходит в  этапов:

Конкретный метод определяется числом  и коэффициентами  и . Эти коэффициенты часто упорядочивают в таблицу (называемую таблицей Бутчера)

Для коэффициентов метода Рунге  Кутты должны быть выполнены условия  для .
Если требуется, чтобы метод имел порядок , то следует также обеспечить условие

где   приближение, полученное по методу Рунге  Кутты. После многократного дифференцирования это условие преобразуется в систему полиномиальных уравнений относительно коэффициентов метода.
 

Решение уравнений методом Рунге-Кутта.

     Рассмотрим методику решения дифференциальных уравнений методом Рунге-Кутта на конкретном примере. Пусть задано дифференциальное уравнение с [ Cкачайте файл, чтобы посмотреть ссылку ]:
 

(12.12)


Требуется определить значение функции u в точке
 




Значение шага по времени возьмём равным 0,1.       Видно, что решением уравнения (12.12) является функция , значение которой в искомой точке составляет:
 




Выполним решение уравнения (12.12), используя метод Рунге-Кутта с различными порядками точности, и сравним полученные результаты с истинным решением (следует отметить, что для данного уравнения [ Cкачайте файл, чтобы посмотреть ссылку ] и [ Cкачайте файл, чтобы посмотреть ссылку ] методы Эйлера неприменимы, так как соответствующие им разностные схемы для уравнения (12.12) будут [ Cкачайте файл, чтобы посмотреть ссылку ]).       Рассмотрим методику решения уравнения (12.12) [ Cкачайте файл, чтобы посмотреть ссылку ] с использованием [ Cкачайте файл, чтобы посмотреть ссылку ]:
 




Видно, что ошибка появляется в третьей цифре после запятой. 

Рассмотрим методику решения уравнения (12.12) методом Рунге-Кутта 2-го порядка с использованием [ Cкачайте файл, чтобы посмотреть ссылку ]:
 




Видно, что ошибка, как и в предыдущем случае, появляется в третьей цифре после запятой.     
  Рассмотрим методику решения уравнения (12.12) [ Cкачайте файл, чтобы посмотреть ссылку ]:
 




Видно, что ошибка появляется в пятой цифре после запятой. Это наглядно доказывает, что метод Рунге-Кутта 3-го порядка более точен, чем метод Рунге-Кутта 2-го порядка.    
   Рассмотрим методику решения уравнения (12.12) [ Cкачайте файл, чтобы посмотреть ссылку ]:
 



Видно, что ошибка появляется в седьмой цифре после запятой. Это наглядно доказывает, что метод Рунге-Кутта 4-го порядка более точен, чем методы Рунге-Кутта 2-го и 3-го порядка.







Система уравнений:
Метод позволяет решать системы обыкновенных дифференциальных уравнений (ОДУ) первого порядка следующего вида:

которые имеют решение:

где t - независимая переменная (например, время); X, Y и т.д. - искомые функции (зависимые от t переменные). Функции f, g и т.д. - заданы. Также предполагаются заданными и начальные условия, т.е. значения искомых функций в начальный момент.
Одно диф. уравнение - частный случай системы с одним элементом. Поэтому, далее речь пойдет для определенности о системе уравнений.
Метод может быть полезен и для решения диф. уравнений высшего (второго и т.д.) порядка, т.к. они могут быть представлены системой диф. уравнений первого порядка.
Метод Рунге-Кутта заключается в рекурентном применении следующих формул:
Страница | 13 PAGE \* MERGEFORMAT 14415










13PAGE 15


13PAGE 14115




Рис.1. Таблица расчета функции


Рис.3 Окно команды «Прогрессия»


Рис. 6. Выбор типа графика


Рис.5. Окно форматирования ячейки


Рис. 10. Построенная диаграмма.


Рис. 11. Окно формата области построения графика


Рис.13. Диаграмма со всеми изменениями.


Рис.14. Окно создания процедуры.

13 EMBED Word.Picture.8 1415
Рис.15. Корень уравнений


Рис.16. Графики модельной функции и ее производной


Рис.18. Таблица расчетных данных

13 EMBED Word.Picture.8 1415
Рис.1 Корень уравнений

13 EMBED Word.Picture.8 1415
Рис.3 Существующий и несуществующий корни

13 EMBED Word.Picture.8 1415
Рис.2 Корни квадратного уравнения


Рис.4. Алгоритм метода итераций

13 EMBED Word.Picture.8 1415
Рис.5 Графическая реализация метода касательных (хорд)


Рис.6. Алгоритм метода касательных (хорд)


Рис.7. Алгоритм метода деления отрезка пополам (дихотомии)


Рис.8. Запрос системы безопасности


Рис. 9. Заголовок таблицы для реализации метода деления отрезка пополам


Рис.10. Результат поиска корня модельной функции.


Рис. 11. Образец заготовки для макроса


Рис.13. Окно сообщения


Рис.12. Результат работы макроса «Dihot1»


Рис.14. Фрагмент таблицы


Рис.15. Окно «Подбор параметра»

13 EMBED Word.Picture.8 1415
Рис.1 Экстремум уравнения

13 EMBED Word.Picture.8 1415
Рис.2 Локализация экстремума функции


Рис.4. Алгоритм метода итераций

13 EMBED Word.Picture.8 1415
Рис.3 Графическое представление золотого сечения


Рис.9. Фрагмент листа для вычисления функции GoldS


Рис.10. Фрагмент таблицы

13 EMBED Word.Picture.8 1415
Рис.1 Интеграл уравнения

13 EMBED Word.Picture.8 1415
Рис.4. Алгоритм интегрирования функции


Рис.7. Формулы для начала сечения


Рис.6. Формулы для номера сечения


Рис.8. Формулы для средней и конечной точек сечения


Рис.10. Таблица для построения графика


Рис.13. Таблица разностей


Рис.12. Таблица для сравнение результатов вычислений


Рис.14. Гистограмма разностей в зависимости от расположения интервалов


Рис.16. Окно сообщения


Рис.15. Таблица расчета интегралов



Root EntryEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation Native15

Приложенные файлы

  • doc 14430506
    Размер файла: 2 MB Загрузок: 0

Добавить комментарий