8.8. Метод продолжения по параметру*
Решение "хороших" нелинейных уравнений и систем типа тех, которые были рассмотрены в предыдущих разделах этой главы, представляет собой несложную, с вычислительной точки зрения, задачу. В реальных инженерных
и научных расчетах очень распространена более сложная проблема: решениене одного уравнения (или системы), а целой серии уравнений, зависящих отнекоторого параметра (или нескольких параметров). Для таких задач существуют очень эффективные методы, которые называются методами продолжения. Эти методы непосредственно не встроены в MathCAD, но могутбыть легко запрограммированы с помощью уже рассмотренных намисредств. Будем далее говорить об одном уравнении, имея в виду, что всегдавозможно обобщение результатов на случай системы уравнений.
Пусть имеется уравнение f (а,х)=о, зависящее не только от неизвестного х,но и от параметра а. Требуется определить зависимость его корня х от параметра а, т. е. х(а). Простой пример такой задачи был приведен в предыдущем разделе в листинге 8.18. Тогда нам повезло, и решение в общем видебыло найдено с помощью символьных вычислений. Рассмотрим еще один,чуть более сложный пример, аналитическое решение которого также заранееизвестно, но с которым символьный процессор, тем не менее, не справляется. Обобщим задачу (1 - 1), добавив зависимость от параметра а следующимобразом:
sin(a'X)=0. (1)
Рис. 8.10. Решение уравнения sin (а-х) =0 (см. листинг 8.21)
Аналитическое решение этого уравнения находится из соотношения,т. е. имеется бесконечное количество (для каждого N) семейств решений xN=N-n/a. Несколько из семейств для N=1,2,3 показаны нарис. 8.10 тремя сплошными кривыми. Кроме того, следует иметь в виду, чтодля N=O, т. е. х=о, решением является прямая, совпадающая с осью х. Заме
тим (листинг 8.19), что символьный процессор MathCAD выдает в качестверешения только эту серию х=о.
Листинг 8.19. Символьное решение уравнения sin(a-x)=0
Забудем на время, что аналитическое решение известно, и подойдем к уравнению (1) как к любой другой новой задаче. Решим его методом секущих,применяя для этого встроенную функцию root. Самый простой, но далеконе лучший способ иллюстрируется листингом 8.20. Корень уравнения (1)требуется определить численно для каждого значения параметра а. Дляэтого первые две строки листинга создают ранжированную переменную i,с помощью которой определяется вектор значений параметра аь для которых будут производиться расчеты. Его элементы пробегают значения ото.ою до 0.025 с шагом o.ooo5 (эти числа взяты ради примера, вы можетепоэкспериментировать с другими значениями). Последняя строка листингаприсваивает элементам еще одного вектора у вычисленные с помощьюфункции root значения корней уравнения (1) для каждого а±. Но для тогочтобы функция root заработала, необходимо предварительно задать начальное приближение к решению, что сделано в третьей строке листинга. Ключевой момент метода, примененного в листинге 8.20, заключается в том, чтоодно и то же начальное значение х=зоо использовано для всех ai.
Листинг 8.20. Один из способов численного решенияуравнения sin (а-х) =0
Результат расчетов yi показан на том же рис. 8.10 точками, причем самаялевая точка отвечает начальному значению у0=зоо. Обратите внимание, что,по мере увеличения а, кривая корней уравнения сначала идет по семействурешений у=я/а, а потом (в районе а=ол?) "перепрыгивает" на другое семейство у=2-я/а. С вычислительной точки зрения такая ситуация чаще всегокрайне неблагоприятна, поскольку хотелось бы отыскать непрерывное семейство решений. Скачки зависимости у (а) могут вводить пользователя взаблуждение, вовсе скрывая от него существование семейства решений при
а>0.17.
Почему же происходят эти скачки с одного семейства решений на другое?Конечно, причина кроется в выборе начального значения для вычисления
каждого из корней. Линия начальных значений у=зоо обозначена на рис. 8.7в виде пунктирной горизонтальной прямой. Для a0=o.oi, и вообще для нескольких первых ai начальное значение у=зоо находится ближе всего к нижнему семейству решений у=л/а. Поэтому неудивительно, что численный метод находит именно эти корни. В правой части графика на рис. 8.10 к линииначальных значений ближе второе семейство решений у=2-я/а, к ним-то иприводит численный метод.
Приведенные соображения диктуют очень простой рецепт избавления отскачков и нахождения одного из семейств непрерывных решений. Для этоготребуется при поиске каждого (i+i)-ro корня взять начальное значение, повозможности близкое к отыскиваемому семейству. Неплохим вариантом будет выбор приближения в виде предыдущего 1-го корня, который был найден для прошлого значения параметра ai. Возможный вариант воплощенияэтого метода, называемого продолжением по параметру, приведен на листинге 8.21. В нем функция root применена внутри функции пользователяf(xd,a), определенной в самом начале листинга с помощью средств программирования. Назначение функции f (xO,a) заключается в том, что онавыдает значение корня для заданного значения параметра а и начальногоприближения к решению хО. В остальном, смысл листинга 8.21 повторяетпредыдущий, за исключением того, что задается явно (в его предпоследнейстроке) только начальное значение у0=зоо только для поиска у^. Для всехпоследующих точек, как следует из последней строки листинга, взято начальное значение, равное предыдущему корню yi.
Листинг 8.21. Решение уравнения sin (а-х) =0 методом продолжения к параметру
Результат вычислений, приведенный на рис. 8.11, разительно отличается отпредыдущего. Как видно, столь малое изменение идеологии применениячисленного метода привело к определению непрерывного семейства корней.Отметим, что получить результат рис. 8.10 (без продолжения по параметру)в терминах введенной нами функции f (xO,a) можно, изменив ее первыйаргумент в последней строке листинга 8.21 на константу: f (300,ai).
Чтобы найти другое семейство решений, нужно взять соответствующее первое начальное значение у0, например, у0=бОО. Результат действия листинга 8.21 для этого случая показан на рис. 8.12. Если взять у0 ближе к третьемусемейству решений (например, у0=эоо), то оно и будет найдено вычислительным процессором MathCAD, и т. д.
Рис. 8.11. Решение уравнения sin(a-x)=0 методом продолжениядля уо=300 (листинг 8.21)
Рис. 8.12. Решение уравнения sin(a-x)=0 методом продолженияпо параметру для у0=600
С помощью метода продолжения можно решать и соответствующие задачиоптимизации, зависящие от параметра. Идеология в этом случае остаетсяточно такой же, но вместо функций решения нелинейных уравнений rootили Find вам следует применить одну из функций поиска экстремума
Minerr, Maximize ИЛИ Minimize.
Мы привели основную идею и один из возможных способов реализацииметода продолжения по параметру. Безусловно, вы можете предложить иныекак математические, так и программистские решения этой проблемы. В частности, для выбора очередного начального приближения к корню можноиспользовать результат экстраполяции уже найденной зависимости х(а),придумать более сложные алгоритмы для ветвящихся семейств решенийи т. д.
Глава 7
Содержание
Глава 9