Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Решение обыкновенных дифференциальных



Соломатин А.С.

С60

Решение типовых задач одномерной и многомерной оптимизации с применением пакета MATLAB: учеб. пособие / А. С. Соломатин, В. Н. Калинкин, Т. Н. Гартман, Д. К. Новикова; под ред. проф. Т.Н. Гартмана. - М.: РХТУ им. Д. И. Менделеева, 2011. - 74с.: ил.

ISBN

 

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

Материал изложен в доступной форме и содержит наглядные иллюстрации и тексты программ.

Предназначено для студентов химико-технологических специальностей вузов.

УДК 517.977

ББК

© Российский Химико-Технологический Университет

им. Д. И. Менделеева, 2011


 

ОГЛАВЛЕНИЕ

Предисловие…………………………………………………….4

Глава 1. Краткие основы работы в MATLAB……………..5

1.1. Интерфейс. ………………………………………………………….5

1.2. Редактирование М-файлов ……………………………………8

1.3. Построение графиков……………………………………………12

1.4. Построение поверхности………………………………………13

1.5. Операции с матрицами. ……………………………………….14

1.6. Нелинейные уравнения и системы…………………………...15

1.7. Интегрирование…………………………………………………...16

Решение обыкновенных дифференциальных

уравнений и систем………………………………………18

1.9. Поиск экстремума функции одной переменной…………...21

1.10. Поиск экстремума функции нескольких переменной…..21

Глава 2. Одномерная оптимизация с

применением пакета MATLAB …………………..23

2.1. Метод сканирования……………………………………………...23

2.2. Метод чисел Фибоначчи…………………………………………29

2.3. Метод локализации экстремума……………………………...35

2.4. Метод обратного половинного шага………………………..43

2.5. Метод золотого сечения………………………………………..51

Глава 3. Двухмерная оптимизация с

применением пакета MATLAB……………………57

3.1. Метод сканирования……………………………………………...57

3.2. Метод Гаусса-Зейделя …………………………………………..61

3.3. Метод пробных движений ……………………………………..67

 


Предисловие

Методы оптимизации широко применяются в настоящее время при компьютерном моделировании и проектировании химико-технологических процессов и решении задач энерго-ресурсосбережения химических производств. Поэтому приобретение знаний о постановке и решении задач оптимизации – необходимое условие подготовки современных специалистов химиков-технологов. Важной задачей является также обучение навыкам реализации конкретных методов оптимизации на компьютерах с применением математических пакетов решения конкретных оптимизационных задач программ, например, MATLAB.

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

Для контингента студентов, имеющих недостаточный опыт работы с пакетом MATLAB, в отдельной главе изложены его основные функциональные возможности. Приведенные в пособии коды программных модулей включают многочисленные комментарии и могут использоваться при решении практических задач оптимизации химико-технологических процессов.

Авторы настоящего учебного пособия с благодарностью отнесутся к замечаниям и предложениям по улучшению его смыслового содержания.

 


Глава 1. Краткие основы работы в MATLAB

Интерфейс.


После запуска МАТЛАБ на экране появляется основное окно приложения (рис.1.1.). Оно содержит меню, панель инструментов и рабочую область (Commаnd Window).

Рис. 1.1. Интерфейс. Основное окно.


 

В рабочей области находится знак > > после которого расположен курсор. Эту строку называют командной строкой. В нее с клавиатуры вводятся команды. Нажатие Enter заставит выполнить команду и вывести результат в том же окне. (см. рис. 1.1.)

Так как текст в окне по мере работы смещается (уступает место новым командам и выводимым данным) то для просмотра выехавшей за окно части текста используют полосы прокрутки или клавиши Page Up, Page Down.

Клавиши ↑ и ↓ позволяют вернуть в командную строку ранее введенные команды или другую входную информацию (она вся обязательно автоматически хранится и всегда доступна). Кнопка ↑ помещает в командную строку предыдущую команду, а если еще раз ее нажать то еще предыдущую и так далее. Кнопка ↓ выводит команды (ранее набранные) в обратном порядке.

Видимая часть информации (то есть то что поместилось в окне) называется зоной просмотра, а командная строка зоной редактирования.

В зоне просмотра ничего нельзя исправить или ввести. Можно только выделить мышкой для копирования.

Если команда заканчивается; то результат ее выполнения не отображается в командной строке. Иначе, то есть если строка не заканчивается на; то результат сразу же после нажатия на Enter выводится в окне ниже этой команды. (см. выше на рис. 1.1)

Значения всех переменных, вычисленные в течение работы, сохраняются в специальной области памяти, называемой Workspace. (см. выше на рис. 1.1)

Определения всех переменных и функций и их последние перед закрытием программы значения можно сохранить на диск в файл с расширением.mat но само содержание Command Window при выключении МАТЛАБа не сохраняется никаким способом.

Примеры выполнения арифметических операций показаны на рис.1.1.

Для строк символов необходимо текст помещать в ‘одинарные кавычки’. Для сложения строк символов используется операция strcat, как показано на рис.1.1.

В главном меню (см. рис.1.1) следует обратить внимание на команду Desktop (настройка среды МАТЛАБ). При нажатии раскроется список, содержащий Desktop Layout который предлагает на выбор:

