Читайте также:
|
|
1. Задаем значения переменных, которые пользователь может изменять, согласно заданию:
1.1. Введём значение точности ε для процедуры на определение корня методом половинного деления:
1.2. Введём значения точностей ε для главной процедуры нахождения вектора корней:
1.3. Введём число итераций, границы отрезка, в пределах которого будет находиться корень при методе половинного деления:
2. Задаем исходную функцию в виде функции двух скалярных переменных:
Задаем исходную функцию в виде функции вектора:
Те переменные, которые используются только в данной процедуре, объявляются как локальные.
3.Задаем начальное приближение в виде вектора из двух строк, поэтому переменная n:=2:
4.Составляем функцию определения частной производной, как функцию двух переменных:
Функция diff(,) состоит из двух аргументов, где первый – то, что дифференцируется, второй – по какой переменной идёт дифференцирование. Функция eval() применяется для полного вычисления выражения, т.е. до числа.
5. Составляем функцию определения частной производной, как функцию вектора:
6. Составляем функцию определения матрицы Гессе, как функцию двух переменных:
7. Составляем функцию определения матрицы Гессе, как функцию вектора:
8. Находим норму функции. Для числа – это модуль, для матрицы – корень квадратный из суммы квадратов элементов:
Можно применять ещё для вычисления выражения и функцию eval().
9. Составляем вспомогательную функцию для поиска значений t дифференцирование первого порядка:
10. Составляем вспомогательную функцию для поиска значений t дифференцирование второго порядка:
Функция convert(,) преобразовывает один вид данных в другой, матрицу в вектор, и наоборот.
11. Определение корня методом половинного деления с точностью epss0:
Функция abs() - нахождение модуля от выражения в скобках.
12. Проверяем положительную определенность по критерию Сильвестра (определители всех главных диагональных миноров обратной матрицы Гессе должны быть положительны):
Функция SubMatrix() находит миноры матрицы в зависимости от указанных строк и столбцов, Determinant() находит определитель матрицы.
13. Составляем основную программу.
В данной программе точки носят наименование Y. Y – текущее значение точки, XX - предыдущее значение точки.
В цикле находим градиент функции. Если он меньше epss1, тогда вычисления прекращаем. Текущая точка и есть приближенное значение точки минимума.
Иначе ищем значение обратной матрицы Гессе . Если эта матрица положительна определена, то ищем минимум функции . Иначе – .
Параметры можно менять, для получения нужного результата, если с этими значениями параметров решение не найдено. Величины этих параметров существенно влияют на скорость вычисления решения.
Затем ищем корни этой производной, чтобы определить экстремум функции . Найденный параметр (шаг) подставляем во вторую производную . Если она положительна – нашли минимум . Если нет – повторяем поиск на другом отрезке. Далее вычисляем новую точку.
Проверяем условие окончания расчета: норма разности значения функций в новой и предыдущей точке и норма разности точек должны быть меньше заданного значения epss2. Если это не так – процесс повторяется. Выход из бесконечного цикла осуществляется только тогда, когда (при условии не выполнения выше указанных) переменная k, которая увеличивается на 1 на каждой итерации, становится равной общему количеству итераций М, установленной в начале описанной программы.
Если при нахождении обратной матрицы Гессе и применении критерия Сильвестора, она оказывается сингулярной, то происходит выход из цикла преждевременно нахождению вектора корней.
14. Результат решения задачи:
15. График заданной функции реализуется с помощью функции plot3d(), аргументами которой являются сама функция, диапазон, стиль, ориентация осей и т.д., другие аргументы, использующиеся для изменения дизайна графика, зависят от желаний пользователя.
3. Приложение
Дата добавления: 2015-07-07; просмотров: 195 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Сходимость | | | Метод Ньютона |