Глава 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
Самоучитель 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