· Default устанавливает настройку принятую по умолчанию, то есть открывает окна Command Window, Workspace, Command History, Current Directory.

· Command Window Only открывает только окно Command Window.

· History and Command Window открывает соответствующие окна.

· All Tabbet показывает окно справки, окно управления М-файлами и внизу ярлычки рабочих окон, которые можно выбрать щелчком.

Также работа может осуществляться в программном режиме, то есть в командной строке указывается имя М-файла (файл с расширением.m), который содержит программу действий (алгоритм) и может рассматриваться как функция, то есть при указании его имени (без указания расширения) в командной строке выполняются запрограммированные в нем операции. (см.рис.1.2).

Как выгладит содержимое М-файла, см. рис.1.3.

Числовые переменные могут быть с плавающей точкой (тогда указывается порядок, например 6.4713e+003) или с фиксированной точкой (например 81.5000).

Текстовые комментарии начинаются со знака % (см.рис.1.2).

Все функции разделяются на встроенные и определенные пользователем. Встроенные, например, это y=sin(x); y=atan(x); y=exp(x); y=log(x) натуральный логарифм, а вот y=log10(x) десятичный логарифм, y=fix(x) округление до ближайшего целого в сторону нуля, y=floor(x) округление до ближайшего целого в сторону отрицательной бесконечности, y=ceil(x) округление до ближайшего целого в сторону положительной бесконечности, y=round(x) обычное округление

Массив задается так: ИМЯ_МАССИВА = НАИМЕНЬШ_ЭЛ-Т_МАСС: ШАГ_ИЗМЕН_ЭЛ-ТА_МАСС: НАИБОЛЬШ_ЭЛ-Т_МАСС; (см. рис.1.2).

Обращение к элементу массива y=x_mas(2); где в скобках указывается порядковый номер (индекс) элемента массива (см. рис.1.2).

Редактирование М-файлов

«File»—«New»--«M-file» позволяет открыть окно Editor то есть Редактор М-файлов. В этом окне напечатать текст программы, которая должна быть выполнена, когда имя этого М-файла будет указано в командной строке в Command Window. Иначе можно запустить командой “Debug”—“Run” в меню редактора.

 


 


Рис. 1.2. Математические операции.


 


рис. 1.3. описание функции в М-файле


Сохранение File—Save при этом откроется окно в котором надо будет указать где и под каким именем хо тите сохранить этот М-файл. Имя сохраняемого файла должно совпадать с именем описанной в нем функции

Рис. 1.4. Сохранение М-файла

(то есть описанная в нем программа считается функцией и ее описание начинается с указания какого-нибудь имени этой функции, под которым она дальше и будет вызваться для исполнения). (см.рис.1.4.)

Если какие-то М-файлы уже созданы ранее то их можно посмотреть командой File—Open и выбрать тот который нужен.

При написании программы можно писать комментарии начиная их со знака %. (см.рис.1.3).

Function y=f(x)

%функция вычисляется от одного аргумента и возвращает одно

%значение, или от вектора аргумента и возвращает вектор, каждый %элемент которого вычислен от соответствующего элемента вектора %аргумента

y=(x+2).*(x-4); %поэтому перед знаком *умножения стоит.точка.*

%если не ставить; точку с запятой в конце строки то произойдет вывод на %экран

end

символьная переменная в М-файле:

str=’P I Pupkin’

ее символьное содержимое заключается в кавычки.

Ввод:

xleft=input('введите левую границу интервала поиска ');

Вывод:

disp('ВВОД ИСХОДНЫХ ДАННЫХ края диапазона поиска, точность по аргументу ИЛИ по функции ');

disp(string);

Построение графиков

% подготовка к построению графика

h=0.1;

x1=xleft: h: xright; % создан массив точек для графика

y1=f(x1); % создан массив точек для графика

plot(x1, y1, ’k-‘);

grid on; % покрыт сеткой

title('y=(x+2)(x-4)'); % подпись наверху

xlabel('X'); % подпись к оси

ylabel('Y');

text(x, y, ’\leftarrow Minimum’); %подпись Minimum к стрелке влево,

%которая будет указывать на точку с координатами x, y.

zeroMas=x1*0;

hold on; %обеспечивает построение нового графика в том же окне

plot(masx, masy, ’r.’); % график построен

legend(‘plot with minimal step’, ’plot with your step’, 0);

hold on;

plot(x1, zeroMas, ’k-‘, zeroMas, y1, ’k-‘); % построены оси

результат этих действий смотри ниже на рис.1.5.

В результате обращения к функции plot(x, y) будет создано окно с именем Figure 1 (так обычно по умолчанию) в котором будет построен график функции У от Х если заранее заданы массив Х и соответствующий ему массив значений функции У.

Тип линии указывается в кавычках plot(x1, y1, 'k-');

‘k-‘ Черная сплошная линия.

‘r.’ Круглые красные маркеры без линии.

hold on блокирует создание нового окна то есть новый график будет построен поверх старого на тех же координатных осях.

 

Рис. 1.5. Пример построения графика

Построение поверхности

Обеспечивается следующим текстом программы (см. рис. 1.6)

% подготовка к построению графика

