Решение
алгебраических уравнений и систем
или
Ван Гог в среде Mathcad
В. Очков
Cначала о терминах
статьи:
Нуль функции – это такое
значение ее аргумента, при котором функция равна нулю[1].
Корень алгебраического
уравнения – это такое значение его
неизвестного, при котором уравнение становится тождеством.
Корень системы алгебраических уравнений – это такое значение ее
неизвестных, при которых уравнения, входящие в систему, становятся
тождествами.
Решение
алгебраического уравнения или системы –
нахождение его (ее) корней
Рис.
1. Поиск корней уравнения средствами символьной математики Mathcad
Рис. 2. Численный
поиск корня уравнения
Рис. 2a. Численный поиск корня
уравнения с помощью слайдера Mathcad 2001
Рис. 2b. Численный поиск корня
уравнения с помощью слайдера Mathcad 2001
Рис.
3. «Рисунок» корней двухаргументной функции root
Рис. 3a. «Рисунок» корней функции Find при
одном неизвестном
Рис.
4. «Рисунок» корней четырехаргументной функции root
Рис.
5. Численный поиск корней системы двух нелинейных алгебраических уравнений
Рис.
5a. Выставление первого
приближения с помощью слайдера Mathcad
Рис.
7. Винсент Ван Гог «Пейзаж в Овере после дождя»
Рис.
6a. Выбор метода поиска
корней системы алгебраических уравнений
Рис.
7а. Картинка «Метод сопряженных градиентов»
Рис.
7в. Картинка «Квазиметод Ньютона»
Рис. D1. Аналитический поиск
корней системы двух нелинейных алгебраических уравнений
Одна из типичных задач, решаемых в среде Mathcad, – это поиск корней алгебраических уравнений и их систем[2]: нахождение значений неизвестных (неизвестного в случае одного уравнения), при которых уравнения превращаются в тождества. В среде Mathcad есть широкий набор инструментов (команд меню, функций и операторов) для численного, аналитического и графического решения этой задачи.
Основные особенности численного[3] поиска корней нелинейных[4] алгебраических уравнений и систем такие:
1. Определяется один корень из многих существующих. Какой именно корень будет найден – зависит главным образом от первого приближения к решению (guess values), который должен задать сам пользователь. Можно задать несколько приближений вектором. В этом случае Mathcad выдаст несколько корней.
2. Ищется не корень уравнения или системы, а значение неизвестного (неизвестных), при котором отклонение правых и левых частей уравнений (невязка) не превышает наперед заданного числа. В среде Mathcad по умолчанию оно равно 10-3 (значения системных переменных TOL и CTOL[5]).
3. Работа функций root и Find (а именно эти функции встроены в Mathcad для решения заглавной задачи статьи) имеет некий вероятностный и в каком-то смысле непредсказуемый характер, что отличает их от других встроенных функций Mathcad. Функция sin, например, всегда выдает «предсказуемый» ответ: каждому элементу множества «аргумент функции» соответствует вполне определенный элемент множества «значение функции». По отношению же к функциям root и Find такой четкости нет: эти функции могут возвратить совсем не то, что от них ожидают, или вообще аварийно прервать свою работу, попросив пользователя изменить некоторые параметры поиска и повторить расчет. Функция Find полностью контекстно зависима: значение, которое она возвращает, зависит не только и не сколько от значений ее аргументов, а от того, что возле нее (функции Find) записано. Это можно рассматривать как некое нарушение принципа функциональной зависимости, лежащего в основе математики.
Отметим также и особенности аналитического и графического поиска корней в среде Mathcad.
При
аналитическом поиске[6]
система Mathcad
пытается найти все корни с абсолютной (аналитической) точностью.
Из-за этого решение даже простейшей задачи часто заканчивается неудачей (см. рис. 1).
На рис. 1 показан аналитический (символьный[7]) поиск корней y уравнений sin(x)/x = 0 и sin(x) = 0. Хотя у этих уравнений корней бесчисленное множество[8], в первом случае вместо корня выдается сообщение об ошибке[9] «No solution was found», а у более простого второго уравнение sin(x) = 0 символьная математика Mathcad находит единственный корень х = 0.
Графика Mathcad в основном используется для верификации (проверки) правильности решения и/или для уточнения данных для первого приближения при численном поиске корней. На рис. 1 (и рис. 2, см. ниже), к примеру, показан график функции sin(x)/x, который на отрезке –10, 10 шесть раз (рис. 1) пересекает ось x, но на котором, тем не менее, «сломалась» символьная математика Mathcad.
Встроенная в Mathcad функция root ищет корень уравнения[10] численными методами. Начиная с Mathcad 2000, функция root может иметь не только два аргумента (используется комбинация методов Ньютона и секущих), но и четыре аргумента (метод половинного деления). В этом случае корень ищется не в близи точки начального приближения («двухаргументный» вариант функции root), а в интервале значений неизвестного, задаваемого двумя дополнительными аргументами. Работа функции root с уравнением sin(x)/x = 0 показана на рис. 2, рис. 2a и рис. 2b.
Но в статье графика Mathcad будет задействована не в совсем обычном аспекте – для визуализации функций, возвращающих корни уравнений и систем и имеющих в качестве аргументов значение первого приближения. Здесь открываются новые возможности не только для анализа тех или иных численных методов, реализованных в Mathcad, но и для…художественного творчества.
На рис. 3 и рис. 4 показано, какие корни уравнения sin(x)/x = 0 возвращает функция root в зависимости от значений первого приближения.
График на рис. 3 – это некий «портрет» метода Ньютона-секущих, суть которого такова. Через две точки (одна из которых – это первое приближение, а вторая отступает вправо от нового на расстояние TOL) проводится секущая, пересечение которой с осью х дает точку второго приближения. Но предварительно проверяется, чему рано значение функции в точке первого приближения: если оно меньше TOL, то задача считается решенной. Если нет – итерации продолжаются: секущие проводятся через новые пары точек. Только при первом приближении проводится не секущая, а фактически касательная (метод Ньютона).
Отсюда становится понятным график на рис. 3: когда значение х по модулю не превышает значение системной переменной TOL (10-3), то корень находится за одну итерацию (см. центр рис. 3), а если превышает, то за несколько итераций. При этом предугадать, какой именно корень будет найден, довольно трудно: значения корней разбросали в широком диапазоне (см. левый и правый край рис. 3).
Для поиска корня уравнения можно использовать также функцию Find, записывая перед ней не систему, а одиночное уравнение (рис. 3а).
В этом случае (рис. 3а) характер точек первого приближения вблизи критических точек[11] будет вполне предсказуем: функция Find базируется не различных модификациях градиентных методов (см. ниже) – решение «скатывается» либо влево, либо вправо. Одно плохо – функция Find работает на порядок медленнее функции root.
Функция root, возвращающая корень уравнения sin(x)/x = 0 методом половинного деления, как отмечено ранее, имеет не один, а два аргумента. Следовательно, ее визуализация требует уже не линии (рис. 3 и рис. 3а), а плоскости (рис. 4). Кроме того, при формировании функции Rt использовался оператор обработки ошибок: когда функция root не может выдать корень, то функция Rt возвращает значение 23 (число, больше чем 7p – максимальный корень на плоскости а – в). Это значение на рис. 4 «окрашено» в белый цвет, корни же имеют «топографическую» окраску: маленькие значения корней (-7×p) – синий цвет (глубины океана), а большие (7×p) – коричневый (вершины гор). Промежуточные корни «окрашены» в промежуточные цвета (голубой, зеленый, желтый). Все это вместе похоже на мозаичный мраморный пол или картину в стиле кубистов[12].
Для численного решения систем алгебраических уравнений как было уже отмечено выше, предназначена встроенная в Mathcad функция Find, работающая в паре с ключевым словом Given.
На рис. 5 показана работа функции Find по решению системы двух нелинейных алгебраических уравнений: функция Find возвращает тот или иной корень[13] в зависимости от значения первого приближения. Показано также, что при «неудачном» первом приближении (на рис. 5 это, к примеру, начало координат) работа функции Find прерывается сообщением об ошибке и призывом к пользователю изменить параметры поиска: первое приближение, значение системных переменных TOL и/или CTOL. Помочь выставить первое приближение к решению системы может слайдер (ползунок) Mathcad – см. рис. 5a.
Если первое приближение включает комплексные числа, то функция Find может вернуть комплексный (мнимый) корень – см. рис. 5a, где наша система записана в векторном виде, когда неизвестные системы являются не отдельными скалярными переменными (x, y, z etc), а элементами вектора x (x0, x1, x2 etc):
Но вернемся к четырем действительным корням системы. На рис. 6 поверхность x-y, раскрашена в четыре цвета в зависимости от того, какой корень из четырех существующих (см. рис. 5) был найден при первом приближении, взятом в данной «цветовой» области. «Белые пятна» на рис. 6 – это области, поиск корней из которых был прерван сообщением об ошибке.
Когда автор показал рис. 6 человеку, разбирающемуся в изобразительном искусстве, то он сказал, что это… «Пейзаж в Овере после дождя» Винсента Ван Гога («Landscape at Auveres after the rein» by Vincent Van Gogh). Правда, этот «искусствовед» не успел надеть свои очки, а рис. 6 был показан ему издали. Но при более детальном сравнении была отмечена схожесть цветовой гаммы и «фактуры» (полосы грядок) рисунков. Так ли это – пусть читатель решит сам, сравнив рис. 6 и рис. 7.
Но оставим в стороне «эстетическую сторону» рис. 6 и рис. 4[14] и поговорим о практических делах.
В среде Mathcad реализованы три метода решения систем алгебраических уравнений: метод Левенберга-Маркворта (Levenberg-Marquardt), метод сопряженных градиентов (Conjugate Gradient) и квазиметод Ньютона (Quasi-Newton – см. рис. 6a, где показано локальное меню, появляющееся после нажатия правой кнопки мыши на слове Find).
Так вот, рис. 6 – это «портрет» первого метода (он был выбран системой Mathcad автоматически для решения нашей системы самим пакетом Mathcad – см. позицию AutoSelect на рис. 6a), а рис 7a и рис. 7b –это «иллюстрации» двух других методов: Conjugate Gradient (рис 7a) и Quasi-Newton (рис. 7b).
Несложно оценить относительную площадь белых пятен на рис. 6, рис 7a и рис. 7b и дать некую количественную оценку методов решения систем нелинейных алгебраических уравнений, реализованных в Mathcad[15]. Вот как, например, будет выглядеть рис. 6, если повысить точность расчетов – изменить значения системных переменных TOL и CTOL с 10-3 (умолчание) на 10-15 (рис. 6b).
А сами же рисунки (рис. 6, рис 7a и рис. 7b) составляют некий триптих (три «живописных» полотна, объединенных одной темой), который можно использовать не только для оценки качества тех или иных методов поиска корней, но и для… эстетического наслаждения. Автор предлагает читателям подобрать другие уравнения системы с иной «картинкой» корней. В «картинку» на рис. 6 свою «красоту» привнесла лемниската («увитая цветами») Бернулли. Но в математике еще есть много других «красивых» кривых, которые могут передать свою «красоту» рисункам, подобным тому, какой показан на рис. 6.
Рис. D3. Решение задачи о размерах подводной лодки в среде будущей версии Mathcad
[1] Более правильно говорить не о корне функции, а о нуле функции. Но… см. статью.
[2] А к этому сводится решение многих математических, физических, химических и прочих предметных задач, когда необходимо, например, свести к равновесию какой-либо баланс и т.д.
[3] Функции численного решения этой задачи входят в состав Решателя (Solver), в разработке которого принимала участие фирма Frontline Systems, Inc (www.frontsys.com). Эта же фирма поставила Решатель и для другой популярной расчетной среды – для электронных таблиц Excel.
[4] Системы линейных алгебраических уравнений – это особая тема, которой в этой статье мы касаться не будем. Отметим только то, что линейные уравнения и системы – это частный случай нелинейности: линейную задачу вполне возможно решать «нелинейными» инструментами, хотя это, честно говоря, «забивание гвоздей микроскопом». В среде Mathcad есть особые инструменты для решения систем линейных уравнений, записанных в матричной форме (функция lsolve, например).
[5] В среде Mathcad до восьмой версии была одна системная переменная TOL (TOLerance – терпимость, снисходительность к погрешности). Затем эта переменная распалась на две TOL и СTOL. Теперь TOL «отвечает» за работу функций root, Find, Minimize, Maximize и MinErr, а СTOL – за ограничения (Constrains).
[6] В Mathcad встроено ядро символьной математики из пакета Maple MKM (MathSoft Kernel Maple – ©1994 Waterloo Maple Software – www.waterloomaple.com).
[7] В среде Mathcad меню, хранящее команды символьной (аналитической) математики, называется Symbolic, а в среде StudyWorks («школьная», укороченная версия Mathcad) – Algebra. Символьная математика – это калька с английского, которая довольно точно отображает суть данного современного компьютерного инструмента: машина оперирует не числами (численная математика), а символами (и конечно, числами тоже).
[8] У функции sin(x)/x на один корень меньше, чем у функции sin (x).
[9] Один студент автора сказал, что Mathcad «подавился» слишком большим количеством корней.
[10] Функция root имеет в качестве первого своего аргумента не уравнение, а выражение; возвращает же функция root значение своего второго аргумента, при котором значение выражения по модулю не превышает значения системной переменной TOL (по умолчанию 10-3). Функцию root, честно говоря, следовало бы назвать не root (корень), а zero (нуль). Отсюда и путаница в терминологии, которую мы отметили в самой первой сноске статьи.
[11] Вблизи точек «водораздела», точек, где производная равна нулю.
[12] Мы «подбираемся» ко второй половине названия статьи.
[13] А всего их двадцать четыре. Их легко найти средствами символьной математики Mathcad (см. рис. D1). На рис. 5 показаны, естественно, только действительные корни системы. Методика построения графика (сканирование) описана в статье «История одного шедевра» – http://twt/ochkov/Lace/Lace.htm.