ЛАБОРАТОРНАЯ РАБОТА 1
Минимизация функций в MATLAB
Минимизация унимодальной функции одной переменной
1.1. Для отыскания минимума унимодальной функции на заданном отрезке используется функция fminbnd, основанная на алгоритме золотого сечения.
Вызов функции в простейшем варианте проводится оператором:
x = fminbnd(fun, a, b).
Здесь fun – минимизируемая функция – может быть задана либо в виде формулы, заключённой в кавычки, либо в виде ссылки на функцию, составленную пользователем;
a, b – начало и конец интервала поиска.
При этом возвращается значение аргумента x в точке минимума.
Вызывая справочную функцию help, изучить параметры и способы использования функции fminbnd.
>> help fminbnd
Поместите пояснения в отчёт.
Пример 1.
Найти значение аргумента в точке минимума функции x3–2x на отрезке [0, 2].
В командной строке задайте:
>> x = fminbnd('x^3-2*x', 0, 2)
Результат запишите.
1.2. Чтобы функция возвратила минимальное значение, при найденном аргументе, задайте следующую команду:
>> [x, f] = fminbnd('x^3-2*x', 0, 2)
|
|
Результат запишите. Дайте пояснения.
Измените команду в виде:
>> [x, f, e_flag, out] = fminbnd('x^3-2*x', 0, 2)
Объясните полученные результаты.
В режиме редактирования (>> edit) с помощью следующих операторов создайте новую функцию:
function y=fun(x)
y= x^3-2*x;
Сохраните её в m-файл под именем fun.m, располагая его в рабочей папке по согласованию с преподавателем.
Обратитесь к функции поиска минимума в виде:
[x, f] = fminbnd(@fun, 0, 2)
Результаты всех вычислений запишите.
1.3. Самостоятельно найдите минимумы функций, заданных в табл.1, согласно варианту. Используйте различные формы обращения к функции fminbnd. Результаты приведите в отчёте и прокомментируйте.
Таблица 1.
Вариант | Вид функции fun(x) | Интервалы поиска |
1(1, 9, 17) | x2–x–2 | [0, 1] |
2(2, 10, 18) | 3x4–4x3–12x2 | [–2, 0]; [0, 3] |
3(3, 11, 19) | cos x + ch x | [–1, 1] |
4(4, 12, 20) | | x | – x2 | [–1, 1] |
5(5, 13, 21) | x3–6x2+9x–4 | [0, 4] |
6(6, 14, 22) | x4–2x2 | [–2, 0]; [0, 2] |
7(7, 15, 23) | x(x–1)2 (x–2)2 | [0, 1]; [1, 2] |
8(8, 16, 24) | x + 1/x | [–2, 2] |
9(9, 18, 3) | 2x / (1 + x2) | [–2, 0] |
10(10, 19, 1) | (x2 – 3x + 2)/(x2 + 2x + 1) | [0, 2] |
11(11, 20, 2) | (2x – x2)1/2 | [0, 2] |
12(12, 21, 3) | x(x – 1)1/3 | [0, 1] |
13(13, 22, 4) | 1 – x e–x | [0, 2] |
14(14, 23, 5) | x1/2 ln x | [0, 1] |
15(15, 24, 6) | (ln 2 x) /x | [0.5, 1.5] |
16(16, 3, 7) | cos x + 0.5 cos 2x | [0, 2]; [6, 8] |
17(17, 10, 4) | 10/(1 + sin2 x) | [0, 2]; [4, 6] |
18(18, 11, 5) | 0.5 ln(1 + x2) – arc tg x | [0, 2] |
19(19, 12, 6) | ex sin x | [–1, 0]; [5, 6] |
20(20, 13, 9) | | x |e– |x – 1| | [–1, 1] |
21(21, 14, 8) | 2x | [–1, 5] |
22(22, 15, 10) | x2 – 4x + 6 | [–3, 10] |
23(23, 16, 9) | | x2 – 3x + 2 | | [–10, 10] |
24(24, 18, 5) | (5 – 4x)1/2 | [–1, 1] |
1.4. Выполните следующие команды:
f = inline('sin(x)+3');
x = fminbnd(f,2,5)
получим
x = 4.7124
С помощью следующего оператора можно получить значение минимизируемой функции в точке минимума:
[x, y] = fminbnd(f,2,5)
x = 4.7124
y = 2.0000
С помощью функции help изучите описание функции inline. Пояснения запишите в отчёт.
|
|
Далее выполните
f = inline('x^3-2*x');
x = fminbnd(f,0,3)
и
f = inline('x^3-2*x');
[x, y] = fminbnd(f,0,3)
Поясните полученные результаты.
1.5. В режиме редактирования:
>> edit
набрать текст программы:
function prog15_3
xx=-2:0.1:3;
yy=fun(xx);
plot(xx,yy,'k-')
hold on; grid;
xlabel('x'); ylabel('y');
[x,f]=fminbnd(@fun,-2,0)
line(x,f, 'Marker', '.', 'MarkerSize', 20);
[x,f]=fminbnd(@fun,0,3)
line(x,f, 'Marker', '.', 'MarkerSize', 20);
function y=fun(x)
y= 3*x.^4-4*x.^3-12*x.^2;
Сохранить программу как m-файл с именем prog15_3.m в рабочей директории с помощью команды «Сохранить как».
Примечание: незнакомые выражения языка MATLAB изучить, используя режим справки help.
Вызвать написанную программу из командной строки:
>> prog15_3
Результат прокомментировать
x = -1.0000
f = -5.0000
x = 2.0000
f = -32.0000
Привести рисунок:
1.6. Создать в рабочей папке файл fun.m, содержащий текст:
function y=fun(x)
y= 3*x.^4-4*x.^3-12*x.^2;
Выполнить команду:
[x,f]=fminbnd(@fun,-2,3)
Прокомментировать результат
x = 2.0000
f = -32.0000
1.7. Провести исследование следующей функции, для чего повторить шаги:
– Редактирования,
– Сохранения в файл,
– Вызова.
function prog15_4
line([-2,-eps],[g(-2),g(-eps)]);
hold on; grid off;
line([eps,2],[g(eps),g(2)]);
xlabel('x'); ylabel('y');
[x,f]=fminbnd(@g,-2,2)
line(x,f, 'Marker', '.', 'MarkerSize', 20);
function y=g(x)
if x<=0
y=-x-1;
else
y=x+1;
end
>> prog15_4
x = -1.9290e-005
f = -1.0000
Ответьте на вопрос, как изменится результат, если в определении целевой функции g(x) заменить условие if x<=0 на if x<0?
Результаты работы по данному пункту отразить в отчёте.