masx=xleft: hx: xright;

masy=yleft: hy: yright;

masz=fz_xy2(masx, masy); построены массивы координат для точек

%графика

mesh(masx, masy, masz); %построена сеточная поверхность

grid on;

title(‘z=-sqrt(256-x.^2-y.^2)’);

xlabel(‘X’);

ylabel(‘Y’);

zlabel(‘Z’);

text(x, y, z, ’\leftarrow Minimum’);

legend(‘z(i, j)=-sqrt(256-x(i)*x(i)-y(j)*y(j))’, 0);

где команда mesh(masx, masy, masz); строит сеточную поверхность.

 

Рис. 1.6. Пример построения поверхности

 

Операции с матрицами.

Пусть даны две матрицы. (Если не даны, зададим их. Пусть

A=[1 2 3; 5 67 89; 34 21 5];

B=[3 4 5; 54 32 12; 6 7 8];

Тогда имеем две матрицы 3х3 элемента).

Транспонировать матрицу можно так

A_transp=A’; где знак ’ обеспечивает транспонирование матрицы А.

Умножение матриц выполняется так

C_res_mult=A*B; где C_res_mult результат умножения матриц.

Обратная матрица находится так

А_obr=A^(-1);

Или так: A_obr=inv(A);

Поэлементное сложение матриц C=A+B;

Определитель D=det(A);

Решение системы линейных уравнений, где А матрица системы, столбец b столбец свободных членов, столбец х столбец неизвестных:

x=linsolve(A, b);

Интегрирование

Для решения определенного интеграла методом трапеций предусмотрена функция trapz.

Пример для вышеописанной функции func (см. рис.1.8), (где для обработки вектора аргументов поставлена точка перед знаком возведения в степень y=0.2*exp(x) -2*(x-1).^2; ) при пределах интегрирования [0 1] с шагом разбиения 0, 1 приведен на рис.1.9.

Вполне очевидно, что с ростом числа точек разбиения по х (числа шагов, то есть при уменьшении шага по х) будет расти точность вычисления интеграла.

На рис.1.9 наглядно показано разбиение интервала интегрирования по х с заданным шагом, а также вектор значений функции в точках разбиения по х (то есть при данных значениях аргумента).

Получилось значение интеграла равное -0, 3261.

Рис. 1.9
. Интегрирование


 

Рис. 1.11. функция ode113 строит график решения

Напишем М-функцию syst (см. рис.1.12)

Используем функцию ode23 решающую методом Рунге-Кутта 2-3 порядка. Ее вызов

[T, Y]=ode23(@syst, [0 10], [0 0]); Рис. 1.12. функция syst(t, y)

где явно указаны выходные параметры вектор Т и матрица Y, а также указаны интервал [0 10] и начальные значения [0 0].

Затем формируем график решения plot(T, Y, ’k-‘). Получаем график (см.рис.1.13)

 

 

Рис. 1.13. график решения


 

Метод сканирования

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

Основным достоинством данного метода является возможность найти глобальный экстремум, а недостатком – большой объем вычислений.

Далее приведен текст программы, позволяющий реализовать описанный выше алгоритм.

Function[]=Scanirovanie1D_030809();

%метод одномерного поиска экстремума для указанной ниже функции

function y=f(x)

%функция вычисляется от одного аргумента и возвращает одно значение

%или от вектора аргумента и возвращает вектор, каждый элемент

%которого вычислен от соответствующего элемента вектора аргумента

y=(x+2).*(x-4); %поэтому перед знаком умножения * стоит точка.

%если не ставить точку с запятой; в конце строки то произойдет

%вывод на экран

end

%метод одномерного поиска экстремума: сканирование

disp('МЕТОД ПОИСКА МИНИМУМА ФУНКЦИИ С ИСПОЛЬЗОВАНИЕМ СКАНИРОВАНИЯ');

% disp означает, что на экран будет выведено сообщение, выделенное апострофом

disp('применен для указанной функции: y=(x+2)*(x-4)');

disp('ВВОД ИСХОДНЫХ ДАННЫХ точность по аргументу, края диапазона поиска');

function[x, y, masx, masy, xleft, xright, n]=scan1();

% в квадратных скобках указан список возвращаемых переменных.

disp('метод cканирования ')

disp('для одномерного поиска экстремума указанной ниже функции')

disp('y=(x+2)*(x-4)')

% на экран выводится сообщение и том, что нужно ввести исходные данные:

%диапазона значений аргумента функции

disp('исходные данные')

xleft=input('введите левую границу интервала поиска ');

xright=input('введите правую границу интервала поиска ');

h=input('введите допустимую погрешность по аргументу ');

%создание массива точек

n=ceil(abs((xright-xleft)/h)); % определяем число шагов

% функция ceil округляет число в сторону плюс бесконечности

masx(1)=xleft;

masy(1)=f(xleft);

disp('ВЫВОД ПРОМЕЖУТОЧНЫХ РЕЗУЛЬТАТОВ ПОШАГОВО ');

for i=2: n

masx(i)=masx(i-1)+h;

masy(i)=f(masx(i));

end

%вывод на экран

for i=1: n

