Материал: Matlab. Практический подход. Самоучитель

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Глава 5. Решение уравнений и оптимизация

Вот эти команды (жирным шрифтом выделен ввод пользователя):

>>f1=@(x)(x(1)^2+2*x(1)*x(2)-x(1)-14);

>>f2=@(x)(3*x(2)+x(1)*x(2)^2-27);

>>f={f1 f2};

>>NSolve(f,[6,10],100)

ans =

23

>>NSolve(f,[8,-5],100) ans =

7.2353 -2.1502

Командами f1=@(x)(x(1)^2+2*x(1)*x(2)-x(1)-14) и f2=@(x) (3*x(2)+x(1)*x(2)^2-27) задаются функции уравнений системы, а переменные f1 и f2 являются указателями на эти функции.

На заметку

Функции системы уравнений определяются так, что у них один аргумент – список значений независимых переменных. При описании функции NSolve() неявно предполагалось, что обрабатываются именно такие функции.

Список указателей создается командой f={f1 f2}. Как отмечалось выше, указатели на функции формируют список ячеек. Список ячеек создается с использованием фигурных скобок.

Командой NSolve(f,[6,10],100) пытаемся найти решение системы уравнений. Здесь мы используем 100 итераций, а в качестве начальных приближений указаны значения 6 для первой переменной (т.е. переменной x ) и 10 для второй переменной (т.е. переменной y ). В результате находим решение x = 2 и y = 3 . Если воспользоваться командой NSolve(f,[8,-5],100), в которой указаны иные начальные приближения для поиска решения системы уравнений, в результате получаем решение x ≈ 7.2353 и y ≈ −2.1502 .

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

231

k =1
n
fk (x1,x2,...,xn )2

Самоучитель Matlab

Оптимизация

Денег мало, а любить людей нужно много.

Б. Ельцин

Задача по решению системы алгебраических уравнений тесно связана с задачей поиска экстремума. Внесем ясность в этот вопрос. Для чего представим, что нужно решить систему уравнений вида fk (x1,x2,...,xn ) = 0 относительно переменных xk (индекс k = 1,2,...,n ). Как часто бывает в математике, вместо того, чтобы решать одну задачу, решим другую. А имен-

но, рассмотрим такую функцию Φ(x1,x2,...,xn ) =

.

Функция Φ(x1,x2,...,xn ) представляет собой сумму квадратов функций fk (x1,x2,...,xn ) (индекс k = 1,2,...,n ), определяющих систему уравнений. Что можно сказать о функции Φ(x1,x2,...,xn )? Очевидно, что она неотрицательна, поскольку равна сумме неотрицательных значений. Ее гипотетическое минимальное значение равняется нулю – меньше быть не может. Причем в ноль функция Φ(x1,x2,...,xn ) обращается, если все ее слагаемые равны нулю, то есть если для всех индексов k = 1,2,...,n выполняется условие fk (x1,x2,...,xn ) = 0 . Другими словами, если мы найдем такие значения xk (индекс k = 1,2,...,n ), при которых Φ(x1,x2,...,xn ) = 0 (это минимальное значение функции Φ(x1,x2,...,xn )), тем самым решим систему уравнений.

На заметку

Мало найти минимум функции Φ(x1,x2,...,xn ). Необходимо, чтобы это был нулевой минимум.

Рассмотрим те средства, которые представлены в Matlab для поиска экстремумов функций. Сразу отметим, что существует несколько типов или классов задач, подразумевающих поиск экстремумов (локальных или абсолютных). Здесь мы рассмотрим только несколько основных задач в контексте тех встроенных утилит, которые есть в Matlab.

Для поиска локального минимума скалярной функции одного аргумента на конечном интервале используется функция fminbnd(). Функция имеет несколько вариантов вызова. Наиболее типичный – с тремя аргументами. Пример использования функции приведен в документе на рис. 5.22.

Командой f=@(x)(x.*(x-2).*(x-5).*(x-10)) создается функция для вычисления экстремумов. Чтобы представить, какая это функциональная зависимость, командами ezplot(f,[-1 11]) и grid on отображаем график функции и координатную сетку. Результат построения представлен на рис. 5.23.

232

Глава 5. Решение уравнений и оптимизация

Рис. 5.22. Поиск экстремума скалярной функции одного аргумента

Для создания графика мы использовали функцию быстрого создания графики ezplot(). Первым аргументом функции ezplot() передается указатель на отображаемую на графике функцию, а второй аргумент – список из двух элементов, определяющий диапазон изменения аргумента. Функциональная зависимость f (x) = x(x −2)(x − 5)(x −10) имеет два минимума и два максимума. Если воспользоваться командой [x y]=fminbnd(f,-1,11), будет выполняться поиск минимума для функции, определенной через указатель f, а поиск минимума выполняется на интервале от -1 до 11. Хотя минимумов на этом интервале два, находится только один из них – тот, что находится в интервале между точками x = 5 и x = 10 . Чтобы найти локальный минимум, попадающий в интер-

233

Самоучитель Matlab

Рис. 5.23. График функции для поиска экстремума

вал между точками x = 0 и x = 2 , нужно изменить границы диапазона поиска минимума, как, например, в команде [x y]=fminbnd(f,-1,2).

С поиском локальных максимумов дело обстоит еще хуже. Чтобы найти локальный максимум функции y = f (x) , достаточно найти локальный минимум функции y = −f (x). В данном случае для поиска максимума исходной функции на интервале от 2 до 6 используем команду [x y]=fminbnd (@(x)(-f(x)),2,6). Первым аргументом функции fminbnd() указана инструкция @(x)(-f(x)). Это указатель на анонимную функцию, действие которой на аргумент x состоит в вычислении значения f(x), где f есть указатель на исходную функцию.

На заметку

Обратите внимание, что в последнем случае вычисляется минимум функции y = −f (x). Точка минимума этой функции совпадает со значением точки максимума функции y = f (x) . Соответствующий аргумент возвращается как результат. Что касается возвращаемого значения функции, то это значение функции y = −f (x).

Для поиска минимума функции нескольких аргументов используют функцию fminsearch(). Аргументами функции указывают указатель на иссле-

234

Глава 5. Решение уравнений и оптимизация

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

Рис. 5.24. Поиск экстремума функции нескольких переменных

Здесь ищется минимум функции f (x,y) = x2 −2xy + 2y2 − 4x . У функции минимум один, и это точка x = 4 и y = 2 . Для поиска минимума командой f=@(x)(x(1)^2-2*x(1)*x(2)+2*x(2)^2-4*x(1)) задаем функцию для поиска минимума, а командой [x z]=fminsearch(f,[3,1]) этот минимум вычисляется. В качестве начальной указана точка x = 3 и y = 1 . Как видим, решение найдено правильно. Однако обольщаться не стоит – просто в данном случае пример достаточно тривиальный.

На заметку

Помимо приведенных выше, в Matlab есть еще достаточно большое количество встроенных функций для решения специальных задач по оптимизации – в основном из пакета инструментов Optimization Toolbox. Этот пакет инструментов содержит множество полезных утилит для решения задач по оптимизации (в широком смысле этого понятия). Однако описание этой темы требует серьезного углубления в математическую суть вопроса, а это выходит за рамки книги.

235

Источник: https://studfile.net/preview/16433384/