Добавил:
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

1-2 Моделирование / Matlab. Практический подход. Самоучитель

.pdf
Скачиваний:
769
Добавлен:
31.01.2021
Размер:
12.72 Mб
Скачать

Глава 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

Глава 6 Интегрирование

и дифференциальные уравнения

Ваше Высочество, здесь Вам никто ничего не скажет.

К/ф "Клуб самоубийц, или Приключения титулованной особы"

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

Задача о вычислении определенного интеграла возникает, кроме прочего,

при решении дифференциального уравнения dy = f (x,y) специального dx

вида с функцией f (x,y) в правой части, не зависящей от неизвестной функции y(x), то есть когда f (x,y) = f (x). В этом случае имеем дифференциаль-

ное уравнение вида dy = f (x). Это задача по определению первообразной dx

функции, если известна ее производная. Добавив сюда начальное условие

вида y(x0) = y0

, получим задачу Коши. Ее решение может быть представ-

 

x

лено в виде y(x) = y0 + f (z)dz . Таким образом, задача сводится к вычис-

x

x

0

лению определенного интеграла f (z)dz . Именно такого типа задачи рас-

смотрим для начала.

x0

 

Вычисление определенных интегралов

 

И силой нельзя, и отступать нельзя...

 

Б. Ельцин

Существуют разные алгоритмы вычисления в числовом виде определенных интегралов. Применимость того или иного метода во многом зависит от свойств подынтегральной функции на интервале интегрирования. В Matlab для вычисления определенных интегралов используется несколько функций, каждая из которых реализует тот или иной алгоритм. Список этих функций приведен в табл. 6.1.

236

 

 

Глава 6. Интегрирование и дифференциальные уравнения

Табл. 6.1. Функции для выполнения численного интегрирования

 

 

 

 

Функция

 

Описание

 

 

 

 

 

Вычисление интеграла методом квадратур Симпсона. Аргумен-

 

quad()

тами функции обычно указывают: указатель на подынтеграль-

 

ную функцию и границы интегрирования. Также можно в явном

 

 

виде указать точность результата (по умолчанию составляет ве-

 

 

личину 10−6 )

 

 

Вычисление интеграла методом квадратур Лобатто. Первым ар-

 

quadl()

гументом передается указатель на подынтегральную функцию.

 

Кроме этого, указываются границы диапазона интервала инте-

 

 

грирования. Можно явно указать точность вычислений, равную

 

 

по умолчанию 10−6

 

 

Вычисление интеграла методом квадратур Гаусса-Кронрода.

 

quadgk()

Аргументами методу передаются: указатель на подынтеграль-

 

ную функцию, нижняя граница интегрирования и верхняя грани-

 

 

ца интегрирования. Также может указываться до четырех опций

 

 

(в формате опция-запятая-значение)

 

 

 

 

quadv()

Вычисление интеграла методом квадратур Симпсона для век-

 

торных функций скалярного аргумента. Аргументы такие же, как

 

 

у функций quad() и quadl()

 

 

Вычисление двойного интеграла на плоскости. Первый аргу-

 

 

мент функции – указатель на подынтегральную функцию (двух

 

 

переменных). Кроме того, указываются пределы интегрирова-

 

 

ния (четыре аргумента) по внешней (второй и третий аргументы)

 

quad2d()

и внутренней (четвертый и пятый аргументы) переменным. Если

 

по внутренней переменной пределы интегрирования непосто-

 

 

янные, четвертый и/или пятый аргументы могут быть указателя-

 

 

ми на функции, определяющими уравнение границ области ин-

 

 

тегрирования. Также в формате опция-запятая-значение могут

 

 

задаваться дополнительные аргументы

 

 

 

 

 

Вычисление двойных интегралов по прямоугольной области.

 

 

Аргументами функции указываются указатель на подынтеграль-

 

dblquad()

ную функцию двух переменных, а также постоянные пределы

 

интегрирования по внешней и внутренней переменным. Также

 

 

можно указать точность вычислений (значение по умолчанию

 

 

10−6 ), а также метод вычислений (по умолчанию это метод ква-

 

 

дратур Симпсона)

 

 

 

 

 

Вычисление тройных интегралов по прямоугольному паралле-

 

 

лепипеду. Аргументы функции: указатель на подынтегральную

 

triplequad()

функцию трех переменных и постоянные границы интегриро-

 

вания по каждой из трех переменных. Можно явно указать точ-

 

 

ность (по умолчанию 10−6 ) и метод вычислений (по умолчанию

 

 

метод квадратур Симпсона)

 

 

 

 

 

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

237

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

цию (указатель на эту функцию или имя соответствующего файла). Второй и третий аргументы – пределы интегрирования. Также может указываться еще и точность вычислений (четвертый аргумент функции quad()). Пример использования этой функции для вычисления определенного интегра-

π 4

ла tg(x)dx = ln(2) приведен в документе на рис. 6.1.

2

0

Рис. 6.1. Вычисление определенного интеграла с помощью функции quad()

Интеграл вычисляется командой quad(@tan,0,pi/4). Первым аргументом функции quad() передается указатель на встроенную функцию вычисления тангенса. Второй и третий аргументы функции quad() – соответственно нижняя и верхняя границы интегрирования.

На заметку

Чтобы создать указатель на функцию, перед именем функции добавляем символ @.

Для сравнения приведен точный результат для интеграла (команда log(2)/2). Как видим, функция quad() в данном случае с задачей справилась. К сожалению, не всегда есть возможность так просто проверить результат вычислений.

В качестве примера применения встроенных функций интегрирования рассмотрим задачу о вычислении несобственного интеграла

π

 

exp(−x2)dx =

(интеграл Пуассона). Для вычисления интеграла

2

0

 

 

 

используем такую последовательность команд: f=@(x)(exp(-x.^2)) (определение подынтегральной функции) и quadgk(f,0,Inf) (непосредственное вычисление интеграла).

238

Глава 6. Интегрирование и дифференциальные уравнения

На заметку

Функции quad() и quadl() с таким интегралом не справляются.

Кроме того, для сравнения командой sqrt(pi)/2 вычисляется (в формате числа с плавающей точкой) точное значение для интеграла Пуассона. Результат вычислений представлен на рис. 6.2.

Рис. 6.2. Вычисление интеграла Пуассона

Стоит обратить внимание на то, что верхняя граница интегрирования указана как Inf.

На заметку

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

Еще один пример связан с вычислением двойного интеграла. Задача формулируется так: необходимо вычислить площадь области, ограниченной кривыми y = x и y = x2 . Сразу отметим, что точное значение для площади этой области равно 1 6 . Эта область находится между соответствующими кривыми. Кривые пересекаются в точках x = 0 и x = 1 . Область интегрирования представлена на рис. 6.3.

239

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

Рис. 6.3. Область интегрирования

Рис. 6.4. Вычисление площади области

240