string=strcat(‘шаг номер: ’, int2str(i), ’ аргумент: ’, num2str(masx(i)), ’ функция от него: ’, num2str(masy(i));

disp(string);

% string – имя переменной, strcat – функция, которая объединяет в одну строку символов все, что указано в круглых скобках, int2str(i) – функция, которая преобразует целое число в строку символов (где в круглых скобках указано число – аргумент функции)

end

% поиск минимума

min=masy(1); % стандартный алгоритм поиска минимума

num=1;

for i=2: n

if masy(i)< min

min=masy(i);

num=i;

end

end

%возвращаемые значения (минимум)

x=masx(num);

y=masy(num);

end

%обращение к функции сканирования

[x, y, masx, masy, xleft, xright, n]=scan1();

%выбор оформления вывода на экран

choiceTab=input('ВОПРОС выводить пошагово как таблицу? Да=1 нет=0 ');

choiceGraf=input('ВОПРОС выводить график? Да=1 нет=0 ');

%вывод таблицы

if choiceTab==1 % Два раза символ «равно» используется в операторе сравнения

disp('вывод результатов');

for i=1: n

%string=strcat(‘номер=’, int2str(i), ’ аргумент=’, num2str(masx(i)), ’ функция=’, num2str(masy(i)));

%disp(string);

string=sprint(‘номер= %4i\tаргумент= %7.3f\tфункция= %7.3f’, i, masx(i), masy(i));

% где %4i означает 4-х значное целое число с последующим знаком табуляции: \t

% где %7.3f означает десятичную дробь: 7 знаков до запятом, 3 – после с последующим знаком табуляции: \t

disp(string);

end

end

% подготовка к выводу текста

% num2str преобразует число в строку символов

disp('НАЙДЕН МИНИМУМ')

sx=strcat('оптимальное значение аргумента=', num2str(x), ' с точностью: ', num2str(abs(masx(n)-masx(n-1))));

% sx – имя переменной (строки символов). В данном случае оно не имеет никакого отношения к переменной x

sy=strcat('минимум функции=', num2str(y), ' с точностью: ', num2str(abs(masy(n)-masy(n-1)));

sn=strcat('выполнено: ', num2str(n), ' итераций');

disp(sx); % вывод на экран

disp(sy);

disp(sn);

% подготовка к построению графика

h=0.1;

x1=xleft: h: xright; % создан массив точек для графика

y1=f(x1); % создан массив точек для графика

plot(x1, y1, ’k-‘);

grid on; % покрыт сеткой

title('y=(x+2)(x-4)'); % подпись над графиком

xlabel('X'); % подпись к оси x

ylabel('Y'); % подпись к оси y

text(x, y, ’\leftarrow Minimum’);

zeroMas=x1*0;

hold on;

if choiceGraf==1

plot(masx, masy, ’r.’); % график построен

legend(‘plot with minimal step’, ’plot with your step’, 0);

else

legend(‘plot with minimal step’, 0);

end

hold on;

plot(x1, zeroMas, ’k-‘, zeroMas, y1, ’k-‘); % построены оси

end

После выполнения этой программы пользователь видит на экране соответствующий текст, вводит нужные значения и получает график:

МЕТОД ПОИСКА МИНИМУМА ФУНКЦИИ С ИСПОЛЬЗОВАНИЕМ СКАНИРОВАНИЯ

применен для указанной функции: y=(x+2)*(x-4)

ВВОД ИСХОДНЫХ ДАННЫХ точность по аргументу, края диапазона поиска

метод cканирования

для одномерного поиска экстремума указанной ниже функции

y=(x+2)*(x-4)

исходные данные

введите левую границу интервала поиска -10

введите правую границу интервала поиска 10

ведите допустимую погрешность по аргументу.5

ВЫВОД ПРОМЕЖУТОЧНЫХ РЕЗУЛЬТАТОВ ПОШАГОВО

шаг номер: 1 аргумент: -10 функция от него: 112

шаг номер: 2 аргумент: -9.5 функция от него: 101.25

шаг номер: 3 аргумент: -9 функция от него: 91

шаг номер: 4 аргумент: -8.5 функция от него: 81.25

 

Часть вывода вырезана

 

шаг номер: 15 аргумент: -3 функция от него: 7

шаг номер: 16 аргумент: -2.5 функция от него: 3.25

шаг номер: 17 аргумент: -2 функция от него: 0

шаг номер: 18 аргумент: -1.5 функция от него: -2.75

шаг номер: 19 аргумент: -1 функция от него: -5

шаг номер: 20 аргумент: -0.5 функция от него: -6.75

шаг номер: 21 аргумент: 0 функция от него: -8

шаг номер: 22 аргумент: 0.5 функция от него: -8.75

Часть вывода вырезана

шаг номер: 36 аргумент: 7.5 функция от него: 33.25

шаг номер: 37 аргумент: 8 функция от него: 40

шаг номер: 38 аргумент: 8.5 функция от него: 47.25

шаг номер: 39 аргумент: 9 функция от него: 55

шаг номер: 40 аргумент: 9.5 функция от него: 63.25

ВОПРОС выводить пошагово как таблицу? Да=1 нет=0 0

ВОПРОС выводить график? Да=1 нет=0 1

НАЙДЕН МИНИМУМ

оптимальное значение аргумента=1 с точностью: 0.5

минимум функции=-9 с точностью: 0.25

выполнено: 40 итераций

Рис. 2.1. Пример вывода на экран при применении метода сканирования


 

Метод чисел Фибоначчи

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

Fn = Fn – 1 + Fn – 2; F0 = 1.

Алгоритм поиска экстремума (в данном случае минимум) функции методом чисел Фибоначчи:

1) по заданной точности поиска Δ, где Δ = (XmaxXmin)/Fs – абсолютная погрешность при поиске экстремума определяется по формуле, а Fs – число Фибоначчи под номером s, сначала рассчитывается вспомогательное число: N = (XmaxXmin)/Δ;

2) находится число Фибоначчи Fs, удовлетворяющее условию:

