Нахождение минимума функции на заданном отрезке




Вычисление локального минимума функции одной переменной на заданном отрезке выполняет функция 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;



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-04-27 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: