Вычисление локального минимума функции одной переменной на заданном отрезке выполняет функция fminbnd. При использовании функции поиска минимума рекомендуется предварительно построить график исследуемой функции, чтобы точнее определить отрезки поиска минимума:
[x, y] = fminbnd(fun, a, b),
где fun – может быть указатель на функцию, или имя файл-функции ( m-файла ), заключенное в апострофы, или символьное выражение, определяющее функциональную зависимость (формулу), заключенное в апострофы.
a, b – границы отрезка, на котором ищется минимум.
Результат – вектор, состоящий из двух значений: x – аргумент функции (вычисленное значение), при котором достигается минимум; y – значение функции в точке минимума;
Например, найдем локальные минимумы для функции e-x*sin(3pi*x) на отрезке [0 2]
f=@ (x) (exp(-x).*sin(3*pi.*x));
>> fplot(f,[0 2])
>> grid on
Из графика видно, что на этом у этой функции 3 локальных минимума. Можно последовательно найти локальные минимумы на 3-х отрезках.
1-ый локальный минимум
>> [x,y]=fminbnd(f,0,1)
x =
0.4888
y =
-0.6099
2-ой локальный минимум
>> [x,y]=fminbnd(f,1,1.5)
x =
1.1555
y =
-0.3132
3-ий локальный минимум
>> [x,y]=fminbnd(f,1.5,2)
x =
1.8221
y =
-0.1608
Если хотим получить только значение аргумента, при котором функция будет иметь минимальное значение, то обращение к функции будет таким:
>> х=fminbnd(f,1,1.5)
х =
1.1555
Для нахождения локального максимума не предусмотрено специальной функции. Можно найти максимум, используя fminbnd для функции, имеющей обратный знак.
>> fplot(f,[0 2])
hold on
grid on
[x y]=fminbnd(@ (x) (-f(x)), 1, 1.5)
x =
1.4888
y =
-0.2244
>> hold on
>> plot(x,-y,'*r') %точка max
Решение системы линейных уравнений.
Рассмотрим еще одну типовую задачу вычислительной математики: решение системы линейных уравнений.
a11x1+a12x2+…+a1nxn=b1
a21x1+a22x2+…+a2nxn=b2
………………………….
am1x1+am2x2+…+amnxn=bm
Система может быть записана в матричном виде: A*x=b, где x ={xj}- вектор неизвестных, A={aij} – матрица коэффициентов при неизвестных (матрица системы), b={bj} – вектор свободных членов (правых частей) (i=1…m, j=1,,,n). Существует множество методов решения систем линейных уравнений (правило Крамера, метод обратной матрицы, метод Гаусса и т.д.).
Простейшим случаем является квадратная крамеровская система A*x=b, у которой определитель не равен 0 .. Такая система имеет единственное решение – x=A-1b, в терминах ML это x=inv(A)*b.
Для решения этой системы существует альтернативная запись: A\ b (операция обратного деления).
В матричной алгебре
X= B/A = B*A-1 (решает уравнение X*A=B)
X= B\A = B-1 *A
X= A\B = A-1 *B (решает уравнение A*X=B)
С векторами и матрицами – иначе. Пусть A – матрица, а Х – вектор.
А * Х = В и Х * А = В – разные уравнения.
Для решения уравнения Х * А = В используется обычное деление:
Х = B / A = В *А-1
Для решения уравнения А * Х = В используется обратное деление:
Х = А \ В = А-1 * В
Например, найдем корни линейного уравнения вида:
x1 - 3x2 +4x3= 11
2x1 + x2 -7x3= 8
x1- 6x2 - x3=-5
Для решения этой системы сначала составим матрицу коэффициентов левой части - A и вектор правых частей – B. Затем решим систему, подставив
Решим уравнение вида A*X=B:
>> A=[1, -3, 4; 2, 1 -7; 1, -6, -1]; % матрица коэффициентов левой части
>> B=[11; 8; -5]; % вектор столбец правых частей
>>X=A \ B
X =
9.6750
2.1250
1.9250
Проверим полученное решение, выполнив умножение A*X:
>> A*X % проверка
ans =
11.0000
8.0000
-5.0000
В результате получили вектор правых частей, что доказывает правильность найденного решения.
Или по-другому:
Решение системы X=A-1*B
>> A=[1, -3, 4; 2, 1 -7; 1, -6, -1]; % матрица коэффициентов левой части
B=[11; 8; -5];
>> X=inv(A)*B
X =
9.6750
2.1250
1.9250
Может оказаться удобным предоставить пользователю возможность выбора того или иного пункта задания. Для этого можно организовать работу с помощью выпадающего меню.
Для реализации такого решения можно воспользоваться командами eval. и menu.
Функция eval. В ML имеется возможность сформировать требуемую команду в виде строки символов, а затем выполнить ее, как обычную команду, набранную в командном окне. Для этого предназначена встроенная функция eval.
Метод задания команд в виде текстовых строк и их выполнения с помощью этой функции используется при написании m -файлов.
Функция еval (<текст>) предназначена для выполнения команды, заданной текстом, как команды ML.
Например, eval (‘2*2+3’) выводит на экран 7. Аргументом функции может быть также строковая переменная.
Команда eval (‘<имя скрипт-файла>’) вызовет выполнение операторов, находящихся в файле с соответствующим именем.
Функция menu. Эта функция предназначена для вывода на экран окна с выпадающим меню, которое имеет заголовок и кнопки с названиями пунктов меню. Количество кнопок, равное количеству пунктов меню, определяется количеством параметров функции menu:
k= menu (‘<заголовок меню>’,’<назв. пункта 1>’,…,’<назв. пункта n>’)
Номер выбранной кнопки является результатом функции menu.
П р и м е р. Пусть необходимо построить график функции на заданном интервале от 0 до 2 pi, цветом, выбранным из меню.
Напишем script-файл:
k=menu ('цвет','красный', 'зеленый','синий')
color=['r'
'g'
'b'];
t=0:0.1:2*pi;
s=sin(t);
plot(t,s,color(k))
При выполнении этого скрипт-файла функция menu выводит на экран окно, изображенное на рисунке.
При нажатии на одну из кнопок с названием цвета номер этой кнопки становится результатом функции menu и попадает в переменную k. Вектор-столбец color содержит атрибуты цвета для построения графика. По номеру k нужный атрибут выбирается из массива color и указывается в команде plot. В результате, выбрав нужный пункт меню, получим график функции, построенный выбранным цветом.
Для организации многократного выбора и выполнения нужных действий с помощью меню можно использовать цикл while и функцию eval. Для этого команды, реализующие необходимые действия, оформляются в виде скрипт-файлов: для каждого пункта меню – свой скрипт-файл. Затем необходимо задать символьную матрицу, например D, состоящую из названий файлов, соответствующих пунктам меню (заданий). Строки символьной матрицы должны иметь одинаковую длину. Команда return обеспечивает возврат из функции или скрипт-файла в точку вызова. В данном примере можно также использовать команду break, которая предназначена для досрочного прерывания цикла.
Предположим, что необходимо выполнить по выбору три задания в любом порядке:
D=[‘f1 ’
‘f2 ’
'f3 '
‘return‘];
n=1;
while n<4
n=menu(‘меню’, ’пункт1’, ’пункт2’, ’пункт3’, ’выход’)
eval(D(n,:))
end
Каждая строка символьной матрицы D содержит имя одного из файлов, реализующих соответствующий пункт меню. В n- й строке матрицы находится название файла, выполняющего n -й пункт меню. Обращение D(n,:) позволяет извлечь из матрицы D n- ю строку, содержащую название файла. В результате выполнения команды menu в n записывается номер выбранного пункта меню. Для выполнения файл-программы достаточно в командной строке указать имя этого скрипта. Функция eval с параметром D(n,:) запускает соответствующий скрипт-файл для выполнения.
Файл меню
%файл меню
d=['p1'
'p2'
'p3'
'p4'
'p5'
' '];
k=0;
while k~=6
k=menu('лаб.раб', 'нах.корней пол', 'реш.сист.лин.ур', 'макс.мин', 'выч.интегр', 'транс.ур', 'выход');
eval(d(k,:))
end;