Fs – 1 < NFs;

3) определяется минимальный шаг поиска:

hmin= (XmaxXmin)/Fs;

4) рассчитывается значение критерия R в точке, определяемой соотношением X1 = Xmin + hmin Fs – 2;

5) рассчитывается значение критерия R в точке, определяемой соотношением X2 = X1 + hmin Fs – 3;

6) если R(X2) < R(X1), то X3 = X2 + hmin Fs – 4.

Иначе Х3 = X1 hmin Fs – 4 и в этой точке рассчитывается новое значение R.

Процедура продолжается до тех пор, пока не будут исчерпаны все числа Фибоначчи в убывающей последовательности.

Далее приведен текст программы, позволяющий реализовать описанный выше алгоритм.

Function[]=FibonachiChisla1D_170809();

%метод одномерного поиска минимума для указанной ниже функции

function y=f(x);

%функция вычисляется от одного аргумента и возвращает одно

%значение или от вектора аргумента и возвращает вектор, каждый элемент

%которого вычислен от соответствующего элемента вектора-аргумента y=(x+2).*(x-4);

%поэтому перед знаком умножения *стоит точка.

%если не ставить точку с запятой; в конце строки то произойдет

%вывод на экран

end

%метод одномерного поиска минимума: с использованием чисел Фибоначчи

disp('МЕТОД ПОИСКА МИНИМУМА ФУНКЦИИ С ИСПОЛЬЗОВАНИЕМ ЧИСЕЛ ФИБОНАЧЧИ');

disp('Применен для указанной функции: y=(x+2)*(x-4)');

disp('ВВОД ИСХОДНЫХ ДАННЫХ точность по аргументу, края диапазона поиска');

function [x, y, masx, masy, xleft, xright, dy]=Fib1();

%Ввод исходных данных

disp(Одномерная оптимизация методом чисел Фибоначчи')

disp(ЗАДАЧА найти минимум указанной ниже функции')

disp('y=(x+2)*(x-4)')

disp ('в интервале, определяемом пользователем’)

eps=input('точность по аргументу=');

xleft=input('левый край интервала поиска=');

xright=input('правый край интервала поиска=');

F(1)=1;

F(2)=2;

s=2;

N=abs(xright-xleft)/eps;

% определяются числа Фибоначчи

while N> F(s)

s=s+1;

F(s)=F(s-1)+F(s-2);

end %конец while

%вывод чисел Фибоначчи на экран

disp(' ЧИСЛА ФИБОНАЧЧИ');

for i=1: s

string=strcat(‘НОМЕР числа Фибоначчи: ’, int2str(i), ’ ЧИСЛО ФИБОНАЧЧИ: ’, int2str(F(i)));

disp(string);

end

disp(‘ВЫВОД ЧИСЕЛ ФИБОНАЧЧИ ЗАВЕРШЕН’);

h=(xright-xleft)/F(s);

x1=xleft+h*F(s-2);

R1=f(x1); % вызов функции y=f(x)

x2=x1+h*F(s-3);

R2=f(x2); % вызов функции y=f(x)

k=s-3;

x3=0;

n=1;

disp('ВЫВОД ПРОМЕЖУТОЧНЫХ РЕЗУЛЬТАТОВ ПОШАГОВО');

while k> 1 %основной цикл

k=k-1;

if R2< R1

x3=x2+h*F(k);

else

x3=x1-h*F(k);

end %конец if

%подготовка к следующей итерации

x1=x2;

R1=R2;

x2=x3;

R2=f(x3);

masx(n)=x3;

masy(n)=R2;

n=n+1;

%вывод на экран

string=strcat('число Фибоначчи номер: ', int2str(k), ' аргумент: ', num2str(x3), ' функция от него: ', num2str(R2));

disp(string);

end %конец while

n=n-1;

%возвращаемые значения

x=x3;

y=R2;

dy=abs(y-masy(n-1));

end %конец функции

%обращение к функции поиска минимума (числа Фибоначчи)

[x, y, masx, masy, xleft, xright, dy]=Fib1();

%выбор оформления вывода на экран

choiceTab=input('ВОПРОС выводить пошагово как таблицу? Да=1 нет=0 ');

choiceGraf=input('ВОПРОС выводить график? Да=1 нет=0 ');

%вывод таблицы

if choiceTab==1

disp('вывод результатов');

for i=1: length(masx)

string=print(‘номер= %4i\tаргумент= %7.3f\tфункция= %7.3f’, i, masx(i), masy(i));

disp(string);

end

end

% подготовка к выводу текста

% num2str преобразует число в строку символов

disp('НАЙДЕН МИНИМУМ')

sx=strcat('оптимальное значение аргумента=', num2str(x));

sy=strcat('минимум функции=', num2str(y), ' с точностью: ', num2str(dy));

sn=strcat('выполнено: ', num2str(length(masx)), ' итераций');

disp(sx) % вывод на экран

disp(sy)

disp(sn)

% подготовка к построению графика

h=0.1;

x1=xleft: h: xright; % создан массив точек для графика

y1=f(x1); % создан массив точек для графика

plot(x1, y1, ’k-‘);

grid on; % покрыт сеткой

title('y=(x+2)(x-4)'); % подпись над графиком

xlabel('X'); % подпись к оси x

ylabel('Y'); % подпись к оси y

string=strcat(‘\leftarrow Minimum (‘, num2str(x), ’, ’, num2str(y), ’)’);

text(x, y, string);

zeroMas=x1*0;

hold on;

if choiceGraf==1

plot(masx, masy, ’r.’); % график построен

legend(‘plot with minimal step’, ’points by Fibonachi method’, 0);

else

legend(‘plot with minimal step’, 0);

end

hold on;

plot(x1, zeroMas, ’k-‘, zeroMas, y1, ’k-‘); % построены оси

end

После выполнения этой программы пользователь видит на экране соответствующий текст, вводит нужные значения и получает график:

МЕТОД ПОИСКА МИНИМУМА ФУНКЦИИ С ИСПОЛЬЗОВАНИЕМ ЧИСЕЛ ФИБОНАЧЧИ

Применен для указанной функции: y=(x+2)*(x-4)

ВВОД ИСХОДНЫХ ДАННЫХ точность по аргументу, края диапазона поиска

Одномерная оптимизация методом чисел Фибоначчи

ЗАДАЧА найти минимум указанной ниже функции

y=(x+2)*(x-4)

в интервале, определяемом пользователем, точность по аргументу=0.01 левый край интервала поиска=-10, правый край интервала поиска=10

ЧИСЛА ФИБОНАЧЧИ

НОМЕР числа Фибоначчи: 1 ЧИСЛО ФИБОНАЧЧИ: 1

НОМЕР числа Фибоначчи: 2 ЧИСЛО ФИБОНАЧЧИ: 2

НОМЕР числа Фибоначчи: 3 ЧИСЛО ФИБОНАЧЧИ: 3

НОМЕР числа Фибоначчи: 4 ЧИСЛО ФИБОНАЧЧИ: 5

НОМЕР числа Фибоначчи: 5 ЧИСЛО ФИБОНАЧЧИ: 8

НОМЕР числа Фибоначчи: 6 ЧИСЛО ФИБОНАЧЧИ: 13

НОМЕР числа Фибоначчи: 7 ЧИСЛО ФИБОНАЧЧИ: 21

НОМЕР числа Фибоначчи: 8 ЧИСЛО ФИБОНАЧЧИ: 34

НОМЕР числа Фибоначчи: 9 ЧИСЛО ФИБОНАЧЧИ: 55

НОМЕР числа Фибоначчи: 10 ЧИСЛО ФИБОНАЧЧИ: 89

НОМЕР числа Фибоначчи: 11 ЧИСЛО ФИБОНАЧЧИ: 144

НОМЕР числа Фибоначчи: 12 ЧИСЛО ФИБОНАЧЧИ: 233

НОМЕР числа Фибоначчи: 13 ЧИСЛО ФИБОНАЧЧИ: 377

НОМЕР числа Фибоначчи: 14 ЧИСЛО ФИБОНАЧЧИ: 610

НОМЕР числа Фибоначчи: 15 ЧИСЛО ФИБОНАЧЧИ: 987

НОМЕР числа Фибоначчи: 16 ЧИСЛО ФИБОНАЧЧИ: 1597

НОМЕР числа Фибоначчи: 17 ЧИСЛО ФИБОНАЧЧИ: 2584

ВЫВОД ЧИСЕЛ ФИБОНАЧЧИ ЗАВЕРШЕН

ВЫВОД ПРОМЕЖУТОЧНЫХ РЕЗУЛЬТАТОВ ПОШАГОВО

число Фибоначчи номер: 13 аргумент: 5.2786 функция от него: 9.3067

число Фибоначчи номер: 12 аргумент: 0.55728 функция от него: -8.804

число Фибоначчи номер: 11 аргумент: 1.6718 функция от него: -8.5486

 

Часть вывода вырезана

число Фибоначчи номер: 3 аргумент: 0.99845 функция от него: -9

число Фибоначчи номер: 2 аргумент: 1.0139 функция от него: -8.9998

число Фибоначчи номер: 1 аргумент: 0.99071 функция от него: -8.9999

ВОПРОС выводить пошагово как таблицу? Да=1 нет=0 1

ВОПРОС выводить график? Да=1 нет=0 1

вывод результатов

номер= 1 аргумент= 5.279 функция= 9.307

номер= 2 аргумент= 0.557 функция= -8.804

номер= 3 аргумент= 1.672 функция= -8.549

номер= 4 аргумент= -0.132 функция= -7.720

номер= 5 аргумент= 1.246 функция= -8.939

номер= 6 аргумент= 1.509 функция= -8.741

номер= 7 аргумент= 1.084 функция= -8.993

номер= 8 аргумент= 1.184 функция= -8.966

номер= 9 аргумент= 1.022 функция= -9.000

номер= 10 аргумент= 1.060 функция= -8.996

номер= 11 аргумент= 0.998 функция= -9.000

номер= 12 аргумент= 1.014 функция= -9.000

номер= 13 аргумент= 0.991 функция= -9.000

НАЙДЕН МИНИМУМ

оптимальное значение аргумента=0.99071

минимум функции=-8.9999 с точностью: 0.00010783

выполнено: 13 итераций

Рис. 2.2. Пример вывода на экран при оптимизации методом чисел Фибоначчи


 

Рис. 2.3. Пример вывода на экран при оптимизации методом локализации экстремума

Вывод результатов исполнения той же программы при изменении условий проведения поиска:

МЕТОД ПОИСКА МИНИМУМА ФУНКЦИИ ЛОКАЛИЗАЦИЕЙ ЭКСТРЕМУМА

Применен для указанной функции: y=(x+2)*(x-4)

ВВОД ИСХОДНЫХ ДАННЫХ края диапазона поиска, точность по аргументу ИЛИ по функции

Одномерная оптимизация методом локализации экстремума

ЗАДАЧА найти минимум указанной ниже функции

• y=(x+2)*(x-4)

в интервале, определяемом пользователем

введите левую границу диапазона поиска=-10

введите правую границу диапазона поиска=10

ВОПРОС завершение работы по минимальному изменению функции? Да=1 нет=00

введите допустимую погрешность по аргументу: 0.1

очередная итерация

аргумент: -5 функция: 27

аргумент: 0 функция: -8

аргумент: 5 функция: 7

аргумент: 10 функция: 72

В ДАННОЙ ИТЕРАЦИИ оптимальный аргумент: 0 минимальная функция: -8

очередная итерация

аргумент: -2.5 функция: 3.25

аргумент: 0 функция: -8

аргумент: 2.5 функция: -6.75

аргумент: 5 функция: 7

В ДАННОЙ ИТЕРАЦИИ оптимальный аргумент: 0 минимальная функция: -8

очередная итерация

аргумент: -1.25 функция: -3.9375

аргумент: 0 функция: -8

аргумент: 1.25 функция: -8.9375

аргумент: 2.5 функция: -6.75

Часть вывода вырезана

В ДАННОЙ ИТЕРАЦИИ оптимальный аргумент: 1.0156 минимальная функция: -8.9998

очередная итерация

аргумент: 0.97656 функция: -8.9995

аргумент: 1.0156 функция: -8.9998

аргумент: 1.0547 функция: -8.997

аргумент: 1.0938 функция: -8.9912

В ДАННОЙ ИТЕРАЦИИ оптимальный аргумент: 1.0156 минимальная функция: -8.9998

очередная итерация

аргумент: 0.99609 функция: -9

аргумент: 1.0156 функция: -8.9998

аргумент: 1.0352 функция: -8.9988

аргумент: 1.0547 функция: -8.997

В ДАННОЙ ИТЕРАЦИИ оптимальный аргумент: 0.99609 минимальная функция: -9

ВОПРОС выводить пошагово как таблицу? Да=1 нет=0 1

ВОПРОС выводить график? Да=1 нет=0 1

вывод результатов

номер= 1 аргумент=-10.000 функция=112.000

номер= 2 аргумент= -5.000 функция= 27.000

номер= 3 аргумент= 0.000 функция= -8.000

номер= 4 аргумент= 5.000 функция= 7.000

номер= 5 аргумент= 10.000 функция= 72.000

номер= 6 аргумент= -5.000 функция= 27.000

номер= 7 аргумент= -2.500 функция= 3.250

номер= 8 аргумент= 0.000 функция= -8.000

номер= 9 аргумент= 2.500 функция= -6.750

номер= 10 аргумент= 5.000 функция= 7.000

номер= 11 аргумент= -2.500 функция= 3.250

номер= 12 аргумент= -1.250 функция= -3.938

номер= 13 аргумент= 0.000 функция= -8.000

номер= 14 аргумент= 1.250 функция= -8.938

номер= 15 аргумент= 2.500 функция= -6.750

Часть вывода вырезана

номер= 39 аргумент= 1.055 функция= -8.997

номер= 40 аргумент= 1.094 функция= -8.991

номер= 41 аргумент= 0.977 функция= -8.999

номер= 42 аргумент= 0.996 функция= -9.000

номер= 43 аргумент= 1.016 функция= -9.000

номер= 44 аргумент= 1.035 функция= -8.999

номер= 45 аргумент= 1.055 функция= -8.997

НАЙДЕН МИНИМУМ

оптимальное значение аргумента=0.99609

минимум функции=-9 с точностью: 0.0017548

 

Часть вывода вырезана

аргумент: -1.4 функция: -3.24

аргумент: -1.2 функция: -4.16

аргумент: -1 функция: -5

аргумент: -0.8 функция: -5.76

аргумент: -0.6 функция: -6.44

аргумент: -0.4 функция: -7.04

аргумент: -0.2 функция: -7.56

аргумент: -2.0539e-015 функция: -8

аргумент: 0.2 функция: -8.36

аргумент: 0.4 функция: -8.64

аргумент: 0.6 функция: -8.84

аргумент: 0.8 функция: -8.96

Аргумент: 1 функция: -9

yeps % Это означает, что функция прервала свою работу при достожении минимального изменения по у

ВОПРОС выводить пошагово как таблицу? Да=1 нет=0 1

ВОПРОС выводить график? Да=1 нет=0 1

вывод результатов

номер= 1 аргумент= -9.800 функция=107.640

номер= 2 аргумент= -9.600 функция=103.360

номер= 3 аргумент= -9.400 функция= 99.160

Часть вывода вырезана

номер= 48 аргумент= -0.400 функция= -7.040

номер= 49 аргумент= -0.200 функция= -7.560

номер= 50 аргумент= -0.000 функция= -8.000

номер= 51 аргумент= 0.200 функция= -8.360

номер= 52 аргумент= 0.400 функция= -8.640

номер= 53 аргумент= 0.600 функция= -8.840

номер= 54 аргумент= 0.800 функция= -8.960

номер= 55 аргумент= 1.000 функция= -9.000

НАЙДЕН МИНИМУМ

оптимальное значение аргумента=1 с точностью (по аргументу): 0.2

минимум функции=-9 с точностью (по функции): 0.04

выполнено: 55 итераций

Рис. 2.4. Пример вывода на экран при применении метода обратного половинного шага

Вывод результатов исполнения той же программы при изменении условий проведения поиска:

Часть вывода вырезана

аргумент: -0.2 функция: -7.56

аргумент: -2.0539e-015 функция: -8

аргумент: 0.2 функция: -8.36

аргумент: 0.4 функция: -8.64

аргумент: 0.6 функция: -8.84

аргумент: 0.8 функция: -8.96

аргумент: 1 функция: -9

аргумент: 1.2 функция: -8.96

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

dx = -0.1000

аргумент: 1.1 функция: -8.99

аргумент: 1 функция: -9

xeps

ВОПРОС выводить пошагово как таблицу? Да=1 нет=0 1

ВОПРОС выводить график? Да=1 нет=0 1

вывод результатов

номер= 1 аргумент= -9.800 функция=107.640

номер= 2 аргумент= -9.600 функция=103.360

номер= 3 аргумент= -9.400 функция= 99.160

номер= 4 аргумент= -9.200 функция= 95.040

номер= 5 аргумент= -9.000 функция= 91.000

номер= 6 аргумент= -8.800 функция= 87.040

Часть вывода вырезана

номер= 54 аргумент= 0.800 функция= -8.960

номер= 55 аргумент= 1.000 функция= -9.000

номер= 56 аргумент= 1.200 функция= -8.960

номер= 57 аргумент= 1.100 функция= -8.990

номер= 58 аргумент= 1.000 функция= -9.000

НАЙДЕН МИНИМУМ

оптимальное значение аргумента=1 с точностью (по аргументу): 0.1

минимум функции=-9 с точностью (по функции): 0.01

выполнено: 58 итераций

 

Метод золотого сечения

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

или ,

где – длина всего отрезка; – длина его большей части; – длина его меньшей части.

Рис. 2.5. Графическая иллюстрация правила золотого сечения

 

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

Из рис. 2.5 следует, что:

. (1)

Тогда, подставляя в (1) соотношение (2) получим:

 

. (2)

Обозначив отношение и подставив его в (2), получим:

, (3)

откуда следует:

. (4)

Решение этого уравнения дает:


Поделиться:



Популярное:

  1. III ГЛАВА. ИНТЕРЬЕР И АРХИТЕКТУРНО – ПРОЕКТИРОВОЧНОЕ РЕШЕНИЕ ШКОЛЫ БУДУЩЕГО
  2. Архитектурно - конструктивное решение
  3. ВАШЕ РЕШЕНИЕ ЗАНЯТЬСЯ САМОСОВЕРШЕНСТВОВАНИЕМ: «КАЙЗЕН»
  4. Внешние экологические эффекты. Решение а. Пигу
  5. ВОПРОС 20 Понятие «управленческое решение» Классификая Управленческих решений
  6. г. Крайняя необходимость и её разрешение
  7. Глава 3. Решение игр в смешанных стратегиях
  8. Глава 5. Те, кто отрицает Воскрешение, и опровержение их доводов
  9. Глава шестая. Морган принимает решение захватить Пуэрто-Бельо, собирает флот и овладевает городом с горстью пиратов
  10. График успеваемости по курсу «Решение прикладных задач»
  11. Задача 1. Решение нелинейного уравнения
  12. Имеются ли основания для признания недействительной сделки, заключенной между подругами? Изменится ли решение, если на момент заключения сделки обоим девочкам было по 13 лет?


Последнее изменение этой страницы: 2017-03-03; Просмотров: 598; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.386 с.)
Главная | Случайная страница | Обратная связь