П. Н. Вабищевич Численны е МЕТОЛЫ ВЫЧИСЛИТЕЛЬНЫЙ ПРАКТИКУМ .-01 1б1 ?2* (4 « в ° е к Практическое применение численных методов при использоватщк алгоритмического Python URSS j П. Н. Вабищевич ЧИСЛЕННЫЕ МЕТОДЫ Вычислительный практикум URSS МОСКВА ББК 22.19 Вабищевич Петр Николаевич Численные методы: Вычислительный практикум. — М.: Книжный дом «ЛИБРОКОМ», 2010. — 320 с. Настоящая книга посвящена отработке навыков практического применения численных методов при использовании алгоритмического языка Python. Рассматри­ ваются прямые и итерационные методы линейной алгебры, спектральные задачи, системы нелинейных уравнений, задачи минимизации функций, задачи интерполи­ рования функций, численного интегрирования, интегральные уравнения, краевые задачи и задачи с начальными данными для обыкновенных уравнений и уравнений с частными производными. На уровне пользователя применяются специализирован­ ные математические пакеты, на уровне разработчика проводится программирование базовых алгоритмов численного анализа. Часть материала посвящена информации о программном обеспечении, кратко описаны основные элементы языка Python и Используемые пакеты. Книга рассчитана на студентов вузов, обучающихся по специальности «При­ кладная математика», и специалистов по вычислительной математике и математиче­ скому моделированию. Издательство «Книжный дом “ЛИБРОКОМ”». 117312, Москва, пр-т Шестидесятилетия Октября, 9. Формат 60x90/16. Печ. л. 20. Зак. № 3625. Отпечатано в ООО «ЛЕНАНД». 117312, Москва, пр-т Шестидесятилетия Октября, НА, стр. 11. ISBN 978—5—397—01372—7 ® Книжный дом «ЛИБРОКОМ», 2010 НАУЧНАЯ И УЧЕБНАЯ ЛИТЕРАТУРА E-mail: URSS@URSS.ru Каталог изданий в Интернете: http://URSS.ru Тел./факс: 7 (499) 135-42-16 URSSI Тел./факс: 7 (499) 135-42-46 8529 Ю 113221 9785397013727 785397 3727 Все права защ ищ ены. Никакая часть настоящей книги не может быть воспроизведена или передана в какой бы то ни было форме и какими бы то ни было средствами, будь то элек­ тронные или механические, включая фотокопирование и запись на магнитный носитель, а такж е размещ ение в Интернете, если на то нет письменного разрешения владельца. Содержание Предисловие............................................................................................................ 6 1 Программное обеспечение..................................................................... 8 1.1 Установка Python.......................................................................................... 8 1.2 Работа в IDLE................................................................................................. 10 1.3 Net Beans IDE для Python............................................................................... 13 2 Элементы я зы к а......................................................................................... 20 2.1 Общая характеристика языка Python.......................................................... 20 2.2 Типы данных................................................................................................ 23 2.3 Инструкции.................................................................................................... 29 2.4 Функции......................................................................................................... 36 2.5 Модули............................................................................................................ 39 3 Математический Python.......................................................................... 43 3.1 Встроенные функции и стандартная библиотека...................................... 43 3.2 Пакет NumPy.................................................................................................. 48 3.3 Пакет Matplotlib............................................................................................. 65 3.4 Пакет SciPy.................................................................................................... 92 3.5 Другие математические пакеты................................................................... 132 4 Прямые методы линейной алгебры ..................................................... 159 4.1 Задачи решения систем линейных уравнений........................................... 159 4.2 Алгоритмы решения систем линейных уравнений..................................... 160 4.3 Упражнения.................................................................................................. 163 4.4 Задачи............................................................................................................ 169 5 Итерационные методы линейной алгебры ........................................ 172 5.1 Итерационное решение систем линейных уравнений................................ 172 шие Итерационные алгоритмы линейной алгебры........................ 174 Упражнения.............................................................................. 179 Задачи ........................................................................................ 183 Спектральные задачи линейной алгебры ...................... 184 Собственные значения и собственные вектора матриц......... 184 Численные методы решения задач на собственные значения 185 Упражнения.............................................................................. 190 Задачи ........................................................................................ 195 Нелинейные уравнения и системы .................................... 196 Решение нелинейных уравнений и систем............................. 196 Итерационные методы решения нелинейных уравнений...... 197 Упражнения.............................................................................. 200 Задачи........................................................................................ 204 Задачи минимизации ф ун кций ........................................... 205 Поиск минимума функции многих переменных..................... 205 Методы решения задач оптимизации..................................... 206 Упражнения............................................................................... 210 Задачи............................................. .......................................... 215 Интерполирование и приближение ф у н к ц и й ............... 216 Задачи интерполяции и приближения функций 216 ............. Алгоритмы интерполяции и приближения функций............. 217 Упражнения............................................................................... 220 Задачи ......................................................................................... 225 Численное интегрирование.................................................... 227 Задачи приближенного вычисления интегралов................... 227 Алгоритмы приближенного вычисления интегралов............. 228 У п р а ж н е н и я ...................................................................................................... 230 Задачи........................................................................................ 236 Интегральные уравнени я....................................................... 238 З а д а ч и дл я интегральны х у р а в н ен и й ................................................ 238 М етоды реш ения интегральны х у р а в н ен и й ................................... 240 Содержание___________________________________________________________5 11.3 Упражнения....................................................................................... 244 11.4 Задачи......................................................................................................... 250 12 Задача Коши для дифференциальных уравнений....................... 251 Задачи с начальными условиями для систем обыкновенных дифференциальных уравнений.................................................................. 251 12.2 Численные методы решения задачи Коши............................................... 252 12.3 Упражнения................................................................................................ 257 12.4 Задачи......................................................................................................... 261 13 Краевые задачи для дифференциальных уравнений.................. 264 13.1 Краевые задачи........................................................................................... 265 13.2 Численные методы решения краевых задач............................................ 266 12.1 13.3 Упражнения................................................................................................ 274 13.4 Задачи............. 279 14 Краевые задачи для эллиптический уравнений............................ 281 14.1 Двумерные краевые задачи....................................................................... 282 14.2 Численное решение краевых задач........................................................... 282 14.3 Упражнения................................................................................................ 290 14.4 Задачи......................................................................................................... 296 15 Нестационарные задачи математической ф и зи к и ......................... 298 15.1 Нестационарные краевые задачи.............................................................. 299 15.2 Разностные методы решения нестационарных задач............................. 300 15.3 Упражнения................................................................................................ 309 15.4 Задачи......................................................................................................... 316 Список литературы............................................................................................... 318 Предисловие Современные научные вычисления проводятся на основе использования чис­ ленных методов. Вычислительные методы являются интеллектуальным яд­ ром прикладного математического моделирования, которое базируется пре­ жде всего па решении нелинейных нестационарных многомерных задач для уравнений с частными производными. Это обуславливает возрастающее вни­ мание к подготовке специалистов по численным методам как на уровне раз­ работчика, так и на уровне квалифицированного пользователя. В курсах по численным методам основное внимание уделяется численным ме­ тодам решения задач алгебры и анализа, рассматриваются вопросы решения краевых задач для обыкновенных дифференциальных уравнений и уравне­ ний с частными производными. В вычислительной математике изучаются важнейшие вопросы построения и теоретического обоснования вычислитель­ ных алгоритмов. Не менее важной является проблема практического исполь­ зования численных методов при решении прикладных задач. Поддержка курса но численным методам проводится как в теоретическом, так и в практическом плане. Аудиторные и самостоятельные занятия направ­ лены, с одной стороны, на закрепление базового материала по теории. Здесь отрабатываются навыки построения вычислительных алгоритмов для реше­ ния базовых задач численного анализа, теоретического исследования свойств алгоритма (точность, устойчивость, вычислительная работа при реализации и т.д.). С другой стороны, навыки грамотного практического использования численных методов закладываются в вычислительном практикуме. Высокая техническая оснащенность, рост возможностей вычислительной тех­ ники позволяют существенно обогатить содержание вычислительного прак­ тикума по численным методам. На уровне разработчика вычислительные ал­ горитмы отрабатываются на основе разработки программного обеспечения для приближенного решения типовых задач. Этим обеспечивается достиже­ ние первой цели вычислительного практикума. Вторая цель, которая связа­ на с грамотным использованием современного программного обеспечения по численному анализу, решается на уровне пользователя. Предлагаемое учебное пособие ориентировано на практическое закрепление слушателями теоретического материала по курсу численных методов. Для Предисловие 7 основных задач численного анализа рассматриваются вопросы построения и практической реализации вычислительных алгоритмов, использования биб­ лиотек численного анализа. Рассмотрены прямые и итерационные методы линейной алгебры, задачи интерполирования и приближения функций, чис­ ленного интегрирования, спектральные задачи линейной алгебры, системы нелинейных уравнений, задачи минимизации функций, интегральные урав­ нения, краевые задачи и задачи с начальными данными для обыкновенных уравнений, стационарные и нестационарные задачи математической физики. Программная реализация решения задач вычислительной математики бази­ руется на относительно новом алгоритмическом активно развиваемом язы­ ке Python. Этот высокоуровневый язык программирования общего назначе­ ния максимально ориентирован на производительность разработчика и чита­ емость кода, поддерживается большинством используемых платформ и рас­ пространяется свободно. Предлагаемая книга построена по следующему плану. Первая часть посвяще­ на программному обеспечению, используемым средам разработки и основам языка Python. Отдельно рассмотрены базовые численные и графические па­ кеты. Вторая часть книги посвящена численному решению основных задач численного анализа. Каждая глава содержит справочный материал по алго­ ритмам, приведена программная реализация, проводится решение типовых задач. Автор с благодарностью примет любые конструктивные замечания по книге. П. Н. Вабищевич Москва, январь 2010 г. 1 Программное обеспечение Вычислительный практикум подразумевает организацию рабочего места. Бу­ дем считать, что вычисления выполняются на персональном компьютере с опе­ рационной системой Windows. Используемое нами программное обеспечение (интерпретатор языка и среда разработки) относится к классу кроссплатформенного, и поэтому можно работать и в операционной системе Linux. Кратко обсуждаются вопросы установки Python на компьютере и его пакетов. Процесс разработки программ иллюстрируется использованием простейшей интегрированной среды разработки (IDE, Integrated development environment) IDLE, которая поставляется вместе с Python. Более комфортная работа обес­ печивается использованием NetBeans. 1.1 У становка Python Основные реализации, получение дистрибутива и установка, переменные окружения Python, установка пакетов. Основные реализации Существуют три различные реализации интерпретатора языка программи­ рования Python: CPython, Jython и IronPython1. CPython2 — это стандартная реализация, которая написана на переносимом языке ANSI С. Именно с этой эталонной реализацией интерпретатора языка мы и будем работать. Jython3 обеспечивает интеграцию с языком программирования Java. Реали­ зация Jython состоит из Java-классов, которые выполняют компиляцию про­ граммного кода на языке Python в байт-код Java, а в качестве среды испол­ нения используется виртуальная машина Java (JVM, Java Virtual Machine). 1 Python Implementations — www.python.org/dev/implementations/ 2 CPython — www.python.org/ 3 Jython — www.jython.org/ 9 1.1 Установка Python Iron Python4 предназначена для обеспечения интеграции программ Python с приложениями, созданными для работы в среде Microsoft.NET Framework (для операционной системы Windows и в Mono для Linux). Компилирует Python программы в промежуточный язык MSIL (Microsoft Intermediate Language). Получение дистрибутива и установка Возможно, что на вашем компьютере уже установлен Python: ищите пункт Python х.х меню кнопки Пуск (Start) на рабочем столе вашего компьютера. Обновите вашу версию, если это необходимо. В настоящее время поддерживаются две серии: Python 2.x и Python 3.x. Python 3.x не совместим с предыдущей серией Python 2.x. С учетом того, что основные пакеты написаны для Python 2.x большого смысла переходить на Python 3.x при его использовании в научных вычислениях пока нет. Для загрузки Python зайдите на официальный сайт www.python.org. Со стра­ ницы Download выберите версию (загрузить) на этой странице и выберите версию Python для своей операционной системы. Для Windows дистрибутив Python распространяется в виде стандартного инсталляционного файла с рас­ ширением .msi. Стандартный каталог установки C:\Python2x (для более новых версий — C:\Python3x). После установки в подменю Пуск (Start) | Все программы (All Programs) появ­ ляется группа Python2x (Python3x), которая обеспечивает: запуск IDLE (IDLE Python GUI), доступ к документации (Module Docs), запуск интерактивной командной строки (Python (command line)), доступ к руководствам (Python manuals) и удаление версии Python. С интерпретатором Python связываются файлы с расширением .ру. Переменные окружения Python Для запуска интерпретатора языка Python из любой директории необходимо, чтобы путь к соответствующему исполняемому файлу python.exe был пропи­ сан в переменной окружения path или PATH. Эти путь прописываются авто­ матически при первичной установке интерпретатора языка Python в каталог по умолчанию. Его необходимо, например, корректировать при установке па­ раллельно нескольких версий Python. Доступ к переменным окружения осуществляется вызовом диалога Свой­ ства системы (System Properties): Панель управления (Control Panel) | Система (System). На вкладке Дополнительно (Advanced) выберите Переменные среды (Environment Variables). 4 IronPython — http://ironpython.codeplex.com/ Программное обеспечение 10 Вторая переменная окружения PYTHONPATH задает список каталогов для поиска интерпретатором Python включаемых модулей. По умолчанию интер­ претатор ищет м о^ли , которые расположены в том же каталоге, что и вы­ полняемый файл. Установка пакетов Для Python имеется большое количество разработанного программного обес­ печения, которое удобно использовать при решении различных задач (список пакетов и их описание5). Программное обеспечение оформляется в виде мо­ дулей, которые в свою очередь могут быть собраны в пакеты. Модуль оформ­ ляется в виде отдельного файла, а пакет — в виде отдельного каталога. Есть различные варианты установки пакетов: стандартный инсталлятор для Windows, из исходных текстов с использованием команды python s e tu p .ру i n s t a l l и Python eggs, который позволяют использовать механизм зависимостей для пакетов Python. В первых двух вариантах приходиться внимательно следить, что нужно установить дополнительно, чтобы пакет заработал. Простейший подход связан с использованием инсталляционного файла, кото­ рый скомпилирован под необходимую вам версию Python. Инсталляционные файлы берутся на сайте пакетов Python (если они есть), или с домашней страницы пакета в его описании на этом интернет-ресурсе. 1.2 Р абота в IDLE Работа в командной строке, стандартная интегрированная среда разработки, отладка в IDLE. Работа в командной строке Для работы с интерпретатором языка Python в интерактивном режиме можно использовать командную строку. Командная строка (Command Prompt) распо­ ложена в разделе Стандартные (Accessories), меню Все программы (All Prog­ rams). После набора команды python открывается окно, в котором выведена информация о версии интерпретатора и приглашение к вводу » > . При работе в интерактивном режиме каждая введенная команда выполняться сразу же после ввода. Введем, для примера 5 Package Index — http://pypi.python.org/pypi/ 1.2 Работа в IDLE 11 Рис. 1.1 Python и командной строке инструкцию присваивания а=2**10 (а = 210) а затем — напечатаем величину а командой p r in t а. Результат будет выглядеть следующим образом: » > а=2**10 » > p r in t а 1024 При более содержательном программировании команды для интерпретатора записываются в файлы, которые называются модулями. Например, приве­ денные выше инструкции интерпретатора с помощью текстового редактора запишем в файл te s t.p y : а=2**10 p r in t а Запуск этого модуля (программы) производиться командой python te s t .p y при переходе в каталог, в котором расположен файл te s t.p y . В противном случае указывается полный путь к файлу. В операционной системе Windows стандартной является процедура открытия файла щелчком мыши па его ярлыке. В этом случае после появления кон­ сольного окна и выполнения программы окно закрывается. Если вам необхо­ димо увидеть результаты добавьте в конце модуля вызов встроенной функции raw _input() командой raw _input() в конце модуля. Выполнение программы приостанавливается пока не будет нажата клавиша Enter. Программное обеспечение 12 Стандартная интегрированная среда разработки ; .. : Filfe Sd-t Shell Debug Colons WimfcAS Fyrhcr. 2.6.2 ir262:';i62S, Apr X? 2 « n£ 22;4v:C2> fMSC v.ISOO 32 bit (Inte2).l or. jj | w in S S I type ”co£>yrigh&” , "creditг" or "license О * for more information. tf***.A I ft***•*# ****•**«»>■****•# *«*»*■****•***»******** Personal firewall software may warn «boat the connection IDLE makes to its sobprocess using this ocmpater’s internal loopback interface. This ccnneotion is net visible on any external interface and no data is sent to or received from the Internet. | IDLE 2.6.1 | > » a « 2**10 | » > ptz.t& a I 1024 I> > >I irclSCoU Рис. 1.2 Главное окно IDLE Выше продемонстрирована возможность подготовки модулей в текстовом ре­ дакторе при запуске интерпретатора Python. Для более комфортной работы используются интегрированные среды разработки (IDE). Они позволяют ре­ шать разнообразные задачи (подготовка модулей, отладка и расчеты) в еди­ ной оболочке с графическим интерфейсом пользователя (GUI, Graphical user interface). Простейшей интегрированной средой для Python является IDLE, которая яв­ ляется. стандартной и свободно распространяемой частью дистрибутива Python. Запуск IDLE выполняется по ярлыку IDLE (Python GUI) в разделе Python х.х меню Пуск (Start) | Все программы (All programs). Быстрый старт обеспечивается контекстным меню (правая кнопка мыши) на ярлыке модуля Python (файла с расширением .ру). Главное окно (рис. 1.2) обеспечивает работу с Python в интерактивном режи­ ме. В IDLE имеются стандартные функции текстового редактора. В частно­ сти, обеспечивается подсветка синтаксиса кода, которая позволяет визуально выделять ключевые элементы. Поддерживается работа с модулями (текстовыми файлами с расширением .ру). Для открытия и редактирования файла с программным кодом в IDLE откройте окно текстового редактора: в меню File главного окна Python Shell выберите Open. Результат для нашего тестового модуля показан на рис. 1.3. Для запуска модуля из редактора IDLE, выберите пункт Run Module в меню Run. Вывод результатов работы модуля, в частности, сообщения об ошибках, производится в основное окно Python Shell. Для создания нового модуля ис­ пользуйте команду File | New Window или в редакторе, или же в Python Shell. 1.3 NetBeans IDE для Python____________________________________________13 4. . . . - “ ” ГГ^ ^ “ ' S -" 1 l s l B ЛЯ | a » fp ri& y & . л ;tn<i iColi 01 Рис. 1.3 Редактор IDLE Отладка в IDLE Среди основных свойств IDLE необходимо отметить возможность отладки. В отлаживаемом модуле в окне редактирования на выбранным строках ко­ да устанавливаются точки останова по контекстному меню (правая кнопка мыши). Встроенный отладчик вызывается командой меню Debug | Debugger главного окна. После появления окна Debug Control запускается отлажива­ емый модуль (команда Run | Run Module в редакторе), при этом появляется возможность пошагового выполнения программы с просмотром текущих зна­ чений переменных. 1.3 NetBeans IDE д л я Python Не только IDLE, установка NetBeans, создание проекта, редактирование и от­ ладка в NetBeans, плагины в NetBeans. Не только IDLE Помимо IDLE имеется много программных продуктов (редакторов, интегри­ рованных сред разработки), которые решают задачу облегчения работы с Python. Помимо обычных возможностей, таких как подсветка синтаксиса (вы­ деление ключевых слов, строк, комментариев), редактирование текста, отлад­ ка, они позволяют работать с файлами проектов, обеспечивают интеграцию с системами контроля версий исходных текстов и т.д. Различные редакторы и IDE для Python для основных операционных систем, описание их базовых возможностей, сравнение можно найти на странице Программное обеспечение 14 Python Editors6. Среди бесплатных продуктов можно выделить eric4 IDE7. Для программирования на языке Python в операционной системе Windows можно рекомендовать PyScripter8. Необходимо отметить также Eclipse9 — кроссплатформенную интегрирован­ ную среду разработки программного обеспечения на многих языках програм­ мирования. При использовании модуля расширения PyDev обеспечивается возможность разработки программ на языке Python. К подобному классу про­ граммных продуктов относится NetBeans IDE10 — свободная интегрированная среда разработки приложений на языках программирования Java, JavaFX, Ruby, Python, PHP, JavaScript, C + + и других. Установка NetBeans шшш Рис. 1.4 Окно диспетчера платформ Python Хотя проект NetBeans IDE поддерживается и спонсируется фирмой Sun Micro­ systems, разработка NetBeans ведется независимо сообществом разработчиков-энтузиастов (NetBeans Community) и компанией NetBeans Org11. NetBeans IDE доступна в виде готовых дистрибутивов (прекомпилированпых бинарных файлов) для основных платформ (Microsoft Windows, GNU/Linux, FreeBSD, Mac OS X, Solaris). Загрузите NetBeans для Python (Python (Early Access 2)12). 6 7 8 9 10 11 12 PythonEditors — http://wiki.python.org/moin/PythonEditors eric4 IDE — http://eric-ide.python-projects.org/ PyScripter — http://code.google.eom/p/pyscripter/ Eclipse — www.eclipse.org/ NetBeans IDE — www.netbeans.org/ NetBeans Org — www.netbeans.org/mdex.html Python (Early Access 2) — www.netbeans.org/features/python/index.html 1.3 NetBeans IDE для Python 15 Для разработки программ в среде NetBeans и для успешной инсталляции и работы самой среды NetBeans должен быть предварительно установлен Sun JDK (Java Development Kit) — бесплатно распространяемый фирмой Sun ком­ плект разработчика приложений на языке Java. Вы всегда можете загрузить последнюю версию JDK13. Инсталляция и запуск программы NetBeans в Windows является стандартной и осуществляется из группы NetBeans в меню Пуск (Start) | Все программы (All programs). После установки NetBeans IDE распознает установленные на компьютере версии Python. На рис. 1.4) представлено окно диспетчера плат­ форм Python (Python Platform Menager), которое открывается по команде Tools | Python Platforms. Реализация Jython интерпретатора языка Python включена в NetBeans. В этом окне можно добавить или удалить версии Python, доступ­ ные для среды NetBeans IDE. С помощью диспетчера платформ Python можно также настроить пути к Python. В процессе настройки можно разместить мо­ дули Python в пути таким образом, чтобы они были доступны при каждом запуске NetBeans для каждой отдельной версии Python. Создание проекта Рис. 1.5 Мастер New Project Программа на языке Python состоит из набора модулей, которые обычно свя­ заны с файлами. Модули позволяют объединять разрозненные файлы в круп13 Java SE Downloads — http://java.sun.com/javase/downloads Программное обеспечение 16 ^SetesMwPrs^jed I^ O e a ie M ^ F fe РуЛопЙаЙои»: aа — -- itestLpy :Р?»Ьет2.6.2 С М Ш ** Е ^ ..1С о ^ Г Ж ~ 1 Рис. 1.6 Свойства нового проекта Рис. 1.7 Основное окно NetBeans 1.3 NetBeans IDE для Python 17 ные программные системы. Программа организована как один главный файл, к которому могут подключаться дополнительные файлы (модули). В среде разработки NetBeans программа на языке Python связывается с про­ ектом, который состоит из каталога с файлами. Проект можно или создавать с нуля, или из уже существующих исходников. Сначала необходимо создать новый проект Python. Для этого используется мастер New Project, который содержит встроенные шаблоны различных ти­ пов проекта. Для открытия мастера New Project выберите команду File | New Project на главной панели инструментов или но контекстному меню на окне Projects (рис. 1.5). Выберите значение Python Project в качестве типа проекта, если новый проект не использует ранее подготовленные модули, и нажмите кнопку Next. В поле имени проекта введем Testl и выберем каталог, в котором этот проект будет располагаться. Выберите нужную нам версию Python из раскрывающегося списка Python Platform. Флажок Set as Main Project делает проект активным в списке проектов, а флажок Create Main File определяет файл проекта te stl.ру как главный (рис. 1.6). Результат работы мастера New Project показан рис. 1.7. Редактирование и отладка в NetBeans Редактор NetBeans для файлов Python поддерживает базовые функции завер­ шение кода, подсветка синтаксиса и ошибок компиляции. Когда вы набираете код, вы можете открыть окно завершения кода (Code Completion) (нажатием комбинации клавиш Ctrl + Space), которое содержит список для завершения текущего выражения. Если далее продолжать набирать код, то список будет изменяться в соответствии с введенными символами. Для некоторых наиболее часто используемых фрагментов кода можно ис­ пользовать сокращения (аббревиатуры) взамен набора полного фрагмента — шаблоны кода (Code Templates). NetBeans преобразует аббревиатуры в пол­ ные фрагменты кода после нажатия на клавишу табуляции. Список шаблонов кода доступен по команде Tools | Options | Editor на вкладке Code Templates. Здесь вы можете создать свой собственный шаблон кода. Еще одна возможность связана с подсказками (Editor Flints) Когда NetBeans обнаруживает ошибку, такую как недостающий код, то в месте ее предпола­ гаемого возникновения появляется па левой границе значок лампочки. Вы можете кликнуть на этот значок или нажать комбинацию клавиш Alt + Enter для отображения возможных исправлений. Если одно из исправлений подхо­ дит вам, то вы можете выделить его и нажать Enter для исправления ошибки в вашем коде. Упомянем также о возможностях рефакторинга — последовательность мел­ ких изменений в коде, результат которых не изменяет поведение программы. Программное обеспечение 18 В результате код становиться проще для понимания и изменения. В NetBeans имеется возможность переименовывать классы, методы и переменные и неко­ торые другие возможности. Для переименования выделенной переменной воспользуйтесь командой Refactor | Rename. Перед применением рефакторин­ га показывается сравнение файлов до него и после. Среда NetBeans содержит мощный отладчик Python, который позволяет от­ лаживать приложение. В зависимости от размера, сложности и области дей­ ствия приложения отладчик Python предоставляет различные способы отлад­ ки проекта. Для простых приложений многие из этих функций не требуют­ ся. Параметры отладки настраиваются в окне Options, после команды Tools | Options | Python на главной панели инструментов и выбора вкладки Debugger. Запускается отладчик Python командой Debug | Debug Main Project. В простей­ ших случаях будет достаточно сообщений об ошибках интерпретатора языка Python (в окне Output). Плагины в NetBeans Для работы в NetBeans IDE используется большое количество плагинов. Ин­ формация о доступных и используемых плагинах имеется на окне Plugins, которое открывается командой Tools | Plugins. В частности, по умолчанию устанавливаются установлены плагины для трех систем контроля версий: SVN, CVS и Mercurial. Поэтому на вкладке Installed можно что-то из этого отключить (Deactivate) или даже удалить (Uninstall). Обратите внимание на список всех плагинов для NetBeans14, характеристи­ ку их основных возможностей. Поддерживается система поиска плагинов по ключевым словам. NetBeans IDE помимо редактора кода для языка Python дает возможность просматривать графические файлы, что полезно использовать при органи­ зации вычислений. Эти файлы с результатами расчетов удобно поместить в каталог проекта и они становятся доступны для просмотра (рис. 1.8). Для работы с документами, в частности, с файлами помощи, учебными и ис­ следовательскими материалами полезно иметь возможность просмотра фай­ лов в формате PDF (Portable Document Format). Поиск по порталу плагинов (ключевое слово PDF) дает нам несколько вариантов. Например, для про­ смотра PDF файлов можно использовать NetBeans-PDFViewer15. С сайта про­ екта загружается файл с расширением .nbm. На вкладке Downloaded окна Pluguns нажимаем кнопку Add Plugins... и выбираем загруженный файл. По­ сле этого инсталлируем его (кнопка Install). Пример использования плагина представлен на рис. 1.9. и NetBeans Plugin Portal — http://plugins.netbeans,org/PluginPortal/ 15 NetBeans-PDFViewer — http://code.google.eom/p/netbeans-pdfviewer/ 1.3 NetBeans IDE для Python Рис. 1.8 Просмотр графического файла в NetBeans Рис. 1.9 Просмотр PDF файла 19 2 Элементы языка Эта глава никак не претендует на полное и всестороннее руководство по язы­ ку Python. Основная цель состоит в том, чтобы предоставить минимальную информацию, которая достаточна для того, чтобы начать работать с Python. Особенно это будет нетрудно, если Вы знакомы с другими алгоритмическими языками. После общего обсуждения дается краткая характеристика базовых элементов языка с ориентацией на пользователя, который намерен использо­ вать Python в своих вычислительных экспериментах. 2.1 О бщ ая хар ак тер и сти к а язы к а Python Язык Python, объекты Python, динамическая типизация. Язык Python Python — это активно развиваемый, мощный, переносимый, простой в исполь­ зовании и свободно распространяемый язык программирования. Он ориен­ тирован на высокую производительность разработчика и максимальную чи­ таемость кода. Не предлагая революционных особенностей и нововведений, язык Python комбинирует основные лучшие качества многих различных язы­ ков программирования. Разработка языка Python была начата в конце 1980-х годов голландским математиком Гвидо ван Россумом (Guido van Rossum), работа над языком активно поддерживается сообществом пользователей. Несомненное преимущество языка Python состоит в простоте, удобочитаемо­ сти программ. Это достигается жесткими правилами оформления программ­ ного кода (см. Python Style Guide1), что облегчает его понимание. Небольшое число ясных базовых концепций (философия программирования на языке Python2) делает язык простым в освоении и использовании. Возможность диа­ логового режима работы интерпретатора Python сокращает время изучения самого языка и облегчает переход к решению поставленных задач. 1 Python Style Guide — www.python.org/doc/essays/styleguide.html 2 The Zen of Python — www.python.org/dev/peps/pep-0020/ 2.1 Общая характеристика языка Python 21 Python ориентирован па быструю разработку приложений (RAD, Rapid Appli­ cation Development). Создание программ за меньшее время достигается ис­ пользованием встроенных высокоуровневых структур данных, динамической типизацией и простым синтаксисом. Программирование на языке Python зна­ чительно увеличивает производительность труда разработчика по сравнению с традиционными языками программирования, такими как С, C++ и Java. Меньший объем программного кода на Python дает значительный выигрыш времени на написание, отладку и сопровождение программного продукта. Python относится у категории открытых программных продуктов. Вы мо­ жете получить полные исходные тексты реализации Python и использовать без всяких ограничений (копировать, распространять, встраивать в другие продукты). Поддержка обеспечивается через Интернет квалифицированны­ ми экспертами всего мира. Python доступен для многих платформ, а написанные на нем программы пе­ реносимы между платформами без каких-либо изменений. Стандартная реа­ лизация языка Python написана на переносимом ANSI С, благодаря чему он компилируется и работает практически на всех основных платформах. Про­ граммы на языке Python, которые используют базовые возможности языка и стандартные библиотеки, компилируются в переносимый байт-код и одина­ ково работают в Windows и в Linux, а также в любых других операционных системах, где установлен Python. Стандартная библиотека Python предоставляет широкие возможности, кото­ рые используются в прикладных программах. Она включает модули для ра­ боты с текстом, мультимедийными форматами, архивами, сетевыми протоко­ лами и форматами Интернета, обеспечивается поддержка юнит-тестирования и др. В Python существует множество прикладных библиотек для решения самых разнообразных задач (Web-приложения, базы данных, графические библиотеки и т. д.). Среди них для нас наибольший интерес вызывают биб­ лиотеки численных методов, которые по своей функциональности позволяют заменить MATLAB. Функциональные возможности разрабатываемых программных продуктов расширяются за счет интеграции отдельных компонентов. Можно как встра­ ивать (embedding) интерпретатор Python в программу па другом языке, так и, наоборот, писать модули для Python на других языках (extending). Стан­ дартная библиотека позволяет программам Python напрямую обращаться к динамическим библиотекам (DLL, Dynamic-link library), написанным на С. Су­ ществуют модули, позволяющие встраивать код на C /C ++ прямо в исходные файлы Python, программный интерфейс для написания собственных модулей на других языках. Такие модули расширения позволяют объединить эффек­ тивность кода на C /C + + с удобством и гибкостью интерпретатора Python. На этом пути нивелируется недостатки языка Python, которые связаны, прежде всего, со скоростью выполнения программ, которая не всегда может быть та­ Элементы языка 22 кой же высокой, как у программ, написанных на языках программирования низкого уровня, таких как С или C ++. Объекты Python Не забираясь в терминологические дебри объектно-ориентированного про­ граммирования, можно сказать, что все данные в языке Python являются объектами, над которыми выполняются те или иные действия. С отдельным объектом связывается область памяти со значениями и ассоциированными с ними наборами операций. Программа на языке Python можно разложить на такие основные составляю­ щие, как модули, инструкции, выражения и объекты. Иерархическое постро­ ение основано на том, что: • программы состоят из модулей; • модули содержат инструкции; • инструкции состоят из выражений, которые создают и обрабатывают объ­ екты. Сами объекты могут быть встроенными, когда они предоставляются языком Python, а также объектами, которые создаются с помощью других инстру­ ментов, например, библиотек расширений, написанных на языке С. Объек­ ты могут быть неизмеичивыми и изменчивыми. Например, строки в языке Python являются неизменчивыми и в силу этого операции над строками со­ здают новые строки. Python предоставляет мощную коллекцию объектных типов, встроенных не­ посредственно в язык, которые решают многие типовые задачи программиро­ вания. Такие встроенные объекты, как коллекции (списки) и таблицы поис­ ка (словари) можно использовать непосредственно. Среди встроенных типов языка Python как базовые можно отметить числа (целые, числа с плавающей точкой, комплексные числа), строки, списки, словари, кортежи и файлы. Динамическая типизация Язык Python относится к классу языков программирования с динамической типизацией, при которой переменная связывается с типом в момент присваи­ вания значения, а не в момент объявления переменной, как при статической типизации. Типы данных определяется автоматически, и их не требуется яв­ но объявлять в программном коде В различных участках программы одна и та же переменная может принимать значения разных типов. В языке Python отсутствует конструкция объявления типа, сам синтаксис выполняемых выражений задает типы создаваемых и используемых объек­ тов. После создания объекта, он будет ассоциирован со своим собственным 23 2.2 Типы данных набором операций на протяжении всего времени существования — над объ­ ектом можно выполнять только те операции, которые применимы к его типу (строгая типизация). При динамической типизации тип переменной определяется только во время исполнения. Переменные не имеют никакой информации о типе или ограни­ чениях, связанных с ним: тип является свойством объекта, а не его имени. Переменные являются всего лишь ссылками на конкретные объекты и в кон­ кретные моменты времени: одна и та же переменная может связываться в разных частях программы с объектами разного типа. Прежде чем перемен­ ную можно будет использовать, ей должно быть присвоено значение (связать с объектом). Объект в Python помимо типа характеризуется числом ссылок. Если на объ­ ект нет ссылок, то происходит автоматическое освобождение памяти, зани­ маемой объектами — сборка мусора (garbage collection). 2.2 Т ипы дан н ы х Числа в Python, строки, листы, кортежи и словари, файлы. Числа в Python В Python имеются стандартные типы объектов чисел (целые и с плаваю­ щей точкой), которые присутствуют в других языках программирования. Python поддерживает работу с комплексными числами. Точность представ­ ления определяется точностью компилятора языка С, который использован для сборки интерпретатора Python. В Python имеются также длинные целые числа с неограниченной точностью представления (точность зависит от объ­ ема доступной памяти). Тип int (целые числа) соответствует типу long в компиляторе С для использу­ емой архитектуры. При работе на 32-разрядной системе максимальное целое равно 231 —1, а минимальное равно —231. Длинное целое число (тип long) идентифицируется символом 1 или L в конце числа. Интерпретатор языка Python осуществляет преобразования значения, выходящее за рамки допустимого типа int, в long. Ниже приведен пример, поясняющий сказанное. » > import sys » > а = sys.m axint » > p r in t а 2147483647 » > type (а) <type ’i n t ’> Элементы языка 24 »> b = а + 1 » > type(b) <type ’lo n g ^ Сначала мы находим (команда maxint) максимальное целое типа int, а затем (команда type) — определяем типы чисел а и Ь. Признаком восьмеричного числа является 0 в начале числа, вслед за которым цифры 0-7. Для шестнадцатеричного числа используется Ох или ОХ в начале, и затем — шестнадцатеричные цифры 0-9 и A-F. В силу этого » > p r in t 10, 012, ОхА, 10L 10 10 10 10 Вещественные числа (тип float) в языке Python реализованы как тип double в языке С. Числа с плавающей точкой могут содержать символ точки и/или символ е или Е для выделения экспоненты: >» 2**100 1267650600228229401496703205376L »> 2. ** 100 1 .2676506002282293е+30 Комплексные числа на языке Python состоят из двух чисел с плавающей точ­ кой, представляющих вещественную и мнимую части. Для индикации мни­ мой части используется символ j или J в конце. В примере » > z = 2 + 3j » > z .r e a l 2. 0 » > z.im ag 3.0 выделяется вещественная и мнимая часть комплексного числа z. В Python имеется логический тип bool, который доступен в виде двух новых встроенных предопределенных имен True (истина) и False (ложь). True и False ведут себя точно так же, как и целые числа 1 и 0, однако при выводе на экран они выводятся как слова True и False, вместо цифр 1 и 0: »> b = 2 > 3 »> а = b + 1 » > p r in t а, b 1 F alse Для работы с числовыми объектами используются стандартные модули math (вещественные числа) и cmath (комплексные числа). О подобных расшире­ ниях Python, которые особенно важны при научных вычислениях, мы будем говорить отдельно. 25 2.2 Типы данных Строки Для работы с текстовой информацией в Python используются строки (тип string), которые представляют собой упорядоченные последовательности сим­ волов. Язык Python имеет мощный набор средств для обработки строк. Как мы уже отмечали выше, строки являются неизменчивыми объектами языка. Строки задаются с использованием апострофов (») или кавычек ("). » > s i = "Sample" » > s2 = »l i n e s ’ » > p r in t s i , s2 Sample lin e s Для работы с произвольным числом строк используются утроенные апостро­ фы или утроенные кавычки. » > s = """M u ltilin e te x t: . . . lin e 1 . . . lin e 2""" » > p r in t s M u ltilin e te x t: lin e 1 lin e 2 Символ \ используются для вставки специальных символов. В примере » > s = »a\nb\tc» » > p r in t s а b с символ \п обеспечивает переход на новую строку, a \ t — горизонтальную табуляцию. Базовый набор операций над строками включает объединение строк с помо­ щью оператора конкатенации + и дублирование — оператор повтора *: » > s i = 'Hello» » > s2 = 'w o rld ' » > s3 = »! » » > p r in t s i + » » + s2 + s3*3 Hello w o rld !!! Встроенная функция len возвращает длину строки: » > s = 's t r i n g ' » > le n (s ) 6 Элементы языка 26 Строка в Python представляет собой последовательность символов с произ­ вольным доступом. Отдельные элементы этой последовательности извлека­ ются с помощью процедуры индексации по номеру позиции последователь­ ности следующим образом: » > s = ’s t r i n g ’ »> S [1 ] ’t ’ В языке Python индексация начинается с 0: первый элемент имеет индекс 0, второй — 1 и т. д. Предусмотрена также возможность индексации в обратном порядке: » > s = ’s t r i n g ’ >>> s [-1] ’g ’ Для получения части символов строки можно использовать более общую форму индексирования, известную как получение среза. В примере » > s = ’s t r i n g ’ » > s [1:3] ’t r ’ выбраны символы с 2 (индекс 1) по 3. Левая граница среза по умолчанию принимается равной нулю, а правая — длине последовательности (строки): » > s = ’s t r i n g ’ »> s [1 :] ’t r i n g ’ Списки Списки (тип list) в языке Python являются аналогом массивов в других язы­ ках программирования, но они обладают более широкими возможностями. В отличие от строк списки могут содержать объекты любых типов: числа, строки и даже другие списки. Кроме того списки являются изменяемыми объектами, списки могут увеличиваться и уменьшаться непосредственно (их длина может изменяться). Элементы списка заключены в квадратные скобки и разделены запятой: » > 1 st = [123, 1.23, ’a d c ’] » > p r in t 1 st [123, 1.23, ’ad c ’] В этом примере каждый элемент списка принадлежит к разному типу. Спис­ ки в Python поддерживают все операции над последовательностями, которые мы упоминали при обсуждении строк, так что » > 1 st = [123, 1.23, ’a d c ’] » > le n (ls t) 2.2 Типы данных 27 3 » > 1 st [1: ] [1.23, ’ad c’] Метод append увеличивает размер списка и вставляет в конец новый элемент, a pop удаляет элемент из списка: »> »> »> [1, »> 3 »> [1, 1 st = [1, 2, 3, 4] 1 s t .append(’a b c ’) 1 st 2, 3, 4, ’a b c ’] ls t.p o p (2 ) 1 st 2, 4, ’ab c’] Для того чтобы вставить новый элемент в нужное место списка используется метод insert, для удаления элемента, заданного значением — метод remove: »> »> »> [3, »> »> [3, 1 st = [3, 5, 2, 1] 1 s t . in s e r t (2, 4) 1 st 5, 4, 2, 1] 1 st .remove(5) 1 st 4, 2, 1] Для сортировки элементов списка используются методы sort (сортировка по возрастанию) и reverse — по убыванию: »> »> »> [1, »> »> [4, 1 st = [3, 4, 2, 1] 1 s t. s o r t () 1 st 2, 3, 4] 1 st .r e v e r s e () 1 st 3, 2, 1] Работа с матрицами (многомерными массивами) в языке Python может быть обеспечена использованием вложенных списков. Пример извлечения элемен­ тов матрицы 3 x 3 : »> >» [4, »> 9 А = [ [ 1 ,2 ,3 ] , [4 ,5 ,6 ] , [7 ,8 ,9 ]] А[1] 5, 6] А[2] [2] Элементы языка 28 С помощью первого индекса (А [1]) извлекается вторая строка, а с помощью второго (А [2] [2]) — элемент этой строки. Кортежи и словари Кортежи (тип tuple) также являются последовательностями, как и списки, по в отличие от списков кортежи являются неизменяемыми. В этом смысле они похожи на строки. Для задания кортежа используются не квадратные, а круглые скобки: » > t p l = С’аЪ’ , 12, 1.2) » > type ( tp l) <type ’t u p l e ’> » > tp l[ 0 ] ’a b ’ При передаче коллекции объектов между компонентами программы исполь­ зуются кортежи вместо списков для обеспечения неизменности передаваемых данных. Словари (тип diet) представляют собой коллекции объектов, доступ к кото­ рым осуществляется по ключам: пары ключ-значение, где значение однознач­ но определяется ключом. В качестве ключа может выступать неизменчивый тип данных (число, строка, кортеж). Порядок пар ключ-значение произво­ лен. При задании словаря используются фигурные скобки, для разделения пар ключ-значение — запятая, символ : отделяет ключ от значения. Доступ к элементам словаря осуществляется по ключу: » > d ct = { ’name*: ’N ik’ , ’a g e’ : 25} » > dct •Cage’ : 25, ’name1: ’N ik’} » > d ct [ ’hobby’] = ’s p o r t ’ » > dct { ’hobby’ : ’s p o r t ’ , ’a g e ’ : 25, ’name’ : ’N ik’} В данном примере также проиллюстрировано создание новой записи в сло­ варе (пара ’hobby’ : ’s p o r t ’). Для словарей имеются свои специальные методы: проверка на вхождение, список ключей, список значений, копирование, получение значения по умол­ чанию, слияние, удаление и т. д. Файлы Объекты типа file обеспечивают интерфейс между программным кодом на языке Python и внешними файлами на компьютере. 2.3 Инструкции 29 Встроенная функция open создает объект файла, a close разрывает связь с внешним файлом. Первый аргумент open — строка, содержащая имя фай­ ла, второй аргумент — строка режима использования файла. Выбор ’г* (по умолчанию) соответствует открытию файла для чтения, ’w’ — только для записи (файл будет перезаписан). Пример записи и чтения из файла: »> »> »> »> »> »> f = open ( ’с: \\tm p W d a ta .tx t ’ , ’w’) f . w r i t e ( ’lin e l \ n l in e 2 \n ’) f .c lo s e O f = open( ’с :\\tm p W d a ta .tx t’ ) s i = f .r e a d lin e O s2 = f .r e a d lin e O »> si ’lin e l \ n ’ » > s2 ’lin e 2 \n ’ Метод write используется для записи в файл, a readline — для построчного чтения. 2.3 И н стр ук ц и и Имена в Python, логические строки программы, стиль программирования, инструкции присваивания, инструкция p r in t, условные инструкции, циклы w hile, циклы fo r, обработка исключений. Имена в Python Имена переменных должны начинаться с латинской буквы (любого регистра) или подчеркивания, а дальше допустимо использование букв, цифр, цифр или символов подчеркивания. В языке Python регистр символов имеет зна­ чение как в именах, которые вы создаете, так и в зарезервированных словах. В качестве идентификаторов нельзя применять ключевые (зарезервиро­ ванных) слова языка и нежелательно переопределять встроенные имена (табл. 2.1). Таблица 2.1 Ключевые слова Python and elif if print as else import raise assert except in return break exec is try class finally lambda while continue for not with def from or yield del global pass Список ключевых слов для установленной версии Python можно вывести сле­ дующим образом: 30 Элементы языка » > im port keyword » > keyw ord.kw list Дополнительные соглашения об именах касаются использования подчерки­ вания в начале и в конце имени. Например, имена с двумя символами под­ черкивания в начале и конце являются системными. Логические строки программы Базовым элементом программы на языке Python является логическая стро­ ка. Программа на Python, с точки зрения интерпретатора, состоит из логи­ ческих строк. Работа интерпретатора состоит в последовательной обработке логических строк. Логическая строка составляется из одной или несколь­ ких физических строк, если подразумевается объединение строк. Физическая строка заканчивается символом конца строки, принятым для используемой платформы. Комментарий начинается символом # и заканчивается в конце физической строки. Обычно на каждой строке располагается одна инструкция, при записи не­ скольких инструкций в одной строке они разделяются символом ;. Для объ­ единения нескольких физических строк в одну логическую строку использу­ ется символ обратной косой черты (\): p r in t a; p r i n t b; с = а sr = а + b + с \ d + е Выражения в круглых, квадратных и фигурных скобках могут быть разде­ лены на несколько физических строк без использования символа обратной косой черты: 1 st = [ , ab c ) , 123, 1.23] Инструкции языка Python не могут быть разделены на несколько логических строк, за исключением составных инструкций. Составные инструкции состо­ ят из основной инструкции и блока вложенных инструкций. Запись составной инструкции проводится по шаблону Основная инструкции: Блок вложенных инструкций с использование двоеточия в качестве разделителя. Вложенный блок оформляется использованием одинаковых отступов от ле­ вого края. Именно по величине отступа интерпретатор языка Python опреде­ ляет, где находится начало блока и где — его конец. В пределах одного блока все инструкции должны иметь один и тот же отступ от левого края. 31 2.3 Инструкции Отступы являются частью синтаксиса языка Python. Их использование поз­ воляет получить однородный и удобочитаемый программный код, простой в сопровождении. Подобные ограничения на оформление программы важны для любого языка программирования и оказывают огромное влияние на при­ менимость вашего программного кода, на его пригодность к многократному использованию. Стиль программирования Основные ограничения на вид программы дает синтаксис языка программи­ рования и при его нарушении интерпретатор выдает синтаксические ошибки. Под стилем программирования будем понимать дополнительные ограничения на оформление кода, которые принимается и используется некоторой груп­ пой разработчиков программного обеспечения с целью получения удобных для применения, легко читаемых и эффективных программ. Стиль программирования касается все аспектов оформления кода: выбора названий и используемый регистр символов для имён переменных, стиль ком­ ментариев, оформление логических блоков, модулей, документирования и т.д. Для языка Python разработан официальный стиль (Python Style Guide3). Отметим некоторые положения стиля программирования на языке Python. При написании кода рекомендуется: • • • • использовать отступы в 4 пробела; использовать физические строки не более 79 символов; логические строки разбивать неявно (внутри скобок); выравнивать отступы строк продолжения по скобкам или но первому опе­ ранду в предыдущей строке; • не ставить пробелы сразу после открывающей скобки или перед закрыва­ ющей, перед запятой, точкой с запятой; • не ставить более одного пробела вокруг знака равенства в присваиваниях (пробелы вокруг знака равенства не ставятся в случае, когда он применя­ ется для указания значения по умолчанию). Среди рекомендаций по написанию комментариев отметим следующие: • обновляйте комментарии, когда модифицируете код; • для короткого комментария лучше не ставить в конце точку, длинные луч­ ше писать по обычным правилам написания текста; • пишите комментарии па английском; • комментарии к фрагменту кода (блочный комментарий) идут с тем же отступом, что и комментируемый код, после символа # идет одиночный пробел, абзацы можно отделять строкой с # на том же уровне, блочный комментарий отделяется от окружающего кода пустыми строками; 3 Python Style Guide — www.python.org/doc/essays/styleguide.html Элементы языка 32 • встроенные комментарии относятся к конкретной строке и их не следует1 использовать часто, символ # должен отстоять от комментируемого опера­ тора но крайней мере на два пробела; • все модули, классы, функции и методы, предназначенные для использова­ ния за пределами модуля, должны иметь строки документации, описыва­ ющие способ их применения, входные и выходные параметры; • для строк документации использовать утроенные кавычки; • для очевидных случаев используйте одинарные строки документации; • многострочное документирование состоит из подытоживающей строки с последующей пустой строкой и более подробным описанием; • вставлять пустую строку между последним параграфом в многострочной документации и ее закрывающими кавычками, размещая кавычки в от­ дельной строке. Третья группа соглашений касается правил для именования различных объ­ ектов, с тем чтобы это было понятно любому программисту, использующему Python: • имена модулей лучше давать строчными буквами, либо делать первые бук­ вы слов прописными, имена написанных на С модулей расширения обычно начинаются с подчеркивания; • в именах классов первые буквы слов являются прописными; • имена констант (они не должны переопределяться) лучше записывать про­ писными буквами; • имена исключений содержат в своем составе слово error (или warning). Инструкции присваивания Инструкция присваивания всегда создает ссылку на объект и никогда не со­ здают копии объектов. Для того, чтобы связать идентификатор (существую­ щий или новый) с объектом, для создания и изменения атрибутов объектов, изменения элементов изменяемых последовательностей, добавления и изме­ нения записей в отображениях используется символ =. Можно использовать групповое присваивание типа »> а = b = с = О Ту же задачу минимизации кода решает компактная форма, когда, например, вместо х = х + у мы используем х += у. Инструкция print С ее помощью производится вывод на экран для каждого выражения в списке выражений — эта инструкция преобразует объекты в текстовое представле­ ние и посылает результат на устройство стандартного вывода. 2.3 Инструкции 33 » > а = 2. » > b= 3 » > p r in t Ь /2 , а 1 2. 0 Инструкция p r i n t может быть использована для вывода в любой файл. Для этого после ключевого слова p r i n t необходимо поставить » и соответству­ ющий файловый объект. » > f = op en (’c iW tm p W d a ta .tx t’ , ’w’) » > s = ’T e x t’ » > p r in t » f , s » > f .c lo s e O Этот же результат можно получить использованием обычной команды p r in t при перенаправлении вывода в файл вместо стандартного потока вывода. Условные инструкции Условная инструкция i f в языке Python является примером составной ин­ струкции. Наиболее общая конструкция этой инструкции в Python имеет вид: i f condition!.: bodyl e l i f cond itio n 2 : body2 e l i f cond itio n 3 : body3 e l i f c o n d itio n ( n - l) : body(n-l) e ls e : body(n) Если условие c o n d itio n l истинно, то выполняется bodyl; иначе, если усло­ вие condition2 истинно, выполняется body2 и так далее, пока не находится истинное условие, или если нет истинных условий, то выполняется body(n). Если при этом нет части else, то условный оператор ничего выполнять не будет. Типичный фрагмент кода с условной инструкцией: i f а < 0: b = 1 e l i f а == 0: Ъ= 0 e ls e : b = -1 Элементы языка 34 Циклы while Инструкция w hile является самой универсальной конструкцией организации итераций в языке Python, в которой блок инструкций выполняется до тех пор, пока условное выражение продолжает возвращать истину. Цикл с while выглядит следующим образом: w hile co n d itio n : body e ls e : post-code Здесь co n d itio n это условие, которое оценивается на истинность или лож­ ность. Пока условие справедливо, тело цикла body будет постоянно выпол­ няться. Если условие ложно, будет выполняться блок программы post-code. Если цикл начат, а условие condition ложно, тело цикла body не будет вы­ полняться, а один раз выполниться часть цикла post-code. s = 0. i = 1 w hile i < 100: s = s + l./ i* * 2 i = i + 1 Отметим две простые инструкции break и continue, которые могут использо­ ваться только внутри циклов. Если выполняется break, цикл w hile немедлен­ но прекращается, даже часть p ost-code не выполняется. При выполнении ин­ струкции continue прекращается работа тела цикла body, условие co n d itio n оценивается снова и цикл начинает работать сначала. Часть e ls e цикла while может не использоваться, если нет оператора break в body. В тех случаях, когда синтаксис языка требует наличия инструкции, исполь­ зуется инструкция pass, которая не выполняет никаких действий. Циклы for Цикл fo r выполняет выполнять тело цикла для каждого элемента после­ довательности. Инструкция f o r работает, например, со строками, списками, кортежами. Общая форма выполнения цикла при работе со списком значе­ ний: fo r v a ria b le in l i s t : body e ls e : p ost-code Тело body будет выполнено один раз для каждого элемента списка. Конструк­ ция с e ls e обычно не используется. Операторы break и continue использу­ ются также, как и в цикле w hile. Вычисление суммы чисел: 2.3 Инструкции 35 х = [1, 2, 3, 4, 5] s = О fo r n in х: s = s + n Для работы с индексами используется функция ra n g e (). Функция ran g e() с одним аргументом генерирует список целых чисел в диапазоне от нуля до ука­ занного в аргументе значения, не включая его. В функции range () с двумя аргументами, первый будет рассматриваться как нижняя граница диапазона. Необязательный третий аргумент определяет шаг в списке целых чисел, так что » > ra n g e (-3 , 10,2) [-3 , -1, 1, 3, 5, 7, 9] Использование функции range в цикле: f o r i in r a n g e d , 10): fo r j in r a n g e d , 10): p r in t i , j , i* j В этом примере иллюстрируется работа с вложенными циклами. Обработка исключений Исключение возбуждается, когда интерпретатор обнаруживает ошибку во время выполнения программы. В своей программе мы можем перехватывать такие ошибки и обрабатывать их или просто игнорировать. В последнем слу­ чае интерпретатор останавливает выполнение программы и выводит сообще­ ние об ошибке. » > а = 0. »> Ъ = 2 / а Traceback (most re c e n t c a l l l a s t ) : F ile "<console>", lin e 1, in <module> Z e ro D iv isio n E rro r: f lo a t d iv is io n Можно добавить инструкцию try , которая позволит перехватить обнаружен­ ные ошибки (деление на ноль) и продолжить выполнение программы. Стан­ дартная форма инструкции try : try : do something except e rr o r : do something e ls e В пашем примере результатом работы программы а = 0. Элементы языка 36 tr y : b = 2 / а except Z e ro D iv isio n E rro r: p r in t ’D iv isio n by z e r o ! ’ будет строка D iv is io n by z e ro ! Более общие конструкции обработчиков исключений можно найти в доку­ ментации по языку. 2.4 Ф ун к ц и и Инструкция d e f, переменное число аргументов, lambda функции, простран­ ство имен в Python. Инструкция def Функции в Python являются основными программными структурами, кото­ рые обеспечивают структурирование программы и многократное использо­ вание программного кода. Составные инструкция def в языке Python состоит из строки заголовка и следующего за ней блока инструкций: def nam e(argl, a r g 2 , . . . , argN ): body Инструкции def определяются имя функции name, с которым будет связан объект функции, и список из нуля или более аргументов (параметров) a rg l, arg2, . . . , argN. Параметры связаны с объектами, которые передаются в функцию в точке вызова. Тело функции body образует программный код, который выполняется интерпретатором всякий раз, когда производится вы­ зов функции. В любом месте в теле функции может располагаться инструкция re tu rn . Ин­ струкция r e tu r n является необязательной — при ее отсутствии работа функ­ ции завершается, когда поток управления достигает конца тела функции. Пример создания функции и ее вызова: def add(x, у ): re tu rn х + у p r in t add(2, 3 ), a d d (’P o ly ’ , ’morphism’ ) Результат работы программы 5 P o lym o rp h ism 2.4 Функции 37 Вызов осуществляется по имени функции (add), добавляя круглые скобки после ее имени, внутри которых указаны аргументы, значения которых будут присвоены аргументам, указанным в заголовке функции. При первом обращении к функции проводится сложение простых чисел 2 и 3, во втором случае мы работаем со строками ’P o ly ’ и ’morphism’, результат есть конкатенация этих строк. Этот пример демонстрирует полиморфизм в языке Python, когда одна и.та же функция реализована одинаково для разного типа данных. Переменное число аргументов В языке Python реализованы различные возможности определения функции с переменным числом аргументов. Наиболее простой и важный способ со­ стоит в установлении значения по умолчанию для одного или нескольких аргументов. Заданные по умолчанию значения аргумента используются в том случае, ес­ ли при вызове функции соответствующий аргумент не был определен. Для этого необходимо присвоить соответствующему аргументу некоторое значе­ ние в определении функции. Если во время вызова функции не будет передан аргумент, то переменная примет присвоенное ей по умолчанию значение. Результат работы программы def f ( x , а = 1 ): r e tu rn а*х**2 p r in t f (2 ), f (2, 2) будет В Python имеется возможность определить функцию таким образом, тюбы ее можно было вызвать с произвольным числом аргументов. В этом случае аргументы будут переданы в виде кортежа. Перед переменным числом аргу­ ментов может присутствовать произвольное число обычных аргументов. Используем, например, функция расчета суммы элементов списка def lsu m (* a rg s): smm = О fo r arg in arg s: smm += arg re tu r n smm p r in t lsumO , ls u m (l), lsu m (l, 2, 3) Элементы языка 38 Результатом работы будет 0 1 6 Возможна также передача аргументов аргументов но ключам с использова­ нием конструкции def nam e(**args), когда аргументы будут собраны в но­ вый словарь, который можно обрабатывать обычными инструментами, пред­ назначенными для работы со словарями. lambda функции Python разрешает создание анонимных функций (например, функции, ко­ торые не связаны с именем) во время выполнения, используя конструкцию lambda. Объекты функций в этом случае создаются в форме выражений. За ключевым словом lambda следуют один или более аргументов и далее, вслед за двоеточием, находится выражение: lambda a r g l, arg2, argN: выражение. Разницу между обычным определением функции (f 1) и lambda функции (f2) наиболее просто пояснить на примере работы программы def f l (х): r e tu r n х**2 f2 = lambda х: х**2 p r i n t f 1 (4 ), f 2 (4) Такие конструкции удобны для создания малых функций и позволяют встра­ ивать определения функций в программный код, который их использует. Пространство имен в Python С каждой точкой программы можно связать три пространства имен: локаль­ ное, глобальное и встроенное. Пространство имен определяет отображение имен в объекты. Пространства имен создаются в различные моменты времени и имеют раз­ ную продолжительность жизни. Пространство встроенных имен создается при запуске интерпретатора и существует все время его работы. Глобальное пространство имен-модуля создается, когда он считывается, и, обычно, также существует до завершения работы интерпретатора. Локальное пространство имен функции создается при вызове функции и удаляется при выходе из нее. Имена, определяемые внутри тела функции, видны только программному коду внутри тела функции. К этим именам нельзя обратиться за пределами функции. Свойство глобальности во вмещающем модуле переменной внутри тела функции обеспечивается использованием инструкции global. 2.5 Модули 39 Поиск имен ведется последовательно в четырех областях видимости: локаль­ ной, затем в объемлющей функции (если таковая имеется), затем в глобаль­ ной и, наконец, во встроенной. 2.5 М одул и Программа в Python, создание и использование модулей, поиск модуля, стан­ дартные модули, пакеты модулей. Программа в Python При модульном подходе к программированию большая задача разбивается па несколько более мелких, каждую из которых (в идеале) решает отдельный модуль. Важно составить такую композицию модулей, которая позволила бы свести к минимуму связи между ними. Набор функций, имеющий множество связей между своими элементами, логично расположить в одном модуле. Программа на языке Python организована как один главный файл, к которо­ му могут подключаться дополнительные файлы. Каждый такой файл пред­ ставляет собой отдельный модуль, содержащий инструкции. Именно такая процедура реализуется при работе в среде разработки NetBeans IDE. Модули для использования в программах на языке Python по своему происхо­ ждению делятся па обычные (написанные на Python) и модули расширения, написанные на другом языке программирования (например, на С). Для включения модуля в программу на языке Python он должен быть импор­ тирован главным файлом, или другими файлами программы. Создание и использование модулей Для создания модуля достаточно ввести программный код па языке Python в текстовый файл и сохранить его с расширением .ру. Такой файл но умолча­ нию считаться модулем Python. Все имена, которым выполнено присваивание на верхнем уровне модуля, станут его атрибутами (именами, ассоциирован­ ными с объектом модуля) и будут доступны для использования клиентами. При работе в NetBeans IDE для добавление модуля в проект выбирается ко­ манда File | New File и тип файла Python. Далее в режиме диалога задается имя файла и его расположение. Создадим, например, модуль °/0 module 1 ( f i l e m odulel.py) def tim es(x , y ) : re tu rn x * у Элементы языка 40 def add(x, у ): re tu rn х + у который содержит две функции: tim es и add. Будем использовать этот модуль в главном файле main.py. Для этого при­ меняется инструкция import: °/о main ( f i l e main.py) import modulel p r in t m odulel.add(2, 3 ), m o d u le l.tim e s( ’w ell ’ , 4) После запуска программы выводиться строка ;S '"W 1Г :'W ;6:11;:'!:: ^ В результате выполнения инструкции im port в главном модуле становиться доступным имя (modulel), которое ссылается на полный объект модуля. При обращении к его атрибутам (функциям tim es и add) необходимо использовать имя модуля сточкой (modulel .add () и modulel .tim es ()). Для изменения имени ссылки на импортируемый модуль используется кон­ струкция import . . . as. Результатом работы программы У* main ( f i l e main.py) import modulel as ml s = m l.a d d (’Import ’ , ’as ’) p r in t m l.ad d (s, ’m l’) будет Иногда бывает более удобно импортировать модуль не целиком, а отдельные имена из его области видимости. В этом случае используется инструкция from . .. import. В нашем примере в/« main ( f i l e main.py) from modulel im port add p r in t a d d (’Import ’ , ’add’) Импортируемое имя (add) копируется в область видимости, в которой на­ ходится сама инструкция from . . . im port, и его можно использовать без указания имени вмещающего модуля. Имеется специальная форма инструкции from . . . import с использованием символа * вместо списка импортируемых имен. В этом случае импортируются все имена: °/0 main ( f i l e main.py) from modulel import * p r in t a d d (’Import ’ , ’a l l ’) , tim e s ( ’ ! ’ , 3) 41 2.5 Модули Im p o rt a ll ! 1! Для того чтобы выяснить, какие имена определены в модуле, можно исполь­ зовать встроенную функцию d i r (). Она возвращает отсортированный список строк: °/e main ( f i l e main.py) import module1 p r in t dir(m odule1) [ ’„ b u iltin s 1 , ’„ d o c ’, ’ 5 package 1 , ' 1add ’ ’ tim e s ’ ] file ^ 5 ,__ ’_name ’, Импортирование является относительно дорогостоящей операциейи онавы­ полняется интерпретатором всего один раз первойинструкцией import или from .. . import. Последующие операции импорта просто получают объект уже загруженного модуля. Возможность повторной загрузки модулей реали­ зуется встроенной функцией relo ad . Поиск модуля При импорте модуля, интерпретатор Python ищет модуль в следующей после­ довательности: • в текущем каталоге (где расположен главный файл); • если модуль не найден, Python просматривает каждый каталог в перемен­ ной окружения PYTHONPATH; • если все остальное не даст результатов Python проверяет каталоги, в кото­ рые были установлены модули стандартной библиотеки Python. В силу такой организации поиска желательно располагать все модули про­ граммы в одном каталоге. Вы можете узнать как выглядит путь поиска при запуске вашей программы, просмотрев содержимое встроенного списка sy s.p a th (после импорта модуля sys, который входит в состав стандартной библиотеки Python): У. main ( f i l e main.py) import sys import module1 p r in t sy s.p a th [ ’C \ \ V a b \ \ P y t h o n \ \ ; T e s t l \ \ s r c ’ , ’0 \ \ P r o g r a m F ile s \ \ N etB eans 6 7 \ \ p y t h o n ! ’ , ’C - \\W in d o w s \\.s y s te m 3 2 \\ p yth o n 2 6 zip ’ , ’C * \\P y th o n 2 6 \\D L L s ’ , ’C \ \ P y t h o n 2 6 \ \ l i b ’ , }C \ \ P y th o n 2 6 \\ lib \ \ p l a t - w i n ’ , ’C* \ \ P y th o n 2 6 \\ 1ib \ \ l i b —tk ’ , ’C :\\P y th o n 2 6 ’ , ,C . \ \ P y t h o n 2 6 \ \ l i b \ \ s i t e -p a c k a g e s ’ , ’С : \ \ V ab \ \ P у t hon \ \ T es 11 \ \ s г с ’ ] . ; Элементы языка 42 При работе в среде разработки NetBeans IDE пути поиска можно посмотреть и отредактировать на вкладке Python Path диалога Python Platform Manager, который активизируется командой Tools | Python Platforms. Дополнительные пути для основного проекта устанавливаются в диалоге Project Properties (ко­ манда File | Project Properties) при выборе Categories: Python. Стандартные модули Привлекательной стороной языка программирования Python является стан­ дартная библиотека, которая является обширной коллекцией дополнитель­ ных модулей. Эта коллекция насчитывает многие десятки крупных модулей и обеспечивает поддержку наиболее распространенных задач. Набор модулей для работы с операционной системой позволяет писать кроссплатформенные приложения. Имеются также средства для работы со мно­ гими сетевыми протоколами и форматами интернета, для разбора и создания почтовых сообщений, для работы с XML. Отметим также модули для работы с регулярными выражениями, текстовыми кодировками, мультимедийными форматами, криптографическими протоколами, архивами, поддержки сери­ ал изации данных. Некоторые возможности стандартной библиотеки Python, которые интересны при научных вычислениях, мы рассмотрим позже. Более полную информацию можно найти в справочном руководстве по стан­ дартной библиотеке языка Python. Она доступна для установленной версии Python по команде Пуск (Start) | Python х.х | Python Manual в разделе The Python Standard Library. Пакеты модулей В больших программных продуктах для организации иерархической файло­ вой структуры удобно использовать каталог. Типичной является ситуация, когда в отдельных подкаталогах находятся файлы с одинаковыми именами. Python дает возможность импортировать не только имена модулей но и име­ на каталогов. Каталог в этом контексте является пакетом, а такая операция импортирования в Python называется импортированием пакетов. Основная особенность импортирования пакетов состоит в указании пути к соответствующему модулю в инструкциях import и from . . . import. Пусть пакет идентифицируется как каталог d i r l . В нем есть подкаталог d ir2 , кото­ рый содержит нужный нам модуль modulel (файл modulel .ру). Тогда импорт этого модуля будет осуществляться инструкцией в/, main ( f i l e main.py) import d ir l.d ir2 .m o d u le l При этом каталог d i r l должен находится в пути поиска модулей. 3 Математический Python Встроенные функции и стандартная библиотека Python предоставляют ши­ рокие возможности для решения самых различных задач программирова­ ния. Кроме того, Python допускает расширение за счет библиотек, созданных сторонними разработчиками. В данной главе рассматриваются инструмен­ тальные средства для решения задач численного анализа. Дается краткое описание математических модулей стандартной библиотеки Python и расши­ рений NumPy и SciPy, которые могут рассматриваться как свободный и более мощный эквивалент системы программирования математических вычисле­ ний MATLAB. Визуализация расчетов обеспечивается пакетом научной гра­ фики Matplotlib. 3.1 В стр оен н ы е ф у н к ц и и и стандартная библиотека Встроенные функции, модули стандартной библиотеки, математические мо­ дули. Встроенные функции Python имеет ряд встроенных функций, некоторые из них мы уже упоминали. Общий список встроенных функций с описанием содержится в документации (команда Пуск (Start) | Python х.х | Python Manual). Здесь мы отметим лишь некоторые из них, которые интересны при проведении вычислений. При арифметических операциях над числами смешанного типа проводится автоматическое преобразование к общему более старшему типу. Иерархия чисел: целые числа, длинные целые числа, числа с плавающей точкой, ком­ плексные числа. В частности, интерпретатор Python автоматически преобра­ зует целые числа в длинные целые, если их значения оказываются слишком большими, чтобы уместиться в формат простого целого числа. Для принуди­ тельного преобразования используются встроенные функции in t О, long О, f l o a t (), complex(). Примеры их использования: »> а = 1 » > Ъ = - 2.3 Математический Python 44 » > с = ’4 .5 ’ > » p r in t а + b -1 .3 » > p r in t in t( b ) -2 » > p r in t f l o a t (c) 4.5 » > p r in t complex (a, b) (1 - 2 .3j) Core Python поддерживает только несколько математических функций. На­ пример, abs(x) возвращает абсолютное значение числа, т.е модуль данного числа | х | : » > p r in t a b s ( - 1 .2 ) , abs(3 + 4 j) 1.2 5.0 Встроенные функции max(x) и min(x) используются для поиска максималь­ ного и минимального значений: »> >» »> 4 1 »> 7 а = [1, 2, 3, 4] b = [5, 3, 1] p r in t max (a ), min(b) p r in t max(3, 1, 7, 4) Функция cmp(x, у) сравнивает х и у и возвращает 1, когда х > у, - 1, когда х < у и ноль при х = у: » > а = 0.5 »> b =1 » > p r in t cmp(a, b ) , cmp(a+l, b) -1 1 » > p r in t cmp(2*a, b) 0 Упомянем также встроенную функцию pow(x, у ) , которая возвращает х воз­ ведённый в степень у. Ранее мы упоминали некоторые другие встроенные функции, такие как range, open. Модули стандартной библиотеки Из большой массы модулей стандартной библиотеки отметим лишь некото­ рые. Модуль sys предоставляет доступ к переменным, которые содержит ин­ формацию о среде выполнения программы, об интерпретаторе Python. Выше 3.1 Встроенные функции и стандартная библиотека 45 мы уже упоминали объект из этого модуля p ath — список путей поиска мо­ дулей. Функция e x it (arg) с необязательным аргументом прерывает выпол­ нение программы. Можно воспользоваться e x i t ( ’e r r o r ’) для того чтобы прервать выполнение программы и вывести сообщение об ошибке. Инструк­ ция platfo rm выводит информацию об используемой платформе. Файловые объекты, соответствующие стандартным потокам ввода, вывода и ошибок интерпретатора связаны с объектами s td in , std o u t, s td e r r модуля sys. Взаимодействие с операционной системой поддерживается модулем os. В частности, функция getcwdO возвращает строку, представляющую текущий рабочий каталог. Для изменения текущий рабочий каталог (на path) исполь­ зуется c h d ir(p a th ). Для удаления файла (каталога) с именем path можно использовать функцию remove (path) (rem ovedirs(path)). Переименовывать файл (каталог) s rc в d s t поможет функция rename (s r c , d s t). Для выявления узких мест в программе необходимо замерить временные ин­ тервалы на выполнения отдельных частей программы. С этой целью можно использовать модуль time, который предоставляет различные функции для работы со временем. Точка отсчета (начало эпохи — 0 часов 1 января 1970г.) для вашей платформы выводиться функцией gmtime(O): import tim e p r in t time.gmtime(O) |iin e s t ruc-t;J t im e ( tm ^ y e a r = 1 9 7 0 ,; tm _ m o n - l, tm _m day—1, tm ^h o tir ==0,^ tih ^ m m ~ 0 ^ titt;b sd d 4 ;0 , :tm_wday==3, tm ^yday ~ 1, Для замера производительности может быть использована функция clockO , коггорая возвращаем1 текущее процессорное время в секундах в виде веще­ ственного числа. Функция sle e p (secs) приостанавливает выполнение па secs (вещественное число) секунд. Более полный анализ производительно­ сти программ на языке Python осуществляется с использованием специали­ зированных модулей p r o f i le и p s ta ts , которые включены в стандартную библиотеку. Весьма полезные функции сохранения и копирования объектов языка Python предоставляет модуль p ic k le , который преобразуем1объекты языка Python в последовательность баймюв и обратно (сериализация). Полученную м’аким об­ разом последовательность баймюв можно сохранить во внешней памяти или передать его но каналам связи. Модуль p ic k le реализован на языке Python и работаем1досм'аточно медленно. Для более быстрой работы можно использовамъ реализованный на С модуль cP ickle. Для сохранения данных используем следующую программу для записи дан­ ных в файл m ydata.dat: im port p ic k le d a ta = ("abc", 1.23, [1, 2, 3]) 46 Математический Python f i l e = o p en ("m y d ata.d at", "w") p = p ic k l e .P i c k i e r ( f i l e ) p.dum p(data) f i l e . c lo se O Здесь P ic k ie r ( f i l e ) возвращает объект, реализующий сериализацию. Аргу­ мент f i l e должен быть файловым объектом, имеющим метод w r ite (). Для сериализация данных d a ta используется dump (d a ta ). Обратная процедура извлечения данных реализуется следующей програм­ мой: import p ic k le f i l e = open ("m y d ata.d at", "r") mydata = p i c k l e . lo a d ( f i le ) f i l e . clo se O p r in t mydata Для восстановления и возвращения ранее сериализованных объектов исполь­ зуется lo a d ( f ile ) . В ранних версиях Python для работы со строками использовался модуль s trin g . В настоящее время функции этого модуля реализованы как методы для строк. Пример использования для разделения и объединения строк: import s tr in g s = "one, two, th re e " p r in t s t r i n g . s p l i t ( s , ", ") r = s . s p l i t ( " ," ) p r in t r p r in t " " .j o i n ( r ) [ ’ one ’ , ’two ’ , ’ th r e e 5] [ ’ one ’ , ’ two ’ , ’ th r e e 7] one two t h r e e Из других полезных методов работы со строками отметим f in d () и re p lac e () для поиска и замены. Математические модули Несколько более подробно обсудим модули стандартной библиотеки Python для выполнения основных математических операций. Математические функ­ ции для работы с вещественными числами представлены в модуле math. Рабо­ та с комплексными числами обеспечивается модулем cmath. Многие функции 3.1 Встроенные функции и стандартная библиотека 47 в этих модулях имеют одинаковые имена, но результаты могут быть совер­ шенно разные. В частности, при вычислении квадратного корня из отрица­ тельного числа (функции m a th .s q r t(-1) и c m a th .sq rt(-1)). Функции модуля math приведены в табл. 3.1. Если аргумент обозначен буквой z, то функция определена как в math, так и в cmath. Таблица 3.1 Функции в модулях math и cmath Ф ункция acos(z) acosh( 2) asin(z) asinh(z) atan( 2) atan2( y, x) atanh( 2 ) ceil (ж) copy sign (я, у) cos( 2 ) cosh (ж) degrees(:r) ехр(г) fabs(rr) factorial (x) йоог(ж) fmod(.x,y) frexp(x) О п и са н и е арккосинус 2 гиперболический арккосинус 2 арксинус 2 гиперболический арксинус 2 арктангенс 2 atan(?//x) гиперболический арктангенс 2 наименьшее целое, большее или равное х х со знаком у косинус 2 гиперболический косинус х перевод величины угла х из радиан в градусы экспонента (ez ) абсолютное значение х факториал х\ наибольшее целое, меньшее или равное х остаток от деления х на у возвращает мантиссу и порядок х как пару (ш ,г), где т — число с плавающей точкой, а г — целое, такое, что х = m2 1. hypot ( x, y) ldexp(ra, i) у]х2 + у2 Функция, обратная frexp(x) ( т 2 г) натуральный логарифм 2 десятичный логарифм 2 возвращает пару (р, q) — целую и дробную часть х. Обе части имеют знак исходного числа полярный угол комплексной величины 2 комплексное число z в полярных координатах (г, ip) ху перевод величины угла х из градусов в радианы переход от полярных координат к декартовым синус 2 гиперболический синус 2 корень квадратный от 2 тангенс 2 гиперболический тангенс 2 loglO(z) m odf(x) phase(z) ро1аг(г) pow (x, y) radians(x) rect (r, (f) sin ( 2) sinh( 2 ) sqrt( 2 ) ta n ( 2 ) tanh( 2) В модулях math, так и в cmath также определены две вещественные констан­ ты: p i — число 7Г и е — число е. Следует отметить также модуль random, который позволяет генерировать псевдослучайные числа для различных распределений. Для генерации слу­ Математический Python 48 чайного вещественное число г такое, что (0.0 < г < 1.0) используется функ­ ция randomO. Функция u n iform (a, b) возвращает случайное вещественное число г -такое, что а < г < Ь. Для получения случайного целого число из диа­ пазона range ( s t a r t , sto p , ste p ) используется функция randrange( s t a r t , sto p , ste p ). Генерация числа из последовательности нормально распределенных псевдо­ случайных чисел (распределение Гаусса) производиться функцией gauss (mu, sigma), где mu — математическое ожидание a sigma — стандартное отклоне­ ние. Другая возможность связана с использованием функции n o rm alv ariate с теми же параметрами. Имеется возможность генерации чисел из других последовательностей псевдослучайных чисел (бета-распределение, экспонен­ циальное распределение, гамма-распределение, логарифмически нормальное распределение и др.). 3.2 П ак ет NumPy Вычислительное ядро Python, массивы в NumPy, создание массивов, работа с массивами, математические функции, матричные объекты, линейная алгеб­ ра, работа с полиномами, другие возможности NumPy. Вычислительное ядро Python Математические алгоритмы, реализованные на интерпретируемых языках, работают, вообще говоря, гораздо медленнее чем при использовании компи­ лируемых языков, таких как С. В Python для большого количества вычисли­ тельных алгоритмов проблема низкого быстродействия решается за счет ис­ пользования специальных библиотек (вычислительный Python), которые спе­ циально ориентированы на поддержку многомерных массивов и множество функций и операторов для работы с ними. Типичной является ситуация, ко­ гда вычислительный алгоритм базируется на последовательности операций над массивами и матрицами, и в этих условиях программа на языке Python работает также быстро как и программа написанная на С. Наиболее интересным примером вычислительного пакета является NumPy1. NumPy включает модули для вычислений с многомерными массивами, необ­ ходимых для многих численных приложений. Благодаря этому NumPy обес­ печивает возможности, которые характерны для таких систем как MATLAB2 и GNU Octave3 (аналог MATLAB). Язык программирования MATLAB также является интерпретируемым и позволяет писать быстрые программы пока большинство операций производятся над массивами или матрицами, а не над скалярами. 1 NumPy — http://numpy.scipy.org/ 2 M A TLAB — www.mathworks.com/products/matlab/ 3 GNU Octave — www.gnu.org/software/octave/ 3.2 Пакет NumPy 49 NumPy прост и удобен для пользования и включает помимо средств для ра­ боты с многомерными массивами модули для: • решения задач линейной алгебры; • быстрого преобразования Фурье; • генерации массивов случайных чисел. На основе пакета NumPy строятся другие инструментальные средства для решения задач вычислительной математики, некоторые их них мы отметим ниже. Это обстоятельство позволяет отнести пакет NumPy к базовым мате­ матическим пакетам, хотя он и не входит в стандартную библиотеку Python. Массивы в NumPy Пакет NumPy определяет новый тип данных — N-мерный массив (ndarray). Массив — это упорядоченный набор данных для хранения данных одного ти­ па, идентифицируемых с помощью одного или нескольких индексов. В NumPy массив имеет, как правило, постоянную длину и хранит единицы данных од­ ного и того же типа dtype (Data type objects). Количество используемых ин­ дексов массива может быть различным. Массивы с одним индексом называют одномерными (вектора), с двумя — двумерными (матрицы). Количество размерностей и длина массива по каждой оси называются фор­ мой массива (the shape of the array). В NumPy форма массива описывается как кортеж из N натуральных чисел, длина которого (N) есть размерность массива, а элементами кортежа является длина массива по соответствующей оси. Пример двумерного массива 2 x 3 целых чисел: im port numpy as np a = n p .a r r a y ( [ [ 1 , 2, 3 ], [4, 5, 6 ]]) p r i n t ty p e (a ) p r i n t a.shape p r i n t a .d ty p e C ty p e ’numpy n d a rra y ’> 111Д ^ :;^ I " ^ ^ i;■ :; H i-i::; В качестве элементов массива можно используются все числовые типы (см. табл. 3.2). 50 Математический Python Таблица 3.2 Типы элементов массива Тип данны х bool int int8 intl6 int32 int64 uint8 uintl6 uint32 uint64 float float32 float64 complex64 complexl28 О п и са н и е логическое (True или False) целое (обычно int32 или int64) байт (от -128 до 127) целое (от -32768 до 32767) целое (от -2147483648 до 2147483647) целое (от -9223372036854775808 до 9223372036854775807) беззнаковое целое (от 0 до 255) беззнаковое целое (от 0 до 65535) беззнаковое целое (от 0 до 4294967295) беззнаковое целое (от 0 до 18446744073709551615) краткая форма для float64 вещественное с одинарной точностью вещественное с двойной точностью комплексное (float32 для вещественной и мнимой части) комплексное (float64 для вещественной и мнимой части) Создание массивов Наиболее простой способ создания массива связан с использованием функ­ цию a rra y О , в которой элементы массива задаются в виде вложенных спис­ ков, с явным или неявным заданием типа. import numpy as np a = n p .a r r a y ( [ [ 1 , 2, 3 ], [4, 5, 6 ] ] , ’f l o a t ’) p r in t a p r in t a.sh ap e p r in t a.d ty p e II 1 2 ; С]:.? : в ш и й ш ш ш ш Создание массива из списка и обратная процедура (с помощью метода t o l i s t O ) иллюстрируется следующим примером: import numpy as np 1 st = [[1 , 2, 3 ], [4, 5, 6]] a = n p .a r r a y (1 st) p r in t a p r in t a . t o l i s t O [[1 2 3] [4 5 6]] 111, 2, 3 ] , [ 4, 5, 6Ц 51 3.2 Пакет NumPy При вычислениях часто используются специальные матрицы. В единичных матрицах элементы главной диагонали равны 1, а все остальные — 0, нулевые матрицы, у которых все элементы равны 0. Отметим также матрицы, все элементы которых равны 1. Для инициализации таких массивов в NumPy имеются соответствующие инструменты. Функция z e ro s (s h , d t) позволяет сформировать массив с пулевыми элемен­ тами по форме sh и необязательному аргументу d t — тин элемента. Анало­ гично o nes(sh , d t) формирует массив с единичными элементами. Для полу­ чения матрицы с единицами на главной диагонали и нулями для других эле­ ментов используется функция еуе(п, ш), для квадратной матрицы — еуе(п) или id e n tity ( n ) . Примеры генерации массивов: im port numpy as np a0 = n p .z e ro s ((2 , 3 ), ’f l o a t ’) p r i n t ’a0 :.\n ’ , aO a l = n p .o n e s((3 , 2 ), ’i n t ’) p r i n t ’a l : \ n ’ , a l a2 = n p .ey e(3 , 2, d ty p e= in t) p r i n t ’a 2 :\ n ’ , a2 a3 = n p .id e n t i t y (4, ’f l o a t ’) p r i n t ’a 3 : \ n ’ , a3 [ [ 0 0. 0. 1 о ] 0 О 1 ]] Имеются специальные процедуры для формирования одномерных массивов (векторов). Функция a r a n g e ( s t a r t , sto p , step ) формирует массив вели­ чин, начиная со s t a r t до (не включая) sto p с шагом step. Такая копстрз щя подобна arra y (range ( s t a r t , sto p , s te p ) ) , но работает не только с целыми числами. Функция l i n s p a c e ( s t a r t , sto p , п) создает одномерный массив с числом элементов п, значения которого равномерно распределены от s t a r t до (включая) stop. Математический Python 52 import numpy as np aO = np. arra y ( r a n g e d , 1 0,3)) p r in t ’a 0 : \n ’ , aO a l = n p .a ra n g e (0 .,1 0 .,2 .) p r in t ’a l : \ n ’ , a l a2 = n p .lin s p a c e ( 0 .,1 .,1 1 ) p r in t ’a l : \ n ’ , a2 Имеются и некоторые дополнительные функции создания массивов (напри­ мер, fro m file O , empty О ), о которых вы можете узнать в документации по пакету NumPy. Работа с массивами Для копирования массивов можно использовать метод соруО, а изменить форму массива — shape(). Аналогичный результат достигается при вызове reshape (). Функция r e s iz e О аналогична reshape О , но работает и в случае, когда число элементов исходного и получаемого массивом не совпадает. import numpy as np aO = n p .l i n s p a c e ( l .,1 0 .,1 0 ) p r in t ’a0 :\n > , aO a2 = np.copy(aO) a l = np.reshape(aO , (2, 5)) p r in t ’a l : \ n \ a l a2.shape = (-1,50 p r in t > a 2 :\n \ a2 a3 = n p .re s iz e (a 2 , (3, 4)) p r in t > a3 :\n ’ , a3 aO [ 1 al : и I a2: II 1 a3 ; 2 3 4. 5 1. 6 2 7. 3 8 4 9 5 ] 10 ]] 1 6. 2. 7. 3 8 4 9 5 ] 10 ]] 6 3.2 Пакет NumPy [[ I ( 1 2 5 9 6 10 53 3 4 } 7. 1. 8 ] 2 ]] Здесь используется -1 при выборе формы массива (в пашем примере (2 ,-1 )) для неявного задания числа элементов по одной оси массива — вычисляется по общему числу элементов. Для изменения элемента массива используется доступ по индексу, а для части массива — получение среза. Некоторые основные возможности иллюстриру­ ются следующим примером. import numpy as np a = n p .re s h a p e (n p .lin s p a c e (1 ,1 2 ,1 2 ),(3 ,4 )) p r in t ’a : \ n ’ , a p r in t ’elem ent (2 ,3 ): ’ , a [2,3] p r in t ’row 1: ’ , a [ l] p r in t ’l a s t row: ’ , a [ - 1 ,:] p r in t ’column 1: ’ , a [ : , l ] p r in t ’window 2x2: \ n ’ , a [1 :3 ,0 :2 ] a [( ' 1 2 [ 5 6 [ 9 10 e le m e n t (2 ,3 ) row 1 [ 5 l a s t row . [ colum n 1.' j window 2x2 [[5 I 3 7 4.1 8 1 12 ]] 12 0 11 6 9. 2 7 10 6. 8 j 11. 10 ] 6 ] 9. 10 П Запись массива в файл (бинарный, NumPy формат, расширение .пру) произ­ водиться функцией save (), а чтение из файла — load О . im port numpy as np a = n p .r e s h a p e ( n p .lin s p a c e ( l., 8 . , 8 ) , ( 2 , 4 ) ) p r in t ’a : \ n ’ , a n p .s a v e ( ’c :/tm p /d a ta .n p y ’ , a) a l = n p .lo a d ( ’c :/tm p /d a ta .n p y ’) print ’ a l : \n \ al U i I 5 al U i 2 6. 3 7. 4 ] 8 ]] 2 3 4 ] Математический Python 54 (5 б 7 8 |] При чтении и записи массивов в текстовый файл используются функции to file Q и fromfileO. Математические функции В NumPy реализованы стандартные арифметические операции над элемента­ ми массивов (табл. 3.3). Таблица 3.3 Арифметические операции над массивами Ф ункция Описание add(x, у) subtract(a:, у) m ultiply(x, у) divide(ai, у) power(a:,2/) negative(:r) поэлементное сложение поэлементное вычитание поэлементное умножение поэлементное деление поэлементное возведение в степень изменение знака элементов массива Примеры использования арифметических поэлементных операций над мас­ сивами: Import numpy as np 10 = n p .1in sp a c e ( 1 ., 10., 1 0 ).re s h a p e (2, 5) >rint ’aOAn’ , aO 11 = n p.o n e s( 1 0 ) .re s h a p e (2, 5) 11 = n p .a d d (a l, 1.) >rint ’a l A n ’ , a l 12 = np.add(a0, a l) >rint Ja 2 : \ n , , a2 13 = np.multiply(aO , a l) >rint ’а З Л п ’ , a3 = np.power(aO, a l) print :’ a4:\n ’ , a4 aO 2 3 II i [ 6. 7 8. al 2. 2. 2 [[ 2 2 2 2 [ 2 a2 4 5 II 3 9. 10. [ 8. a3 4 9 5 ] io .] ] 2 ] 2 ]] 6. 11 7.J 12 U 3.2 Пакет NumPy [[ 2 [1 2 [[ [ 4 14. 1 36 55 6 16 4 49 8. 18 9 64 10 ] 20 J] 16 81 25 ] 100 |] Среди других функций для поэлементных операций над массивами отмстим: Тригонометрические: sin(x), cos(x), tan(x), arcsin(x), arccos(x), arctan(x), hypot(x, y), arctan2(x,y), degrees(x), radians(x); Гиперболические: sinh(x), cosh(x), tanh(x), arcsinh(x), arccosh(x), arctanh(x); Экспоненциальные и логарифмические: exp(x), expml(x) (= exp (ж) - 1), log(:r), logl0(a;), log2(a;)) loglp(a;)(= log(l +ж)). Другие функции соответствуют обозначениям математических функций в модуле math стандартной библиотеки Python (см. табл. 3.1). import numpy as np aO = np.linspace(0., np.pi, 9) print ’a O A n ’, aO al = np.sin(aO) print ’a l A n ’, al a2 = np.cos(aO) print ,a2:\n ^, a2 a3 = np.multiply(al, al) + np.multiply(a2, a2) - 1. print ’а З А п ’, a3 [ 0 117809725 2 35619449 0.39269908 1 57079633 2.74889357 0 78539816 196349541 3 14159265] [ 0 OOOOOOOOe+OO 3 82683432e~01 7.07106781 e-01 9.23879533e-01 10Q000000e+00 , 9 23879533e-01 7.07106781 e—01 , 3 82683432e~01 ; 1 22464680c-16] [ 1.00000000e-f00 3.82683432e—01 - 7 07106781e—01 a3 : [0 . 0. 0 0 0 9.23879533e-01 7 07106781e-01 6.12323400e-17 -3.82683432e-01 -9.23879533e-01 -l.OOOOOOOOe+OO] 0 0 0 0 ] Для работы с массивами с комплексными элементами предназначены функ­ ции: angle(x) (аналог функции phase(x)), rcal(x), imag(x) и conj(.x), которая возвращает массив с комплексно-сопряженными элементами. import numpy as np Математический Python 56 aO = n p .1in s p a c e ( 1 . , 10., 1 0 ).r e s h a p e (2, 5) p r i n t ’аОЛп’ , aO a l = np.add(aO, l . j ) p r i n t ’a l A n ’ , a l a2 = n p .c o n j( a l) p r i n t Ja 2 : \n ^, a2 a3 = n p . r e a l ( a l ) p r i n t ’а З Л п ’ , a3 a4 = np.im ag(al) p r i n t *a 4 :\n *, a4 Р Ш Ш Я М 1 1 1 ......... l i l l S i l i e i l i l i [ 6. - l . j ;7 - 1 ■J : : - 1 - ;j шшшшкшшш 9 -1 J 10 - 1 j 11 аЗ '• |[ 1. 2 3 4 ■ £ | 6 7 8 9 10 |] а4 : ш т ж т ш ш ш ш ёш ш ш ш ш ш т ш ш ш ш ш яавкш Матричные объекты В вычислительной практике вместо N-мерных массивов часто удобнее опери­ ровать с векторами и матрицами (одномерными и двумерными массивами). В частности, при программировании вместо поэлементных операций с массива­ ми можно использовать матричные операции. Работа с матричными типами является вычислительной основой системы научных вычислений MATLAB. В пакете NumPy помимо общего типа N-мерного массива (ndarray) имеют­ ся подклассы векторных, матричных и тензорных объектов. Нас интересуют матричные объекты NumPy (matrix) в плане их использования при решении задач линейной алгебры. Здесь мы отметим особенности использования matrix в сравнении с ndarray. Можно заметить, что, с одной стороны, работа с масси­ вами как с более общим типом данных дает больше возможностей. С другой стороны, матричные задачи часто самодостаточны для приложений и нет необходимости в расширенных возможностях работы с общими массивами. 57 3.2 Пакет NumPy Для матричных объектов возможна инициализация по строке, элементы мат­ рицы задаются в соответствии с синтаксисом MATLAB с пробелом в качестве разделителя для строки и разделителем ; для столбцов. import numpy as np a = n p .m a t(’ l 2 3; 4 5 b = n p . m a t ( [ [ l , 2, 3 ], p r i n t type ( а ), ’а Л п ’ , p r i n t ty p e ( b ) , ’b : \ n ’ , <class 30 [4, 5, 6 ]]) a b ’numpy, c or e d e f m a t r i x m a t r i x ’> a , ш ш ш вш и яаи ш ш яш ш яяй аш ш ш ж |4 5 3 ] ] . < e l a s s ’numpy c or e , d e f m a t r i x m a t r i x ’> b* III 2 3 ] И 5 61] Основной операцией линейной алгебры является умножением матриц (как частный случай, матрицы на вектор и вектор на вектор). При использовании объектов ndarray и matrix в NumPy синтаксис умножение матриц разный. В случае ndarray символ * соответствует поэлементному умножению, для умно­ жения матриц используется функция dot О. В случае matrix символ * при­ меняется для умножения матриц и функция m u ltip ly О для поэлементного умножения. import numpy as np a = n p . a r r a y ( [ [ 1 , 2 ], [3, 4 ]]) b = n p . a r r a y ( [ [ 5 , 6 ], [7, 8 ]]) p r i n t ’ndarray - a * b : \ n ’ , a*b p r i n t ’ndarray - d o t ( a , b ) : \ n ’ , n p .d o t( a , b) с = np.mat(a) d = np.mat(b) p r i n t ’m atrix - c * d : \ n ’ , c*d p r i n t ’m atrix - m u l t i p l y ( a , b ) : \ n ’ , n p .m u ltip ly (c , d) ndarray — a*b ]| 5 12] [21 32]] ndarray — d o t( a ,b ) [ ]1 9 22] (43 50]] m a t r i x — c*d 1119 22] [43 50]] matrix - multiply (a ,b ) ([ 5 12] [21 32]] 58 Математический Python В этом примере используется функция mat О для преобразования объектов ndarray в matrix. Ее можно использовать при инициализации матриц с помо­ щью функций типа zero s (), ones О, eye О, lin s p a c e O для задания масси­ вов. При работе с массивами удобно использовать атрибут .Т для получения транспонированной матрицы (замена строк на столбцы исходной матрицы). Для матричных объектов используется также следующие атрибуты: • .Н —транспонирование с комплексным сопряжением; • . I —обратная матрица; • .А — преобразование матрицы в двумерный массив, import numpy as np a = n p .m a t(n p .lin s p a c e (l, 4, 4 ) .re sh a p e (2 ,2 )) p r i n t ’lin sp a c e - reshape -> a : \ n ’ , a p r in t ’a: ’ , ty p e (a ) b = a .I p r i n t >a . T : \ n ’ , a.T p r i n t ’a . l A n ’ , b p r i n t ’a + a . l A n ’ , a*b p r i n t ’a.A: ’ , type(a.A) a < с la ss - humpy- ore: i x:V^m^attI^:; :д д. д :д За описаниями других функций для работы над матрицами и массивами (над ndarray в matrix) мы отсылаем к документации по пакету NumPy. Линейная алгебра В пакете NumPy реализованы базовые операции линейной алгебры (модуль linalg). Упомянем вначале функции для вычисления характеристик матрицы. Для вычисления нормы вектора (например, евклидовой) и нормы квадратной 3.2 Пакет NumPy 59 матрицы (например, Фробениуса) привлекается функция norm(). Для вы­ числения числа обусловленности квадратной матрицы используется cond(), определителя — det(), а для следа матрицы —trace() из пакета NumPy. import numpy as np a = np.mat( [[1, 2 ], [3, 4 ]] ) p r i n t ’a : \ n ’ , a p r i n t ’norm a: ’ , n p .lin a lg .n o rm (a ) p r i n t ’cond a: ’ , n p .lin a lg .c o n d ( a ) p r i n t ’de t a: ’ , n p . l i n a l g . d e t ( a ) p r i n t ’tr a c e a: ’ , n p . tr a c e ( a ) |[1 2] ;!3 4Ц norm a 5 4772 25 57 50 5 cond a 14*9330343737 det a -2.0 trace a 5 В модуле линейной алгебры имеются функции разложения матрицы на мно­ жители. Для симметричной положительно определенной матрицы А имеет место разложение Холецкого, когда A = L L *, где L — нижнетреугольиая мат­ рица (функция choleskyO). Для общих матриц используется <2Л-разложение, когда А = Q R , где Q — ортогональная матрица, a R — верхнетреугольная матрица (функция qr()). Сингулярное разложение матрицы проводится функцией svd(). import numpy as np a = n p .mat( [ [ 2 , 1], [3, 4 ]]) b = (a + a.T) / 2 p r i n t ’a : \ n ’ , a p r i n t ’a : \ n ’ , b p r i n t ’l o w e r - t r ia n g u la r (Cholesky) m a t r i x : \ n ’ , n p .lin alg .c h o le sk y (b ) q, r = n p . l i n a l g . q r ( a ) p r i n t ’orthonormal m atrix q: \ n ’ , q p r i n t ’u p p e r - tr ia n g u la r m atrix r : \ n ’ , r p r i n t ’q*r: \ n ’ , q*r a: II I2 j ^iL^^^ Г; (x;: ;i^ ^ ^x■ ^ I2 4 U l ower —t r i a n g u l a r ( C h o l e s k y ) II 1 .41421356 0. I :• ^^ . . matrix i ^ 1 - i':Ш'if■' ЦiШ^ 'Wt Щ ^ ^^ 11 Математический Python 60 | 1 41421356 1 4 1 4 2 1 3 5 6 )] orthonorm al m atrix q: [ [ - 0 5547002 - 0 83205029] [ - 0 83205029 0 5547002 ]] upper tr ia n g u la r m atrix r* [ [- 3 .6 0 5 5 5 1 2 8 -3 .8 8 2 9 0 1 3 7 ] [ 0. . 1 3 8 6 7 5 0 4 9 ]] | П Я ! 1 Ш П И ' • М В П Н Ш Н И В ; Особого внимания в линейной алгебре уделяется решению систем линейных алгебраических уравнений. Для вычисления обратной матрицы используется функция invO. Вычисление псевдообратных матриц проводится с помощью pinvQ. Функция solve () предназначена для решения системы уравнений. import numpy as np a = np.mat([[4, 1], [2, 3 ]]) print ’a A n ’ , a b = n p .lin a lg .in v (a ) print ’b = a ^ C -D r W , b print , a*b:\nv, a*b с = np.mat( [1, 1]) .T print ’c A n ’ , с x = n p . lin a lg .s o lv e ( a , c) print ’solution x : \ n ’ , x print ’a*x - с A n ’ , a*x - с ш в н в н н н н в :ЯШЯ1111111111111111111111111111111111И11111111111111»1111111111111111111Я11:1 [[ 1 00000000 е+00 О.ООООООООе+ОО] [ - 1 11 0 2 2 3 0 2 е-1 6 1 .0 0 0 0 0 0 0 0 е + 0 0 ]] 3.2 Пакет NumPy 61 В методе наименьших квадратов для матрицы А размера п х т (п > га) и правой части b иметься вектор х (псевдорешение), который минимизирует норму невязки г = b — Ах. В NumPy для реализации метода наименьших квадратов используется функция IstsqO . import numpy as np a = np.mat([[1, 2], [4, 3], [5, 6]]) print ’ a :\n ’ , a b = np. mat ([7, 8, 9]). T print ’b :\n ’ , b x, resid s, rank, s = n p .lin alg .lstsq (a, b) print ’ solution x :\n ’ , x print ’ resids r :\ n ’ , resids У = np.linalg.pinv(a)*b print ’ function pinv -> y :\n ’ , у ш якш ш ш ивш ш твш яш ш ш ш ш ш ш втж ■■■■■II!!!В В И И а М so lu tio n X П Д И М Н В М 8 Ш В Ш Я М В М 1 £ Ш И 1 И ^ ^ Ш Ш .[[ О 5 5 73 7 70 5 ] I 1 37704918]] resids г [[20.49180328]] function pinv —> у ,[[ 0 5 57 37 70 5 ] 1 1 37704918]] Как видно из приведенного примера, тот же результат мы можем получить с использованием функции pinv(). Отметим теперь возможности пакета NumPy для решения спектральных за­ дач линейной алгебры. Для нахождения собственных значений используется функция eigvalsO для общих матриц и функция eigvalshO —для эрми­ товых или вещественных симметричных матриц. Собственные значения и собственные вектора вычисляются в eig() и eigh() соответственно. import numpy as np a = n p .m a t( [ [ 1 .5 , 2 . ] , p r i n t ’a : \ n ’ , a b = (a + a.T) / 2 с = (a - a.T) / 2 [3 ., 4 . ] ] ) Математический Python 62 print ’b :\n ’ , b print ’ сЛ п’ , с lb = np.linalg.eigvalsh(b) print ’ eigenvalues of b :\n ’ , lb lc = n p .linalg.eigvals(c) print ’ eigenvalues of c :\n ’ , lc la , v = n p.linalg.eig(a) print ’ eigenvalues of a :\n ’ , la print ’ eigenvectors of a :\n ’ , v il l eigenvalues О.+р 5 j of с ; 0, - 0 . ^ eigenvectors^ Собственные значения симметричной вещественной матрицы (в нашем слу­ чае матрицы Ь) являются чисто вещественными, а кососимметричной матри­ цы (матрица с) —чисто мнимыми. Работа с полиномами Пакет NumPy поддерживает основные операции над полиномами. Полиномы задаются в виде списка коэффициентов, так что, например, [1,2,3] соответ­ ствует полином х 2 + 2х + 3. Для задания полинома используется функция polyldO, значение полинома р в точке х вычисляется как р(х) или с помо­ щью функции polyval(p,x). import numpy as np p = np.polyld([1, 2, 3]) print np.polyld(p) print type(p) 63 3.2 Пакет NumPy p r i n t p ( 0 .5 ) , n p .p o ly v a l(p , 0.5) 1 x ~f 2 x + 3 C c l a s s ’numpy l i b 4 25 4 25 p o l y n o m i a l p o l y l d ’> Арифметические операции над полиномами поддерживаются следующими функциями: polyadd() —сложение, polymulO —умножение и polydivO — деление. im port numpy as np p = n p . p o l y l d ( [ l , 2, 3, 4, 5]) q = n p .p o l y l d ( [6, 7, 8]) p r i n t ’p : \ n ’ , p p r i n t ’q : \ n ’ , q p r i n t ’p+q: \n ’ , np.polyadd(p, q) p r i n t ’p * q :\n ’ , n p .polymul(p, q) d , r = np.p olyd iv (p, q) p r i n t ’q u o t i e n t : \ n ’ , d p r i n t ’re m a in d e r:’ , r i l l тй тш ш ш тш и тя я ш ш ттш ш и ^ т i x + 2x + 3x + 4x + 5 ^^g g m 6 x + 7 x4 8 ^ ^ ^ ^ ^ ^ М И Н В 1 И П 1 Ш 1 x + 2 x + 9 x + 11 x -Ь 13 В 1 В 8 В В 1 1 В Ш 1 6 5 4 3 2 6 x + 19 x + 40 'X + 61 x + 82 x + 67 x 4 40. quotient 0 1667 X + 0 1389 X + 0 1157 remainder 2 . 0 7 9 x + 4 074 Для вычисления корней полинома р используется функция ro ots (р), более краткая форма — р.г. Поддерживаются также операции дифференцирова­ ния (polyderO ) и интегрирования полиномов (polyintO ). import numpy as np p = n p .p o ly I d ([1, 2, 3, 4]) p r i n t ’p : \ n ’ , p r = n p .ro o ts(p ) Математический Python 64 p r in t ’ro o ts A n * , n p .ro o ts (p ) p r in t ’polynom :\n’ , n p .p o ly (r) p r in t ’second d e r i v a t e : ’ , n p .p o ly d e r(p , 2) ШШШ^ШШ;ШШЩШШ§ШШШ1т1жШШШШШШШШШШ |ib l|№ 1 й6Ш 1111И Ш !И !И !8 ш!!1В ш11Я1Ш1Ш1!!11111Я1111111111111 1оШ ;йШ ^Ш ш ш К 1111Я Я 1^^^И 11^^Я Ш Ш 1111И Я 11Я 111Ш 1И 1111111 Здесь функция polyO вычисляет полином по заданным корням. Другие возможности NumPy Пакет NumPy включает другие мощные средства, ориентированные, прежде всего на работу с массивами различной природы. В частности, можно отме­ тить методы сортировки и поиска. С учетом нашей ориентации на научные вычисления отдельного упоминания заслуживают методы быстрого преобра­ зования Фурье. Более подробно мы будем говорить о них ниже при рассмот­ рении пакета SciPy. Основной модуль генерации случайных чисел в Python random является ча­ стью стандартной библиотеки Python. Для подготовки больших случайных выборок используется модуль random в пакете NumPy. В этом модуле имеют­ ся функции для генерации массивов случайных чисел различных распреде­ лений и свойств. Для создания массива случайных чисел, равномерно распределенных на (0 ,1), используется функция rand О . Функция ra n d in tO дает массив задан­ ной формы равномерно распределенных чисел из заданного интервала. import numpy as np a = np.random .rand(2, 3) p r in t ’random uniform d i s tr i b u t io n v alu es b = n p .ran d o m .ran d in t(0, 100, (2, 5)) p r in t ’random in te g e rs b : \ n ’ , b a :\n ’ , a random u n ifo rm d i s t r i b u t i o n v a lu e s a [[ 0 4 5 9 0 7 9 5 1 0 9 6 1 9 3 6 6 4 0 7 7 95528 ] I 0 .8 5 30 6 7 7 3 0 .6 9 3 4 2 4 0 6 0 7 9 9 3 1 2 4 6 ]] random i n t e g e r s b [(64 68 34 23 8] 3.3 Пакет Matplotlib 65 [38 19 90 43 Имеются функции для получения массивов случайных чисел, которые под­ чиняются тем или иным законам. Например, для получения нормально рас­ пределенных чисел (распределение Гаусса) используется функция normal О, первый аргумент которой есть заданное среднее (математическое ожидание), второй -- стандартное отклонение. im port numpy as np a = np.random .norm al(0, 1, (2, 4 )) p r in t ’random normal d is t r i b u t i o n v alues random n o r ma l d i s t r i b u t i o n values a :\n ’ , a a [[ 0,01195366 0 671863 —0 62463833 -1 29743642] { 0 73578021 -1 31941736 0,5853565 —1 54388744]] Отметим некоторые возможности пакета NumPy но статистической обработке данных. Имеются функции для вычисления минимальных и максимальных значений всего массива или его отдельной оси (amax(), aminO), средних зна­ чений (mean(), m edianO) и стандартное отклонение (s td ()). im port numpy as np a = n p . a r r a y ( [ [ 8 , 1, 7 ], [3, 9, 2 ]]) p r in t ’a rra y a : \ n ’ , a p r in t ’max of a : ’ , np.amax(a) p r in t ’average of a : ’ , np.mean(a) p r in t ’stan d ard d e v ia tio n :’ , n p .s td (a ) p r in t ’average along a x is 1 : ’ , np.mean(a, 1) a V^ r ^ ^ alb ri g; a x is; 1 [ Й 3 Й3 3 Й3 3 Й 66 67 ] Есть также возможность рассчитать корреляции и гистограммы для задан­ ных выборок случайных величин. 3.3 П ак ет Matplotlib Научная графика, базовые возможности Matplotlib, рисование графиков, эле­ менты оформления, 1D графики, 2D графики, трехмерная визуализация. Математический Python 66 Научная графика При анализе результатов расчетов повышенное внимание уделяется визуа­ лизации результатов вычислений, которое основывается на построение раз­ личных графиков. Многие расширения Python предоставляют пользователям мощные и гибкие средства построения графиков различной природы. Обыч­ ные для сегодняшнего дня программные средства постпроцессинга обеспе­ чивают пользователю возможность работы с файлами данных, просмотра результатов в графическом виде, сохранения рисунка в выбранном стандарт­ ном графическом формате и печати графика. Наиболее важными являются задачи визуализации одномерных или двумер­ ных данных. С одномерными (1D) данными (графиками) мы связываем функцию одной переменной, с двумерными (2D) данными — функцию двух переменных. Отметим некоторые расширения Python, которые ориентирова­ ны прежде всего на создание качественных одномерных и многомерных гра­ фиков. Основным программным продуктом для визуализации расчетных данных в Python является пакет Matplotlib4. Он закрывает основные потребности вычислителей, хорошо проработан и документирован, активно развивается и поддерживается. С учетом этих соображений будем рассматривать паке']' Matplotlib как графическое ядро математического Python. Основные возмож­ ности пакета подробнее’обсуждаются ниже. Из традиционных средств подготовки графиков в научных вычислениях необходимо отметить Gnu plot5. Gnu plot имеет собственную систему команд, возможна интерактивная работа в режиме командной строки, и режиме ин­ терпретации скриптов из файла (командный режим). Gnuplot выводит гра­ фики как непосредственно на экран, так и в файлы основных графических форматов, таких как png, eps, svg, jpeg. Поддерживается экспорт для изда­ тельской системы LaTeX. Работа с Gnuplot в Python поддерживается пакетом Gnuplot.ру6. Он позволяет использовать Gnuplot в программах на языке Python для построения графиков для массивов данных из памяти, при чтении дан­ ных из файлов, а также графики математических функций. Библиотека научной графики DISLIN7 является бесплатной для некоммерче­ ского использования. Она предназначена для отображения расчетных дан­ ных в виде кривых, гистограмм, диаграмм, контуров и поверхностей. Под­ держиваются графические форматы PostScript, pdf, svg, png, bmp, gif, tiff и другие. DISLIN доступна для языков программирования Фортран 77, Фор­ тран 90/95, С, Perl, Python и Java и работает на большинстве операционных систем. 4 5 6 7 Matplotlib - http://matplotlib.sourceforge.net/ Gnuplot — www.gnuplot.info/ Gnuplot.ру — http://gnuplot-py.sourccforge.riet/ DISLIN www.dislin.de/ 3.3 Пакет Matplotlib 67 Кроссплатформсппая библиотека научной графики MathGL8 обеспечивает быструю обработку и отображение больших массивов данных. Реализова­ ны основные типы графиков для одно-, двух- и трехмерных массивов с под­ держкой экспорта в растровые (png, jpeg, tiff или bmp) и векторные (eps и svg) форматы. Библиотека MathGL может быть использована в программах, написанных на C ++, С, Fortran, Python и других языках. Д л я научных вычислений на языке Python будут интересны продукты ком­ пании Enthought, Inc9. Для научной визуализации предлагается два пакета: Chaco и Mayavi. Для 2D интерактивной визуализации применяется Chaco с широкой поддержкой различных графических форматов. Пакет Mayavi2 обеспечивает легкую интерактивную 3D визуализацию данных. Это дости­ гается использованием функций визуализации, аналогичных тем, что есть в MATLAB и matplotlib, для отображения скалярных, векторных и тензорных двух- и трехмерных величин. Базовые возможности Matplotlib Приведем пример использования пакета Matplotlib при визуализации функ­ ции 5т(27гж), когда 0 < х < 1. С учетом того, что мы уже знакомы с работой с массивами в рамках пакета NumPy, сформируем два одномерных массива по 100 элементов х и у. Для рисования графика используем модуль pyplot в пакете Matplotlib. im port numpy as np im port m a tp lo tlib .p y p lo t as p i t x = n p .lin s p a c e ( 0 ., 1 ., 100) у = n p .sin (2 * n p .p i* x ) p i t . p l o t ( x , y) p i t . showO Результатом работы этой программы будет окно с графиком (рис. 3.1). Отметим прежде всего некоторые интерактивные возможности работы с гра­ фиком в этом диалоговом окне, которое вызывается командой showO. Оно содержит навигационную панель инструментов, функциональные возможно­ сти которой легко анализируются экспериментально. Вы можете перемещать график, изменять его размеры, выделять часть графика с помощью мыши или сочетания клавиш (клавиши быстрого вызова). Имеется также кнопка д ля сохранения графика в выбранном графическом формате. Вы можете по­ лучить файлы со следующими расширениями: png, emf, ps, eps, svg, svgz, raw, rgba и pdf. Возможность интерактивной работы с графикой важна при отладке ваших программ, для выбора графического отчетного материала. Для окон чате л ь8 MathGL — http://mathgl.sourccforgc.iiet/ 9 Enthought, Inc — www.enthought.com/ Математический Python 68 Рис. 3.1 Окно графика ной версии программы большее значение придается получению результатов в виде файлов с графиками. В пакете Matplotlib такая возможность реализуется командой s a v e fig O . Первый обязательный аргумент sa v e fig O есть имя файла. Файл записывает­ ся в одном из следующих растровых и векторных форматов (табл. 3.4). Дру­ гие необязательные параметры позволяют управлять выводом. В частности, Таблица 3.4 Поддерэюиваемые графические форматы Р асш ирение Н азвание emf eps pdf png ps raw, rgba svg, svgz Windows Metafile Encapsulated PostScript Portable Document Format Portable Network Graphics PostScript Raw RGB A bitmap Scalable Vector Graphics 69 3.3 Пакет Matplotlib Рис. 3.2 Просмотр графика в NetBeans можно изменять фон рисунка (параметр faceco lo r, по умолчанию равен ’w’ — белый), выбирать графический формат (параметр format, по умолчанию — png) или разрешение (параметр dpi). Для работы с Windows метафайлами необходимо инсталлировать модуль pyemf10, но проблемы с экспортом в emf остались. Можно рекомендовать использовать eps как векторный формат и png как растровый для подготовки рисунков. При работе в NetBeans IDE удобно записывать графические данные в форма­ те png в рабочий каталог проекта. Тогда результаты расчетов становятся до­ ступны для просмотра (рис. 3.2). Тоже самое можно сказать и о графических p d f файлах при установленном плагине NetBeans-PDFViewer для просмотра p d f файлов. Рисование графиков Отмстим некоторые возможности по заданию параметров графиков, которые рисуются с помощью основной функции p l o t (). С помощью задания аргу­ 10 pyemf — http://pyemf.sourceforge.net/ 70 Математический Python ментов этой функции мы можем управлять типом и толщиной линий, их цвс~ том, использовать маркеры. Все возможности использования этой функции можно узнать по общей команде помощи (в нашем примере, help ( p it .p lo t)). Некоторые возможности по выбору типа линей отражены в табл. 3.5. Таблица 3.5 Линии графика С имвол(ы ) Тип линий сплошная линия штриховая линия штрих-пунктирная линия пунктирная линия На рис. 3.3 приведен результат работы нижеприведенной программы. По умолчанию (см. рис. 3.1) используется сплошная линия. import numpy as np import m a tp lo tlib .p y p lo t as p i t x = n p .lin s p a c e ( 0 ., 1 ., 100) y l = n p .sin (4 * n p .p i* x ) y2 = np.exp(x) - 1. y3 = np.cos(4*np.pi*x) p i t . p l o t ( x , y l, x, y2, p it.s h o w () x, y3, ’ : ’) Для того чтобы показать отдельные точки на графике используются марке­ ры, некоторые из них приведены в табл. З.б. Таблица 3.6 Маркеры графика Символ М аркер У жирная точка круг треугольник вершиной треугольник вершиной треугольник вершиной треугольник вершиной У > 0 > >V> у - У »<» ’>» Символ ’s ’ ’р ’ вниз вверх влево вправо М аркер квадрат пятиконечная звезда * + X ’d ’ ромб Замена строки p l t .p l o t ( x , y l, х, у2, х, уЗ, ’ : ’) в программе рисования графика на рис. 3.3 на строку p i t . p l o t (х, y l, ’р ’ , х, у2, ’s ’ , х, уЗ, ’(Н) дает рис. 3.4. Рис. 3.3 Типы линий При выводе графика можно использовать различные цвета линий (табл. 3.7). Комбинируя типы линий, маркеров с цветом мы можем получить необхо­ димое представление для графика. Например, при использовании функции p l o t ( x , у, ’го: О график будет нарисован в виде пунктирной красной ли­ нии с круговыми маркерами. Таблица 3.7 Цвет графика С им вол ’Ъ’ ’с ’ ’g ’ ’к ’ Ц в ет синий (blue) циановый (cyan) зеленый (green) черный (black) С и м в ол ’г ’ »w’ ’у ’ Ц вет малиновый (magenta) красный (red) белый (white) желтый (yellow) Изменить график можно используя различную толщину линий и размер мар­ кера. Для этого задаются аргументы linew idth. (lw) и m arkersize (ms) функ­ ции p lo t О, например, p lo t( x , у, lw=2, ws=4), по умолчанию оба парамет­ р а равны 1. Математический Python 72 Рис. 3.4 Графики с маркерами Элементы оформления Дополнительную смысловую нагрузку графику придают его заголовок, на­ звание осей, координатная сетка и легенда. В пакете Matplotlib эти возможно­ сти поддерживаются функциями t i t l e О , x la b e lO , y la b e lO , g rid O , leg en d (). Функция t i t l e () помещает заголовок (строка с названием обязательный аргумент) па график. Можно использовать команды издательской системы ВТ^Кдля математического текста. Для поддержки русского языка в Matplotlib нужны специальные усилия, поэтому на первых порах лучше использовать английский язык. Для контроля размера шрифта используется параметр fo n ts iz e со значениями: ’l a r g e ’, ’medium’, ’sm a ll’ либо явный размер. По­ ложение заголовка по вертикали определяется параметром v e r tic a la lig n ment (va), который выбирается из: ’to p ’, ’b a s e lin e ’, ’bottom ’, ’c e n te r ’. Положение по горизонтали определяется h o riz o n ta la lig n m e n t (ha) со значе­ ниями ’c e n te r ’, ’l e f t ’, ’r i g h t ’. Для надписей на осях используются функции x la b e lO , y la b e lO . Функция a x is () управляет диапазонами изменения по осям х и у. Новые диапазоны задаются командой axis(xm in, xmax, ymin, ушах). Кроме этого функция 3.3 Пакет Matplotlib 73 имеется возможность дополнительных манипуляций с осями. Например, ко­ манда a x i s ( ’o ff ’) удаляет оси, a x i s ( ’e q u a l’) — выравнивает диапазоны изменения по осям и т.д. При рисовании нескольких графиков полезно идентифицировать отдельных графики с помощью легенды. Для добавления легенды используется функ­ ция legendO при задании аргумента la b e l в виде строки в функции p lo t О для каждого графика. Вторая возможность связана с явным заданием меток в виде списка или кортежа строк как аргумента функции legendO . Локали­ зация легенды проводится по аргументу 1ос) (см. табл. 3.8). Таблица 3.8 Полоо/сепие легенды графика С рока ’b est’ ’upper right’ ’upper left’ ’lower left’ ’lower right’ ’right’ К од 0 1 2 3 4 5 ’center left’ ’center right’ ’lower center’ ’upper center’ ’center’ 6 7 8 9 10 Для отображения координатной сетки используется функция g rid О с воз­ можностью конкретизации свойств линий. Дополнительный контроль шага координатной сетки предоставляют функции x tic k s O и y tic k s O . Ниже представлена программа, которая иллюстрирует некоторые возможно­ сти по оформлению графика (рис. 3.5). im port mimpy as np im port m a tp lo tlib .p y p lo t as p i t x = n p .lin s p a c e ( 0 ., 1 ., 100) y l = n p .sin (2 * n p .p i* x ) y2 = x*x plt.plot(x, yl, label=’$sin(2\pi x)$’) pit.plot(x, y2, ’— label=’$x~2$’) pit.title(’The fuctions $sin(2\pi x)$ and $x~2$’, \ fontsize=’large’, va=’bottom’, ha=’right’) pit.xlabel(’$x$’) pit.ylabel(’$f(x)$ ’) pit.legend(loc=’lower left’) pit.grid(True) pit.showO Выше мы рассмотрели возможности рисования одного графика. Отметим некоторые основные возможности более сложной организации графическо­ го материала. Свяжем интерактивное графическое окно или графический файл с фигурой (областью рисования) и будем рассматривать ее как контаймент графиков. В своей вычислительной практике нам может понадобиться Математический Python 74 The fuctions $in(2nx) and Рис. 3.5 Оформление графика подготовить несколько фигур и каждая их фигур может включать несколько графиков. Пример работы с двумя фигурами, показанный на рис. 3.6, реализован сле­ дующим образом. import numpy as np import m a tp lo tlib .p y p lo t as p i t x = n p .I in s p a c e ( 0 ., 1 ., 100) p i t . f i g u r e (1) p i t .p l o t ( x , x*x) p i t . f i g u r e (2) p l t .p l o t ( x , x /(l+ x )) p i t . show() Рассмотрим теперь проблему размещения нескольких графиков на одной фи­ гуре. Первая возможность связана с использованием функции subplot (), ко­ торая разделяет фигуру на несколько прямоугольных областей равного раз­ мера, расположенных подобно элементам матрицы. Первый аргумент этой функции определяет количество строк (numrows), второй — количество коло­ нок (numcols) в активной фигуре и третий — номер графика (fignum). Если Рис. 3.6 Две фигуры numrows*mimcols < 10 то запятые ставить не обязательно, так что вместо s u b p lo t(1 ,2 ,1 ) можно использовать s u b p lo t(121). Н а рис. 3.7 приведен результат работы программы: im port numpy as np im port m a tp lo tlib .p y p lo t as p i t x = n p .lin s p a c e ( 0 ., 1 ., 100) p i t . f i g u r e (1) p i t . s u b p lo t(211) p i t . p l o t ( x , x*x) p i t . s u b p l o t (212) p l t . p l o t ( x , x /(l+ x )) p i t .showO Имеется возможность ручного расположения графиков на фигуре. Для это­ го нужно воспользоваться функцией ax es(). Аргументом этой функции яв­ ляется список [ l e f t , bottom, w idth, h e ig h t], который задает положение граф ика на фигуре в относительных координатах (все значения изменяются от 0 до 1). Эти возможности иллюстрируются программой im port numpy as np 76 Математический Python Рис. 3.7 Два графика import m a tp lo tlib .p y p lo t as p i t x = n p .lin s p a c e ( 0 ., 1 ., 100) p i t . f i g u r e (1) p i t . a x e s([0 .0 5 , 0 .0 5 , 0 .6 , 0 .6 ]) p i t . p l o t ( x , x*x) p i t .a x e s ([0 .3 5 , 0 .3 5 , 0 .6 , 0 .6 ]) p i t . p l o t ( x , x /(l+ x )) p i t . showO результатом работы которой является рис. 3.8. ID графики К базовым возможностям любого программного инструментария научной ви­ зуализации относятся графическое представлении одномерных и двумерных расчетных данных. Примеры использования функции p lo t( ) , которые при­ ведены выше, демонстрировали возможность строить графики зависимостей У = /(# ) (одномерные функциональные зависимости). Остановимся на других возможностях 1D графики в пакете Matplotlib. 3.3 Пакет Matplotlib 77 Рис. 3.8 Ручное задание положения графиков Д л я отображения графиков величин, который заданы с погрешностью, ис­ пользуется функция e rro rb a rO . После массива абсцисс и массива ординат в качестве третьего аргумента передается погрешность ординаты. Расширен­ ные возможности включают погрешности в задании абсциссы. Пример ис­ пользования функции e rro rb a rO приведен ниже, результат — на рис. 3.9. im port numpy as np im port m a tp lo tlib .p y p lo t as p i t x = n p .lin s p a c e ( 0 ., 1 ., 100) у = n p .ex p (-x ) e = 0 . l*np.random .norm al(0, 1, 100) p i t . e r ro rb a r(x , y, e, fmt= , . 0 p i t . showО Простейший способ построения графиков в молярных координатах (р, ф) свя­ зан с использованием функции p o la r () вместо p lo t О . Первый аргумент этой функции угол (/?, второй — р. Программа для рисования кардиоиды : im port numpy as np im port m a tp lo tlib .p y p lo t as p i t p h i = n p .lin s p a c e ( 0 ., 2 * n p .p i, 100) ro = 5*(1 + n p .c o s (p h i)) p i t . a x i s ( ’o f f ’) 78 Математический Python Рис. 3.9 График с погрешностями p i t .t i t l e ( ’C a rd io id }) p i t .p o l a r ( p h i , ro) p i t . showO Функция a x is ( ’o f f ’) используется для того, чтобы не рисовать (рис. 3.10) декартовы оси, которые рисуются по умолчанию. Для создания более обозримого графика вдоль одной или обеих координат­ ных осей можно выбирать логарифмический масштаб. Для построения таких графиков вместо p lo t( ) используются функции lo g lo g O (логарифмический масштаб по обеим осям), sem ilogxO (логарифмический масштаб по оси х), semilogy (логарифмический масштаб по оси у). Примером является график на рис. 3.11, который получен с использованием следующей программы. import numpy as np import m a tp lo tlib .p y p lo t as p i t x = n p .lin s p a c e ( 0 ., 1 ., 100) у = np.exp(-10*x*x) p i t . sem ilogy(x, у) p i t . showO Для графическое изображение зависимости частоты попадания элементов выборки от соответствующего интервала группировки используются гисто­ 79 3.3 Пакет Matplotlib Carc?ioid Рис. 3.10 Полярные координаты граммы. Возможность построения гистограмм реализуется функцией h is t О, первый аргумент которой есть массив данных, а второй задает число интерва­ лов. Здесь приведен пример трех гистограмм для выборки из 250, 500 и 1000 случайных нормально распределенных величин соответственно (рис. 3.12). im port numpy as np im port m a tp lo tlib .p y p lo t as p i t mu = 1 sigm a = 0 . 2 x = mu + sigma*np.random.randn(1000) p l t . h i s t ( x , 25) p i t . show() Иногда приходиться используют для визуализации результатов различного рода диаграммы — столбцовые и круговые. Для рисования столбцовых диа­ грамм используется функция bar О (barh() для горизонтальных). Пример использования (см. рис. 3.13) иллюстрируется программой: im port numpy as np im port m a tp lo tlib .p y p lo t as p i t pos = n p .lin s p a c e ( 0 ., 1 ., 10) Математический Python 80 Рис. 3.11 Логарифмический масштаб v al = 3 + п р .random .randn(10) p lt.b a r ( p o s , v a l, a l i g n ^ c e n te r 9, w idth=0.1, c o lo r ^ m ’) p i t . showO Подобные инструменты характерны для деловой графики при небольшом объеме представляемых данных и не имеют большого значения для научных вычислений. 2D графики При проведении численных расчетов большое внимание уделяется визуализа­ ции двумерных данных. На этой основе реализуются те или иные инструмен­ ты для представления и более общих трехмерных данных, используя визуа­ лизацию па отдельных поверхностях и сечениях. Здесь мы отметим основные возможности построения 2D графиков в пакете Matplotlib. Рассматривается задача построения графика двумерной функции z = f{x,y)Считается, что значения заданы на прямоугольной сетке, т.е. двумерный мас­ сив (матрица) размерности т х п . Массивы х и у могут быть векторами раз­ мерности п и га соответственно или матрицами (с одинаковыми строками или столбцами) той же размерности, что и г. 81 3.3 Пакет Matplotlib Р и с . 3 .1 3 С толбцовая диаграм м а Линиями уровня (изолинии) представляют собой кривые, которые получают­ ся в результате пересечения поверхности г = f ( x . y ) с плоскостями z = const. Д ля их построения используется функция contourQ . Стандартный вызов 82 Математический Python этой функции связан с заданием массивов ж,?/, которые определяют сетку, затем массив значений функции г и число уровней. import m a tp lo tlib .p y p lo t as p i t import mimpy as np x = n p .lin s p a c e ( - 2 ., 2 ., 101) у = n p .lin s p a c e ( - 2 ., 2 ., 101) X, Y = np.m eshgrid(x, y) z = X * np.exp(-X**2 - Y**2) p i t . co n tou r(x , y, z , 20) p i t . show() Рис. 3.14 Линии уровня Результат работы этой программы приведен на рис. 3.14. Здесь функция m eshgridO задаст сетку на плоскости .т, у в виде двумерных массивов Х ) У. которые определяются одномерными массивами х и у. Применяя операции над массивами, с помощью этой функции легко вычисляются функции двух переменных. Можно отобразить значения линий уровня. Для этого используется функция c la b e lO , первым аргументом которой является результат ContourSet объ­ ект, который возвращается contour. Пример работы иллюстрируется рис. 3.15. который мы получаем при программы: Р и с . 3 .1 5 У правление линиями уровня im port m a tp lo tlib .p y p lo t as p i t im port numpy as np x = n p .lin s p a c e ( - 2 ., 2 ., 101) у = n p .lin s p a c e ( - 2 ., 2 ., 101) X, Y = np.m eshgrid(x, y) z = X * np.exp(-X**2 - Y**2) v = n p .lin s p a c e ( - 0 .5 , 0 .5 , 21) c s = p i t . co n to u r(x , y, z, v, c o lo rs= , g >) p i t . c la b e l( c s , in lin e= T ru e, fontsize=10) p i t . showO Д л я выбора цвета изолиний (см. табл. 3.7) служит параметр colors. Для отображения изолиний с отрицательными значениями используются штрихо­ вые линии. В данном примере значения изолиний задаются явно (массив v). Д ля подготовки графиков с заливкой областей между линиями уровня нужно воспользоваться функцией co n to u rfO . Пример использования показан на рис. 3.16. im port m a tp lo tlib .p y p lo t as p i t im port numpy as np x = n p .lin s p a c e ( - 2 ., 2 ., 101) 84 Математический Python Рис. 3.16 Линии уровня с заливкой Таблица 3.9 Палитры Н а зв а н и е ’autumn’ ’c o o l’ ’f l a g ’ ’g r a y ’ ’h o t ’ ’h s v ’ ’p in k ’ ’s p e c t r a l’ ’ sp r in g ’ ’ summer’ ’w in te r ’ О п и са н и е оттенки красного и желтого цветов оттенки голубого и фиолетового цветов чередование красного, белого, синего и черного цветов линейная палитра в оттенках серого цвета чередование черного, красного, желтого и белого цветов цвета радуги розовые цвета с оттенками пастели спектральная палитра оттенки желтого и фиолетового цветов оттенки зеленого и желтого цветов оттенки синего и зеленого цветов у = n p .lin s p a c e ( - 2 ., 2 ., 101) X, Y = np.m eshgrid(x, у) z = X * np.exp(-X**2 - Y**2) v = n p .lin s p a c e ( - 0 .5 , 0 .5 , 21) p i t . c o n to u rf(x , у, z, v) p i t . c o lo rb a r() p i t . showO 3.3 Пакет Matplotlib 85 Шкала палитры отображена со значениями па линиях отображается помо­ щью c o lo r b a r () . В пакете Matplotlib используются различные палитры (неко­ торые из них приведены в табл. 3.9, по умолчанию используется hsv). Иногда при вычислениях нужно отобразить матрицу. Для этой цели можно использовать различные инструменты (imshowQ, matshowO). В примере Рис. 3.17 Графическое отображение матрицы import m a tp lo tl ib .p y p lo t as p i t import numpy as np x = n p .lin s p a c e ( 0 , 20, 21) У = n p .lin s p a c e ( 0 , 20, 21) X, Y = np.meshgrid(x, y) z = X * n p .e x p ( - 0 . 1*(X-Y)**2) p i t . p c o l o r ( x , y, z, vmin=0.025, vmax=0.975, стар=>g ra y ’) p i t . c o l o r b a r ( o r i e n t a t i o n ^ h o r i z o n t a l ’) p i t . showO используется функция p c o lo rO с выбором палитры (рис. 3.17). Проиллюстрируем также минимальные возможности пакета Matplotlib по отображению векторных полей. По компонентам вектора в каждом узле ри­ суются стрелка, направление которой совпадает с направлением вектора, а Длина —- пропорциональна длине вектора. Такое представление реализуется Математический Python 86 функцией q u iv e r(). Пример использования дается следующим листингом программы и рис. 3.18). 1.0,----------------- ;----------------- .----------------- ,---------— -— п----------------ж •Ж чг 9 * 4 * X» X. ж Ж Ж ж ж ж ¥ 4Г 4 » » V > > ■"* X. X X x- ж -*• X X X X Ж' Ж У* Ж ж ж Ж <Г 4 4 i V V 4 X X X X X X X / / / л Л / 4 4 4 4 4 4 \ 4 X / / S S ✓ / / / 4 # ♦ 4 \ 4 \ X \ X X X X X X X / / / / / / / / / * ♦ \ V 4 \ \ \ \ X X / / / / / / / / / t * \ \ \ \ \ \ \ \ \ \ S / / / / / / / / t * \ \ \ \ \ \ \ \ \ N / / / / / / / / t t \ \ \ \ \ \ \ \ \ \ \ / / / / / / / / / t t \ \ \ \ \ \ \ \ \ \ S У X / / / / / / / / t t i \ \ \ \ \ \ \ \ \ \ / / / / / / / / t t ♦ \ \ \ \ \ \ \ \ \ N / / / / / / / / t t ♦ \ \ \ \ \ \ \ \ \ \ / / / / / / / / t t 1 \ \ 4 \ \ \ \ X S / S / / / / / 4 4 4 k \ \ \ \ / А Л X / t * k V \ 4 4 X ж / ж Ж 4 4 к V V 4 \ X X X X X ж ж я? ¥ ✓ i i V > X X X X X X. X. S Ж Ж ж Ж 0 OU. 0.0 ж —---—--- ж М.--- *----«.----•---- i----------- 0.2 0.4 и---- ----- 0.6 X X X X X X X X X X X X X * --- mi---—---х.---х.--- 0.8 1.0 Р ис. 3.18 Векторное поле import m a tp lo tlib .p y p lo t as p i t import numpy as np x = n p .lin s p a c e ( 0 ., 1 ., 21) у = n p .lin s p a c e ( 0 ., 1 ., 21) p r in t x X,Y = np.m eshgrid(x, y) U = np.cos(np.pi*X ) V = np .sin (n p .p i* Y ) p it.q u iv e r ( x , y, U, V) p i t . showO Выше мы привели примеры, когда проводится визуализация данных на пря­ моугольной сетке. Отметим некоторые возможности построения двумерных графиков в более общих условиях. Изолинии можно строить на произвольных структурированных сетках, когда сетка топологически эквивалентна прямоугольной В этом случае не толь­ ко сама функция, но и каждая координата узлов сетки представляются в 3.3 Пакет Matplotlib 87 виде двумерного массива. Для примера рассмотрим представление решения (рис. 3.19), которое строиться па равномерной цилиндрической сетке. Рис. 3.19 Полярная сетка im port m a tp lo tlib .p y p lo t as p i t im port numpy as np ro = n p .l i n s p a c e ( l . , 2 ., 21) p h i = n p . lin s p a c e (n p .p i / 6, n p .p i/3 , 21) Ro, Phi = n p .m esh g rid (ro , phi) X = Ro*np.cos(Phi) Y = R o*np.sin(Phi) Z = np.exp(-R o) p i t . contourf(X , Y, Z, 20) p i t . a x i s ( ’e q u a l’) p i t . showO Для данных на произвольном множестве узлов задача визуализации в пакете Matplotlib решается следующим образом. Сначала по заданному множеству узлов строиться триангуляция Делоне и данные интерполируются на струк­ турированную сетку, после чего и рисуется график. Задача интерполяции решается с использованием функции g rid d a ta O из модуля mlab. Другая воз- 88 Математический Python можность связана с использованием расширения N atgrid (m p l_ to o lk its.n a tg rid инсталлируется отдельно от пакета Matplotlib). Пусть есть одномерные массивы координат х, у и заданных значений интерполируемой функции z. Прямоугольная сетка задается одномерными или двумерными массивами X и Y как обычно. Двумерный массив значений на этой повой сетке определяется функцией griddata(x, у ) z ) Х ) Y ). Пример визуализации данных на нерегулярном множестве узлов дает программа: Рис. 3.20 Нерегулярное множество узлов from m a tp lo tlib .m la b im port g rid d a ta import m a tp lo tlib .p y p lo t as p i t import numpy as np x = np.random .uniform (-2 , 2, 250) у = np.random .uniform (-2 , 2, 250) z = x*np.exp(-x**2 - y**2) X = n p .lin s p a c e ( - 2 ., 2 ., 100) Y = n p .lin s p a c e ( - 2 ., 2 ., 100) Z = g rid d a ta (x , y, z, X, Y) p i t . contourf(X , Y, Z, 20, стар = p i t . cm .sp e c tra l) p i t . co lo rb a rO p i t . s c a tte r ( x , y, m a rk e r^ o ’ , c=’k ’ , s=5) 3.3 Пакет Matplotlib 89 p it.x lim ( - 2 ,2 ) pl-t .y lim (-2 ,2 ) p i t . showO Результат работы программы представлен на рис. 3.20. Здесь функция s c a t t e r используется для нанесения на график маркеров выбранного раз­ мера и цвета (параметры s и с) в заданных точках. Трехмерная визуализация При визуализации двумерных данных значение функции в отдельных точ­ ках плоскости ж, у мы связывали с цветом, отображая данные па плоскость. Вторая возможность связана с привязкой значения двумерной функции к третьей декартовой координате z. В этом случае объект визуализации есть поверхность, которая является существенно трехмерным объектом — трех­ мерное представление двумерной функции. Возможности работы с трехмерными объектами визуализации поддержива­ ются в модуле mplot3D пакета Matplotlib. Прежде чем обсуждать визуализа­ цию двумерных функций рассмотрим более простые объекты. Пример рисования отдельных точек (функция s c a tte r ()) и параметрической кривой в пространстве (функция p lo t ()) показан на рис. 3.21. В этом примере использовалась программа im port numpy as np im port m a tp lo tlib .p y p lo t as p i t from m p l.to o lk its.m p lo t3 d import Axes3D f i g = p i t . f i g u r e () ax = Axes3D(fig) x = np.random .sam ple(100) у = np.random .sam ple(100) z = np.random .sam ple(100) a x .s c a tte r ( x , y, z) t h e t a = n p .lin s p a c e ( 0 ., 4 * n p .p i, 100) x l = 0 . 5 * ( 1 + n p .s i n ( t h e ta ) ) y l = 0.5 * (1 + n p .c o s (th e ta )) z l = n p .lin s p a c e (-2 , 2, 100) a x .p l o t ( x l , y l, z l) p i t . showO Параметры функций p lo t( ) и s c a t t e r () близки к тем, которые есть в анало­ гичных функциях модуля pyplot. Открывающееся интерактивное окно имеет дополнительные возможности по выбору точки зрения на отображаемый объ­ ект за счет вращения и изменения масштабов с помощью мыши. Д ля отображения каркасной поверхности (wire frame) используется функция p lo t_ w ire fra m e (), аргументами которой являются двумерные массивы коор- Математический Python 90 Рис. 3.21 Точки и кривая в пространстве динат отображаемой поверхности. Тестовая программа дается ниже, резуль­ тат ее работы показан на рис. 3.22 (рисуется каждая пятый элемент массива по каждому направлению). import numpy as np import m a tp lo tlib .p y p lo t as p i t from m p l.to o lk its.m p lo t3 d import Axes3D f ig = p i t . f i g u r e () ax = Axes3D(fig) x = n p .iin s p a c e ( - 2 ., 2 ., 101) у = n p . lin s p a c e ( - 2 ., 2 ., 101) X, Y = np.m eshgrid(x, y) Z = X * np.exp(-X**2 - Y**2) ax.plot_w irefram e(X , Y, Z, r s tr id e = 5 , c strid e = 5 ) p i t . showO Для более выразительной визуализации двумерных расчетных данных часто комбинируют привязывание как цвета так и высоты со значениями функ­ ции. В этом случае график строиться с помощью функции p lo t_ s u rfa c e () с заливкой четырехугольников каркаса. Результат работы программы import numpy as np 3.3 Пакет Matplotlib 91 Рис. 3.22 Каркасное представление import matplotlib.pyplot as pit from mpl.toolkits.mplot3d import Axes3D fig = pit.figure() ax = Axes3D(fig) x = np.linspace(-2., 2., 101) у = пр.1inspace(-2., 2., 101) X, Y = np.meshgrid(x, y) Z = X * np.exp(-X**2 - Y**2) a x .plot„surface(X, Y, Z, rstride=2, cstride=2, cmap=>spectral’) pit.showO представлен на рис. 3.23. Здесь конкретизируется выбор палитры аналогично соответствующим функциям модуля pyplot. Отдельного упоминания заслуживают возможности рисования трехмерных изолиний, которые предоставляются модулем mplot3D. Используются функ­ ции c o n to u r() и contourf (), которые вполне аналогичны соответствующим функциям модуля pyplot. Пример использования дает (рис. 3.24) программа import numpy as np import matplotlib.pyplot as pit Математический Python 92 Рис. 3.23 Поверхность from m pl_toolkits.m plot3d import Axes3D f i g = p i t . f i g u r e () ax = Axes3D(fig) x = n p . l i n s p a c e ( - 2 . , 2 . , 101) у = n p . l i n s p a c e ( - 2 . , 2 ., 101) X, Y = np.meshgrid(x, y) Z = X * np.exp(-X**2 - Y**2) ax.contourf(X , Y, Z, 15) p i t . showO В целом, пакет Matplotlib) удовлетворяет базовые потребности научной визу­ ализации и на его основе может строится программное обеспечение по постпроцессингу данных расчетов. 3.4 П ак ет SciPy Научные вычисления на Python, общая характеристика, специальные функ­ ции, быстрое преобразование Фурье, линейная алгебра, интерполяция, задачи оптимизации, интегрирование и ОДУ. 93 3.4 Пакет SciPy Рис. 3.24 Трехмерные контура Научные вычисления на Python Прикладное математическое моделирование проводится на основе численного исследования математических моделей. Математические модели включают в себя нелинейные системы уравнений с частными производными, дополненны­ ми системами дифференциальных и алгебраических уравнений. Их прибли­ женное решение основывается на базовых алгоритмах численного анализа, среди которых можно отметить методы решения систем линейных и нели­ нейных уравнений и алгоритмы аппроксимации. Среди расширений Python11 есть много инструментов, которые ориентиро­ ваны на решение задач вычислительной математики. Из коллекций Python, которые предназначены для научных вычислений, отметим SciPy12. Более подробное обсуждение этого пакета дается ниже. Другой набор модулей Python для научных вычислений известен как ScientificPython13. Он включает в себя средства для работы векторами, тензорами и кватернионами, поддерживает преобразования векторных и тензорных по­ 11 Python — http://pypi.python.org/pypi/ 12 SciPy — http://scipy.org/ 13 ScientificPython — http://dirac.cnrs-orleans.fr/plone/software/scientificpython/ Математический Python 94 лей, автоматическое дифференцирование, интерполяцию, работу с полино­ мами, задачи элементарной статистики и задачи минимизации, имеется так­ же интерфейсы для MPI (Message Passing Interface), двумерная и трехмерная визуализация. Большая часть этих функций включена в SciPy. ttofiGy,Srtmияк«#й» ms*(fyM »d*»Mte."t 8Л«<*50! чй$£Й&,.| SSW SXr«Ш .«И5<»ЯИ*¥ {< < < :< ■< ■■ !■«{>P “■• I «лШ 4Х Ш Sri** Ш sJris**»:ш Змейке-й WV"t. I \ itXii С»Х«0<<*>КЙЙ>?;:||- ?.>тa*s СУС* > m;>w$$s> :iyqt. tenttkyWt ) . exvpim ?ЛКй^«Т<»<Ш Я ..........*.. .****??*??. Py№onC*,y) iitej, <0> ® »OSi* &<tttO&*(*»# . i V УГ'хтУ (ХШ I pm» Рис. 3.25 Python(x,y) компоненты Наверное самая большая и довольно таки разрозненная коллекция Python(x,y)14 вобрала с себя все основные наработки для научного и инже­ нерного программирования на языке Python. Общее представление о составе коллекции дает рис. 3.25. Она включает не только все основные математи­ ческие и графические пакеты, но и, например, несколько интегрированных средств разработки, инструменты поддержки разработки графического поль­ зовательского интерфейса, работы с языками C /C + + и Fortran и поддержки вычислений па параллельных вычислительных системах. Отмстим также программное обеспечение, которое ориентировано на реше­ ние специальных задач научных вычислений, которое успешно дополнит тог же пакет SciPy. Например, пакет Numexpr15 работает с массивами существен­ но быстрее, чем NumPy. В качестве второго примера хорошего дополнения базового пакета научных вычислений SciPy, отметим PyTrilinos16. PyTrilinos обеспечивает интерфейс к коллекции библиотек Trilinos, которые решают, в частности, задачи построения и использование векторов, разреженных и 14 Python(x,y) — http://pythonxy.com/ 15 Numexpr — http://code.google.eom/p/numexpr/ 16 PyTrilinos — http://trilinos.sandia.gov/packages/pytrilinos/ 95 3.4 Пакет SciPy плотных матриц, численного решения систем линейных уравнений прямыми и итерационными методами с учетом параллельной архитектуры вычисли­ тельной системы. Для численного решения краевых задач для обыкновенных дифференциаль­ ных уравнений можно использовать bvp17. Краевые задачи могут решать­ ся методом конечных элементов с использованием SfePy18. Это программ­ ное обеспечение позволяет решать двумерные и трехмерные задачи механики сплошной среды (теплопроводность, упругость, уравнения Навье—Стокса). Общая характеристика Пакет SciPy является программным обеспечением с открытым исходным ко­ дом для математики, естественных наук и инженерии. SciPy обеспечивает удобную и быструю работу с N-мерпыми массивами NumPy. Кроме этого, па­ кет SciPy предоставляет большое число эффективных вычисленных процедур численного анализа, такие как программы для численного интегрирования и оптимизация. Как мы уже отмечали выше, пакет NumPy предоставляет широкие возможно­ сти работы с важнейшим для вычислений объектом — N-мерным массивом. Имеются мощные инструменты работы с этими объектами, такие как созда­ ние, перестройка, выбор отдельных элементов и групп. Кроме этого пакет NumPy содержит модули численного анализа, которые связаны с задачами линейной алгебры, реализуют быстрое преобразование Фурье и работу со случайными числами. Сам пакет SciPy организован как коллекции пакетов или, как говорят, sub­ packages, которые обеспечивают научные вычисления в различных направле­ ниях. С учетом принятой в Python терминологии для программного обеспе­ чения будем говорить об этих пакетах как о модулях пакета SciPy. Именно в этом контексте, в частности, пакет NumPy мы рассматриваем как модуль пакета SciPy. В состав пакета SciPy входят следующие (в алфавитном порядке) модули. C lu ste rin g p ackage (scip y .clu ster). Предоставляются19 функции кластер­ ного анализа, который связан с разбиением заданной выборки объек­ тов (ситуаций) на непересекающиеся подмножества, называемые кла­ стерами, при условии, что каждый кластер состоит из схожих объ­ ектов, а объекты разных кластеров существенно различаются. Зада­ ча кластеризации относится к статистической обработке и включает иерархическую генерацию кластеров по расстоянию между объекта­ ми, вычисление матрицы расстояний от вектора наблюдений, подсчет 18 bvpm — http://elisanet.fi/ptvirtan/software/bvp/ ^еРу _ http://sfepy.kme.zcu.cz/ Sc'Py-cluster -- http://code.google.eom/p/scipy-cluster/ 19 Математический Python 96 статистики по группам, визуализацию кластеров с помощью дендро­ грамм. C onstants (scipy.constants). Обеспечивается набор физических констант и функции перевода значений из одних единиц измерения в другие. Реализован международно принятый набор значений фундаменталь­ ных физических констант20 предоставляется CODATA (Committee on Data for Science and Technology). Доступны значения, единицы измере­ ния и относительная точность. Fourier transform s (scipy.fftpack). Модуль предназначен для проведения прямого и обратного быстрого преобразования Фурье (БПФ) с целыо получения спектра сигналов и восстановления формы сигналов по их спектрам. Дискретное преобразование Фурье трансформирует после­ довательность комплексных (либо вещественных) чисел в последова­ тельность комплексных чисел. Реализация основана на основе широко известного и популярного пакета FFTPACK21. Integration and O DEs (scipy.integrate). Представлены функции для вы­ числения интегралов при функциональном и табличном задании подынтегральной функции. Вторая часть модуля integrate предназна­ чена для численного решения задачи Коши для системы обыкновен­ ных дифференциальных уравнений. Программная реализация бази­ руется па FORTRAN пакете ODEPACK22. Interpolation (scipy.interpolate). В модуле interpolate реализованы алго­ ритмы интерполяции и сглаживания одномерных и двумерных функ­ ций. Особое внимание уделяется аппроксимации и сглаживанию с ис­ пользованием кубических сплайнов. Используются многие возможно­ сти пакета программ на FORTRAN FITPACK23. Input and ou tp ut (scipy.io). Ввод/вывод данных в пакете SciPy дополняет базовые возможности чтения и записи пакета NumPy. В NumPy под­ держиваются чтение и запись массивов, которые являются основными объектами при вычислениях. В пакете SciPy реализованы некоторые возможности ввода/вывода для различных других форматов (данные, аудио, видео, изображения, MATLAB и т.д.). Linear algebra (scipy.linalg). Пакет NumPy обеспечивает решение основ­ ных задач линейной алгебры. Пакет SciPy, построенный на основе библиотек линейной алгебры ATLAS LAPACK и BLAS, дает новые воз­ можности. В частности, при работе с матричными объектами поддер­ живаются вычисления с функциями матриц. M axim um entropy m odels (scipy.m axentropy). Содержит процедуры подбора моделей максимальной энтропии в теории информации. 20 21 22 23 CODATA constants — http://physics.nist.gov/cuu/Constants/ FFTPAC K — http://netlib.org/fftpack/ ODEPACK — https://computationJlnl.gov/casc/odepack/ FITPACK — http://www.netlib.org/fitpack/ 3.4 Пакет SciPy 97 M iscellan eo u s ro u tin e s (scipy.m isc). Представлены небольшое число раз­ личный полезных функций, которые не отнесены к специализирован­ ным модулям пакета SciPy. M u lti-d im e n sio n a l im age processin g (scipy.ndim age). Модуль предназ­ начен для анализа и обработки изображений на основе операций над массивами значений. Представлены функции для линейной и нели­ нейной фильтрации, имеются инструменты для решения задач интер­ поляции и бинарной морфологии. O rth o g o n a l d ista n c e re g ressio n (scip y .o d r). Метод наименьших квадра­ тов используется для нахождения параметров модели при условии, что имеются ошибки в зависимых переменных. В модуле odr представ­ лены эффективные алгоритмы оценивания параметров в более общей ситуации, когда ошибки вносятся и в независимые переменные. Реа­ лизация основана на пакете ODRPACK24 O p tim iz a tio n a n d ro o t fin d in g (scip y .o p tim ize). Модуль optimize обеспе­ чивает большую часть стандартных алгоритмов оптимизации, задач о нахождении экстремума (минимума или максимума) вещественной функции в некоторой области. Реализованы основные алгоритмы ре­ шения задач условной и безусловной оптимизации. Модуль также включает функции нахождения решений систем нелинейных уравне­ ний. S ig n al pro cessin g (scipy.signal). Представлены функции обработки сигна­ лов, которые понимаются как массивы действительных или комплекс­ ных чисел. Модуль содержит некоторые функции для решения задач фильтрации сигналов, а также инструменты для разработки филь­ тров. Интерполяции для одно- и двумерных данных обеспечивается использованием В-сплайнов. S p a rse m a tric e s (scip y .sp arse). К разреженными относятся матрицы с преимущественно нулевыми элементами. Такие типы матриц типичны для научных вычислений при численном решении краевых задач для дифференциальных уравнений. В модуле sparse реализованы функции создания, хранения и трансформаций' разреженных матриц. Поддер­ живаются различные структуры данных, которые включают, в част­ ности, стандартные CSR (Compressed Sparse Row) и CSC (Compressed Sparse Column) форматы для разреженных матриц. S p a rse lin e a r a lg e b ra (scip y .sp arse.lin alg ). В модуле sparse.linalg пакета SciPy представлены функции, с помощью которых решаются основные задачи линейной алгебры. Для разреженных матриц реализованы ал­ горитмы вычисления собственных значений и собственных функций, прямые и основные итерационные методы решения систем уравнений с симметричными и несимметричными разреженными матрицами. S p a tia l a lg o rith m s a n d d a ta s tru c tu re s (scip y .sp atial). Предназначен для работы с пространственными структурами данных и алгоритма24 ODRPACK — http://netlib.org/odrpack/ 98 Математический Python ми. Модуль spatial содержит функции работы с KD-деревьями, в част­ ности, для нахождение ближайшего соседа, примерного соседа и поиск всех ближайших пар. Special fu n c tio n s (scip y .sp ecial). Модуль special обеспечивает работу па­ кета SciPy с многими специальными функциями математической фи­ зики (функции Эйри, Бесселя, гипергеометрические функции и т.д.). S ta tistic a l fu n c tio n s (s c ip y .sta ts). Модуль stats пакета SciPy имеет боль­ шое количество основных процедур обработки статистических дан­ ных. Реализованы множество генераторов случайных величин как для дискретных и для непрерывных распределений. Im ag e A rra y M a n ip u la tio n a n d C o n v o lu tio n (scip y .stsci). Поддержи­ ваются вычисления средних и экстремальных величин, свертки для массивов изображений. С/СН —Ь in te g ra tio n (scip y .w eav e). С помощью модуля weave обеспечива­ ется включение кода C /C + + внутри кода Python, что позволяет суще­ ственно ускорить вычисления. Многие из модулей пакета SciPy непосредственно ориентированы на научные вычисления, связанные, прежде всего, с решением задач вычислительной ма­ тематики. С учетом этой направленности ниже приведено более детальное описание отдельных модулей. Специальные функции Специальные функции рассматриваются как классы функций, которые обыч­ но возникают в прикладных задачах при решении дифференциальных урав­ нений. Наибольшего внимания заслуживают ортогональные многочлены, сферические и цилиндрические функции, гипергеометрические функции, вы­ рожденные гипергеометрические функции, гамма-функция, эллиптические функции, интегральный синус, косинус, показательная функция, логарифм, интеграл вероятности. В модуле special пакета SciPy представлены все основ­ ные специальные функции. Мы проиллюстрируем работу с некоторые из них, для более полного знакомства воспользуйтесь документацией к моду­ лю special. Одними из широко используемых специальных функций являются ортого­ нальные многочлены (полиномы): система многочленов {рп{х)}, га = 0,1,2,.... ортогональных с весом р(х) на отрезке I = [а, Ь). В пакете SciPy представлены основные из них (табл. 3.10). С помощью программы import s c ip y . s p e c ia l as spec import numpy as np import m a tp lo tlib .p y p lo t as p i t x = n p .l i n s p a c e ( - l ., 1 ., 100) 3.4 Пакет SciPy 99 Таблица ЗЛО Ортогональные полиномы Ф ункция Описание legendrc(n) chebyt(n) полиномы Лежандра Рп (х) (р( х) = 1, / = [-1 ,1 ]) полиномы Чебышева первого рода Тп (х) chebyu(n) (р(х) = (1 - х 2) ~ 1/2, / = [-1 ,1 ]) полиномы Чебышева второго рода Un (x) chebyc(n) (р(х) = (1 - х 2) 1/2, I = [-1 ,1 ]) полиномы Чебышева первого рода С п (х) chebys(n) (р(х) = (1 - (х /2 )2) 1/ 2, / = [-2 ,2 ]) полиномы Чебышева второго рода Sn (x) (р(х) = (l - f x / 2 ) 2) 1/ 2, / = [-2 ,2 ]) ja co b i(n ,a ,/3) laguerre(n) genlaguerre(n,o:) herrnite(n) hermitenorm(n) gcgeribauer(n,o:) полиномы Якоби Р “ ’^(х) (р(х) = (1 —х )“ (1 + х)^, / = [—1,1]) полиномы Лагерра Ln (x) (р( х ) = ехр(—х), I = [0, оо]) обобщенные полиномы Лагерра L%(x) (р(,х) = ехр( —х) х а , I = [0, оо]) полиномы Эрмита Нп {х) (р( х ) = ехр(—х 2), I = [—оо,оо]) нормированные полиномы Эрмита Н е п (х) (р(х) = ехр (—( х /2 )2), / = [-оо,оо]) полиномы Гегенбауэра (ультрасферичсские) С%(х) sh_chebyu(n) (р(*) = ( 1 - х 2)“ - 1/2, / = [-1 ,1 ]) смещенные полиномы Лежандра РЦ(х) (р(х) = 1, I = [0,1]) смещенные полиномы Чебышева первого рода Т^{х) (р(х) = (х - х 2) _ 1 /2 , / = [0 ,1]) смещенные полиномы Чебышева второго рода Un{x) sh_jacobi(n,o:, /3) (р(х) = (х - х 2) 1/2, I = [0,1]) полиномы Якоби Р “ ’^(.т) (р(х) = (1 —х ) а ~ ^х ^~1, I = [0 ,1]) sh_legendre(n) sh _ch eb yt(n) y l = s p e c .c h e b y t( l) (х) p i t . p l o t (х, y l, lab el= "$ T _ l(x )$ u) у2 = sp e c .c h e b y t(2 )(х) p i t . p l o t ( x , y2, ’ — \ label="$T_2(x)$") y3 = sp e c .c h e b y t(3 )(x ) p i t . p l o t ( x , y3, label="$T _3(x)$") y4 = sp e c .c h e b y t(4 )(x ) p i t . p l o t ( x , y4, label="$T_4(x)$") p it.x la b e lC ’x ’) p i t . legend(loc=9) p it.g r id ( T r u e ) p i t . showO па рис. 3.26 показаны графики полиномов Чебышева. Модуль special предоставляет большие возможности по работе с функция­ ми Бесселя (цилиндрическими функциями). Имеется возможность не только вычислять значения цилиндрических функций, но и интегралы и производ­ ные от них, а также найти корпи. Например, функция jn (n ,x ) (yn(n,x)) вычисляет значение функции Бесселя первого (второго) рода целого поряд­ ка п в точке х. В случае нецелого порядка v для комплексного аргумента z Математический Python 100 х Рис. 3.26 Полиномы Чебышева первого рода используются функции jv ( v ,z ) (y v (v ,z)) соответственно. Для вычисления корней используются функции jn _ z e ro s (n ,n t) (y n _ z e ro s(n ,n t)), где n t — число корней. Ниже представлена программа для рисования функций Бесселя первого рода Jn{x))n = 0,1,3 и первых 6 корней функции J0(x) (см. рис.3.27). import s c ip y . s p e c ia l as spec import numpy as np import m a tp lo tlib .p y p lo t as p i t x = n p .lin s p a c e ( 0 ., 2 0 ., 100) y l = s p e c .jn (0 ,x ) p l t .p l o t ( x , y l, lab el= "$ J_ 0 (x )$ ") y2 = s p e c .jn ( l,x ) p i t .p l o t ( x , y2, la b e l= " $ J _ l(x )$") y3 = s p e c .jn (2 ,x ) p i t .p l o t ( x , y3, la b e l= "$ J_ 2 (x )$") zeros = sp e c . jn _ z e ro s(0 , 6) fo r xz in zero s: p i t . s c a tte r ( x z , 0) p i t . x l a b e l ( ’x ’) 3.4 Пакет SciPy 101 х Рис. 3.2Т Функции Бесселя первого рода p i t . legendO p it.g r id ( T r u e ) p i t . showO В качестве еще одного примера отметим гамма-функцию /•ОО T(z) = / tz~le~tdt) Jo которая определена как для вещественных, так и для комплексных 2. График функции Г(а;) для —5 < х < 5 приведен на рис. 3.28. Расчет выполнен по следующей программе. im port s c ip y .s p e c ia l as spec im port numpy as np im port m a tp lo tlib .p y p lo t as p i t x = n p .a ra n g e (-5 ,5 ,0 .0 1 ) у = spec.gamma(x) fo r i in x: if у [i] > 1.e20: y[i] = l.e20 if y[i] < -l.e20: y[i] = -l.e20 plt.plot(x, y, label="$\\Gamma(x)$") Математический Python 102 х Рис. 3.28 Гамма-функции p i t . a x is ( [ - 5 . , 5 . , - 2 0 . , 2 0 . ] ) p i t .x la b e H ’x ’) p i t . legend(loc=4) p it.g r id (T r u e ) p it.s h o w () В данном примере для корректной прорисовки слишком большие по модулю значения функции обрезаются. Быстрое преобразование Фурье На основе преобразования Фурье решаются многие задачи обработки сигна­ лов. Задачи прямого и обратного преобразования Фурье возникают также при применении метода разделения переменных для краевых задач мате­ матической физики. Отметим возможности модуля fftpack пакета SciPy но преобразованию Фурье сеточных периодических функций. Будем считать, что комплексная периодическая функция xj^j — 0, ±1,... с периодом N определяется но значениям в узлах j = 0 ,1 ,...,7V -- 1, так что xjj = yj+mN. где т любое целое. Функция xj^j = 0, dhl,... представляется в 3.4 Пакет SciPy 103 виде N - 1 „ 2Ьц. (3.1) где г = \/~Т- Здесь /с = 0,1,..., TV—1 — коэффициенты Фурье, для которых имеет место представление Вычисление коэффициентов Фурье по (3.2) есть прямое преобразование Фу­ рье функции jjj — 0,1 , ...,7V — 1, а восстановление самой функции по коэф­ фициентам х к,к = 0,1, ...,7V — 1 согласно (3.1) — обратное преобразование Фурье. В общем случае прямое и обратное преобразование Фурье требует 0(7V2) арифметических действий. Вычислительную работу удается снизить до ве­ личины O(TVlogTV), например, при N = 2п — алгоритмы быстрого преобра­ зования Фурье. В модуле fftpack для прямого преобразования Фурье используется функция f f t (), обязательным аргументом которой является массив значений сеточной функции. Обратное преобразование Фурье обеспечивается функцией i f f t О. Приведенная ниже программа иллюстрирует использование функций f f t О и i f f t () при Фурье-преобразовании разрывной функции. На рис. 3.29 при­ ведены модули коэффициентов Фурье, а на рис. 3.30 представлены точные значения сеточной функции и полученные после применения прямого, а за­ тем обратного преобразования Фурье. im port numpy as np im port m a tp lo tlib .p y p lo t as p i t from scipy import fftp a c k def f ( x ) : f = x i f x > 0 .5 : f = 0. re tu r n f N = 32 У = n p .z e ro s((N ), ’ f l o a t ’) t = n p .z e ro s ( (N), ’f l o a t ’) f o r k in range(N ): tk = n p .f lo a t( k ) / N t [k] = tk y[k] = f (tk ) x = f f tp a c k .f f t( y ) z = n p .s q rt(x .re a l* * 2 + x.imag**2) p i t . f i g u r e (1) p i t .b a r(ra n g e (N ), z , a lig n = ’c e n te r ’ , w idth=0.5, co lo r= ’g ’) Математический Python 104 к Рис. 3.29 Модули коэффициентов Фурье p i t . x l a b e l ( , $k$>) p i t . y la b e l(* $ Ix_kI $ ’) p i t . f i g u r e (2) y l = f f t p a c k .i f f t ( x ) p i t . p l o t ( t , y, la b e l= >e x a c t’) p i t . p l o t ( t , y l, ’ l a b e l ^ d i r e c t - i n v e r s ’) p i t .х 1 а Ь е 1 ( ^ $ >) p i t . leg en d (lo c= l) p it.sh o w () Для двумерного преобразования Фурье используются функции f f t 2 ( ) и i f f t 2 ( ) , а для Фурьс-преобразований многомерных массивов имеются функ­ ции f f tn O и i f f t n ( ) . В модуле fftpack предусмотрена также возможность работы с сеточными функциями, которые принимают только вещественные значения — функции r f f t O и i r f f t O для прямого и обратного преобразований Фурье соответ­ ственно. На основе дискретного преобразования Фурье реализованы дополнительные операции дифференцирования и интегрирования периодических сеточных функций (функция d i f f ()), некоторые исевдодифференциальные операции- 3.4 Пакет SciPy 105 0.5 exact direct-invers 0.4 0.3 0.2 0.1 0.0 ~ ° io 0.2 0.4 0.6 0.8 1.0 t Рис. 3.30 Сеточные функции Поддерживается также возможность быстрого вычисления свертки двух се­ точных функций (функция convolve ()). Имеется также возможность исполь­ зования прямого и обратного преобразований Гильберта (функции h ilb e r tO и ih i l b e r t O ) , которые тесно связаны с преобразованиями Фурье. Линейная алгебра Пакет SciPy предоставляет богатые возможности по решению задач линей­ ной алгебры. Как мы уже отмечали выше, эти задачи представлены в паке­ те NumPy, здесь же мы коротко опишем инструменты, предоставляемые мо­ дулем linalg. Этот модуль содержит функции для вычисления норм матриц и векторов, обращения и факторизации матриц, решения систем линейных уравнений, позволяет находить собственные значения и собственные вектора, вычислять функции матриц. Для решения задач линейной алгебры с разре­ женными матрицами, которые особенно важны при научных вычислениях, предназначен модуль sparse.linalg. В SciPy, как и пакете NumPy, мы можем работать как с массивами, так и с матрицами. При задании матриц поддерживается синтаксис MATLAB (ини­ циализация по строке). Напомним базовые операции над матрицами. Математический Python 106 0 5 10 15 20 О 5 10 15 20 Р и с . 3 .3 1 Портрет матрицы А Для вычисления определителя матрицы имеется функция d e t( ) . Для нахо­ ждения нормы матрицы или вектора предназначена функция norm(). Второй аргумент этой функции принимает значения 1, 2 и in f (2 по умолчанию) и соответствует выбору нормы вектора в 1Р при р = 1,2, оо соответственно и подчиненной нормы матрицы. Здесь in f означает бесконечность (определено в пакете NumPy). Для примера рассмотрим матрицу, которая соответствует разностной про­ изводной второго порядка с обратным знаком на интервале 0 < х < 1 для функций, обращающихся в ноль на концах. Используется равномерная сетка с шагом h внутренние узлы i = 0,1,..., т —1 и h — l / ( m + l ) . Для модель­ ной матрицы А размерности т х т нарисуем портрет, сосчитаем определи­ тель и различные нормы матрицы, проведем разложение Холсцкого, найдем обратную матрицу и получим решение уравнения Ay = Ь при 6 = 1. import numpy as np 3 4 Пакет SciPy Рис. 3.32 Матрица U (А = UU*) from scipy import lin a lg import m a tp lo tlib .p y p lo t as p i t a = 25 h = 1. / (m+1) A = np. mat (np. zeros ((m, m), ’f l o a t ’)) fo r i in r a n g e d , m): A [ i - l , i ] = - 1. / h**2 A [ i,i] = 2 . / h**2 A [i, i-1 ] = - 1. / h**2 Д[0,0] = 2. / h**2 ACm-1, m-1] = 2. / h**2 P it .mat show (A) P rin t ’d e t : ’ , lin a lg .d e t(A ) P rin t ’norm -1:’ , linalg.norm (A , 1) 20 Рис. 3.33 Портрет матрицы В print ’norm-2:’, linalg.norm(A, 2) print ’norm-inflinalg.norm(A, np.inf) L = linalg.cholesky(A) pit.matshow(L) В = linalg.inv(A) pit.matshow(B, cmap=’gray’) b = np.mat(np.ones((m), ’float’)) у = B*b.T pit.figure(4) x = np.linspace(h, m*h, m) plt.plot(x, y, x, x*(l-x)/2, ’:’) plt.xlabel(’$x$’) plt.ylabel(’$y$’) pit.showO 109 3.4 Пакет SciPy 0.14 ОД 2 ОД О 0.08 р> 0.06 0.04 0.02 П о 0.2 0.4 X 0.6 0.8 1.0 Рис. 3.34 Решение уравнения det 1 4 5 7 6 0 8 0 1 0 9 9 е+72 no rm- 1* 2704 О n o r m -2* 2694 14239778 norm -m f 2704 О Н а рис. 3.31 приведен портрет матрицы А (использовалась функция matshowO из пакета Matplotlib). Матрица А является симметричной и трехд иагональ­ ной. В нашем примере решение системы уравнений проведено с явным исполь­ зованием обратной матрицы. Вторая возможность связана с применением функции solve () (вместо у = В*Ь.Т положим у = lin a lg . solve (А, Ь.Т)). Функция solve_banded() предназначена для решения систем уравнений с ленточной матрицей. С учетом того, что матрица А симметрична и положительно определена мы представили ее в факторизованном виде А = LL* = U*U (ленточность мно­ жителей матрицы наблюдается на рис. 3.32). Обратная матрица (рис. 3.33), конечно, является полной. Сравнение с точным решением показано на рис. 3.34 — разностный оператор второй производной является точным для полиномов второй степени. Математический Python 110 Для более общих матриц в модуле linalg имеются функции L/7-разложения. Более того, для работы с любыми невырожденными матрицами реализова­ но более общее разложение А = P L U — функция 1и(). Здесь L — нижняя треувольная матрица с диагональными элементами, равными единице, U верхняя треугольная матрица, а Р — матрица перестановок. Другие возмож­ ности //[/-разложения реализованы в функциях lu _ f a c to r( ), lu _ so lv e () (см. документацию по модулю linalg). Имеются также функции для других разложений матриц: • разложение Холецкого — функции choleskyO , cholesky_banded(), c h o _ fa c to r(), cho_solve(); • Q/?,-разложение — функция q r(); • сингулярное (SVD) разложение — функции svd (), sv d v alsO , diagsvdO , diagsvdO ; • разложение Ш ура — функции sch u rO , r s f 2 c s f () . Использование метода наименьших квадратов проиллюстрируем па задаче подбора коэффициентов сглаживающего полинома. Пусть в точках ж* = гД, г = 0,1, ...,7/i известны значения функции уи г = 0,1, ...,т . Эти данные будем приближать с помощью полинома z(a\x) = a0+a,ix+...+апх п, причем п < т. Коэффициенты ак)к = 0,1, ...,п находятся из условия минимума т J (a ) = ^ 2 ( z (a ',Xi) - V i ) 2. i—l В матричной записи имеем J(a) = ||Аа — 6||2. Реализация метода наименьших квадратов с использованием функции Is ts q O дается следующей программой. import numpy as np from scipy import l in a lg import m a tp lo tlib .p y p lo t as p i t m = 20 n = 3 h = 1 ./m A = np.m at(np.zeros((m +1, n+ 1), ’f l o a t ’)) x = n p .z e ro s ( (m+1), ’f l o a t ’) у = n p .z e ro s ( (m+1), ’f l o a t ’) y l = n p .z e ro s ( (m+1), ’f l o a t ’) fo r i in ran g e(0 , m+1): xx = i*h x [i] = xx y [i] = np.exp(-xx**2) fo r k in ran g e(0 , n ) : A [i,k ] = xx**k a, r e s id , rank, sigma = l in a lg .ls ts q ( A , y) fo r i in range(0, m+1): Рис. 3.35 Аппроксимация полиномом хх = i*h sum = 0. f o r k in ran g e(0 , n ) : sum += a[k]*xx**k y l [ i ] = sum p i t . p l o t ( x , y, la b e l= >e x a c t’) p i t . p l o t ( x , y l , >+:>, la b e l= ,polinom >) p it.x la b e lC ’SxS’) p i t . leg en d () p i t . showO Рис. 3.34 демонстрирует точность аппроксимации функции е~х2 полиномом третьей степени при 0 < х < 1. Вместо функции I s ts q O можно использо­ вать pinvO или p in v 2 (), которые позволяют найти псевдорешение системы линейных уравнений. Приведем также пример нахождения собственных значений матриц. Будем искать собственные значения оператора центральной производной для пери­ Математический Python 112 О 5 10 15 20 25 30 Рис. 3.36 Портрет матрицы А одических сеточных функций: Ау = V'+12h ' ~ 1' * = 0 ,1 ,...,7 7 1 - 1 , при yi+m = yh h = 1/т. Собственными значения кососимметричиой матрицы А являются чисто мнимые: Хк = sin(27r/c/i), к = 0,1, ...,77i — 1. Ниже представлена программа вычисления собственных значений этой мат­ рицы (на рис. 3.36 показан портрет матрицы) с использованием функции e ig v a lsO модуля linalg. На рис. 3.37 дано сравнение точных и вычисленных собственных значений. import numpy as np 3 д Пакет SciPy 113 10 15 20 25 30 Рис. З.ЗТ Точные и вычисленные собственные значения from scipy import lin a lg import m a tp lo tlib .p y p lo t as p i t m = 32 h = 1. / m A = np.m at(np.zeros((m , m), ’f l o a t ’)) .fo r i in r a n g e d , m): A[ i - 1 , i] = 1. / (2*h) A[ i , i - 1] = -1. / (2*h) A[0,m-1] = -1. / (2*h) A[m-1,0] = 1. / (2*h) Pit.matshow(A) P it.figu re(2) l a = lin a lg .e ig v a ls (A ) •^1 = n p .s o rt(la .im a g ) *1 = n p .lin s p a c e (0 , m-1, m) P it.p lo t(ii, la l, label=’numerical’ ) = np.sort(1 ./h * np.sin(2*np.pi*ii*h)) P it.p lo t(ii, laE, label=’ exact’ ) Pit.legend(loc=0) P i t . showO 35 Математический Python 114 Для нахождения как собственных значений так и собственных функций используется функция e ig ( ) . Реализованы также алгоритмы решения спектральных задач для специальных классов матриц: функции e ig v a lsh () и eig h () для комплексных эрмитовых и вещественных симметричных матриц функции eigvals_banded() и eig_banded() для ленточных матриц. В модуле linalg имеется поддержка работы с функциями матриц. Для вычис­ ления матричной экспоненты используются три функции: ехрш() — аппроксимация Паде, ехрт2() — спек­ тральное разложение, ехртЗО — ряд Тейлора. Для вычисления логарифма имеется функция logm(). Реализованы также матричный синус, косинус и тангенс (функции sinm (), cosmO и tanmO), гиперболический синус, косинус и тангенс (функции sinhmO, coshmO и tanhmO). Для вычисления матричная sgn (sign) функции используется signmO, квадратного корня — sqrtm O . От­ мстим также возможность вычисления функций матриц (с помощью funmO), которые связываются с любой функцией Python. Рассмотрим пример использования матричной экспоненты при решении за­ дачи Коши: ^ + А у = 0, 0 < t< T , 2/(0) = и. При постоянной (не зависящей от t) матрице А решение представляется в виде y(t) = e~Aiu. В программе матрица А соответствует второй разностной производной се­ точных функций, обращающихся в ноль на концах интервала [0,1]. Точное решение дискретной и непрерывной задачи представляется в виде разложе­ ния по собственным функциям ipk = y/2sm(7rkx),k = 1 ,2 ,__ import numpy as np from scipy import lin a lg import m a tp lo tlib .p y p lo t as p i t n = 3 m = 19 t = 0.1 h = 1. / (m+1) A = np.m at(np.zeros((m , m), ’f lo a t* ) ) fo r i in r a n g e d , m): A[ i - 1 , i] = - 1. / h**2 A [ i,i] = 2. / h**2 3 4 Пакет SciPy 115 Рис. 3.38 Решение задачи Коши при t = 0.1 A[i,i-1] = - 1. / h**2 А[0,0] = 2. / h**2 A[m-l,m-l] = 2. / h**2 x = np.zeros((m), ’float’) V = n p .z e ro s((m ), ’f l o a t ’) for i in ra n g e (0, m): xx = (i+l)*h x[i] = xx y[i] = np.sin(np.pi*n*xx) У0 = np.exp(-(np.pi*n)**2 * t) * у VI = np.exp(-4/h**2*(np.sin(np.pi*n*h/2))**2 * t) * у В = np.mat(linalg.expm(-A*t)) У2 = B*np.mat(у).T Pit.plot(x, yO, label=’exact (continue)’) Pit.plot(x, yl, label=’exact (dicret)’) Pit.plot(x, y2, ’.’, label=’numerical’) Pit.xlabel(’$x$’) Pit.ylabel(’$y$’) Pit.Iegend(loc=0) Pit.grid(True) Pit.show() 116 Математический Python Здесь есть собственные значения непрерывной и сеточной задачи соответственно. Использование функции ехрт2() вместо ехрш() дает те же результаты, а вот ехршЗО -- ничего разумного (из-за плохой сходимости ряда Тейлора при вычислении матричной экспоненты). Для полной поддержки вычислительных алгоритмов линейной алгебры мож­ но добавить итерационные методы решения систем линейных уравнений. Со­ ответствующие функции можно найти в модуле решения задач с разрежен­ ными матрицами sparse.linalg (ранее они находились в linalg). Пример исполь­ зования метода сопряженных градиентов для ранее рассмотренной задачи (см. рис. 3.34) дается следующей программой. import numpy as np from s c ip y .s p a rs e im port li n a lg import m a tp lo tlib .p y p lo t as p i t m = 25 h = 1. / (m+1) A = np.m at(n p .zero s((m , m), ’f l o a t ’)) f o r i in r a n g e d , m ): A [i-l,i] = - 1. / h**2 A [i, i] = 2. / h**2 A[ i , i-1] = - 1. / h**2 A[0,0] = 2. / h**2 A[m-1,m-l] = 2. / h**2 b = np. mat (np. ones ((m), ’ flo a tO - T help(linalg.eg) y, in fo = lin a lg .c g (A , b, to l= l.e - 0 6 ) x = n p .lin s p a c e (h , m*h, m) p i t .p l o t ( x , y, ’ — \ x, x * ( l- x ) /2 , »:») p i t .x la b e ld $ x $ ’) p l t . y l a b e l ( ’$y$’) p i t .showO Модуль sparse.linalg помимо метода сопряженных градиентов (функция cgO) включает другие итерационные методы решения систем линейных уравнений: • • • • • cgs() — квадратичный метод сопряженных градиентов; qmr() — метод квазиминимальных невязок; gmresO — обобщенный метод минимальных невязок; bicg O — метод бисопряженного градиента; b ic g sta b O — метод бисопряженного градиента со стабилизацией. Эти итерационные методы применяются при решении задач как с полными, так и с разреженными матрицами. 117 3,4 Пакет SciPy Интерполяция Модуль interpolate пакета SciPy предоставляет инструменты для решения стандартных задач интерполяции и сглаживания полиномами и сплайнами сеточных функций одной переменной. Имеются также функции для интерпо­ ляции двумерных данных, заданных на регулярной сетке или в произвольных холках плоскости. Пусть в узлах £0, •••, функция у = у(х) принимает заданные значения уо) 2/ь При полиномиальной интерполяции строиться полином р(х) = а0хт + а1х т~1+ .... + ат , для которого р(хк) = ук, к = 0,1, ...,т . Для построе­ ния интерполирующего полинома можно воспользоваться функцией la g ra n g e O . Более устойчивые алгоритмы вычисления значений интерполирующего поли­ нома реализованы в функциях b a ry c e n tric _ in te rp o la te О и k ro g h _ in te rp o la te (). Приведем пример (рис. 3.39) построения интерполирующего полинома для функции Рунге у = (1 + 25ж2)-1 . Рис. 3.39 Аппроксимация полиномами ^■mport numpy as np from scipy import in te r p o la te import m a tp lo tlib .p y p lo t as p i t x = n p .lin s p a c e ( - l , 1 ., 200) 118 Математический Python p i t . p l o t (х, 1 -/(1 + 25*x*x), la b e l= ’e x a c t’) xl = n p .lin s p a c e ( - l, 1 ., 7) yl = 1 -/(1 + 25*xl*xl) p i = in te r p o la te .la g r a n g e ( x l, y l) p i t .p l o t ( x , p l( x ) , la b e l= ’m=6’) x2 = n p .lin s p a c e ( - l, 1 ., 11) y2 = 1 -/(1 + 25*x2*x2) yb = in te r p o la te .b a ry c e n tr ic _ in te r p o la te ( x 2 , y2, x) p i t .p l o t ( x , yb, la b e l= ,m=10, ) p it.g rid (T r u e ) p i t . Iegend(loc=0) p i t . showO В иракггике научных вычислений гораздо большее внимание уделяется кусочно-1юлиномиальпым аппроксимациям (сплайнам). Основной функцией одно­ мерной интерполяции является in te r p ld O , первый аргумент которой есть массив узлов, второй — массив значений. Параметр kind задает тип кусочнополиномиальной интерполяции. При kind = ’l i n e a r ’ (значение по умол­ чанию) используется кусочно-линейная интерполяция (линейные сплайны), kind = ’c u b ic ’ — кубические сплайны, значения kind = ’n e a r e s t’ , ’z e ro ’ связаны с кусочно-постоянны ми аппроксимациями. Целое значение kind со­ ответствует степени интерполирующего полинома между узлами. При зада­ нии в узлах интерполяции производных кусочно-полиномиальная аппрокси­ мация строится с помощью функции p ie c e w ise _ p o ly n o m ia l_ in terp o la te (). Приведем пример использования функции in te r p ld O функции Рунге (см. рис. 3.40). при интерполяции import numpy as np from scipy im port in te r p o la te import m a tp lo tlib .p y p lo t as p i t x = n p .lin s p a c e ( - l, 1 ., 200) p i t .p l o t ( x , 1 -/(1 + 25*x*x), la b e l= ’e x a c t’ ) x l = n p .lin s p a c e ( - l, 1 ., 11) y l = l ./ C l + 25*xl*xl) p i t . s c a t t e r ( x l , y l) f l = in t e r p o l a t e . i n t e r p l d ( x l , y l, kind= ’n e a r e s t ’) p l t .p l o t ( x , f l ( x ) , la b e l= ’n e a r e s t ’) f2 = in t e r p o l a t e . i n t e r p l d ( x l , y l, kind=3) p l t .p l o t ( x , f 2 (x ), la b e l= ’c u b ic ’) p it.g r id (T r u e ) p i t . Iegend(loc=0) p i t . showO Модуль interpolate содержит много инструментов для работы со сплайнами. В частности, можно не только вычислить значение сплайна в заданной точке, но и найти коэффициенты сплайна, вычислить производную сплайна, пай- 3.4 Пакет SciPy 119 Рис. 3.40 Кусочно-полиномиальная аппроксимация ти интеграл на заданном интервале, корни сплайна. В качестве первого ил­ люстративного примера рассмотрим построение сглаживающего В-сплайна (рис.3.41). В-сплайи строиться с помощью функции s p lre p O , для вычис­ ления значений сплайна используется s p le v (). Параметр s есть параметр сглаживания. import numpy as np from scipy import in te r p o la te import m a tp lo tlib .p y p lo t as p i t x = n p .lin s p a c e ( 0 ., 1 ., 200) p l t .p l o t ( x , n p .c o s(3 * n p .p i* x )* n p .e x p (-x ), xl = n p .lin s p a c e ( 0 ., 1 ., 11) yl = n p .c o s(3 * n p .p i* x l)* n p .e x p (-x l) p i t . s c a t t e r ( x l , y l) tc k l = in t e r p o l a t e . s p l r e p ( x l , y l, s=0) s i = in t e r p o l a t e . sp le v (x , t c k l , der=0) p i t .p l o t ( x , s i , ’ — ’ , l a b e l ^ s ^ ’) tck2 = i n t e r p o l a t e . s p l r e p ( x l , y l, s=0.05) s2 = in t e r p o l a t e . sp le v (x , tc k 2 , der=0) P it.p l o t ( x , s 2 , la b e l= ’s=0.05>) la b e l= ’e x a c t’) Математический Р> 120 Рис. 3.41 Сглаживание сплайнами tck3 = i n te r p o l a te . s p l r e p ( x l , y l, s = l.) s3 = in t e r p o l a t e . sp le v (x , tc k 3 , der=0) p i t .p l o t ( x , s3, ’ la b e l= ,s = l . 9) p it.g r id ( T r u e ) p it.le g e n d (lo c = 0 ) p i t . showO Для интерполяции двумерных данных на двумерной сетке можно воси зоваться функциями b is p lre p O (нахождение 5-сплайна) и b isp le v O числение значений двумерного 5-сплайна). На рис. 3.42 показана исхо, сеточная функция па сетке 11x11, результат интерполяции (сетка 101 х — на рис. 3.43. import numpy as np from scipy import in te r p o la te import m a tp lo tlib .p y p lo t as p i t x, у = n p .m g rid [0 :1:11j , 0 :1 :1 1 j] z = y * (l-y )* x p i t . f i g u r e (1) p it.p c o lo r ( x , y, z , стар=>g ra y ’) p i t . c o lo rb a r() 121 3.4 Пакет SciPy 0.225 0.200 0.175 0.150 0.125 0.100 0.075 0.050 0.025 0.000 Рис. 3.42 Сеточная функция xl, yl = np.mgrid[0:1:101j , 0:1:101j] tck = interpolate.bisplrep(x, y, z, s=0) zl = interpolate.bisplev(xl[:,0], у1 [0,:], tck) pit.figure( 2 ) pit.pcolor(xl, yl, zl, cmap=’gray’) pit.colorbar() pit.showO Д ля работы с данными на нерегулярной сетке можно применять интерпо­ ляцию или сглаживание па основе радиальных базисных функций. Пример использования функции Rbf () представлен ниже (см. рис. 3.44). import numpy as np import matplotlib.pyplot as pit from scipy.interpolate import Rbf x = np.random.rand(100) У = n p . random.rand(100) г = np .sin(2*np.pi*x)*y*(1-y) rbf = Rbf(x, y, z, epsilon=2) Xl = np.linspace(0., 1., 101) Математический Python 122 10.21 - 0.18 j 0.15 0.12 0.09 0.06 0.03 0.00 Рис. 3.43 Сплайн-интерполяция yl = np.linspace(0., 1., 101) XI, Yl = np.meshgrid(xl, yl) Zl = rbf(XI, Yl) pit.pcolor(XI, Yl, Zl, cmap=’gray’) pit.colorbar() pit.scatter(x, y) plt.xlim(0, 1) plt.ylim(0, 1) pit.showO Другой вариант интерполяции данных па произвольной ссткс(кусочпо-липейпое восполнение при триангуляции Делоне) рассмотрен нами ранее (рис. 3.20) при обсуждении возможностей графического пакета Matplotlib. Задачи опт имизации В модуле optimize пакета SciPy представлены средства для решения нелиней­ ных уравнений и их систем, минимизации одномерных функций и функций многих переменных без ограничений и с ограничениями. 3.4 Пакет SciPy 123 Рис. 3.44 Интерполяция на нерегулярной сетке Для приближенного решения задачи нахождения решения нелинейного урав­ нения f ( x ) = 0 можно использовать различные методы. Для поиска корня на интервале [а, 6], на котором функция f ( x ) меняет знак (f ( a ) f ( b ) < 0), можно применить метод Брента (функция brentqO). Ниже (см. рис. 3.45) ищется решение уравнения 2х — 1 + 2cos(7тх) = 0 на интервалах [0,1] и [1,2]. import numpy as np import matplotlib.pyplot as pit import scipy.optimize as optimize def f (x): return 2*x - 1 + 2*np.cos(np.pi*x) x = np.linspace(0., 2., 201) У = f(x) pit.plot(x, y, label=’$2x-l+2\\cos(\\pi x) = 0$’) xO = optimize.brentq(f, 0., 1.) xl = optimize.brentq(f, 1., 2.) print ’x:’, xO, *,’, xl Pit.scatter(xO, 0) Pit.scatter(xl, 0) Pit.Iegend(loc=0) Математический Pyt 124 я Рис. 3.45 Решение нелинейного уравнения pit .x lab eK ’ SxSO p i t .ylabel( ’ $f(x )$’ ) pit.grid(True) p i t . showO x. 0.5 , 1.23648444824 Для решения систем нелинейных уравнений используется функция f solve в которой нужно задать уравнения системы и начальное приближение к шеиию. Рассмотренное выше уравнение 2х —1 + 2cos(7rx) = 0 будем рассм ривать как систему 1 - 2х0 - Xi = 0, Xi — 2cos(7ra;o) = 0. В следующей программе решение (см. рис. 3.46) получено при использоваг функции fso lv e(). import numpy as np import matplotlib.pyplot as pit import scipy.optimize as optimize def F (x ): out = [1 - 2*x[0] - x [l]] X Рис. 3.46 Решение системы уравнений out.append( х [1] - 2 * n p .c o s(n p .p i* x [0 ])) return out x = np.1inspace(0., 2., 201) yl = 1 - 2*x y2 = 2*np.cos(np.pi*x) pit.plot(x, yl, label= ,$l - 2x$’ ) pit.plot(x, y2, ’ —\ label=’ $2\\cos(\\pi x)$’ ) xO = optimize.f solve (F, [0.5, 0 .]) xl = optimize.f solve (F, [1.5, 0 .]) print ’ x : ’ , xO, ’ , ’ , xl p it.scatter(xO[0], xO[1]) p it.sc a tte r(x l[0], x l[l]) P lt.le g en d (lo c = 0 ) p l t .x l a b e K ’SxS’) P i t .y la b e l( }$ f(x )$ J) P it.g rid (T ru e ) P i t . showO Математический Python 12G Для минимизации одномерных функций используются различные алгорит­ мы: например, в функции goldenO — метод золотого сечения, в brent() метод Брента (метод обратной параболической интерполяции). В нижепри­ веденной программе используется функция fminboundO для минимизации функции /(л;) = ж2(ж2 - ж - 6) на интервалах [-3,0] и [0,3] (рис. 3.47). Рис. 3.47 Минимизация одномерной функции import mimpy as np import m a tp lo tlib .p y p lo t as p i t import sc ip y .o p tim iz e as optim ize def f ( x ) : re tu rn x+x*(x*x - x - 6) x = n p .lin s p a c e ( - 3 ., 3 ., 201) у = f(x ) p i t .p l o t ( x , y, la b e l= ,$x~2(x~2 - x -6)$*) xO = optim ize.fm in b o u n d (f, - 3 . , 0 .) xl = optim ize.fm in b o u n d (f, 0 ., 3 .) p r in t ’x : 9 , xO, W xl p i t . sc a tte r(x O , f(x 0 )) p i t .s c a tte r ( x l, f(x l)) p i t . legend(loc=0) 127 3.4 Пакет SciPy p lt.x la b e l(’ $x$’ ) plt.y la b e l(’ $f(x)$>) pit.grid(True) pit. showO x : [-1 .3 9 7 1 8 0 1 4 ] , [ 2 .1 4 7 1 8 1 8 7 ] При минимизации функций многих переменных обычно используются квазииыотоповскис методы. В этом случае мы можем задавать производные ми­ нимизирующей функции точно или же они будут вычисляться приближенно в процессе вычислений. Мы ограничимся примером использования функции fminO, в которой реализован симплекс-метод. Будем искать минимум функ­ ции F(x) = 100(.гд —x l ) 2 + (1 —хо)2 (двумерная функция Розенброка). 3.0 2.5 2.0 1.5 1.0 0.5 0.0 —0.5 ~ 1-2.0 -1.5 -1.0 -0.5 0.0 0.5 1.0 1.5 Рис. 3.48 Минимизация функции Розенброка import numpy as np import m a tp lo tlib .p y p lo t as p i t import scip y .o p tim ize as optim ize def f ( x): re tu rn 100*(x[l] -x[0]**2)**2 + (1 - x[0])**2 x = n p .lin s p a c e ( - 2 ., 2 ., 101) 2.0 Математический Python 128 у = n p .1in sp a c e ( - 1 ., 3 ., 101) X, Y = np.m eshgrid(x, y) z = f([X , Y]) v = n p .lin s p a c e (0, 100, 21) p it.c o n to u r f ( x , y, z , v, cm ap=plt.cm .gray) p i t . c o lo rb a rO xO = [0, 0] xmin = o p tim iz e .fm in (f, xO) p i t . sc a tte r(x m in [0 ], xmin[1 ], c=’w’) p r in t ’xm in:’ , xmin p i t . showO Optimization term inated s u c c e ssfu lly Current function value 0,000000 Ite r a tio n s 79 Function e v alu atio n s 146 xmin [ 1 00000439 1 00001064] В вычислительной практике особое значение уделяется минимизации функ­ ции, которая представляет собой сумму квадратов. Типичной является ситу­ ация, когда нелинейная функциональная зависимость функции у = /(р; х) от параметров р к = к = 0 ,1,...,п восстанавливается на набору приближенных данных х^ у ^ г = 0,1,..., га (га > п). Для этого минимизируется функционал ш i=о Можно использовать функцик) leastsqO . В программе ищутся параметры а, 6, с в представлении у = а + Ье~сх по за­ шумленным данным. Результаты расчетов иллюстрируются рис. 3.49. import numpy as np import m a tp lo tlib .p y p lo t as p i t import sc ip y .o p tim iz e as optimize, def re s ( p , y, x ) : a, b, с = p e r r = у - a - b * np.exp(-c*x) re tu rn e r r x = n p .lin s p a c e ( 0 ., 1 ., 21) a, b, с =2, 1, 3 у = a + b *np.exp(-c*x) n p . random. se e d (0) yO = у + 0 .1 * n p.random .randn(len(x)) p i t .p l o t ( x , y, la b e l= , e x a c t>) p i t .p l o t ( x , yO, * la b e l=)p e r tu r b a tio n *) p0 = [0, 0, 0] p lsq = o p tim iz e .le a s ts q ( r e s , p 0 ,arg s= (y 0 , x)) 129 3.4 Пакет SciPy Рис. 3.49 Параметрическая идентификация P i = p lsq [0 ] print ’ a, b, с: *, pi y l = p i [0] + p i [1] *np.exp(-pl [2] *x) p lt.p lo t( x , y l, p i t . Iegend(loc=0) p i t . x la b e l( ’$x$9) p i t . y la b e l( ’$ f ( x ) $ 9) p it.g r id ( T r u e ) p i t .showO a, b, с [1 l a b e l ^ s o lu tio n ’ ) 90512141 1 21298056 2,43970231] В более общем случае рассматриваются задачи минимизации с ограничения­ ми, которые обычно формулируются в виде неравенств. В простейшем случае имеются ограничения на диапазоны независимых переменных. Для условной минимизации можно использовать функцию fm in_cobyla(). Интегрирование и ОДУ В модуле integrate пакета SciPy представлено программное обеспечение для решения двух классов задач вычислительной математики. Рассматриваются Математический Python 130 проблемы вычисления интегралов непрерывных и сеточных функций. Вто­ рой класс задач связан с численным решением задачи Коши для системы обыкновенных дифференциальных уравнений. Основная функция вычисления определенных интегралов от функции непре­ рывного аргумента есть quad(). В нашем примере (см. рис. 3.50) для задан­ ной функции f ( x ) = е~4х sin(47rx) вычисляется интеграл j (x) = f(t)dt ца равномерной сетке интервала [0,1]. Рис. 3.50 Интегрирование функции / ( х) = е 4 lsin(47nr) import numpy as np import m a tp lo tlib .p y p lo t as p i t import s c ip y . in te g r a te as in te g r a te def f ( x ) : re tu rn n p . exp( -4*x)*np. sin (4 * n p .pi*x) m = 101 x = n p .z e ro s ( (m), ’f l o a t ’) у = n p .z e ro s ( (m), ’f l o a t ’) yl = n p .z e ro s ( (m), ’f l o a t ’ ) fo r i in ran g e(0 , m): x [i] = i / ( m - l .) y [i] = in te g r a te .q u a d ( f , 0, x [ i ] ) [0] y l[i] = f ( x [i]) p i t . f i l l (x, f ( x ) , ’g \ la b e l= ’$f (x )$ ’) 131 3.4 Пакет SciPy p i t . p l o t (х, у, la b e l= ,$ \\in t_ o ~ x f ( t ) d t$ 0 10 = in te g r a te .q u a d ( f , 0, 1)[0] 11 = in te g r a t e .tr a p z ( y l , x) 12 = in te g r a te .s im p s ( y l, x) p r i n t ’in t( q u a d ) : *, 10 p r i n t ’i n t ( t r a p z ) : ’ , I I p r i n t ’i n t ( s i m p s ) , 12 p i t . legend(loc=0) p i t .x la b e lO $ x $ ’ ) p it.g r id ( T r u e ) p i t .showO in t( q u a d ) i n t ( tra p z ) in t (s im p s ) 0.0709329489651 0 0708301283866 0 0709330243013 Д л я сеточных функций используются квадратурные формулы трапеций и Симпсона (функции tra p z О и simps () соответственно). На основе процедур интегрирования по одной переменной реализованы так же функции интегри­ рования по двум и трем переменным (dblquadO и tplq uadO ). Отдельного внимания заслуживают возможности решения задачи Коши для систем обыкновенных дифференциальных уравнений. В модуле integrate для таких задач используются функции ode О и o d e in tO . Они предназначены д л я решения задач как для нежестких, так и жестких систем ОДУ. Рассмотрим задачу Коши (модель Лотка—Вольтерра) dy0 dt У0 - У 0 У1 , ^ £ = -У1+УоУи 0 < < < Т, l/o(0) = 2/S, Vi{0) = y°. Система уравнений записывается в векторном виде dY dt F (y ,i), 0 < t< T при У= Уо 2/i F(Y,t) = Уо ~ 2/02/1 . “ 2/1 + 2/о2/1 . В программе решение получено с помощью функции o d ein tO на интервале [0,10] (см. рис. 3.50). im port numpy as np im port m a tp lo tlib .p y p lo t as p i t im port s c ip y . in te g r a te as in te g r a te def f(y , t) : re tu r n [y [0] - y [ 0 ] * y [ l] , -y Cl] + у [0] *y [1] ] t = n p .lin s p a c e (0 , 10, 1000) Математический Python 132 Рис. 3.51 Задача Коши для системы ОДУ уО = [2, 2] Y = i n t e g r a t e .o d e i n t ( f , yO, t ) rO, r l = Y.T p i t . p l o t ( t , rO, l a b e l ^ y . O S ’) p it.p lo t( t, r l, la b e l= ’$ y _ l$ ’) p i t . legend(loc=0) p i t . x l a b e l ( , $ t$ >) p it.g r id ( T r u e ) p i t . show() При использовании функции o d ein t () для решения задачи Коши для систем ОДУ можно повысить вычислительную эффективность за счет аналитиче­ ского задания матрицы Якоби (якобиан, производные правых частей систе­ мы). 3.5 Д р у г и е м атем ати ч еск и е п акеты Вы многое найдете, пакет символьных вычислений SymPy, разреженные мат­ рицы (SciPy.sparse), PyAMG — многосеточный метод, элемеР1ты графического интерфейса пользователя (formlayout). 3 5 Другие математические пакеты 133 Вы многое найдете 3 научных вычислениях могут понадобиться инструменты, которые не пред­ ставлены в рассмотренном пакете SciPy или же возможности модулей этого пакета окажутся недостаточными. Прежде чем программировать что-то свое (программу на языке Python, включение сторонних программ на других язы­ ках) нужно посмотреть, кто и как подобные задачи уже решал. Поиски во всемирной сети уместно начать с репозитария пакетов Python25. Вторая общая возможность связана с тенденцией обеспечения интерфейса на языке Python к прикладному программному, написанному на других языках программирования. Поэтому нужно обратиться к ресурсам по интересую­ щему вас программному обеспечению. Здесь м ы отметим некоторые пакеты Python, которые расширяют возможности SciPy26 прежде всего по решению задач вычислительной математики. Начнем мы с систем аналитических вычислений, которые традиционно хо­ рошо представлены в таких общих математический инструментах, как пакет прикладных программ для решения задач технических вычислений MAT­ LAB27, программа для выполнения и документирования инженерных и на­ учных расчётов Mat head28, системы компьютерной алгебры Mathematica29 и Maple30. Наиболее полная поддержка символьных вычислений обеспечивается Sage31. Этот программный продукт позиционируется как свободно-програм­ мная альтернатива тех же Maple, Mathematica и MATLAB. Для иллюстрации поддержки символьных вычислений при работе на Python мы ограничимся возможностями пакета SymPy. В пакете SciPy мы выделили модуль optimize, в котором решаются нелиней­ ные уравнения и минимизируются функции. Более широкие возможности по задачам оптимизации предоставляет специализированный пакет OpenOpt32. Помимо всего в этом пакете реализован интерфейс с другими программны­ ми продуктами решения задач оптимизации. В частности, к пакету решения задач выпуклой оптимизации CVXOPT33. При численном решении задачи Коши для системы обыкновенных диффе­ ренциальных уравнений использовался модуль integrate пакета SciPy. До­ полнительные возможности работы с такими математическими объектами предоставляет пакет Model Builder34. С использованием графической оболоч­ ки строятся математические модели, находиться численное решение и ви­ 25 26 27 28 29 30 31 32 33 34 Репозитарий пакетов — http://pypi.python.org/pypi Тематическое ПО — http://scipy.org/Topical_Software M ATLAB — http://www.mathworks.com/ Mathcad — http://www.ptc.com/appserver/mkt/products/home.jsp?k=3901 Mathematica — http://www.wolfram.com/ Maple — http://www.maplesoft.com/ Sage — http://www.sagemath.org/index.html OpenOpt — http://openopt.org/Welcome CVXO PT — http://abel.ee.ucla.edu/cvxopt/ Model Builder — http://model-builder.sourceforge.net/ 134 Математический Python зуализируются данные расчетов. Пакет PyDDE35 позволяет найти решение систем обыкновенных дифференциальных уравнений с запаздыванием. Для научных вычислений и прикладных исследований наибольший интерес представляют программные продукты, которые предназначены для решении краевых задач для уравнений с частными производными. В настоящее время необходимо ориентироваться на приближенное решение многомерных нели­ нейных задач в нерегулярных расчетных областях. В силу этого необходимо иметь возможность подготовки входных данных (область, уравнения, гра­ ничные условия), генерации расчетной сетки, аппроксимации (построении дискретной задачи), решения дискретных задач, обработки и визуализации расчетных данных. Для подготовки сложных трехмерных геометрических моделей (расчетной области) используются CAD инструменты. Среди свободного программного обеспечения упомянем набор библиотек и программного обеспечения для 3D моделирования Open CASCADE36. На ее основе строятся многие как платные, так и бесплатные программные продукты. Отметим в этой связи открытую интегрируемую платформу для численного моделирования SALOME37. На основе Open CASCADE реализована Python 3D CAD библиотека pythonOCC38. При численном решении задач математической физики используются регу­ лярные и нерегулярные (структурированные, блочно-структурированные и неструктурированные) сетки. Сеточные генераторы являются важной состав­ ной частью любого программного продукта, ориентированного на решение задач для уравнений с частными производными и они включены в общие ин­ струменты численного моделирования. Среди пакетов Pethon, которые ори­ ентированы на подготовку расчетных сеток, отметим MeshPy39 Имеется воз­ можность строить 2D и 3D неструктурированные сетки на основе разбиения Вороного (триангуляция Делоне). Особое внимание уделяется программным продуктам для решения дискрет­ ных задач. При решении многомерных задач мы должны учитывать основ­ ную специфику таких проблем, которая связана прежде всего с разреженной структурой расчетных данных. Мы упоминали выше о модуле sparse в пакете SciPy, который даст инструменты для работы с разреженными матрицами. В частности, в модою sparse.linalg представлены функции для решения си­ стем уравнений с такими матрицами. Аналогичные возможности предостав­ ляет пакет Pysparse40. Из других пакетов линейной алгебры, ориентирован­ ных на численное решение задач математической физики, стоит упомянуть 35 36 37 38 39 40 PyDDE — http://u se rs.o x.a c.u k/ clm e l0 7 3 /p yth o n /P yD D E / Open CASCADE — http://w ww .opencascade.org/ SALOME — http://w w w .salom e-platform .org/ pythonOCC — h ttp ://w w w .p ytho n o cc.o rg/ MeshPy — http://m athem a.tician.de/softw are/m eshpy Pysparse — http://pysparse.sourceforge.net/ 3.5 Другие математические пакеты 135 pyAMG41, в котором реализован алгебраический многосеточный итерацион­ ный метод для решения сеточных задач. Для решения задач большой размерности необходимо использовать компью­ теры с параллельной архитектурой. Разработка программного обеспечения для решения задач на таких вычислительных многопроцессорных и/или мно­ гоядерных комплексах базируется на тех или иных алгоритмах распреде­ ленных вычислений. Среди специализированных инструментов Python мож­ но отметить пакет mpi4py42, который обеспечивает поддержку MPI (Message passing Interface) стандарт для многопроцессорных систем. Для разбиения задачи на подзадачи используется макет PyMetis43. Среди общих инструментов прикладного численного анализа отметим кол­ лекцию библиотек Trilinos44. В настоящее время пакет PyTrilinos45 обеспечи­ вает интерфейс на языке Python к отдельным библиотекам этой коллекции. Пакет PySUNDIALS46 дает возможность работы с другой популярной кол­ лекцией программного обеспечения численного анализа SUNDIALS47 (SUite of Nonlinear and Dlfferential/ALgebraic equation Solvers). В этой связи отметим, что предоставление интерфейса для работы на языке Python разрабатываемому прикладному программному обеспечению является общей тенденцией. При проведении научных вычислений отдельного обсуждения заслуживает проблема визуализации расчетных данных. Особенно это актуально при опе­ рировании с большими массивами данных на компьютерах параллельной ар­ хитектуры. Для большинства случаев может быть достаточно возможностей графической библиотеки Matplotlib, которая достаточно подробно обсужда­ лась нами выше, и им подобным (Gnuplot, DISLIN, Chaco). Для научной визу­ ализации трехмерных данных (скаляров, векторов) можно ориентироваться на более мощные инструменты, такие, например, как Mayavi248 и Visualization Toolkit (VTK)49. Вторая возможность связана с записью расчетных данных в надлежащем формате и использованию сторонних программных продуктов для их визуализации. Хорошим примером программы визуализации данных расчетов является ParaView50, — свободно распространяемая программа с от­ крытым кодом для параллельной и интерактивной научной визуализации. Имеется ряд интегрированных программных продуктов, которые обеспечи­ вают численное решение краевых задач для уравнений с частными произ­ водными. Так например, DOLFIN51 обеспечивает интерфейс на языке Python 41 42 43 44 45 46 47 P yA M G — h ttp ://code.google.eom /p/pyam g/ mpi4py — http://co d e.go o g le .e o m /p /m p i4 p y/ PyMetis — h ttp://m athem a.tician.de/node/423 Trilinos — http://trilinos.sandia.gov/ PyTrilinos — http://trilinos.sandia.gov/packages/pytrilinos/index.htm l PySUN DIALS — http://pysundials.sourceforge.net/ SUNDIALS — https://com putation.llnl.gov/casc/sundials/m ain.htm l 48 Mayavi2 — http://code.enthought.com/projects/mayavi/ 49 V T K — h ttp ://w w w .v tk .o rg / 50 ParaView — h ttp ://w w w .p a ra vie w .o rg / 51 D O L F IN — h ttp ://w w w .fe n ic s .o r g /w ik i/D O L F IN Математический Python 136 для коллекции свободных программных продуктов FEniCS52 — инструменты для работы с сетками, конечно-элементными аппроксимациями уравнений с частными производными и решения дискретных задач. В качестве второго примера программного инструментария для решения многомерных нелиней­ ных задач на основе метода конечных элементов отметим Escript53. В пакете FiPy54 для решения стационарных и нестационарных задач математической физики применяется метод конечных объемов. При разработке современных программных продуктов большое внимание уделяется графическому интерфейсу пользователя. На этот элемент програм­ мирования при проведении научных расчетов практически часто не обраща­ ется внимания. Однако совсем отказываться от удобств, который предостав­ ляет GUI (Graphical user interface) вряд ли целесообразно. На примере пакета form layout мы проиллюстрируем разработку программ на языке Python с ми­ нимальным графическим интерактивным вводом параметров. Пакет символьных вычислений SymPy Научные вычисления базируются на получении приближенного численного решения задачи. Они могут дополняться символьными вычислениями, кото­ рые подразумевают преобразования и работу с математическими равенства­ ми и формулами, которые рассматриваются как последовательность симво­ лов. Системы аналитических вычислений (системы компьютерной алгебры) используются для символьного интегрирования и дифференцирования, вы­ числения пределов, подстановки одних аналитических выражений в другие, упрощения формул и т.д. Символьные вычисления в Python поддерживаются пакетом SymPy55. Это полнофункциональная и одновременно простая для использования и легко расширяемая система компьютерной алгебры. Пакет SymPy полностью напи­ сан на Python и при использовании не требует никаких внешних библиотек. Для задания одной символьной переменной используется функция Symbol О, нескольких — symbols О или v a r(). При работе с числами с плавающей за­ пятой имеется возможность выбора точности вычислений с использованием функции N() (арифметика произвольной точности). Поддерживаются вычис­ ления с комплексными числами (в SymPy >/~~Т = I, е = Е). Для представле­ ния дробей используется функция R a tio n a l(). Дополнительные возможно­ сти при выводе результатов предоставляет функция p p rin tO . Следующий пример иллюстрирует отмеченные возможности пакета SymPy. import sympy as sm x, у = sm.symbols ( ’xy’) 52 53 54 55 FEniCS — http://www.fenics.org/wiki/FEniCS_Project Escript — https://launchpad.net/escript-Fmley FiPy — http://www.ctcms.nist.gov/fipy/ SymPy — http://code.google.eom/p/sympy/ 3,5 Другие математические пакеты 137 p rin t ’p i : ’ , sm .N(sm.pi, 50) p rin t ’com plex:’ , sm .N (l/(2 + s m .I), 50) x = sm .R a tio n a l(1, 2) у = sm .R a tio n a l(3, 7) sm .pprint(x + y) pi 3 1415926535807932384626433832795028841971693993751 0 4 — 0 2*1 com plex Поддерживаются основные символьные операции с выражениями. Для упро­ щения символьного выражения применяется функция s im p lify O . Для упро­ щения тригонометрических функций используется trig s im p O , для числен­ ных упрощений — n sim p lify O . import sympy as sm x = sm.Symbol(’x ’) s i = (l-2*x)*(3+ x) + x**2 p r in t ’s im p l i f y : ’ , s m .s im p lify (s i) s2 = sm .sin(x)**2 + sm .cos(x)**2 p r in t ’tr ig s im p : ’ , sm .trig sim p (s2 ) s3 = sm .n sim p lify (sm .p i* 7 , to le ra n c e = 0 .0 1 ) p r in t ’n s im p lify : ’ , s3 s im p lify 3 5*x — x**2 t r i g s im p 1 n s im p lif y * 22 Раскрытие скобок в символьных выражениях обеспечивается функцией expand О (ниже приведен пример для полиномов и тригонометрических функций комплексного переменного). Отметим также функцию a p a rt О для разложения на простые дроби. • im port sympy as sm x = sm.Symbol(’x ’ ) у = sm.Symbol(’y ’ ) s i = (x+y)**3 p r in t ’expand ( b a s i c ) : ’ , sm .expand(sl) s2 = sm .sin (x + sm .I*y) p r in t ’expand (co m p le x ):’ , sm .expand(s2, complex=True) S3 = 2 / ( (x -l) * ( x + l) ) p r in t ’a p a r t : ’ , sm .ap art (s3 , x) ex p an d ( b a s i c ) 3 * x *y**2 -f 3*y*x**2 ~f x**3 + y**3 ex p an d ( c o m p le x ) . c o s h ( im ( x ) + re ( y ) ) * s m ( —im (y ) -f r e ( x ) ) 4- I * c o s ( —im (y ) -f re ( x ) ) * s in h ( im ( x ) 4- r e ( y ) ) Математический Python 138 apart - 1 / ( 1 + x) - 1 / ( 1 — x) В пакете Sympy поддерживаются основные операции математического анали­ за. Для аналитического дифференцирования используется функция d i f f ( ) ? для интегрирования — i n t e g r a t e (). import sympy as sm x = sm.Symbol(’x ’) s i = sm .log(l+ x) + 1 / (1+x) p r in t ’d i f f : ’ , s m .d if f ( s i, x) s2 = sm.log(x**2) p r in t ’in t e g r a t e : ’ , s m .in te g ra te (s 2 , x) s3 = x / (x**2 + 2*x+l) p r in t ’in te g r a te ( 0 , 1 ) : ’ , s m .in te g ra te (s 3 , (x, 0, 1)) diff 1 / ( 1 -I x) - 1 / ( 1 + x) ** 2 i n t e g r a t e : —2*x + 2 * x * l o g ( x ) integrate (0,1) - 1 / 2 + log(2) Вычисление пределов обеспечивается функцией lim it О . Для разложения функции в ряд Тейлора в заданной точке используется s e r i e s (). import sympy as sm x = sm.Symbol(’x ’) s i = x**x p r in t ’lim it (x -> 0 ): ’ , s m .lim it( s i, x, 0) s2 = sm .cos(x) p r in t ’s e r i e s : ’ , s 2 .s e r ie s ( x , 0, 8) lim it (x -> 0 ). 1 series 1 - x * *2 /2 + x * * 4 / 2 4 - x * * 6 / 7 2 0 + 0 ( x * * 8 ) Для решения алгебраических уравнений и систем в пакете Sympy исполь­ зуется функция s o lv e () (уравнения записываются в виде f i ( x = 0,1, ...,m). Кроме того имеется возможность получения аналитического реше­ ния задачи Коши для обыкновенных дифференциальных уравнений — функ­ ция d so lv eO . В примере ищется общее решение уравнения import sympy as sm x, у = sm.symbols( ’x y ’) u = sm .F u n ctio n (’u ’) s i = x**4 - 1 p r in t ’s o l v e : ’ , s m .s o lv e (s i, x) s2 = (x**2 + y**2 - 1, x - у + 1) p r in t ’solve (s y s te m ):’ , sm .so lv e(s2 , x, y) eq = sm .D e riv a tiv e (u (x ), x, x) + u(x) 139 3.5 ДРУгие математические пакеты p r i n t ’d s o l v e : ’ , sm.dsolve(eq, u(x)) ■solve. [1, - 1 , - I , I] Solve ( s y st e m) . f ( - l , 0 ) , (0, jjgolve C l * s m ( x ) + C2#cos(x) 1')] Отметим некоторые возможности аналитического решения задач линейной алгебры. Матрицы могут задаваться на основе явного вычисления элементов матрицы (функция Matrix О ) и с использованием функций eye О , zeros О, ones О . Имеются функции для выполнения LU и QR разложения, поддержи­ ваются возможности решения систем линейных уравнений в аналитическом виде. import sympy as sm def f ( i , j ) : r e tu r n 4 - ( i- j) * * 2 Ml = sm.ones(3) p r in t ’M l : \ n \ Ml М2 = sm.Matrix(3, 3, f) p rin t ’M2:\n>, М2 s = M l.do t(М2) p r in t , Ml.dot(M2): ' , s d = M l.detO p r in t , d e t ( M l) :, > d М3 = M2.inv() p r in t ’M 3 :\n \ М3 Q, R = M3.QRdecomposition() p ri n t , Q :\n , > Q p ri n t ’R A n ’ , R e illS ililllliS illllllllllillllS liiilllllllillliilB iilllllB t К Н Н Н Н Ш П Н Н П Ш Н Н И шшшшшшшяяшgшявяшaшяшlяяяшвшlшя^шlявшяi ll!liill®il!!lllll!lSlSIIllBi5I!iaiBlieillilSIIII*lllllllllllllSlllSilliilllllllli Ml. dot (М2) - 24 det(Ml). 0 1-7/8, 3/2, -9/8] 3/2, - 2 , 3/2] 1-9/8, 3/2, -7/8] ]-7*274**(l/2)/274, f 6*274**(l/2)/137, 15*274**(l/2)/274, 0] 1 4 * 2 7 4 * * ( l / 2 ) / 6 8 5 , 3/ 5] 140 Математический Python | —9 *2 7 4 ** ( 1 / 2 ) / 2 7 4 , - 2 1 * 2 7 4 * * { 1 / 2 ) / 1 3 7 0 , 4 / 5 ] R. [ 2 7 4 * * ( 1 / 2 ) / 8 , —2 4 * 2 7 4 * * ( 1 / 2 ) / 1 3 7 , 1 3 5 * 2 7 4 * * ( 1 / 2 ) / 1 0 9 6 ] [ 0, 5*274**(1/2)/274, ~12*274**(1/2)/685] [ О , 0, 1/5] В пакете Sympy поддерживается работа с полиномами. Например, функция d iv () предназначена для деления полиномов с остатком. Для разложения в виде множителей с рациональными коэффициентами используется функция f a c to r (). Корни полиномов находятся с помощью f a c to r О . import sympy as sm x = sm.Symbol( ’x ’) a, b, с = sm .sym bols(’a b c’) f = a*x**2 + b*x + с g = 2*x + 1 q, r = sm .d iv (f, g, x) p r in t ’q: ’ , q p r in t R em a in d e r:’ sm .p p rin t(r) p i = x**3 - 1 p2 = s m .fa c to r(p i) p r in t ’fac to r(x ~ 3 - l ) : \ n ’ , p2 p3 = x**3 + 2*x + 3 p r in t ’r o o t s : ’ , sm .solve(p3, x) q* b / 2 - a / 4 + a * x / 2 rem ainder: f a c t o r ( x ~ 3 — 1). - ( 1 - x ) *(1 -f x -f x**2) roots [ 1/ 2 — I * l l * * ( l / 2 ) / 2 , —1, 1 /2 -f I *11 * * ( l / 2 ) / 2 ] Пакет Sympy (модуль statistics) имеет средства для работы со случайными величинами. Функция Normal () генерирует нормальное распределение с за­ данным средним значением и заданным стандартным отклонением. Функция плотности вероятности рассчитывается с помощью функция UniformO. Для равномерно распределенных величин используется pdf (). На рис.3.52 пред­ ставлены графики нормально распределенных случайных величин и соответ­ ствующая функция распределения, которые получены следующей програм­ мой. import numpy as np import m a tp lo tlib .p y p lo t as p i t import sympy. s t a t i s t i c s as s t 3.5 Другие математические пакеты 141 Рис. 3.52 Нормально распределенные случайные величины N = st.N o rm al(1, 0.25) m = 101 х = n p .lin s p a c e ( 0 ., 2 ., m) y l = n p .z e ro s ( (m), ’f l o a t ’) У2 = n p .z e ro s ( (m), ’f l o a t ’) f o r i in range(m ): , y l [ i ] = N.randomO y 2 [i] = N.pdf ( x [ i ] ) p i t . p l o t ( x , y l, la b e l= ’norm al(1, 0 .2 5 ) ’) p i t . p l o t ( x , y2, ’— ’ , la b e l= ’p d f ’) p i t . x l a b e l ( ’$x$’) p i t . leg en d (lo c= l) p i t . showO Геометрический модуль geometry предоставляет возможности аналитической работы с точками, линиями, сегментами, эллипсами и полигонами. Мож­ но находить площади элементов, решать некоторые задачи вычислительной геометрии, такие как нахождение точек пересечения отрезков. Здесь приве­ ден пример создание треугольника и круга, вычисления их площадей. Более сложные примеры вы найдете в документации по пакету Sympy. Математический Python 142 Рис. 3.53 Визуализация в Sympy import sympy as sm import sympy.geometry as gm r = sm.Symbol ( ’г ’) x = gm .Point(0, 0) у = gm .Point(0, 2) z = g m .P o in t(l, 0) t = gm .T riangle(x, z , y) с = gm .C ircle(x , r) p r in t ’tr ia n g le a r e a : ’ , t . a r e a p r in t ’c ir c l e a r e a : ’ , c .a r e a t r i a n g l e are a 1 c i r c l e are a . p i * r **2 Многоплановость аналитически решаемых в пакете Sympy задач дополня­ ется графическими возможностями. Отличительная особенность связана с работой с аналитическими объектами. Имеется возможность визуализации в интерактивном окне одномерных и двумерных функций. 143 3.5 Другие математические пакеты import sympy as sm sm .v a r(’x у ’) p = sm .P lo t(v is ib le = F a ls e ) p [l] = x**2 + y**2 p [ 1 ] .s ty le = ’s o l i d ’ p [2] = - x**2 - y**2 p [ 2 ] . s ty le = ’w irefram e’ p. showO Рис. 3.53 получен как копия экрана (горячая клавиша F8) при установленном пакете Python Imaging Library (PIL)56. Разреженные матрицы (SciPy.sparse) Разреженные матрицы, которые характеризуются большим числом нулевых элементов, возникают при численном решении краевых задач для уравне­ ний с частными производными. В этом случае при использовании конечно­ разностных или конечно-элементных аппроксимаций имеется зависимость ре­ шения дискретной задачи только от небольшого числа соседей. Вычисли­ тельные алгоритмы линейной алгебры должны учитывать отмеченную спе­ цифику разреженных матриц. Здесь мы отметим возможности пакета SciPy (модуль sparse). В качестве иллюстративного примера рассмотрим разностную задачу Ди­ рихле для уравнения Пуассона в единичном квадрате. Функция и(х), х = ( x i ,t 2), удовлетворяет в ft = {х | 0 < х а < 1, а = 1,2 уравнению д2и д2и хеп и однородным граничным условиям и(х) = 0, х G дП. >Для приближенного решения введем равномерную разностную сетку с шагом h (N h = 1) по каждому направлению. Разностное решение 2/^, i = 0,1,..., TV, j = 0,1,..., TV определяется как решение сеточной задачи ^Vi,j Уг—l,j Уг+lJ —1 2/t,j +l uid = 0, fi,j) ^ 1, 2, ..., IV 1, j 1,2,..., TV 1, i = 1, TV, j = 0, TV, где f i j = h2f( i h, j h) . Сформулируем матричную задачу для определения разностного решения во внутренних узлах сетки. Нумерацию узлов проведем по правилу j = 1,2,..., TV - 1 : i = 1,2,..., TV - 1 : vk = yi5, Python Imaging Library — http://www.pythonware.com/products/pil/ к= г + (TV- 1)j. Математический Pyth 144 Общее число неизвестных равно ( N — I)2. В представлении Av — b разреженная матрица имеет диагональную структуру (ненулевые элем ет содержат только пять диагоналей). Вместо 0 ( N 4) нужно хранить толь 0 ( N 2) ненулевых элементов. Для работы с разреженными матрицами используются специальные форм ты хранения матриц. Простейший из них COOrdinate format (С 00) связан использованием трех массивов. Первый из них содержит значения ненулевг элементов (а^ ф 0), второй — номер строки (г), а третий — номер столб] (г), т.е. храниться тройка (а^-,г, j). Для выполнения основных операций над разреженными матрицами (слож ние, умножение, транспонирование, решение систем линейных уравнений) б лее удобен разреженный строчный формат — Compressed Sparse Row forma (CSR). В этом случае значения ненулевых элементов и номера столбцов хр нятся по строкам в двух массивах: (массивА А ) и j (массив JA). Трет! массив (обозначим его IA) отвечает за номер строки: его г-й элемент указ! вает, с какой позиции в массивах элементов и столбцов (АА и J A ) начинает г-я строка. В силу этого I A( i + 1) —I A ( i ) есть число элементов в г-й строк Имеются также варианты разреженного формата для хранения по столбце — Compressed Sparse Column format (CSC), по блокам, для симметричных ленточных матриц. Основные форматы поддерживаются в модуле sparse п кета SciPy. Первая проблема при работе с разреженными матрицами связана с задание матрицы в нужном формате. Мы можем начать с простейшего способа, к торый связан с заданием матрицы как полной и последующей конвертации нужный формат. Аналогично стандартному массиву для инициализации ра реженной матрицы используется l i l \ _ m a t r i x ( ) , после этого можно задаваг отдельные ненулевые элементы. Для больших матриц нужно ориентироват ся на явное задание матрицы в разреженном формате. Для работы с Compressed Sparse Row форматом в модуле sparse предназначе! класс c sr\_ m a trix (), для Compressed Sparse Column — c sc \_ m a trix (), дл DIAgonal format — d ia \_ m a trix (), для COOrdinate format — coo\_m atrix(). from scip y import sp arse import m a tp lo tlib .p y p lo t as p i t import time def p o is s o n _ lil( n ) : A = s p a rs e .lil_ m a trix ((n * n , n*n)) fo r j in ran g e(n ): fo r i in ran g e(n ): k = i + n*j A[k , k] = 4 Рис. 3.54 Портрет разностного оператора Лапласа i f i > 0: A[k,k-1] = -1 i f i < n-1: A[k,k+1] = -1 i f j > 0: A[k,k-n] = -1 i f j < n-1: A[k,k+n] = -1 re tu rn А def poisso n _ co o (n ): V = [] I = [] J = [] fo r j in ran g e(n ): 146 fo r i in ra n g e (n ): k = i + n*j V.append(4 .) I.append(k) J.append(k) i f i > 0: V .append(-1.) I.append(k) J.append(k-1) i f i < n-1: V .append(-1.) I.append(k) J.append(k+1) i f j > 0: V .append(-1.) I.append(k) J.append(k-n) i f j < n-1: V .append(-1.) I.append(k) J.append(k+n) re tu r n sp arse.co o _ m atrix ((V , ( I , J ) )) N = 10 t s t = tim e .c lo c k () A = p o is s o n _ lil(N -l) d t = tim e .c lo c k O - t s t p r in t ’tim e ( l i l ) : ’ , d t t s t = tim e .c lo c k O В = poisson_coo(N -l) d t = tim e .c lo c k O - t s t p r in t ’tim e ( c o o ) :’ , d t С = B .todenseO R = A .todenseO - С p r in t R pit.m atshow (C) t s t = tim e .c lo c k O D = sp a rs e .lil_ m a trix (B ) d t = tim e .c lo c k O - t s t p r in t ’tim e ( c o o - > li l ) : ’ , d t p i t . showO tim e ( l i l ) ’ 0 012324:1920412 tim e (c o o ) 0 .0 0 0 7 9 5 6 3 1 8 4 7 0 6 4 [[ 0. 0. 0. , 0 0. 0 ] [ 0. 0. 0. , 0 0 O.j Математический Python 3.5 Другие математические пакеты 0. •> о. 0. 0. 147 0. 0. , 0. 0. 0. | 0 0 0. 0. 0 0. , » , 0. 0. 0. 0. 0 0. 0.] 0 ] 0 I] tim e (c o o —> Ш ) 0 .0 0 1 1 5 8 8 0 6 4 9 6 3 6 Здесь разреженная матрица соответствует разностному оператору Лапласа па стандартном пятиточечном шаблоне. Как показывает этот пример (см. портрет матрицы на рис. 3.54), формирование матрицы в формате СОО (функция poisson\__coo()) значительно быстрее, чем на основе полной мат­ рицы ( p o is s o n \_ lil( ) ) . После инициализации можно записать разреженную матрицу в необходимом формате. Проиллюстрируем возможности решения систем линейных уравнений с раз­ реженными матрицами методами модуля sparse.linalg на примере нашей мо­ дельной сеточной эллиптической задачи (рис. 3.55). Рис. 3.55 Разностное решение на сетке 800 х 800 import numpy as np from scipy import sparse from scipy.sparse import linalg 148 import m a tp lo tlib .p y p lo t as p i t import time def f ( x , y ) : re tu rn 20*x*y*(x**2+y**2)* ( l-x**2*y**2) def g(x, y ) : re tu rn x*(l-x**4)*y*(l-y**4) def p o isso n (n , h ) : V= I = J = b = u = fo r j in ran g e(n ): fo r i in ran g e(n ): k = i + n*j b.append(h**2*f(i*h+h, j*h+h)) u.append(g(i*h+h, j*h+h)) V.append(4 .) I.append(k) J.append(k) i f i > 0: V. append(- 1 .) I . append(k) J.append(k-1) i f i < n-1: V. append(- 1 .) I . append(k) J.append(k+1) i f j > 0: V .a p p e n d (-l.) I.append(k) J. append (k-n) i f j < n-1: V .append(-1.) I.append(k) J . append(k+n) re tu rn sp arse.co o _ m atrix ((V , ( I , J ) ) ) , b, u N lis t = [100, 200, 400, 800] fo r N in N lis t: h = 1. / N A, b, u = p o isso n (N -l, h) В = A .to c srO t s t = tim e .c lo c k O v, in fo = lin a lg .c g (B , b, to l= l.e - 0 8 ) d t = tim e .c lo c k O - t s t Математический Python 149 3.5 Другие математические пакеты e r = п р .lin a lg .n o rm (v -u , o rd = n p .in f) i f in fo == 0: p r in t "N = °/0i , tim e s o lu tio n = °/e1.3e, e rro r = °/,1.3e" #/0 \ (N, d t, er) x = n p .lin s p a c e (h /2 , l . - h / 2 , N-1) у = n p .lin s p a c e (h /2 , l . - h / 2 , N-1) X, Y = np.m eshgrid(x, y) Z = n p .resh a p e (v , (N-1,N-1)) p i t . contou rf(X , Y, Z, cm ap=plt. cm.gray) p i t . co lo rb a rO p i t . showO N = 100, 2 00, Ni = 4 0 0 , N :=x 8 0 0 , tim e tim e tim e tim e s o lu tio n s o lu tio n s o lu tio n s o lu tio n ~ = ~ - 1 1 1 1 226e-~01, 2 2 5 e-f0 0 , 148e~f01, 157e~f02, e r r o r = 3 .2 9 9 e -0 5 e r r o r ~ 8 2 4 7 e -0 6 e r r o r = 2 0 6 2 e -0 6 e r r o r = 5 1 5 5 e -0 7 Для приближенного решения сеточной задачи используется стандартный ите­ рационный метод сопряженных градиентов. Точное решение дифференциаль­ ной задачи задается функцией д{х, у), соответствующая правая часть уравне­ ния Пуассона — }(х,у). Точность численного решения в равномерной норме на последовательности расчетных сеток хорошо согласуется с теоретической оценкой (е = 0 ( N ~ 2)). В табл. 3.11 сравниваются временные затраты (в секундах) на решения мо­ дельной задачи при использовании прямого метода на основе Т[/-разложение (функция sp so lv eO ), обобщенного метода минимальных невязок (функция gm resO ) и метода сопряженных градиентов (функция cg()). Таблица 3.11 Решение сеточной задачи N spsolve gm res eg 100 200 4.930е+00 7.079е+01 1.277е+00 2.233е+01 1.226е-01 1.225е+00 На рассматриваемой задаче с симметричной положительно определенной матрицей максимальная скорость сходимости наблюдается при использова­ нии итерационного метода сопряженных градиентов. Потенциальное преиму­ щество прямого метода при относительно небольших N проявляется на за­ дачах с более общими матрицами. PyAMG — многосеточный метод К классу наиболее эффективных итерационных методов для приближенного решения сеточных задач, к которым мы приходим при конечно-разностной или конечно-элементной аппроксимации краевых задач для эллиптических 150 Математический Python уравнений, относятся мпогосеточные методы. Они базируются па последова­ тельном проведении итераций на различных, вложенных друг в друга сетках. Особый интерес представляют алгебраические мпогосеточные методы, кото­ рые непосредственно не привязываются к расчетным сеткам, а оперируют с элементами матрицы и их окружением. В пакете PyAMG57 реализован алгебраический многосеточный итерационный метод на языке Python. Пакет PyAMG базируется на модуле sparse пакета SciPy и дополняет его возможности но итерационному решению систем линейных уравнений. Мног'оссточный метод основан на выборе последовательности сеток, опера­ торов интерполяции и сглаживания для перехода на новую сетку. На каж­ дой сетке делается несколько итераций с использованием, например, метода Гаусса Зсйдсля. Подготовка иерархии сеток и соответствующих процедур перехода с одной сетки на другую в пакете PyAMG проводится с помощью функции ru g e_ stu b en _ so lv er(), которая имеет один обязательный аргумент — матрицу системы, которая записана в разреженном строчном формате CSR. Здесь могут задаваться также, например, максимальное число уров­ ней многосеточного метода, максимальная размерность матрицы на самом низком уровне. Итерационное решение системы линейных уравнений проводится с исполь­ зованием s o lv e () .но задаваемому на входе массиву правой части уравне­ ния. Можно задавать относительную невязку решения (to l) для завершения итерационного процесса и максимальное число итераций (m axiter). Алго­ ритм перехода на новую итерацию контролируется параметром выбора цик­ ла вычислений cycle, который может принимать значения ’W’ , ’V’ , ’F5 и соответствуют W-циклу, F -циклу и F -циклу многосеточного метода (но умолчанию используется F -цикл). Дополнительное ускорении итераций мно­ госеточного метода может осуществляться на основе метода сопряженных градиентов (параметр acc e l равен ’e g ’) или на основе обобщенного метода минимальных невязок (a c c e l= , gm res>). В приведенном примере решается та же сеточная эллиптическая задача Ди­ рихле для уравнения Пуассона в квадрате, которая рассматривалась нами выше при иллюстрации возможностей модуля sparse пакета SciPy. import numpy as np from scipy im port sp arse import m a tp lo tlib .p y p lo t as p i t import pyamg as amg import tim e def f ( x , y ) : re tu rn 20*x*y*(x**2+y**2)* ( l-x**2*y**2) def p o isso n (n , h ) : 57 PyAMG — h ttp ://code.google.eom /p/pyam g/ iteration Рис. 3.56 Сходимость многосеточного метода на различных сетках V= I = J = Ъ= fo r * [] [] [] [] j in ran g e(n ): fo r i in ran g e(n ): k = i + n*j b.append(h**2*f(i*h+h, j*h+h)) V.append(4 .) I.append(k) J.append(k) i f i > 0: V .append(-1.) I . append(k) J . append(k-1) i f i < n-1: V.append(- 1 .) I . append(k) J.append(k+1) i f j > 0: 152 Математический Python Рис. 3.57 Сходимость мри использовании различных циклов V .append(-1.) I.a p p e n d (к) J.append(k-n) i f j < n-1: V .a p p e n d (-l.) I . append(k) J.append(k+n) re tu rn sp arse.co o _ m atrix ((V , ( I , J ) ) ) , b p i t . f i g u r e (1) N lis t = [100, 200, 400, 800] s g lis t = \ fo r к in r a n g e ( le n ( N lis t) ): N = N lis t [k] h = 1. / N A, b = p o isso n (N -l, h) A = A .to c srO b = n p .a rra y (b ) t s t = tim e .c lo c k O ml = am g.ruge_stuben_solver(A ) d t = tim e .c lo c k O - t s t re s = [] 153 3 5 ДрУгие математические пакеты х = m l.so lv e (b , to l= 1 .0 e -8 , r e s id u a ls = r e s , cy cle= ,W>) d tl = tim e .c lo c k O - t s t p r in t "N = e/*i, tim e = °/,1.3e (°/,1.3e + °/,1.3e)" e/0 \ (N, d t l , d t, d t l - d t ) re s = n p .a rra y (re s ) s i = ’N =’ + str(N ) sg = s g lis t[ k ] p it.s e m ilo g y (re s , sg, la b e l= s l) p i t .x la b e l( ’i t e r a t i o n 9) p i t .y la b e l( 9r e s id u a l 9) p it.leg e n d (lo c = 0 ) p i t .f i g u r e (2) N = 400 c c lis t = [ ’v>, ’w’ , ’F ’] for kk in r a n g e ( l e n ( c c l i s t ) ): cc = c c l i s t [kk] h = 1. / N A, b = p o isso n (N -l, h) A = A .to c srO b = n p .a rra y (b ) t s t = tim e .c lo c k O ml = am g.ruge_stuben_solver(A ) d t = tim e .c lo c k O - t s t re s = [] x = m l.so lv e (b , to l= 1 .0 e -8 , re s id u a ls = re s , cycle=cc) d t l = tim e .c lo c k O - t s t s i = ’cycle = 9 + cc s ll = si + V p r in t s l l , "time = °/,1.3e (e/,1.3'e + °/ol.3e)" 7, \ ( d t l , d t, d t l - d t ) re s = n p .a rra y (re s ) sg = s g lis t[ k k ] p it.s e m ilo g y (re s , sg, la b e l= s l) p i t .x la b e l( ’i t e r a t i o n 9) P i t .y la b e l( ’r e s i d u a l’) p it.le g e n d (lo c = 0 ) p it .show () N = 100, t i me = N = 200, t ime = N = 400, t ime = N = 800, t ime = c y c l e = v, t i me c y c l e = w, t i me c yc l e = F, ti me 4 . 0 3 7 e - 0 0 1 (3 8 0 1 9 e - 0 0 1 (1 2 . 3 0 8 e +0 00 (4 1 054e+001 (2 = 2 155e+000 = 2 388 c +0 00 = 2 559e+000 255e-002 + 3 712e-001) 037e-001 + 6.983e-001) 4 2 4 e - 0 0 1 + 1 8 6 5 e +0 00 ) 0 87 e +0 0 0 + 8 4 5 7 e + 0 0 0 ) (6 1 3 8 e - 0 0 1 + 1 5 4 1 e +0 0 0 ) (4 9 8 0 e - 0 0 1 + 1 8 9 0 e +0 00 ) (5 4 6 1 e - 0 0 1 + 2 0 1 3 e +0 0 0) 154 Математический Python На рис. 3.56 показана абсолютная невязка на отдельных итерациях многосеточпого метода на различных расчетных сетках. Приведенные данные иллю­ стрируют независимость числа итераций от сетки — оптимальность итера­ ционного метода. Влияние способа организации вычислений иллюстрируется рис. 3.57 (в нашем примере использование VF-цикла и F -цикла дает практи­ чески одни и тс же результаты). Элементы графического интерфейса пользователя (formlayout) Современные программы, которые ориентированы на стороннего пользова­ теля, базируются на использовании графического интерфейса пользователя (GUI, Graphical user interface). В GUI такие элементы интерфейса как меню, кнопки, списки, представлены пользователю на дисплее и выполнены в виде графических изображений. Пользователь с помощью устройств ввода (кла­ виатуры, мыши и т.н.) имеет доступ ко всем видимым экранным объектам (элементам интерфейса) и осуществляет непосредственное манипулирование ими. В программах, предназначенных для научных вычислений, этому мо­ менту часто не придается большого значения и до сих пор часто ограничи­ ваются простейшим пользовательским интерфейсом командной строки. В стандартной библиотеке Python возможности построения графического ин­ терфейса пользователя реализованы в модуле Tkinter. Tkinter — это встро­ енная графическая библиотека на основе средств Tk, которая широко рас­ пространена в UNIX подобных систем и портирована на Windows, Mac OS X. Реализованы основные элементы GUI, которые часто называют виджета­ ми (widget): окно верхнего уровня (Toplevel), рамка (Frame), меню (Menu), кнопка-меню (Menubutton) надпись (Label), поле ввода (Entry), рисунок (Canvas), кнопка (Button), селекторная кнопка (Radiobutton), флажок (Checkbutton), шкала (Scale), список (Listbox), полоса прокрутки (Scrollbar), форматированный текст (Text), сообщение (Message). Как альтернативу Tkinter можно рассматривать WxPython58. Это бесплатный кроссплатформснный программный инструментарий для создания графиче­ ский интерфейс на языка программирования Python. WxPython реализован в виде модуля расширения Python (родной код) популярной и мощной кроссплатформепной графической библиотеки WxWidgets, которая написана на C++. Для более удобной работы можно использовать редакторы интерфей­ са (дизайнеры), Примером GUI-дизайнера для библиотеки wxPython является wxGlade59. Отметим также кроссплатформенный инструментарий Qt60 для разработки программного обеспечения на языке программирования C++. Б и блиотек а 58 WxPython — h ttp ://w xp yth o n .o rg / 59 wxGlade — http://w xglade.sourceforge.net/ 60 Q t — h ttp ://q t.n o k ia .c o m / 3.5 Другие математические пакеты 155 Qt включает в себя все основные классы, которые могут потребоваться при разработке прикладного программного обеспечения, в том числе и элемен­ ты графического интерфейса пользователя. Привязка к языку Python осу­ ществляется в PyQt61 и работает на всех платформах, поддерживаемых Qt, включая Windows, Mac OS X и GNU/Lin их. Привязка реализована в виде на­ бора модулей Python, содержится более 300 классов и более 6000 функций и методов. Имеется визуальная среда разработки графического интерфейса Designer, которая позволяет создавать диалоги и формы в визуальном режиме (GUI-дизайнер), справочная система Assistant упрощает работу с документа­ цией по библиотеке и позволяет создавать кроссплатформенную справку для разрабатываемого на основе Qt программного обеспечения. Упрощение коммуникации между пользователем и компьютером является основной задачей графического интерфейса. При разработке программного обеспечения для поддержки научных вычислений типичной является ситу­ ация с параметрическим вводом параметров используемой математической модели и вычислительного алгоритма. Поэтому минимальный графический интерфейс должен обеспечить эту базовую возможность. В дальнейшем та­ кие интерактивные возможности ввода параметров можно расширить до бо­ лее полноценного GUI. Модуль Form Layout62 решает задачу создания диалогов для редактирования параметров. Он базируется на PyQt и обеспечивает графический интерфейс без написания какого-либо кода для соответствующих виджетов. Приведем пример программы с графическим интерфейсом для ввода пара­ метров. Будем рассматривать краевую задачу для одномерного нелинейного параболического уравнения второго порядка. Пусть u{x,t) определяется из решения уравнения ~dt = к да? 0 < ж < *» 0<£<Т, с постоянным к, которое дополняется граничными и начальными условиями: u{Q,t) = g 0(t), u(l,t) = gi(t), u(x,0) = v(x), 0 <t<T, 0 < x < I. Для численного решения этой краевой задачи будем использовать метод пря­ мых. Дискретизацию по пространству проведем на равномерной сетке с h (ДГ/i = /). Решение y ^ i = 0,1,..., TV в узлах х ^ г = 0,1, ...,7V определяется из следующей задачи Коши для системы обыкновенных дифференциальных уравнений: dVi _ , Z/i-i ~ 2Уг + yi+1 h2 + 1 { Уг Л * = 1 ,2 ,...,J V -1 , 61 PyQt — http://w w w .riverbankcom puting.com /softw are/pyqt/intro 62 Form Layout — http://co d e.go o g le .e o m /p /fo rm la yo u t/ 0 <t<T, Математический Python 156 Vo(t) = g0(t), VN{t) = gi{t), у{( 0 ) = у ( х {), 0 <t<T, i ~ 1,2,..., TV —1. Правую часть зададим в виде f ( u , t) = su( 1 - u), s = const. В этом случае рассматриваемое нелинейное уравнение диффузии-реакции известно как уравнение Фишера (Колмогорова—Петровского—Пискунова). Пусть * (0 = 1, з,(0 = о, *W = {J; Поставленная задача характеризуются параметрами s, /, N, Г. Эти пара­ метры (а также число временных слоев для вывода графика решения) будем вводить с использованием диалога, который реализуется модулем Form Layout (функция f e d it О ) на основе списка параметров. import numpy as np import m a tp lo tlib .p y p lo t as p i t import s c ip y . in te g r a te as in te g r a te from form layout import f e d i t d a t a l i s t = [(None, ’<b>Physical</b>’) , ( ’d if f u s io n ’ , 0. 2 ) , ( ’sou ce’ , 5 . ) , (None, }<b>Geometric</b>J) , ( ’l e n t h ’ , 10. ) , ( ’10’ , 1. ) , (None, ’<b>C alculated</b>’) , ( ’nodes’ , 51), ( ’tmax’ , 4 . ) , ( ’n tim e ’ , 5) ] d, s , 1, 10, m, tmax, ntime = f e d i t ( d a t a l i s t , title = " P a ra m e te rs u) h = 1 / m def f ( x ) : re tu rn s* x * (l-x ) def f f ( y , t ) : r = n p .z e ro s ( (m+1), ’f l o a t ’) fo r i in r a n g e d , m ): r [ i ] = d * (y [i+ l] - 2*y[i] + у [ i - 1 ] ) / h**2 + f ( y [ i ] ) re tu rn r t = n p .lin s p a c e (0 , tmax, ntim e) x = n p .Iin s p a c e (0 , 1, m+1) v = n p .z e ro s ( (m+1), ’f l o a t ’ ) fo r i in ran g e(0 , m+1): 3.5 Другие математические пакеты 157 Рис. 3.58 Диалог ввода данных i f x [ i] < 10: v [ i] = 1. Y, in f o d ic t = i n t e g r a t e .o d e i n t ( f f , v, t , full_output=T rue) s g lis t = f o r n in ran g e(0 , ntim e): , r = Y[n, :] .T s t = ’tim e = ’ + str(n * tm a x /(n tim e -1)) p i t . p l o t ( x , r , s g l i s t [ n ] , la b e l= s t) p i t . Iegend(loc=0) p i t . x la b e l( ’$x$’) p it.g r id ( T r u e ) p i t . showO Помимо реализованного здесь (см. рис. 3.58) ввода числовых параметров (ви­ дж еты QDateEdit и QSpinBox из PyQt) и надписей (QLabel) обеспечивается интерактивный ввод текстовой информации, распознается ввод списков (ре­ ализация на основе виджета QComboBox), логических переменных — селек­ торная кнопка (QCheckBox), информация о цвете и шрифтах. Параметры такж е можно группировать на отдельных вкладках. Математический Python 158 гг— — ♦. * • N S \ \. .... \ : * i * — time =0.0 - - time =1.0 time =2.0 time =3.0 * ♦ time =4.0 * 4 \ \ \ \ \ \ * \ * \ \ \ ♦ \ \ • \ \ . х Рис. 3.59 Решение задачи для уравнения Фишера На рис. 3.59 представлены графики решения задачи при параметрах по умол­ чанию. Само решение имеет вид бегущей волны со скоростью равной (Кол­ могоров, Петровский, Пискунов) 2y/ks = 2. Для решения задачи Коши ис­ пользуется модуль integrate пакета SciPy. 4 Прямые методы линейной алгебры Одной из основных задач вычислительной математики является проблема решения систем линейных алгебраических уравнений с вещественными ко­ эффициентами. Для нахождения приближенного решения систем уравнений используются прямые и итерационные методы. Математический аппарат ли­ нейной алгебры базируется на понятиях нормы вектора и матрицы, числа обусловленности. Рассматриваются классические методы исключения неиз­ вестных, отмечаются особенности решения задач с симметричной веществен­ ной матрицей. О сновны е обозн ач ен и я — — — — 11*11 — Mil — det(A) — cond(A) — х = {Xi} = { х и х 2, . . . , х п} А = {оу} Е D = drdg{du d2, . . . , d n} n-мерный вектор матрица с элементами единичная матрица диагональная матрица норма вектора х норма матрицы А определитель матрицы А число обусловленности матрицы А * 4.1 З а д а ч и р еш ен и я систем л и н ей н ы х ур авн ен и й Рассматривается задача нахождения решения системы линейных алгебраи­ ческих уравнений Ах = / . (4.1) Здесь А — квадратная матрица п х п с вещественными коэффициентами aij, h j — 1,2, . . . , n , / — заданный вектор с вещественными компонентами, х — искомый вектор. Будем считать, что определитель матрицы А отличен от нуля и поэтому система уравнений (4.1) имеет единственное решение. Для Прямые методы линейной алгебры 160 его нахождения будем использовать прямые (точные) методы, в которых ре­ шение находится за конечное число арифметических действий. Входные данные (коэффициенты матрицы А и компоненты вектора/) заданы с погрешностью, т.е. вместо (4.1) решается система уравнений Ах = /. (4.2) Необходимо оценить влияние погрешностей в задании коэффициентов и пра­ вой части па решение задачи. Близость решения задачи к решению зада­ чи с точными входными данными связывается с числом обусловленности матрицы. 4.2 А л гор и тм ы р еш ен и я си стем л и н ей н ы х у р авн ен и й Рассматриваются основные понятия линейной алгебры: норма вектора, со­ гласованная норма матрицы. Дается оценка погрешности решения системы линейных уравнений при возмущении правой части и коэффициентов мат­ рицы на основе привлечения понятия числа обусловленности. Среди прямых методов выделяется метод Гаусса с и без выбора главного элемента, кото­ рый связан с разложением матрицы на произведение треугольных матриц. Для задач с симметричными вещественными матрицами выделяется метод квадратного корня (метод Холецкого). * Обусловленность матрицы и оценки точности Среди норм векторов наиболее употребительны нормы: п N li = г=1 (п 4 1/а N l2 = (X > N , IM Ic o = 1 < г< п \X i\- Матричная норма ||А|| подчинена векторной норме ||а;||, если ||А|| = шах \\Ах\\ Для квадратной невырожденной матрицы А существует единственная мат­ рица А-1, называемая обратной, для которой A A ~ l — A ~ lA = Е. Число обусловленности матрицы А есть cond(yl) = РНЦЛ-1 !!. 4.2 Алгоритмы решения систем линейных уравнений 161 При рассмотрении близости решений уравнений (4.1), (4.2) для погрешности в задании матрицы, решения и правой части используем обозначения 5А = А — A, Sx = х — х, 6 f = f — f. Если матрица А имеет обратную и выполнено условие 1И Ш И | | < 1, тогда для относительной погрешности справедлива оценка ||fo|| cond(A) П\5А\\ И - 1 -сопс1(А)||М||||Л||-Чи1 |5 /|\ 11/11 Д 1 j Оценка (4.3) выражает устойчивость решения при возмущении правой части и коэффициентов уравнения (4.1) (корректность задачи). М ет о д Гаусса д л я р е ш е н и я с и с т е м л и н е й н ы х у р а вн е н и й Классический алгоритм исключения неизвестных (метод Гаусса) связывается с использованием представления исходной матрицы А в виде произведения треугольных матриц. Матрица А называется нижней (левой) треугольной матрицей, если ее элементы а^ — 0 при i < j, для верхней (правой) треуголь­ ной матрицы А — aij = 0, если г > j. Если все главные миноры матрицы А отличны от нуля, т.е. ац ayi 0-21 &22 ап ф О, Ф 0, det \А\ ф О, тогда матрица А представима в виде А = LU, (4.4) где L — нижняя треугольная матрица с единичной диагональю и U — верхняя треугольная матрица с ненулевыми диагональными элементами. Приведем рекуррентные формулы для определения треугольных матриц L и U: U ll V 'l j ) Ijl — 0-11) 2, 3, ...,77., “) j Un г-1 Ua — ац ^ ^h k V 'k ii i — 2, 3, . . . , 77., к —1 г / г-! V>lj aij ^ ^ ^ik^kji fc=l i = 2, 3 , . . . , n, Iji j- 1 I CLji ^ ^ Ijk'U'ki Uii \ k=l j = i + 1, i + 2, . . . , n. 162 Прямые методы линейной алгебры Эти формулы определяют компактную схему метода Гаусса для разложении матрицы на множители. После того как разложение (4.4) проведено решение системы уравнений сво­ дится к последовательному решению двух систем уравнений с треугольными матрицами: Ly = f, (4.5) Ux = у. (4.6) Разложение (4.4) и решение системы (4.5) связывается с прямым ходом в ме­ тоде исключения неизвестных, а решение системы (4.6) — с обратным ходом. В методе Гаусса с выбором главного элемента на очередном шаге исключается неизвестное, коэффициент по модулю при котором является наибольшим. В этом случае метод Гаусса применим для любых невырожденных матриц Л, т.е. матриц, для которых det(A) ф 0). Матрицей перестановок Р называется квадратная матрица, у которой в каж­ дой строке и в каждом столбце только один элемент отличен от нуля и равен единице. При det(A) ф 0 существует матрица перестановок Р такая, что справедливо разложение . Р А = LU. Тем самым метод Гаусса с выбором главного элемента соответствует приме­ нению обычного метода Гаусса, который применяется^ к системе, полученной из исходной системы перестановкой некоторых уравнений. Метод квадратного корня При решении системы уравнений (4.1) с симметричной вещественной невы­ рожденной матрицей А используется разложение А = S 'D S , где S — верхняя треугольная матрица с положительными элементами па главной диагонали, S* — транспонированная к ней (s^ = s^), a D — диаго­ нальная матрица с элементами d*, г = 1 ,2 ,... ,п, равными ±1. Вычисления на основе этого разложения определяют метод квадратного корпя (метод Холецкого). Для элементов матриц S и D используются расчетные формулы: d ^ s ig n a n , sn = |au |1/2, з ^ = а ^ / 8 П, j = 2,3,...,n. 4.3 Упражнения 163 1/2 k=i S ij i (a ij \ i = 2, 3 , . . . , n, У ] s k is k jd k *= 1 j, / j = г + 1, г + 2, . . . , п. В методе квадратного корня вычислительные затраты примерно в два раза меньше, чем в стандартном методе Гаусса (эффект учета симметрии матрицы задачи). 4.3 У праж нения Ниже приведены примеры построения программ на языке Python для чис­ ленного решения систем линейных уравнений прямыми методами линейной алгебры. Мы ограничиваемся основными возможностями базового математи­ ческого пакета NumPy (поддержка работы с многомерными массивами). У п р аж н ен и е 4.1 Напишите программу, реализующую решение системы линейных алгебраических уравнений на основе L U -разложения. С ее помо­ щью найдите решение системы Ах = f с матрицей 1, -1 , 0, 1, i = j, i<j, i > j фп, j = n, i = 1, 2, j = 1, 2,..., п и правой частью h = 1, при п = 10. В модуле lu функция decLUO проводит 1/£/-разложение входной матрицы А и записывает результат в матрицу LU. Реализация (4.5), (4.6) для решения системы уравнений проводится функцией solveLUO. Модуль lu import numpy as np def decLU(A): иии R eturns th e decompositon LU f o r m atrix A. Прямые методы линейной алгебры 164 п = 1еп(А) LU = пр.сору(А) f o r j in r a n g e ( 0 , n - l ) : fo r i in r a n g e ( j + l , n ) : i f LU[i, j] != 0 .: u = LU [i,j] / LU[j , j ] L U [i,j+ l:n ] = L U [i,j+ l:n ] - u*LU[j, j+1 :n] LU[i, j] = u r e tu r n LU def solveLU(A, f ) : иии Solve the l i n e a r system Ax = b. иии n = len(A) # LU decomposition LU = decLU(A) x = np.copy(f) # forward s u b s t i t u t i o n process f o r i in r a n g e ( l , n ) : x [i] = x[i] - n p .d o t(L U [i,0 :i] , x [ 0 : i ] ) # back s u b s tit u t io n process f o r i in ra n g e (n -1 ,- 1 ,- 1 ) : x [i] = (x[i] - n p . d o t( L U [ i, i+ l :n ] , x [ i + l : n ] ) ) / LU [i,i] re tu r n x Решение нашей конкретной системы линейных алгебраических уравнений да­ ется следующей программой. 11й 11ШЙ811§ ^ import numpy as np from lu import decLU, solveLU n = 8 A = -np.ones((n, n ) , * f l o a t ’) fo r i in range(0,n): A[ i , i] = 1. A [i,n-1] = 1. i f i < n-1: A [ i,i+ 1 :n - l] = 0 . p r i n t ’АЛп’ , A LU = decLU(A) p r i n t >LU:\n\ LU f = n p.ones((n ), ’f l o a t ’) p r i n t ’b : \ n ’ , f x = solveLU(A, f) p r in t ’x : \ n ’ , x 165 4.3 Упражнения А H U 1~ [— 0 0 0 0. 0. o. —1 1 0 о —1. - 1. 1 0 1 -1 -1 1. 1* -1 —1> - i - 1, '- 1* -“I -L. -1 -1 0 j. J ■ f— LU„ :||||!ll|||. it ■ Н И t —i. i i t —i i i i ь [ 1 i x: I o 0 0 0 0 0. 0 0 0 0 0 0 1. 0. - 1. 1 -1 -1 o; 0. 0 0. , Ki J, — ♦1. -1 -1 -1 -1 —1 —1 —1. 0 i -l -i -l 1 1. ] 11 1] 1] 1. I 1, ] 1 j] 0. 0., 0. . 0. 0 0. 0 0 ■ llllil! 0 - l. 1. - 1. ~i. -1 1 1. 1 i. i 0. 0 0. 0 0.- 1 ] 0 0. 0 0 0 0. 1 -1 1] . 2.]. 4.] 8] 16 j 32 j 64 j 128 JI i] Рассматриваемая модельная задача имеет точное решение. В частности, тре­ угольная матрица U есть ' "Ж ( 1» i v>ij = \ j — Т1У i — 1, 2,..., ti, j 1, 2, п. { 0, i Ф j, j Ф n, в LCZ-разложении матрицы A. У п р а ж н е н и е 4.2 Наттшитпе программу, реализующую разлоэюение Холец­ кого А = LL* для симметричной положительно определенной матрицы А и вычисляющей определитель матрицы на основе этого разложения. Найди7пе разлоэюение Холецкого и определитель матрицы Гильбер7па, для которой Q>ij = ~ | : г j ъ+ З - 1 i = 1, 2, ti, j 1, 2,..., 71 при п = 4. Функция decCholO в модуле chol, реализует разложение Холецкого (вычис­ ляется нижняя треугольная матрица L), функция det Chol О вычисляет опре­ делитель матрицы А. Модуль c h o l import numpy as np 166 Прямые методы линейной алгебры def decChol(A): ИII II Returns the decompositon Choleski f o r m atrix A. иии n = len(A) L = np.copy(A) f o r j in range(n): tr y : L[j , j] = n p .s q r t( L [ j , j] - n p . d o t ( L [ j , 0 : j ] , L [ j , 0 : j ] ) ) except ValueError: p r i n t ’Matrix i s not p o s it iv e d e f i n i t e ’ f o r i in rang e(j +1, n ) : L [i, j] = (L [ i , j] - n p .d o t( L [ i,0 : j] , L [j , 0: j ] )) / L [ j , j ] f o r j in r a n g e d , n ) : L[0 :j , j] = 0 . return L def detChol(A): иии Returns the determinant of th e m atrix A. ииn n = L = det for len(A) decChol(A) = 1. i in range(n): det *= L [ i,i] * * 2 r e t u r n det Разложение матрицы Гильберта и вычисление ее определителя проводится в следующей программе. import numpy as np from chol import decChol, detChol n = 4 A = n p .z e r o s ( (n , n ) , ’f l o a t ’) f o r i in ran g e (0 ,n ): f o r j in r a n g e ( 0 ,n ) : A[ i , j] = 1. / d+ j+1) p r i n t ’A :\n ’ , A L = decChol(A) p r i n t ’L : \ n ’ , L det = detChol(A) p r i n t ’det = ’ , det 167 4.3 Упражнения 0.5 0 .3333 3 3 3 3 0 .25 0 33333333 0 25 0.2 0 25 0 2 0 .1 6 6 6 6 6 6 7 lilllllllllllilllliiiliiiis iiis i 0 28867513 I l l l l l l S i i S l l i 0 5 0 ,2 8 8 6 7 5 1 3 0 ,0 7 4 5 3 5 6 0 33333333 0 .1 1 1 8 0 3 4 0 .2 5 9 8 0 7 6 2 0 25 det - 0 2 ] 0 16666667] 0 .1 4 2 8 5 7 1 4 ]] 0 ] o o I ] 0 0 1 8 8 9 8 2 2 ]] 1 65343915344е—07 Определитель матрицы Гильберта при возрастании тг стремиться к нулю. Упражнение 4.3 Напишите программу, которая решает систему линей­ ных уравнений для трехдиагональной (а ^ = 0 при \i —j\ > I) матрицы п х п на основе LU -разлоэюения. Найдите решение уравнения с ац 2, ttj — —1 при постоянной правой части /* = 2/г2, h = (n + I)-1, г = 1,2, ...,п и срав­ ните его сточным решением у{ = ih( 1 - г/г), г = 1 , 2 , п.Рассчитайте определитель матрицы и сравните его значение с точным ( п + 1). Трехдиагональная матрица А задается тремя диагоналями: П-г П'гг) -5» — ^г,г+1* ^i — ^г,г—1* В модуле 1иЗ функция decLU3() предназначена для ГС/-разложение трехдиа- гоналыюй матрицы А. Результат записан в виде трехдиагоналей, причем d>i = щ = j_i, li — Для решения системы уравнений используется функция solveLU3(). Модуль Iu 3 import пшпру as np def decLU3(a, b, с): * ИИII Input of tr i d i a g o n a l m atrix A: a [ i] = A [ i , i] , b [ i] = A [ i , i + i ] , c [i] = A [ i,i- 1 ] Returns th e decompositon LU f o r t r i d i a g o n a l m atrix: d [i] = L [ i , i ] u [ i] = U [ i , i+1] 1 [i] = L [ i , i-1] иии n = len (a) d = np.copy(a) u = np.copy(b) 168 Прямые методы линейной алгебры 1 = пр.сору(с) f o r i in r a n g e d , n ) : a l = 1 [i] / d [ i - l ] d [ i] = d [i] - a l * u [ i - l ] 1 [i] = a l r e tu r n d, u, 1 def solveLU3(a, b, c, f ) : иии Solve the l i n e a r system Ax = b with t r id ia g o n a l matrix: a [ i ] = A [ i, i] , b [ i] = A [ i , i + 1 ] , с [i] = A [ i,i- 1 ] иии n = le n (a ) # LU decomposition d, u, 1 = decLU3(a, b, c) x = np.copy(f) # forward s u b s t i t u t i o n process f o r i in r a n g e d , n ) : x [ i] = x [ i] - 1 [ i ] * x [ i -1] # back s u b s t i t u t i o n process x [n - l] = x [ n -l] / d [n -l] f o r i in ra n g e (n - 2 ,- 1 ,- 1 ) : .x [i] = (x[i] - u [ i ] * x [ i + l ] ) / d [i] r e tu r n ?x Решение системы уравнений, вычисление определителя и сравнение с точны­ ми данными проводится следующей программой. import numpy as np from lu3 import solveLU3, decLU3 n = 50 h = 1. / (n + 1) a = 2 * n p .o n e s((n ), ’f l o a t ’) b = - n p .o n e s((n ), ’f l o a t ’) с = - n p .o n e s((n ), ’f l o a t ’) f = h**2*2*np.ones((n), ’f l o a t ’) # so lu tio n x = solveLU3(a, b, c, f) # t e s t fun ction у = n p .z e r o s ( ( n ) , ’f l o a t ’) # LU decomposition d, u, 1 = decLU3(a, b, c) er = 0. 4.4 Задачи 169 d et = 1 . fo r i in ra n g e (n ): y [ i] = (i+ 1)*h*( 1- (i+ 1)*h) e r = e r + (y [ i ] - x [ i ] )**2*h d et = d e t* d [i] e r = n p .s q r t( e r ) p r in t 9e r r o r = *, e r p r in t ’determ inant c a lc u la te d = d e t, ’\n e x a c t = ’ , n+1 e r r o r - 1 .2 9 1 9 2 7 0 7 2 0 6 e —15 d e te r m in a n t c a l c u l a t e d — 51 0 e x a c t — 51 Аналогичные данные мы получим и при других значениях п. 4.4 З а д а ч и Задачи представляют собой задание для самостоятельного создания программ на языке Python. Как и в упражнениях, предусматривается написание моду­ ля для решения поставленной задачи и программы, которая иллюстрирует работу этого модуля. З а д а ч а 4.1 Напишите программу для вычисления норм вещественных век­ торов (||х||р, р = 1, 2, оо) и норм вещественных матриц п ||Л||1 = 1m Sjax S ti £ layI, i= 1 \ */2 / n piu= E k i2 \i,j=1 , j =l На основе экспериментов со случайными матрицами при различных п убе­ дитесь в выполнении неравенств ^ I P I U < P I U < V^IHIU, a = 1,00 для евклидовой (сферической) нормы (нормы Фробениуса) \\Л\\Е. Задач а 4.2 Напишите программу, реализующую L U -разлоэюетье с выбором главного элемента по строке (схема частичного выбора) с выводом мат­ рицы LU и вектора перенумерации переменных (перестановки столбцов), 170 Прямые методы линейной алгебру который определяет матрицу перестановок Р. С ее помощью найдите LJJ. разлоо1сеиие матрицы Паскаля, для которой - 13 (i + j - 2)! (г - 1)!0 - 1)! - г = l , 2,...,-n, j = 1, 2, п. Проверьте выполнение det (А) = 1 и зависимость определителя от п. II овторите эксперименты с L U -разлооюением без выбора главного элемента (модуль 1и). З а д а ч а 4.3 Разработайте алгоритм и реализуйте его программно для ва­ рианта декомпозиции Холецкого симметричной невыроэюденной матрицы в виде А = LD L*, где L — ниэюняя треугольная матрица с единичной диа­ гональю и D — диагональная матригщ, без вычисления квадратного корпя. С помощью этой программы найдите декомпозицию Холецкого KM S (К асMurdock-Szego) матрицы, для которой Oij = d'~3\ г = 1 ,2 ,...,п , j = 1,2, При различных п и g сравните рассчитанную матрицу D с точным реше­ нием, для которого 1, » = 1, I - О2, г = 2,3, З а д а ч а 4.4 Рассмотрите алгоритм построения обратной матрицы на основе решения матричного уравнения АХ = Е, где Е —■единичная, а X — искомая квадратная матрица. Напишите про­ грамму вычисления обратной матрицы на основе L U -разлоэюение с выбором главного элемента по строке (схема частичного выбора) (задача 4-2). Най­ дите обратную к матрице Лемера (Lehmer), для которой cijj min(i,j) „ . -p —, % 1,2, ...,n, j 7 max(z,. ) -I p. 1,2, При вычислениях с различными значениями п убедитесь в том, что А " 1 является трехдиагональной матрицей. З а д а ч а 4.5 Напишите программу для вычисления числа обусловленности квадратной матрицы с использованием норм || • ||„, а = 1,Е ,о с (см. задачу 4Л) и вычисления обратной матрицы на основе L U -разлоэюение матрицы (упразднение 4Л). Найдите при различных п число обусловленности мат­ рицы А, в которой ai;j = min (г, j), г = l , 2,...,n , j = 1, 2,..., п. 4.4 Задачи 171 Убедитесь, что обратпая матрица является трехдиагональной, внедиагопальпые элементы которой а ”/±1 = —1, а диагональные — 2, г = 1, 2, ...,п - 1 1, г — п. { З а д а ч а 4.6 Рассмотрите алгоритм решения системы уравнений с трех­ диагональной циклической матрицей, элементы которой ац = 0 при 1 < \i —j\ < п — 1 (а\п ф О, ani ^ Q), на основе L U -разлоэюения. Покаэюите, что в этом случае lij 7^ О, i 1 ) 2 , 7i 1, j i, i 1, %— Ti, j = 1,2,..., n , j = 1, 2, ...,n - 1 i = j , j - 1, j = n, i = l , 2,...,n , и напишите программу решения задачи А х = / . Найдите решение уравнения с циклической трехдиагональной матрицей, для которой 2+ A, — 1, o,jn — Anj — 1 при правой части где h = п 1. Покажите, что yi = sin(27r(г - l)/i), г = 1,2,..., п е с т ь 7п о ч н о е р е ш е н и е р а с с м а т р и в а е м о й з ад а ч и . 5 Итерационные методы линейной алгебры Для приближенного решения больших систем линейных алгебраических урав­ нений используются итерационные методы. Такие системы возникают при приближенном решении многомерных краевых задач математической физи­ ки. Рассмотрение начинается с классических итерационных методов Якоби и Зейделя. Приведены базовые понятия теории итерационных методов реше­ ния систем линейных уравнений, рассматриваемых в евклидовых простран­ ствах. Обсуждаются проблемы выбора итерационных параметров, матрицы перехода (переобуславливателя). О сновн ы е об озн ачен и я X = {Xi} = { х г ,х 2, . . . , х п} Л = {flij } Е D = diag{d1,d 2, • ••,<*»} 11*11 1И 11 хк 5.1 1 II — — — — — — — — гк = А хк - / — т,тк — n-мерный вектор матрица с элементами ац единичная матрица диагональная матрица норма вектора х норма матрицы А приближенное решение на fc-й итерации погрешность приближенного решения невязка на к-й итерации итерационные параметры И тер ац и о н н ое р еш ен и е систем л и н ей н ы х ур авн ен и й Рассматриваются проблемы итерационного решения системы линейных урав­ нений Ax = f (5.1) для нахождения вектора х. В теории итерационных методов матрица А обы ч­ но рассматривается как линейный оператор, действующий на евклидовом 5.1 173 Итерационное решение систем линейных уравнений пространстве Н = /2, в котором скалярное произведение есть (ж,?/) = У ^ ж ^ , г=1 а норма 11ж11 = (ж,ж)1/2. Итерационный метод основан на том, что начиная с некоторого начального приближения ж0 6 Н последовательно определяются приближенные реше­ ния уравнения (5.1) ж1, ж2, . . . , х к, . . . , где к — номер итерации. Значения х к+1 определяются по ранее найденным ж*, ж*-1 , . .,. Если при вычислении х к+1 используются только значения на предыдущей итерации ж*, то итерационный метод называется одношаговым (двухслойным). Соответственно, при исполь­ зовании х к и ж*-1 итерационный метод называется двухшаговым (трехслой­ ным). Двухслойный итерационный метод записывается в следующей канонической форме rpk~\~1 грк В —------------ Ь А х к = /, к = 0 ,1 ,— (5.2) т к+ 1 Для характеристики точности приближенного решения естественно ввести погрешность z k = х к — ж. Будем рассматривать сходимость итерационного метода в энергетическом пространстве H r , порожденном симметричной и положительно определенной матрицей R. В H R скалярное произведение и норма есть (y,w ) я = (R y,w ), ||г/||я = ({у,у) я )1/2- Итерационный метод сходится в H r , если \\zk \\R —►0 при к —> оо. В качестве меры сходимости итераций принимают относительную погрешность е, так что на К -й итерации ||я * - я ||я < г ||я ° - я ||я - (5-3) В силу того, что само точное решение ж неизвестно, оценка точности прибли­ женного решения проводится по невязке r k = А х к — f = А х к - Ах, которая может быть вычислена непосредственно. Например, итерационный процесс проводится до выполнения оценки ||г * ||< ф ° ||. (5.4) Использование критерия сходимости (5.4) соответствует выбору R = А*А в (5.3). Минимальное число итераций, которое гарантирует точность е (выпол­ нение (5.3) или (5.4)), обозначим К(е). При построении итерационного метода мы должны стремиться к минимиза­ ции вычислительной работы по нахождению приближенного решения задачи (5.1) с заданной точностью. Пусть Qk — число арифметических действий для 174 Итерационные методы линейной алге6рЬ| нахождения приближения х к и пусть делается К > К (е) итераций. Тогда о^ щие затраты оцениваются величиной Q(e) = ' £ Q k. k=1 Применительно к двухслойному итерационному методу (5.2) минимизация Q(e) может достигаться за счет выбора операторов В к и итерационных параметров тк+1. Обычно матрицы В к (переобуславливатели) задаются из какихлибо соображений близости к матрице А, а оптимизация итерационного ме­ тода (5.2) осуществляется за счет выбора итерационных параметров. 5.2 И тер ац и о н н ы е ал го р и тм ы р еш ен и я систем л и н ей н ы х у р авн ен и й Рассматриваются традиционные итерационные методы решения систем ли­ нейных уравнений — метод Якоби и метод Зейделя. Приведены основные ре­ зультаты о скорости сходимости итерационных методов при решении задач с вещественной симметричной положительно определенной матрицей. Приво­ дится оптимальный выбор постоянных и переменных итерационных парамет­ ров. Второй класс итерационных методов связан с определением итерацион­ ных параметров на каждом итерационном шаге из минимума функционалов для невязки — итерационные методы вариационного типа. Классические итерационные методы В итерационном методе Якоби новое приближение на к + 1-й итерации опре­ деляется из условий г— 1 п ^^ ^ ^ ciijXj /, i 1, 2, . . . , Ti. (о.о) j=1 j=i+1 Тем самым следующее приближение для отдельной компоненты вектора определяется из соответствующего уравнения системы, когда все другие ком­ поненты берутся с предыдущей итерации. Метод Зейделя основан на том, что найденное приближение для компонент вектора сразу же задействуются в вычислениях: г— 1 п ^ 2 aijXj+1 + ацхк+14- ^ 2 aijx ) = f 5 г = 1 ,2 ,... ,n. (5.6) j =1 j=i+1 Для записи итерационных методов (5.5), (5.6) используется следующее раз­ ложение матрицы А: А = L + D + U. (5.7) 175 5.2 Итерационные алгоритмы линейной алгебры Здесь D = d ia g { a n ,а22, • • •, апп} — диагональная часть матрицы А, а L и U — нижняя и верхняя треугольные матрицы с нулевыми элементами на главной диагонали, т.е. О О О 0>21 О О Я31 L = . а 32 О О &nl ^п2 ^пЗ 0>1п 0>2п О a i2 ^13 О 0 ^23 О О О U: а>зп О О О о С учетом (5.7) итерационный метод Якоби (5.5) записывается в каноническом виде (5.2) при В =Д Tfc+i = 1. Д ля итерационного метода Зейделя (5.6) имеем B = D + L, т = 1. Наиболее естественным обобщением рассматриваемых итерационных мето­ дов является использование переменных итерационных параметров. В этом случае мы получим + А хк = /, D- к = 0, 1, . . . , (5.8) т к+ 1 (D + L)- + Аг* = / , /с = 0 ,1 , — (5.9) Т~к+ 1 Отметим также метод верхней релаксации (D + rL )- + А хк = /, /с = 0, 1, — (5.10) который можно рассматривать как параметрическое обобщение итерацион­ ного метода Зейделя. Запишем стационарный итерационный метод (Вк = В , Tk+i — т в виде Je+l _ = S x k + B ~ lf , к = 0, 1, . . . , (5.11) где S = Е — тВ~1А — матрица перехода. Необходимым и достаточным усло­ вием сходимости итерационного метода (5.11) является условие, чтобы спек­ тральный радиус матрицы перехода S меньше единицы, т.е. когда все соб­ ственные значения матрицы S по модулю меньше единицы. Итерационные методы линейной алгебрЬ| 176 Д в у х с л о й н ы е и т ер а ц и о н н ы е м ет оды Приведем некоторые факты теории итерационных методов при решении задачи (5.1) с симметричной вещественной положительно определенной матри­ цей А , т.е. когда А = А * > 0. (5.12) Метод простой итерации (стационарный итерационный метод) соответствует использованию в (5.2) постоянного итерационного параметра Tk+i = т, т.е. В х к + 1 ~ хк + A x k = f \ к = т 0, 1, . . . . (5.13) Итерационный метод (5.13) для решения задачи (5.1), (5.12) сходится в Н Л) т.е. ||г|| а —>0 при к —> оо, если выполнено неравенство В > Г -А . (5.14) В = В* > 0 (5.15) Будем считать, что при и задана априорная информация об операторах В и А в виде двухстороннего операторного неравенства 7 i В < А < 72-В, 7i > 0, (5.16) т.е. операторы В и А энергетически эквивалентны с постоянными энергетиче­ ской эквивалентности 7 а , а = 1,2. Тогда итерационный метод (5.13) сходится в # я , R = А, В при 0 < т < 2/72 . Оптимальным значением итерационного параметра является г = г0 = — J — , (5.17) 71+72 при котором для числа итераций К , необходимых для достижения точности е, справедлива оценка К > К 0(е) = 1П £>о (5.18) где лo - 11 “I ^л’ Q 1+С £? —71 72 Заметим, что в (5.18) К 0(е), вообще говоря, нецелое и К — минимальное це­ лое, при котором выполнено К > К 0(е). Этот результат указывает путь опти­ мизации сходимости итерационного процесса (5.13) за счет выбора оператора В в соответствии с (5.16), т.е. оператор В должен быть близок оператору А по энергии. 5.2 Итерационные алгоритмы линейной алгебры 177 Оптимальный набор итерационных параметров в нестационарном итерацион­ ном методе (5.2) для приближенного решения задачи (5.1) при (5.12), (5.15) связан с корнями полиномов Чебышева, поэтому такой итерационный ме­ тод называется чебышсвским итерационным методом (методом Ричардсона). Определим множество М к следующим образом: Мк = (-COS ( - ^ ~ 7Г) . * = 1,2,..., а :) . Для итерационных параметров тк используется формула п- = — - — , 1 + дФк fik e M K, k = l,2 ,...,K . (5.19) Чебышевский итерационный метод (5.2), (5.19) сходится в Н ц, R = А, В и для числа итераций X , необходимых для достижения точности е, справедли­ ва оценка # > В Д = ^ г ^ , In 01 (5.20) где 61 1 + ^ / 2> « Заметим, что в чебышевском методе (см., (5.19)) расчет итерационных пара­ метров осуществляется по заданному общему числу итераций К . Естествен­ но, что вырожденный^: случай К — 1 соответствует рассмотренному выше методу простой итерации. Практическая реализация чебышевского итераци­ онного метода связана с проблемой вычислительной устойчивости, которая решается специальным упорядочиванием итерационных параметров (выбо­ ром ц к из множества М к )• Итерационные методы вариационного типа Выше рассматривались итерационные методы решения задачи в условиях, когда задана априорная информация об операторах В к А ъ виде констант (см. (5.16)) энергетической эквивалентности 71 и 72. Через эти постоянные определяются оптимальные значения итерационных параметров (см. (5.17), (5.19)). В итерационных методах вариационного типа, в которых итерацион­ ные параметры вычисляются без такой априорной информации. Обозначая невязку r k = A x k —/ и поправку wk = B ~ lr k, для итерационных параметров при естественном предположении о минимизации погрешности в H R получим формулу Итерационные методы линейной алгебры 178 Итерационный процесс (5.2) запишется следующим образом Xk+1 = х к - Tk+iWk , к = 0 , 1,-Конкретизация итерационного метода достигается за счет выбора операто­ ра /2 = Я* > 0 . Этот выбор должен быть подчинен, в частности, условию возможности вычисления итерационных параметров. В формулу (5.21) вхо­ дит невычисляемаявеличина z k и поэтому простейшийвыбор R = В здесь не проходит. Вторая отмеченная выше возможность R — А приводит нас к итерационному методу скорейшего спуска, когда jwk, r k) к и \' [AwK,w k) _ 7fc+1 (л \O.Z2j Среди других возможностей выбора R отметим случай R! = А В ~ 1А — метод минимальных поправок, когда _ k+l (.Awk,w k) {B~lA w k,A w k)' ( ' } Двухслойный итерационный метод вариационного типа сходится не медлен­ нее метода простой итерации, т.е. для числа итераций п, необходимых для достижения точности е, справедлива оценка (5.18). В вычислительной практике наибольшее распространение получили трех­ слойные итерационные методы вариационного типа. По скорости сходимости они не хуже итерационного метода с чебышевским набором итерационных параметров. В трехслойном (двухшаговом) итерационном методе новое приближение на­ ходится по двум предыдущим. Для реализации метода требуются два началь­ ных приближения х ° ,х 1. Обычно х° задается произвольно, а х 1 находится по двухслойному итерационному методу. Трехслойный метод записывается и следующей канонической форме трехслойпого итерационного метода: B x k+1 = a k+i(B - Tk+iA )x k + (1 - a k+ i)B xk~l + а к+1тк+1(р, к= 1,2,, B x 1 = (В (5.24) —TiA)x° + Tiy?, где a k+i и Tfc+i — итерационные параметры. В методе сопряженных градиентов итерационные параметры рассчитывают­ ся по формулам (wk) г к) Тк+1 = (Awk,w kY к = ° ’ 1’ " ’ a. М’1 = ( l - Tk+l \ Тк К ’^ ') М ( w k - 1 , r k - 1) a k ) 179 5.3 Упражнения А; = 1 , 2 . . . , ct\ = 1. Этот метод наиболее широко используется в вычислительной практике при решении задач с симметричной положительно определенной матрицей. 5.3 У п р а ж н е н и я У п р а ж н е н и е 5.1 Напишите программу, реализующую приблиоюеппое ре­ шение системы линейных алгебраических уравнений итерационным мето­ дом Зейделя. С ее помощью найдите решение системы уравнений с трех­ диагональной матрицей А х = /, в которой a ii = 2 , 0-г,г+1 — —1 — ОС, Аг,г-1 = —1 Н" ОС, а правая часть /о = 1 — а , /г = 0, г = 2,3, ...,п - 1, / п = 1 + а, определяет точное решение х { = 1, г = 1,2, ...,п. Исследуйте зависимость числа итераций от п и параметра а при 0 < а < 1. В модуле seidel функция s e id e lO обеспечивает итерационное решение си­ стемы линейных уравнений методом Зейделя, результатом выступает при­ ближенное решение и число итераций для достижения необходимой точности (нормы невязки). import numpy as np import math as mt def se id e l(A , f , t o l = 1 .0 e -9 ): иик Solve th e li n e a r system Ax = b by S e id e l method иии n = le n ( f ) x = n p .z e r o s ( ( n ) , ’f l o a t ’) r = n p .co p y (f) # th e maximum number of it e r a t i o n s i s 10000 f o r k in r a n g e d , 10001): f o r i in ra n g e (n ): x [ i] = x [ i] + (f [i] - n p .d o t( A [ i,0 : n ] , x [0 :n ])) / A [i,i] fo r i in ra n g e (n ): r [ i ] = f [ i ] - n p .d o t( A [ i,0 :n] , x [ 0 :n ]) i f n p .d o t ( r ,r ) < to l* * 2 : r e tu r n x, k p r in t ’S e id e l method f a i l e d to c o n v e rg e :’ Итерационные методы линейной алгебры 180 p r in t ’a f t e r 10000 i t e r a t i o n re s id u a l = ’ , m t.s q r t( n p .d o t( r ,r ) ) r e tu rn x, к Решение модельной задачи дается следующей программой, e x e r - 5 1 ру import numpy as np from s e id e l import s e id e l n = 10 a l = 0.5 A = n p .z e ro s ((n , n ) , ’f l o a t ’) fo r i in ra n g e (0 ,n ): A [ i,i] = 2 if i > 0: A [ i,i- 1 ] = - 1 + a l if i < n -1: A[ i , i+1] = - 1 - . a l p r in t ’A :\n ’ , A f = n p .z e ro s ( ( n ) , ’f l o a t ’) f [0] = 1 - a l f [ n - l] = 1 + a l p r in t ’f : \ n ’ , f x, i t e r = se id e l(A , f) p r in t ’i t e r =’ , i t e r p r in t ’x : \ n ’ , x A. [[ 2. -1 5 0. 0 0 0. 0, 0, 0 0, ] -1 5 0 0 0 0 0 -0 5 2 0 0 i -1 5 0 0 0 0 0 —0.5 ,2 I о I 0 -0 5 2 : -15 0. 0, 0 0 0 1 10 0, 0 0. -0,5 2, -1,5 0/ 0 I о. 0 ] 0. 0 0. 2. -1 5 0 0 -0.5 0 i 0 -1 5 0 0 0 -0 5 2 0 j 0 0 I о —0,5 2, -1 5 0 ] 0 0 0 0 0 [ о 0. 0, 0. 0 , -0.5 -1.5] 0, 2. 0 ( 0. 0 0 0 0 0 -0 5 2 ] 0 0 i 0 f 1 0 5 0 i t e r — 67 X I 1 1 0 1 0 0 1 1 1 0 1 0 1 0 1 0 1 1 5] ] Данные по числу итераций для рассматриваемой задачи с диагональным пре­ обладанием суммированы в табл. 5.1 181 5.3 Упражнения Таблица 5.1 Метод Зейделя ev n = 25 n = 50 71= 100 0 1233 4482 > 1000 0.25 289 410 599 0.5 107 159 254 0.75 58 93 160 1 25 50 100 При 0 матрица системы уравнений несимметрична. Наблюдается вполне ожидаемое увеличение числа итераций при увеличении размерности задачи (параметр п) и сильная зависимость от параметра несимметричности а. У п р а ж н е н и е 5.2 Напишите программу, реализующую приближенное ре­ шение системы линейных алгебраических уравнений с симметричной полоэ/сительно определенной матрицей методом сопряэюенных градиентов. С ее помощью найдите решение системы Ах = f с матрицей Гильберта г = 1, 2, ...,n, %- = т—4— г, г+З ~ 1 и правой частью j = 1, 2, ...,п п f i = ^ ^ G>ij j 3=1 1) 2, ..., П, ^ для которой точное решение есть ж* = 1, симость числа итераций от п. г = 1,2, ...,п. Исследуйте зави­ Расчетные формулы метода сопряженных градиентов возьмем (сравни с (5.24) при В = Е) в виде: x k+l _ x k+ 1 _ QfJfe+l5*j = r fc+! + Pk+lSk, fc = 0 , 1 , ... при задании итерационных параметров a fc+i,/3fc+i в виде (rk, r k) ak+1 = (sk,A sk) ’ ^r k+i^r k+ij ^ fc+1 = (rk, r k) (rk+1,A sk) = (sk,A sk) ' В модуле eg функция eg О реализует описанный вариант метода сопряжен­ ных градиентов для системы с самосопряженной положительно определенной матрицей А. На выходе мы имеем приближенное решение и число итераций д ля достижения необходимой точности по невязке. Модуль eg im port numpy as np d e f cg(A, f , t o l = 1 .0 e -9 ): 182 Итерационные методы линейной алгебрЬ| мии Solve th e lin e a r system Ax = b by conjugate g ra d ie n t method иии n = x = r = fo r le n ( f ) n p .z e ro s ( ( n ) , ’flo a t* ) np.copy(f) i in ran g e(n ): r [ i ] = n p .d o t(A [i,0 :n] , x [0 :n ]) - f [ i ] s = np.copy(r) As = n p .z e r o s ( ( n ) , ’f l o a t ’) fo r к in ran g e(n ): fo r i in ran g e(n ): A s[i] = n p .d o t(A [i,0 :n ] , s [0 :n ]) alpha = n p .d o t( r , r) / n p .d o t(s , As) x = x - alpha*s fo r i in ran g e(n ): r [ i ] = n p .d o t(A [i,0 :n] , x [0 :n ]) - f [ i ] i f n p .d o t( r , r) < to l* * 2 : break e ls e : b e ta = - n p .d o t( r , As) / n p .d o t(s , As) s = r + beta*s re tu rn x, к Решение тестовой задачи дается следующей программой. import numpy as np from eg import eg n = 4 A = n p .z e ro s ((n , n ) , ’f l o a t ’) fo r i in ran g e(0 ,n ): fo r j in ran g e(0 ,n ): A [ i,j] = l . / ( i + j + l ) p r in t ’A :\n ’ , A f = n p .o n e s ((n ), ’f l o a t ’) f o r i in ra n g e (0 ,n ): f[i] = 0. fo r j in ra n g e (0 ,n ): f [i] = f [i] + A [i, j] p r in t ’f : \ n ’ , f x, i t e r = cg(A, f) p r in t ’i t e r =’ , i t e r p r in t ’x : \ n ’ , x 5.4 Задачи н 183 О5 О 3 3 3 33333 0 .2 5 О2 i ( 0 .5 [ 0.33 3 3 3 3 3 3 [ 0 25 f { 2 08333333 iter = 3 1 28333333 0 .33333333 О 25 О 25 ] О2 ] О 16666667] О 1 4 285714]] 0. 2 О 16666667 0 95 О 75952381] iillillllllllllllll Г i l i 1 ] Зависимость числа итераций от размерности матрицы прослеживается по следующим данным: при п = 25 необходимо 13 итераций, при п = 50 - 17, а при п = 100 — 20. 5.4 З а д а ч и З а д а ч а 5.1 Напишите программу, реализующую приближенное решение системы линейных алгебраических уравнений итерационным методом Яко­ би. С ее помощью найдите решение системы уравнений, рассмотренной в упразюнении 5.1. Сравните скорости сходимости итерационных метюдов Якоби и Зейделя при различных параметрах п и а. З а д а ч а 5.2 Напишите программу, реализующую приближенное решение системы линейных алгебраических уравнений методов релаксации (5.9). Ис­ следуйте зависимость скорости сходимости этого итерационного метода от итерационного пар&метра Tk+1 = г при численном решении системы уравнений из упразднения 5.1 при различных п и а. З а д а ч а 5.3 Напишите программу для решения системы линейных алгебра­ ических уравнений явным (В = Е ) итерационным методом минимальных поправок (итерационные параметры определяются согласно (5.23)). Сравни­ те скорость сходимости этого метода со скоростью сходимости метода сопряженных градиентов на примере задачи из упразднения 5.2. З а д а ч а 5.4 Пусть A = A1+ A 2 = A *> 0, A*2 = A i = )^D + L. В попеременно-треугольном методе переобуславливатель В зададим в виде В = (Е ~Ь и А \)(Е + (^^2). Напишите программу для решения системы линейных алгебраических урав­ нений с симметричной положительно определенной матрицей поперемен­ но-треугольным методом с выбором итерационных параметров по (5.23). Исследуйте зависимость скорости сходимости этого итерационного мето­ да от параметра и> в задаче из упразюнепия 5.2. 6 Спектральные задачи линейной алгебры Важной и трудной задачей линейной алгебры является нахождение собствен­ ных значений и собственных векторов матриц. Рассматривается проблема устойчивости собственных значений по отношению к малым возмущениям элементов матрицы. Для приближенного нахождения отдельных собствен­ ных значений широко используется степенной метод в различных модифика­ циях. Для решения полной проблемы для симметричных матриц применяется итерационный метод Якоби и Q R-алгоритм. О сновн ы е обо зн ачен и я 2Г= {ж;} = { х \,х 2, ■.. ,х п} — n-мерный вектор А. = {flij } — матрица с вещественными элементами Е — единичная матрица D = diagfdx, d2, . . . , dn} — диагональная матрица А г = 1, 2, . . . ,n — собственные значения г = 1, 2, . . . ,n — собственные вектора п (х ,у) = Е ^ г /i — скалярное произведение г=1 6.1 С обственн ы е зн а ч е н и я и собственн ы е в е к т о р а м атр и ц Рассматриваются проблемы нахождения собственных значений и собствен' ных векторов квадратной вещественной матрицы А. Собственным числом называется число Л такое, что для некоторого ненулевого вектора (собствен' ного вектора) р имеет место равенство А р = Хр. (ел) 0 2 Численные методы решения задач на собственные значения 185 Собственные вектора определены с точностью до числового множителя. Мно­ жество всех собственных значений матрицы А называется спектром матри­ цы А. q учетом того, что ищется нетривиальное решение уравнения (6.1), то det {А - ХЕ) = 0. (6.2) Тем самым собственные значения Л матрицы А являются корнями характе­ ристического многочлена n -й степени (6.2). Задача отыскания собственных значений и собственных векторов матрицы сводится к построению характери­ стического многочлена, отысканию его корней и последующему нахождению нетривиальных решений уравнения (6.1) для найденных собственных значе­ ний. В вычислительной практике рассматривается как полная проблема собствен­ ных значений, когда необходимо найти все собственные значения матрицы А, так и частичная проблема собственных значений, когда ищутся только некоторые собственные значения, например, максимальные (минимальные) но модулю. 6.2 Ч и с л е н н ы е м етод ы р еш ен и я за д ач н а собственны е зн ач ен и я Начнем с приведением некоторых полезных фактов о свойствах собственных значений и собственных векторов квадратной матрицы. Далее рассматрива­ ются методы решения частичной и полной проблемы собственных значений. С во й ст ва с о б с т в е н н ы х зн а ч е н и й и с о б ст вен н ы х вект оров Квадратная вещественная матрица порядка п имеет п собственных значе­ ний, при этом каждое собственное значение считается столько раз, какова его кратность как корня характеристического многочлена. Для симметрич­ ной матрицы А собственные значения вещественны, а собственные векто­ ра, соответствующие различным собственным значениям, ортогональны, т.е. ч? ) — если ®Ф зОтметим также некоторые свойства собственных значений и собственных векторов для сопряженной матрицы А*: А*ф = рф. Для спектральных задач (6.1), (6.3) имеем Х{ /ij, i 1, 2, . . . , и, (<р\ф3) = 0, i^j. (6.3) 186 Спектральные задачи линейной алге Две квадратные матрицы А и В одинаковых размеров называются по ными, если существует такая невырожденная матрица Р , что А = Р ~ 1 Подобные матрицы имеют одни и те же собственные значения, так ка] (6.1) непосредственно следует Вф = \ф, ф = Р^р. Поэтому вычислительные алгоритмы решения спектральных задач баз] ются на подобном преобразовании матрицы к матрице В, для которой с тральная задача решается проще. В качестве В естественно выбирать ди нальную матрицу, причем в данном случае это будет Л = diag{A1,A2, . . . , A n}. Упорядочим собственные значения симметричной матрицы А по возра нию, т.е. Ai < Л2 < • • • < Лп. Свойства собственных значений и собствен (А х ж) функций связаны с отношением Релея - 7— Отметим, например, что (д?, X) любого ненулевого вектора х справедливы неравенства л ,< ^ £ ) < л „ . (ж, X) Важны также экстремальные свойства Релея . (Ас, а:) А, = min -----г-, (Х ,Х ) А„ = max хфО (Ах, х) (Ж, Ж) Для локализации собственных значений произвольной матрицы А привл' ются круги Гершгорина: любое собственное значение матрицы А лежи] крайней мере в одном из кругов п IА — (1ц |< У " |o>ij |, i = 1,2..., п. i^j=l Приведем теперь некоторые о возмущении собственных значений при во: щении элементов матрицы. Помимо (6.1) рассмотрим задачу А р = Ар. ( Ограничимся случаем, когда все собственные значения простые. С то1 егью до членов второго порядка возмущение собственных значений за < возмущения матрицы дается оценкой |А - А| < Ci\\A - Л||, ( где ||т|| = (.т,^)1/2. Мерой устойчивости собственного значения А* слу: величина „ = ii^in i^ii / 6.2 Численные методы решения задач на собственные значения 187 которая называется коэффициентом перекоса матрицы А , соответствующим данному собственному значению. Здесь ^ — собственное значение матрицы А*. Для нормированных собственных векторов задач (6.1) и (6.5) соответ­ ствующая оценка устойчивости имеет вид £ 1I Г* ^ ПJ’l ||Д _ Л |1 i#j=1 И? В частности, для симметричной матрицы все коэффициенты перекоса рав­ ны единице и оценки устойчивости вычисления собственных значений опти­ мальны. Итерационные методы решения частичной проблемы собственных значений Д ля нахождения минимального по модулю (максимального) собственного значения используется прямые и обратные итерации. Пусть матрица А яв­ ляется симметричной, все ее собственные значения простые и упорядочены следующим образом N < | A 2| < . - . < |A „ |. Определим последовательность векторов х к+1 = А х к} /г = 0, 1, . . . (6.7) при некотором заданном х° (прямые итерации). Рассматривая последователь­ ности скалярных произведений (хк, х к), (хк+1, х к), при ограничении (х°,<рп) Ф 0, получим (хк, х к) ( I x f ) ' ( 6 -8 ) Тем самым при использовании итерационного процесса (6.7) находится мак­ симальное по модулю собственное значение матрицы А. Принимая во внимание, что собственные значения матрицы А ~1 есть 1/Л*, i = 1, 2, . . . ,п, при использовании последовательности (обратные итерации) yk+ l= A ~ ly k, ( j / V ) ^ 0, * = 0 ,1 ,... (6-9) имеем .. (ук+\ у к) (vk, yk) J_ АГ Тем самым при обратных итерациях находится минимальное по модулю соб­ ственное значение матрицы. Заметим, что в прямых и обратных итерациях нет необходимости в специ­ альном вычислении соответствующих собственных векторов, так как Спектральные задачи линейной алге 188 Вычислительная реализация обратных итераций (6.9) может быть осног на однократном LU разложении матрицы А. После этого каждая обрат итерация по вычислительным затратам эквивалентна прямой итерации. Отметим процедуру ускорения сходимости обратных итераций при извест хорошем приближении к собственному значению Ах к собственному значе] Ai. В этом случае рассматриваются обратные итерации со сдвигом, когд; (2° , ^ ) ^ 0, г ш = (Л - XiE)~lz k, * = 0 ,1 ,.... Скорость сходимости обратных итераций со сдвигом и без сдвига опред( ется отношениями — Ai 1 to Ai Ai a2 соответственно. В более общей ситуации обратные итерации со сдвигом пользуются для нахождения ближайшего к заданному числу собствен! значения соответствующего собственного вектора. Решение полной проблемы собственных значений Прямые и обратные итерации хорошо приспособлены для определения дельных собственных значений и собственных векторов. Для решения ci тральной задачи в целом используется Q R алгоритм. Он основан на предо леиии матрицы А в произведение А = Q R , где Q — ортогональная Q*Q = a R — верхняя треугольная матрицы. Строится последовательность ортогональных матриц Qk и верхних треугс ных матриц R k п о рекуррентным формулам А = QiRi, Ai = Q2R2, Ak—1 = QkRk, Ai — RiQi, Л2 — R2Q2, Ak — RkQk, Процесс построения по матрице А матриц Qk, Rk, Ак называется QR-su ритмом. Пусть для невырожденной матрицы А собственные значения различны модулю и IAi | > |Ai| > • • • > |An| и существует представление А = ТАТ~\ Г " 1 = LC7, А = diag{Ab А2, . . . , Ап}. 6.2 Численные методы решения задач на собственные значения 189 Тогда последовательность матриц А к <ЗЯ-алгоритма сходится к верхней тре­ угольной матрице, а диагональные элементы — к собственным значениям матрицы А. При решении полной спектральной задачи на основе QR для минимизации вычислительной работы проводится предварительное преобразовании исход­ ной матрицы к верхней почти треугольной матрице, в которой ац = 0, г > j + 1. При рекуррентных преобразованиях фЯ-алгоритма матрицы А к оста­ ются почти верхнетреугольными. Решение спектральной проблемы для симметричной вещественной матрицы может осуществляться методом вращений (методом Якоби). Вещественная матрица, отличающаяся от единичной матрицы четырьмя элементами, распо­ ложенными на пересечении строк и столбцов с номерами г, j, и имеющая вид T (ij) = .0 1 где с2 + s2 = 1 называется матрицей вращения. Заметим, что матрица враще­ ния является ортогональной и при умножении вектора на матрицу вращения T (ij) меняются только г и j координаты вектора. Д ля любой матрицы А и любой пары индексов г, j, г ф j всегда можно найти такую матрицу вращения T ( ij ), что элемент 6^ матрицы В = T*(ij)A T(ij) равен нулю. Определим последовательность матриц А 0 — A, Ai, А 2, . . . , каждая из которых получается из предыдущей с помощью преобразования подобия, определяемой матрицей вращения. На каждом шаге этого процесса обнуляется отдельный внедиагональный элемент. При таком преобразовании сумма квадратов внедиагональных элементов убывает. Последовательность матриц А к сходится к диагональной матрице и диагональные элементы мат­ рицы А к в рассматриваемом методе вращений (метод Якоби) являются соот­ ветствующими приближениями для собственных значений матрицы А. 190 Спектральные задачи линейной алгебрЬ( Оптимизация метода вращений достигается за счет выбора элемента для уц^ чтожения на каждом шаге преобразований. Это может быть максимальны^ по модулю виедиагональный элемент всей матрицы Ak или на выбрашю^ столбце. 6.3 У п р а ж н е н и я У п р а ж н е н и е 6.1 Напишите программу для нахоэюдения минимального по модулю собственного значения и соответствующего собственного вектора симметричной матрицы при использовании обратных итераций. С ее помощью найдите минимальное по модулю собственное значение матрицы Гильберта А, когда Oij = — т— г, г+ j - 1 г = 1, 2, ...,n, j = l , 2,...,n , при значениях п от 2 до 10. В модуле invlter функция i n v I t e r O обеспечивает нахождение минимального по модулю собственного значения и соответствующего собственного вектора с помощью обратных итераций (см. (6.9)). Для решения системы линейных уравнений используется функция solveLU из модуля lu. import numpy as np import math as mt from lu import decLU, solveLU def in v lte r(A , t o l = 1.0e-6 ): иии The inverse power method. Returns the sm allest eigenvalue and the corresponding eigenvector. иии n = len(A) iterMax = 100 x = np.random.rand(n) xNorn = m t.s q r t( n p .d o t( x , x)) x = x / xNorn f o r i in ra n g e (0, iterMax): xl = x.copyO x = solveLU(A, x) xNorn = m t.s q r t( n p .d o t( x , x)) x = x / xNorn i f m t .s q r t( n p . d o t ( x l - x , x l- x ) ) < t o l : r e tu r n 1 / xNorn, x p r i n t ’Method did not converge (100 i t e r a t i o n s ) . ’ 191 6.3 Упражнения Решение частичной проблемы собственных значений для матрицы Гильберта дается следующей программой. ехег —6 1 ру import numpy as np from i n v l t e r import i n v l t e r p r i n t *n eigenvalue * f o r n in range(2, 11): A = n p .z e r o s ( ( n , n ) , ’f lo a t* ) f o r i in ra n g e (0, n ) : f o r j in r a n g e (0, n ) : A [ i , j ] = 1 . / (i+j+1) lam, x = inv Iter(A ) p r i n t n, lam n e ig e n v a lu e 2 0 0657 4 1 4 5 4 0 8 9 3 3 0 00268734035577 4 9 .6 7 0 2 3 0 4 0 2 2 6 e 4 )5 5 3 ,2 8 7 9 2 8 7 7 2 17e~~ 06 6 1 0 8 2 7 9 9 4 8 4 4 8 e —07 7 3 4 9 3 8 9 8 5 9 2 2 2 e —09 8 1 1 1 1 5 3 8 9 5 3 6 7 e —10 9 3,4 9 9 6 8 9 2 4 8 6 5 e —12 10 1 0933068413e~*13 Приведенные расчетные данные демонстрируют быстрое приближение мини­ мального собственного значения к нулю при увеличении размерности матри­ цы п. У п р а ж н е н и е 6.2 Напишите программу для нахоэюдепия собственных зна­ чений и собственных векторов симметричной вещественной матрицы ме­ тодом вращений (методом Якоби). С ее помощью найдите собственные зна­ чение матрицы Лемера (Lehmer) А, для которой йц тг> г = 1,2, ...,п, тах(г,у) у = 1,2,...,77., при п = 8. Приведем необходимые расчетные формулы, которые связаны с применением матрицы вращения. Пусть В = T*(kl)A T(kl). Д ля измененных элементов матрицы В имеем bkk = c2akk + s2au - 2csakh Ьц = s2akk + (?а.ц + 2csaki, Спектральные задачи линейной алгебры 192 h i = (с2 —s2)a,ki 4- cs(akk — ад), Ъы = caki - заи, 1фк, %ф1, bu = saki 4- cati, i Ф к, i ф I. В силу этого, для обнуления элемента bki необходимо (с2 - s2)aki + cs(akk - аи) = 0. Пусть с = cosQ, s — sin# (в — угол поворота) тогда достаточно положить _ 1 _ tan(20) акк ~ аи 2aki Полагая t = s/c = tan#, для определения t получим квадратное уравнение t2 И- 2(f)t —1 —0, решение которого есть t — - ф ± фф2 4-1. Меньший по модулю корень \t\ < 1 соответствует повороту на угол меньший 7г/4 и порождает более устойчивый алгоритм. Поэтому t = sign(<£)(-|0 | + \/ф2 + 1). Для более точных вычислений при больших \ф\ положим _ sign(0) \ф\ + фф2 4 -1 ’ причем для очень больших \ф\ имеем t « 1/ ( 20). По значению i находим с = ■у--—. ф Т+ i2 s = tc. Расчетные формулы для элементов матрицы В принимают вид bkk = акк — taki, bg = аи 4- ta ki, hi = о, h i = aki - s(au + Taki), i ф к, гф1, Ьи = ац + 8(акг - т а н), i Ф к, гф 1, где т = s /( 14- с). В модуле jacobi функция elemMaxO находит максимальный по модулю эл^' мент матрицы, для обнуления отдельного элемента матрицы используется функция r o t a t e (). ^ 3 Упражнения Модуль jaco b i imp°r t numpy as np impo r t math as j ef elemMax(A): к ик Find the la r g e s t (absolute value) o ff-d ia g o n a l element A[k,1] in the upper h a lf of A. иии n = len(A) aMax = 0. f o r i in r a n g e ( n - l) : f o r j in range(i+1, n ) : i f a b s ( A [ i ,j ] ) >= aMax: aMax = a b s ( A [ i ,j ] ) к = i 1 = j r e t u r n aMax, к, 1 def ro tate (A , P, к, 1): иии Rotate of A to make A[k,l] = 0 . ииit n = len(A) d = A[1,1] - A[k, k] i f a b s(A [k ,l]) < abs(d)*1.0e-36: t = A[k, 1] / d else: phi = d / (2*A[k,l]) t = 1 / (ab s(p h i) + m t .s q r t( l + phi**2)) i f phi < 0 .: t = - t с = 1 / m t .s q r t( l + t* * 2) s = t* c ta u = s / (1 + c) # Modify the m atrix elements t t = A[k,l] A[k,l] = 0.0 A[k,k] = A[k,k] - t * t t A[1,1] = A[1,1] + t * t t f o r i in range(k): t t = A[i,k] A[i,k] = t t - s * ( A [ i,l] + t a u * t t ) A [ i, l] = A [ i ,l ] + s * ( t t - ta u * A [ i ,l ] ) f o r i in range(k+1,1): t t = A[k,i] 193 А[к , i] = t t - s * ( A [ i,l] + tau *A [k ,i]) A [ i, 1] = A [ i ,l] + s * ( t t - t a u * A [ i ,l ] ) f o r i in r a n g e ( l + l , n ) : t t = A[k,i] A [k,i] = t t - s * ( A [ l ,i ] + ta u * t t ) A [ l,i ] = A [ l ,i ] + s * ( t t - t a u * A [ l ,i] ) # Update tran sfo rm atio n matrix f o r i in range(n): t t = P [ i,k ] P [ i,k ] = t t - s * (P [i,l] +tau * P [i,k ]) P [i,l] = P [i,l] + s * (tt - tau * P [i,l]) def jacobi(A, t o l = 1.0e-12): иии Solution of eigenvalue problem by J a c o b i’s method. Returns eigenvalues in vecto r lam and the eigenvectors as columns of matrix . иии n = len(A) # Number of r o t a t i o n s l im it rotMax = 5*(n**2) P = n p .i d e n ti ty ( n ) # Jacobi r o t a t i o n loop f o r i in range(rotMax): aMax, к, 1 = elemMax(A) i f aMax < t o l : re tu r n n p.diago nal(A ), P ro ta te (A , P, к, 1) p r i n t ’Jacobi method did not converge’ Решение полной проблемы собственных значений для матрицы Гильбс при использовании метода Якоби дается следующей программой. import numpy as np from jaco bi import ja c o b i n = 8 A = n p .z e r o s (( n , n ) , ’f l o a t ’) f o r i in ra n g e (0, n ) : f o r j in ran ge(0, n ) : if i < j: A[ i , j ] = ( i + l . ) / ( j + l ) e ls e : A[i, j] = ( j+ 1 . ) / (i+1) lam, x = jacobi(A) p r i n t ’All eige n v a lu e : \ n ’ , lam 195 5,4 Задачи [ о 74602786 О 12603956: 1 46486865 О 18325435 0 2760521 0 439372 О'.ДйГрГ^Эё^-'Г:4.67731251 ] Сравнение с результатами вычисления минимального собственного значения методом Якоби и обратными итерациями (см. упражнение 6.1) показывает хорошее согласие результатов. 6.4 З а д а ч и З а д ач а 6.1 Напишитпе программу для нахоэюдения ближайшего к задан­ ному числу собственного значения и соответствующего собственного век­ тора симметричной вещественной матрицы при использовании обратных итераций со сдвигом. С ее помощью найдите первые три минимальных по модулю собственных значение матрицы Паскаля А , для которой j 2)! = ( i - 1)\(j - 1)! ^= ...,n, j = 1,2, ...,гс. при п = 8. З а д ач а 6.2 Напишите программу для нахоэюдения минимального по моду­ лю собственного значения и соответствующего собственного вектора сим­ метричной трехдиагональной матрицы. С ее помощью найдите первое ми­ нимальное по модулю собственное значение матрицы п х п, для которой 2, вц — 1 при различных п. Сравните численное решение с точным. З ад ач а 6.3 Напишите программу для преобразования симметричной веще­ ственной матрицы А к симметричной трехдиагональной матрице РАР с помощью ортогонального преобразования Хаусхольдера (Р -1 = Р ). С ее по­ мощью проведите преобразование матрицы А, элементы которой есть ai:j = min ( г ,Д i = l,2 ,...,n , j = 1,2 ,...,n , при различных п. З а д а ч а 6.4 Напишите программу для вычисления собственных значений трехдиагональной вещественной матрицы А с использованием Q R алго­ ритма. Найдите собственные числа трехдиагональной матрицы А, для ко­ торой вц — 2, G-i.i+l = 1 Ck, 1 = —1 при различных значениях п и параметра а (0 < а < 1). Сравните найденные собственные значения с точными. Нелинейные уравнения и системы Многие прикладные задачи приводят к необходимости нахождения прибли­ женного решения нелинейных уравнений и систем нелинейных уравнений. С этой целью используются итерационные методы. Приведены алгоритмы решения нелинейных уравнений с одним неизвестным и систем нелинейных уравнений. Применяются итерационные метод последовательных приближе­ ний (простой итерации) и метод Ньютона в различных модификациях. О сновны е об озн ачен и я /(х ) — функция одной переменной /г(ж), г = 1, 2, . . . , п — функции п переменных (х = Цч} = {хи х2, . . . , х п}) F(x) = { /1, / 2, . . . , f n} — вектор-функция с компонентами / l ) / 2?• • • >fn F'(x) — матрица Якоби г.к приближенное решение на к-й итерации 7.1 Р еш ен и е н ел и н ей н ы х у р ав н ен и й и систем Ищется решение нелинейного уравнения f(x) = 0, (7.1) где f ( x) — заданная функция. Корни уравнения (7.1) могут быть комплекс' ными и кратными. Выделяют как самостоятельную проблему разделения корней, когда проводится выделение области в комплексной плоскости, сот держащей один корень. После этого на основе тех или иных итерационны* процессов при выбранном начальном приближении находится решение нелИ' нейного уравнения (7.1). 19 7 7 . 2 Итерационные метод i решения нелинейных уравнений В более общем случае мы имеем не одно уравнение (7.1), а систему нелиней­ ных уравнений f i ( x u x 2, . . ' , z n) = 0, i = 1,2, . ..,n . (7.2) Обозначим через х = { х х, х 2, . . . , х п) вектор неизвестных и определим векторфункцию F(x) = { / ь / 2)---»/п}- Тогда система (7.2) записывается в виде уравнения F(x) = 0. (7.3) Частным случаем (7.3) является уравнение (7.1) (п = 1). Второй пример (7.3) — система линейных алгебраических уравнений, когда F(x) = Ах - / . 7.2 И тер ац и о н н ы е м етоды р еш ен и я н елин ейны х уравнений Д л я приближенного решения нелинейных уравнений и систем нелинейных уравнений используются итерационные методы. Среди основных подходов можно выделить метод последовательных приближений (простой итерации) и метод Ныотона. Алгоритмы для решения нелинейного уравнения При итерационном решении уравнений (7.1), (7.3) задается некоторое началь­ ное приближение, достаточно близкое к искомому решению х*. В одношаго­ вых итерационных методах новое приближение x k+l определяется по преды­ дущему приближению х к. Говорят, что итерационный метод сходится с ли­ нейной скоростью, если х к+1 —х* = О( хк — х*) и итерационный метод имеет квадратичную сходимость, если х к+1 —х* = 0 ( х к — х*)2. Заменим уравнение (7.1) эквивалентным уравнением х = у?(ж), (7.4) полагая, например, (р{х) = x + g{x)f(x), где функция д(х) не меняет знака на отрезке, на котором ищется решение уравнения (7.1). Для приближенного решения уравнения (7.4) используется метод простой итерации, когда х к+1 = (р(хк), к = 0 ,1 ,... (7.5) при некотором заданном начальном приближении .т°. Пусть в некоторой окрестности R = {х \ \х —х*\ < г} корня х = х* уравнения (7 .4) функция (р(х) удовлетворяет условию Липшица \(р(х) - i p ( y ) | < q\x - у\ х,у е R (7 .6) 198 Нелинейные уравнения и систему с постоянной q < 1. Тогда метод простой итерации (7.5) сходится и для ц0, грешности верна оценка \хк —х*\ < qk\x° — х*\. (7.7) Можно сформулировать условия, гарантирующие, что имеется единственный корень в окрестности начального приближения х°. Пусть теперь R = {х | \х~~ х°\ < г} и |я° -<P(z°)| < (1 ~q)r, (7.8) тогда при выполнении (7.6) с q < 1 уравнение (7.4) имеет единственное ре­ шение в R. В итерационном методе Ньютона (методе касательных) для нового прибли­ жения имеем х "fc+1 ^ х К~ / У » ’ (7-9) Пусть х* — простой вещественный корень уравнения (7.1) и определим R, = {х | \х — х*\ < г} — окрестность этого корня. Предположим также, что >nf \ f {x)\ = m > 0, xeR sup \f"(x)\ = М, xeR причем 10 *i 2m Тогда при х° £ R метод Ныотона (7.9) сходится и для погрешности справед­ лива оценка \xk —х*\ < q2k~l \х° —х*\. Тем самым метод Ныотона имеет квадратичную сходимость. Модификации метода Ныотона направлены на минимизацию вычислитель­ ной работы, на увеличение окрестности корня, в которой можно задавать начальное приближение. Примером выступает метод секущих, который по­ лучается из метода Ныотона заменой производной в знаменателе на соответ­ ствующую разделенную разность: *.*+1 _ „к _ № Этот метод является простейшим двухшаговым итерационным методом, ко­ гда новое приближение х к+1 находится по двум предыдущим х к и х к_1. М ет оды р е ш е н и я с и с т е м н е л и н е й н ы х у р а вн е н и й При приближенном решении систем нелинейных уравнений (7.3) можно орш ентироваться на аналоги метода многомерные простой итерации и метод*1 7.2 Итерационные методы решения нелинейных уравнений 199 Ныотопа. Многие одношаговые методы для приближенного решения (7.3) но аналогии с двухслойными итерационными методами для решения систем ли­ нейных алгебраических уравнений можно записать в виде + F ( x k) = О, В кк+ 1 к = 0,1,. (7.11) Tk + 1 где тк+1 — итерационные параметры, a B k+i — квадратная матрица п х п, имеющая обратную. Для стационарного итерационного метода (7.11) ( В и т не зависят от к) имеем x k+1 = S{xk), (7.12) где S(x) = x —t B ~ 1F ( x ). Тес самым (7.12) соответствует применению метода простой итерации для преобразованного уравнения (7.13) х = S(x). Пусть в окрестности R = {х \ \\х —х°|| < г} заданного начального приближе­ ния х° выполнены условия IIS(x) - 5(j/)|| < q\\x - y \l ||T0 - 5 ( ^ ° ) | | < ( l - l ) r , x ,y e R, q < 1. Тогда уравнение (7.13) имеет в R единственное решение ж*, которое дается итерационным процессом (7.12), причем для погрешности справедлива оцен­ ка \\xk+l — ж*|| < qk\\x° — х*\\. В методе Ныотона новое приближение для решения системы уравнений (7.2) определяется из решения системы линейных уравнений i > 3= r + № * )= о , 1 ‘J г = 1, 2, . . . , п, к = 0, 1, __ Определим матрицу Якоби F' (x) = dfdx) dxi df l {x) 0X2 df i (x) 0xn df*(x) Ox i dh(x) Ox 2 dh(x) 0xn d f n(x) . dxi d f n(x) Ох 2 9 f n(x) дх п (7.14) Нелинейные уравнения и системы 200 и запишем (7.14) в виде F' (x){xk+1 - х к) + F( x k) = 0, к = 0 ,1 ,.... (7.15) При использовании записи (7.11) метод Ныотона (7.15) соответствует выбору B k+1 = F ’(xk), Tk+1 = 1. Система линейных уравнений (7.15) для нахождения нового приближения х к+1 может решаться итерационно. В этом случае мы имеет двухступенчатый итерационный процесс со внешними и внутренними итерациями. Например, внешний итерационный процесс может осуществляться по методу Ныотона, а внутренние итерации — на основе итерационного метода Зейделя. При решении систем нелинейных уравнений можно использовать прямые аналоги стандартных итерационных методов, которые применяются для ре­ шения систем линейных уравнений. Нелинейный метод Зейделя примени­ тельно к решению (7.2) дает *• i З'п) 0) i 1, 2, . . . , ть. В этом случае каждая компонента нового приближения из решения нелиней­ ного уравнения, что можно сделать на основе итерационных метода простой итерации и метода Ныотона в различных модификациях. Тем самым сно­ ва приходим к двухступенчатому итерационному методу, в котором внешние итерации проводятся в соответствии с методом Зейделя, в внутренние — ме­ тодом Ныотона. Основные вычислительные сложности применения метода Ныотона для при­ ближенного решения систем нелинейных уравнений связаны с необходимо­ стью решения линейной системы уравнений с матрицей Якоби на каждой итерации, причем от итерации к итерации эта матрица меняется. В модифи­ цированном методе Ныотона F '(x°)(xk+1 - x k) + F( x k) = 0, k = 0 ,1 ,... матрица Якоби обращается только один раз. 7.3 У п р а ж н е н и я У п р аж н е н и е 7.1 Напишите программу для нахоэюдения решения нелиней­ ного уравнения f ( x ) = 0 методом бисещий. С ее помощью найдите корна уравнения (1 + х 2)е~х + sin(x) = 0 на интервале 10,10). В модуле bisection функция b is e c t ion О обеспечивает нахождение корпя уравнения f ( x ) = 0 на интервале [xi,x2\ при условии, что f ( x i ) f ( x 2) < 0. Модуль b i s e c t i o n 7.3 Упражнения 201 im port numpy as np im port math as mt def bisection(f, xl, x2, tol=l.0e-10): к ии Finds a ro o t of f(x ) = 0 between th e arguments x l and x2 by b is e c tio n . f ( x l) and f ( x 2) can not have th e same sig n s. иии f l = f ( x l) f 2 = f ( x 2) i f f l * f 2 > 0 .: p r in t ’f ( x l ) and f ( x 2) can not have th e same s ig n s ’ n = in t( m t.c e il( m t.lo g ( a b s ( x 2 - x l ) / t o l ) / m t .l o g ( 2 . ))) fo r i in ran g e(n ): x3 = 0 .5 * (x l + x2) f3 = f(x 3 ) i f f 2*f3 < 0 .: x l = x3 f l = f3 e ls e : x2 =x3 f2 = f3 r e tu r n (x l + x2) / 2 . Д л я определения интервалов, которые содержат корни уравнения f(x) = 0 будем использовать график у = f(x). С учетом этого для нахождения корней уравнения (1 + х 2)е~х + sin(:c) = 0 используется следующая программа. е х е г —7 1 ру im port numpy as np im port m a tp lo tlib .p y p lo t as p i t from b is e c tio n import b is e c tio n def f(x ): re tu r n ( 1 . + x**2) * np.ex p (-x ) + n p .sin (x ) x = n p .lin s p a c e (0 . , 10., 200) у = f(x ) p i t . p l o t ( x , y) p l t . x l a b e l ( ’x ’ ) p it.g r id ( T r u e ) p i t . showO xRootl = bisection(f, 2, 4) print ’root(l) = ’, xRootl xRoot2 = bisection(f, 6, 8) print ’root(2) = ’, xRoot2 xRoot3 = bisection(f, 8, 10) X Рис. 7.1 График функции у = (1 + х2)е х + s\n(x) p r in t ’ro o t(3 ) = xRoot3 На интервале [0,10] найдены три корня (см. рис. 7.1). У п р а ж н ен и е 7.2 Напишите программу для нахоэюдения решения систе­ мы нелинейных уравнений F(x) = 0 методом Ньютона при численном вы­ числении матрицы Якоби. С ее помощью найдите приближенное решение системы (3 + 2xi)xi - 2х 2 = 3, (3 + 2х {)хг - Xi_i - 2xi+1 = 2, (3 -+- 2xr^)xn x n—i i = 2,3,..., n - 1, 4 при n — 10 и сравните его с точным решением ж» = 1, г = 1, 2,..., п. В модулеnewton функция ja co b ian O предназначена для вычисления элс' ментов матрицы Якоби с использованием разностной производной. ФункЩ1*1 newt on () реализует метод Ньютона при решении соответствующей систем^ 7.3 Упражнения 203 линейных уравнений с помощью LU-разложения (функция solveLUO из мо­ дуля lu). import numpy as np import math as mt from lu import solveLU def ja c o b ia n ( f , x ) : ииn C a lc u la tio n of th e Jacobian using f i n i t e d if f e r e n c e s . иии h = 1.0e-4 n = len(x) Jac = n p .z e r o s ( ( n ,n ) , ’f l o a t ’) fO = f(x ) f o r i in ran ge(n ): t t = x [ i] x [ i] = t t + h f l = f(x ) x [ i] = t t Jac [ : , i] = ( f l - f 0 ) / h r e t u r n Jac, fO def newton(f, x, to l= 1 .0 e - 9 ) : иии Solves th e system equations f (x ) = 0 by the Newton method using {x} as th e i n i t i a l guess. Solve th e l i n e a r system Ax = b by lu module. иии iterMax = 50 f o r i in ra n g e (ite rM ax ): Jac, fO = ja c o b ia n ( f , x) i f m t.s q r t( n p .d o t( f O , fO) / le n (x )) < t o l : r e tu r n x, i dx = solveLU(Jac, fO) x = x - dx p r i n t ’Too many i t e r a t i o n s f o r the Newton method’ В тестовой задаче метод Ныотона применяется при начальном приближении х 9 = 0, i = 1, 2,..., п и с использованием следующей программы. ехег —7.2 ру import numpy as np from newton import newton n = 10 def f ( x ) : 204 Нелинейные уравнения и системы f = n p . z e r o s ( ( n ) , ’f lo a t * ) f o r i in r a n g e d , n - l ) : f [ i ] = (3 + 2 * x [ i]) * x [ i] - x [ i - l ] - 2 * x[i+ l] - 2 f CO] = (3 + 2*x[0] )* x [0] - 2* x [l] - 3 f [ n - l ] = (3 + 2*x[n-l] )* x [n -l] - x[n-2] - 4 return f xO = n p . z e r o s ( ( n ) , ’f l o a t* ) x, i t e r = newton(f, xO) p r i n t *Newton i t e r a t i o n = *, i t e r p r i n t ’S o lu t io n : \ n *, x При используемых параметрах метода точное решение задачи совпадает с численным. 7.4 З а д а ч и З а д а ч а 7.1 Напишите программу для решения нелинейного уравнения f ( x ) = 0 методом секущих. Используйте ее для решения уравнения A sm(x) + 1 —х = 0 на интервале /-10,10]. З а д а ч а 7.2 Напишите программу для решения нелинейного уравнения f ( x ) = 0 методом Ныотона. С ее помощью найдите пололсительные корпи уравнения х 2 —10sin(a;) = 0. З а д а ч а 7.3 Напишите программу для нахоэ/сдения решения системы нели­ нейных уравнений F(x) = 0 методом Ньютона при аналитическом задании матрицы Якоби. С использованием этой программы найдите приблиэюенное решение системы уравнений п n - £ (cos Xj + г( 1 - cosxi) - sina^) = 0 j=l г = 1, 2, n, при n = 20 и начальном приблиэюепии х® = 1/п, г = 1, 2,..., п. З а д а ч а 7.4 Напишите программу для нахоэюдепия решения системы нели­ нейных уравнений F(x) = 0 методом Зейделя при решении нелинейного урав­ нения методом Ныотона. Рассмотрите возмоэюности использования э т о й программы при приблиэюенном решении системы уравнений из упраздне­ ния 7.2. 8 Задачи минимизации функций Среди основных проблем вычислительной математики можно отметить зада­ чи минимизации функций многих переменных (задачи оптимизации). Поиск минимума часто проводится при некоторых дополнительных ограничениях — условная оптимизация. Для численного решения таких задач используют­ ся итерационные методы. В задачах с ограничениями применяются методы штрафных функций. Простейшей задачей рассматриваемого класса является поиск минимума одномерной функции. О сновн ы е о б о зн ачен и я х = {xi} = { х и х 2). . . ,х п} f(x) / (х) —> min, х Е R n f ( x) —> min, х £ X X хк п — — — — — — (х ,у) = ^ 2 Х*У' ~ 8.1 n -мерный вектор функция одной или п переменных задача безусловной оптимизации задача условной оптимизации допустимое множество приближенное решение на к-й итерации скалярное произведение П о и ск м и н и м у м а ф у н к ц и и м ногих п ерем ен н ы х Для заданной функции /( т ) , определенной на допустимом множестве X из евклидова пространства R 71, ищется точки минимума (максимума) функции /(^ ), т.е. f ( x ) —> min, хеХ. (8.1) Точка х* G X есть точка глобального минимума функции}{х) на множестве X, если /О О < /(ж), Vt g X, (8.2) и -точка локального минимума, если f(x*) < f ( x ) в окрестности точки х* е X. 206 Задачи минимизации функций Задача (8.1) называется задачей безусловной оптимизации, если X = R n, т.е /(# ) -> min, х е R n. (8.3) Если X некоторое подмножество пространства R n, то мы имеем задачу услов. ной оптимизации. Такие задачи существенно сложнее для численного реше­ ния, чем задачи безусловной минимизации. Ограничения могут формулиро. ваться в виде равенств (например, д{(х) = 0, г = 1, 2, . . . ,га) или неравенств (д{(х) < 0, г = 1, 2, , га). 8.2 М етоды р еш ен и я за д ач оп ти м и зац и и Вычислительные алгоритмы для приближенного решения задачи оптими­ зации чаще всего строятся на использовании необходимых и достаточных условиях оптимальности, т.е. на условиях, которые имеют место в точке ми­ нимума. Реализация такого подхода связана с решением соответствующих нелинейных уравнений итерационными методами. Поиск минимума функции одной переменной Пусть X = [а, Ь] и кусочно-непрерывная функция /(# ) имеет в некоторой точке х* Е X один минимум. Мы отметим прежде всего простейшие итераци­ онные методы решения, задачи минимизации, наиболее полно учитывающие специфику одномерных задач. Вычислим функцию на концах отрезка и в двух внутренних точках х 1 и х 2 < х 1. Будем считать, что эти точки симметричны относительно середины отрезка [а, Ь]. В методе золотого сечения точки х 1 и х 2 выбираются так, чтобы отношение длины всего отрезка [а, Ь] к длине большей из его частей [а, .т1] равно отношению длины большей части [а, .т1] к длине меньшей части [ж1, 6]: Ь- а х 1- а х- 1— — а = 1х 2— —а • . л 8-4) Далее проводится сравнение значений функции в четырех точках а , х 2, х 1,Ь и выберем точку, в которой значение функции наименьшее. Пусть это будет точка #2, тогда минимум функции достигается в одном из прилегающих к этой точке отрезков: [а,ж2] или гг2,# 1] и поэтому в дальнейшем можно рас­ сматривать проблему минимизации на отрезке [а,ж1]. После этого процесс повторяется — в соответствии с правилом золотого сечения делится точкой х 3 отрезок [а,#1]. Для минимизации функции одной переменной широко используются методы полиномиальной интерполяции. В этом случае с использованием ранее пай' денных точек строится интерполяционный полином, точка минимума кото­ рого принимается за очередное приближение. В методе парабол используется интерполяционный многочлен второго порядка. 8.2 Методы решения задач оптимизации 207 Пусть, например, известны три приближения х к~2 < ж*-1 и х к~2 < х к < х к~ \ причем f ( x k) < f { x k~2) и f ( x k) < / ( x fc_1). Новое приближение ищется как решение задачи минимизации L 2(x) —> min, (8.5) где Ь 2(х) — интерполяционный многочлен второго порядка, построенный по с—О узлам х 1К , ягfc— 11 и х к . Интерполяционный многочлен Ныотона имеет вид ■Мя) = f i xk) + (х - xk)f(x k,x k~1)+ + (х - хк)(х - xk~l)f(x k,x k~1,x k~2), где f( к Jf(xk ух , х X к- _ /(* * )-/(* * -* ) ,Х ) — ^ 1, a;fe_2) X ) - J , ^ k_ 2 _ разделенные разности первого и второго порядка соответственно. Решение задачи (8.5) приводит нас к следующей формуле для новогоприближе для точки минимума 2xk + l- x k + xk~1 - f{-xk' xk~4 ... (8 6) Для дифференцируемой функции f ( x ) строятся итерационные методы, осно­ ванные на решении уравнения (необходимое условие минимума) f ( x ) = 0. (8.7) Корень этого уравнения х* Е X является точкой минимума, если f "{x) > 0 (достаточные условия минимума). Для приближенного решения нелинейного уравнения используются итерационные методы. В итерационном методе Ныотона новое приближение для точки минимума ' определяется в соответствии с формулой хк+1=хк~ 9 ( 9 ) ’ fc= ° - 1--'- (8-§) Различные модификации метода Ныотона рассматривались в главе 8. Минимизация функций многих переменных Для функции многих переменных /(я:), х = { х \ , х 2, ... , х п} определим вектор первых частных производных (градиент) , / , . _ч ГЯ/,_.ч 1 _ f Я / , ч Я / , ч Of , Л Задачи минимизации функций 208 Матрица вторых частных производный (гессиан) в точке х есть Будем рассматривать задачу безусловной оптимизации (8.3). Пусть функция f ( x ) дифференцируема в точке локального минимума х = х*, тогда (необхо­ димые условия оптимальности) f ( x * ) = 0. (8.9) Если функция f ( x ) дважды дифференцируема в точке х (8.9). Если матрица f "( x) положительно определена, т.е. (/"(я*)г/. у) > °. = х* и выполнено Уу Ф °> (ело) тогда х* — точка локального минимума. Условия (8.9), (8.10) есть достаточ­ ные условия оптимальности. Для итерационных методов минимизации будем использовать обозначения x k+l = х к -f- a khk, к = 0, 1, . . . , (8.11) где hk — вектор, который определяет направление (к + 1)-го шага минимиза­ ции, а коэффициент а к — длину этого шага. Вектор h задает направление убывания функции f ( x) в точкех , если f ( x + < f ( x ) при достаточно малых а > 0. Если вектор hk задает направление убывания функции f ( x ) в точке х к, а а к > 0 такое, что ah) f ( x k+l) < f ( x k), то итерационный метод (8.11) называется методом спуска. В градиентном методе hk = —/'(ж*), т.е. = х к - a kf ( x k), к = 0, 1, . . . (8.12) Особое внимание уделяется выбору итерационных параметров а к, к = 0, 1,. • • в методе (8.11). Их можно определять из условия f ( x k + a khk) = min f ( x k + a>0 a h k ), т.е. из решения дополнительной одномерной задачи минимизации. В вычислительной практике широко используется процедура дробления ша­ га, когда параметр а уменьшается, например, в два раза, до тех пор пока не будет выполнено неравенство } ( х к + a h k) < f ( x k). При применении метода Ньютона для решения системы нелинейных уравне­ ний (8.9) получим f " ( x k)(xk+1 - х к) + / V ) = 0 , к = 0, 1, . . . (8.13) 8.2 Методы решения задач оптимизации 209 Он записывается в виде (8.11) при а к = 1, hk = - ( / V ) ) - 7 V ) . (8.14) Среди модификаций метода Ныотона отметим метод Ныотона с регулиров­ кой шага, когда вместо (8.14) используется а , > 0, hk = - ( / " ( * * ) ) - № ) • В квазииыотоновских методах hk = - H kf ( x k), где Hk — матрица, которая аппроксимирует матрицу ( / //(^fc))_1- Задачи условной минимизации При минимизации функций с ограничениями широко используются подходы, которые аналогичны тем, которые разработаны для задач безусловной мини­ мизации. Наиболее просто это реализуется при переходе от задачи условной минимизации к задаче минимизации без ограничений. Рассмотрим задачу минимизации с ограничениями типа равенств: f ( x ) —>min, gi{x) = 0, г = 1, 2, (8.15) Эту задачу можно записать в общем виде (8.1), задав допустимое множество X = {х е R n | gi(x) = 0, г = 1, 2, . . . ,га}. При некоторых ограничениях задача условной минимизации (8.15) эквива­ лентна задаче безусловной минимизации функции Лагранжа т Ц х , у ) = f{x) + г=1 где yi — неизвестные множители Лагранжа. Тем самым мы приходим к задаче минимизации функции п + т переменных. Более сложно перейти к задаче безусловной оптимизации при учете ограни­ чений в виде неравенств. Рассмотрим, например, задачу f ( x ) —>min, gi(x) < 0, г = 1, 2, . . . , ш , (8.16) т.е. в (8.1) X = {х е R n | gi(x) < 0, г = 1, 2, . . . ,m}. Вместо функции f ( x ) в методе штрафов минимизируется функция Ф(х, е) = f {x) + ф(х, г), (8.17) 210 Задачи минимизации функцц^ где ф(х, е) — штрафная функция, е > 0 — параметр штрафа. Выбор штраф, ной функции на допустимом множестве подчинен условиям 'ф(х1е ) > 0 , ф{х,£) —> 0, если £ —>0, х е X, а вне допустимого множества — ф{х,£) —>оо, если е —> 0, х X. В качестве характерного примера приведем штрафную функцию для задачи условной минимизации (8.16): 2 тп ф( х, е) = - £ Д т а х { 0,&(а:)}]2 . е »=1 После этого рассматривается задача безусловной минимизации Ф(х,е) —>min, х Е R n. Помимо выбора штрафной функции в методах этого класс очень важен выбор величины параметра штрафа £. 8.3 У праж нения У п р аж н ен и е 8.1 Напишите программу для иахоэюдепия минимума функ­ ции одной переменной f ( x ) на интервале [а, Ь] методом золотого сечения. С ее помощью найдите минимум функции (х2 — 6х + 12)(х2 + 6х + 12)~г на интервале [0,20/. Точка х 1 является точкой золотого сечения, если Ъ—а х 1 —а х 1 —а b —х 1 Исходя из этого определения имеем V 5 - 1 , ,(6 —а). ч х 1 — а -\-------— Аналогично для х 2 имеем х 1 —а х 2 —а х 2 —а х 1 —х 2 и поэтому о х = аН 3 —у/Ъ. ~ ч На основе сравнения значений функции f ( x ) в этих точках проводится итср*1' ционное уточнение интервала, на котором функция имеет минимум. ЧисЛ° 211 g 3 Упражнения итераций п для достижения необходимой точности е в определении точки минимума определяется равенством | „ |Ь - а |с = е , >/5-1 с = — -— . g модуле golden функция g o ld en () обеспечивает нахождение минимума функции одной переменной f ( x ) на интервале [а, Ь]. Модуль g o ld e n import math as mt def g o ld en (f, a, b, t o l = l . 0e - 10) : иии Golden se c tio n method fo r determ ining x th a t minimizes th e s c a la r fu n c tio n f ( x ) . The minimum must be b rack eted in ( a , b ) . иии c l = (m t.s q r t( 5 .) - 1 .) / 2. c2 = 1 . - c l n i t = in t( m t.c e iK m t.lo g ( t o l / a b s(b -a )) / m t.lo g ( c l) ) ) # F ir s t ste p xl = cl* a + c2*b x2 = c2*a + cl*b f l = f ( x l) f 2 = f ( x 2) # I te r a tio n fo r i in r a n g e ( n it) : if f l > f 2: a = xl x l = x2 fl = f2 x2 = c2*a + cl*b f 2 = f ( x 2) e ls e : b = x2 x2 = xl f2 = fl x l = cl* a + c2*b fl = f(x l) if f l < f 2: re tu rn x l , f l e ls e : re tu rn x2 , f 2 Задачи минимизации функций 212 х Рис. 8.1 График функции у = (х2 - 6х + 12) (ж2 + 6х + 12) 1 Для оценки интервала, на котором функция f ( x ) достигает минимума, будем использовать график у = f (x). С учетом этого для нахождения минимума функции (х2 - 6я + 12)(ж2 + 6ж + 12)-1 используется следующая программа. ||Я 1 1 Р 1 !И import numpy as np import m a tp lo tlib .p y p lo t as p i t from golden import golden def f ( x ) : r e tu rn (x**2 - 6 .*x + 12.) / (x**2 + 6 .*x + 12.) a = 0. b = 20. x = n p .lin s p a c e (a , b, 200) у = f (x) p i t . p l o t ( x , y) p i t . x l a b e l ( ’x ’) p it.g rid (T r u e ) p i t . show() xMin, fMin = g o ld e n (f, a, b) g 3 Упражнения 213 r^nt ’xMin = ’, xMin print ’fMin = ’, fMin xMin - 3.4 6 4 1 0 1 6 3 3 0 3 fiylin = 0 .0 7 1 7 9 6 7 6 9 7 2 4 5 pla интервале [0,20] найдены одна точка минимума (см. рис. 8.1). у п р а ж н ен и е 8.2 Напишите программу для нахоэюдения минимума функ­ ции нескольких переменной f( x ) градиентным методом при выборе ите­ рационных параметров из минимума функции одной переменной, который находиться методом золотого сечения (модуль golden). Проиллюстрируйте работу программы при минимизации функции 10(х2 —х \) 2 + (1 —Xi)2. Б модуле grad функция grad () находиться минимум функции многих пере­ менных при аналитическом задании ее градиента. Модуль g rad import numpy as np import math as mt from golden import golden def grad(F, GradF, x, d=0.5, t o l = l . e - 1 0 ) : иии Gradient method f o r determining v e c to r x t h a t minimizes the fu n c tio n F(x), GradF(x) i s f u n c tio n f o r g r a d ( F ) , x i s s t a r t i n g p o in t. иии # Line fu n c tio n along h def f ( a l ) : r e t u r n F(x + al*h) grO = - GradF(x) h = grO.copyO F0 = F(x) itMax = 500 fo r i in ra n g e (itM ax): # Minimization ID fun c tion a l , fMin = go ld e n (f, 0, d) x = x + al*h Fl = F(x) g r l = - GradF(x) i f ( m t . s q r t ( n p . d o t ( g r l , g r l ) ) <= t o l ) or (abs(F0 - Fl) < t o l ) : r e t u r n x, i+1 h = grl grO = g r 1 . copy() F0 = Fl p r i n t "Gradient method did not converge (500 i t e r a t i o n s ) " 214 Задачи минимизации функцц^ 3.0 2.5 2.0 1.5 1.0 0.5 0.0 -0.5 _1 -2.0 -1.5 -1.0 -0.5 0.0 0.5 1.0 1.5 2.0 Рис. 8.2 Линии уровня функции 10(^2 —X2)2 + (1 —Х\)2 Для оценки начального приближения используется график исследуемой функции 10 (х*2 - xf ) 2 + (1 —Xi)2 с использованием следующей программы. ехег - 8 2.р у import пшпру as np import matplotlib.pyplot as pit from grad import grad def F(x): return 10.*(x[l] - x[0]**2)**2 + (1 - x[0])**2 def GradF(x): gr = np.zeros((2),’ float>) gr[0] = -40.*(x[1] - x [0]**2)*x[0] - 2.*(1 - x[0]) gr[1] = 20.*(x[l] - x [0]**2) return gr # graph of function x = np.linspace(-2., 2., 101) у = np.linspace(-l., 3., 101) X, Y = np.meshgrid(x, y) z = F([X, Y]) 215 g§4 Задачи v = n p . l i n s p a c e ( 0 ., 10., 21) p i t . co ntou rf(x, y, z, v, cmap=plt. cm.gray) p i t . c o lo r b a r () p it .showO # minimum fu nc tio n x0 = n p . a r r a y ( [ 0 . , 0 .1 ]) xMin, n i t = grad(F, GradF, xO) p r in t ’XMin:’ , xMin p ri n t ’Number of i t e r a t i o n s = ’ , n i t xMin [ 0 .9 9 9 9 5 3 8 3 0 .9 9 9 9 0 3 0 5 ] Number of i t e r a t i o n s == 372 функция имеет выраженный овражный характер (рис. 8.2), что обуславлива­ ет достаточно медленную сходимость градиентного метода. 8.4 З а д а ч и З а д а ч а 8.1 Напишите программу для нахоэюдения минимума функции од­ ной переменной f( x ) на интервале [а, Ь\ с использованием интерполяцион­ ного полинома второго порядка. С помощью этой программы найдите два первых локальных минимума функции х 2 — 50siii(.x*) при х > 0. З ад ач а 8.2 Напишите программу для нахоэюдения локального минимума функции одной переменной f( x ) методом Ньютона. С ее помощью найдите минимум функции 2х — 1 Н- 2cos(7rx) на интервале [0,2]. З ад ач а 8.3 Напишите программу для нахоэюдения локального минимума функции многих переменных f( x ) методом Ньютона. Продемонстрируйте работоспособность программы на задаче нахоэюдения минимума функции х\ + х \ — ЗХ1Х2 , x Q > 0, а = 1,2 при различных начальных приблиэюениях. У п р аж н ен и е 8.3 Напишите программу для нахоэюдения минимума функ­ ции одной переменной f ( x ) на интервале [а, Ь] при ограничениях д(х) > 0 методом штрафа с использованием метода золотого сечения для решения задачи безусловной минимизации. С ее помощью найдите минимум функ­ ции е~хх при х > 2. 9 Интерполирование и приближение функций Рассматриваются задачи приближенного восстановления значений функции одной переменной по ее значениям в некоторых точках. Традиционный под­ ход для одномерной интерполяции связан с построением алгебраических мно­ гочленов, принимающих заданные значения в точках интерполяции. Более перспективными являются подходы с использованием кусочно-гладких поли­ номов. Отдельно выделены задачи приближения функций в нормированных пространствах. О сновн ы е о б означен ия /(z) — интерполируемая функция Х0 < Xi < ... < х„ — узлы интерполирования {<Pi(x)}?=o — система Чебышева <р(х) — обобщенный интерполяционный многочлен L n(x) — интерполяционный многочлен n-го порядка f(Xi,Xi+1) — разделенная разность первого порядка f{Xiy Xi+\, . . . , Xj+fc) — разделенная разность к-го порядка Sm(x) — интерполяционный сплайн т -го порядка 9.1 З а д а ч и и н тер п о ляц и и и п р и б л и ж е н и я ф у н к ц и й Задача интерполяции ставится следующим образом. Пусть на отрезке [а, Ь] в узлах интерполирования х 0 < ад < ... < х п известны значения функции Di = ffo i), i = 0 ,1 ,... ,п. Необходимо найти значения функции f( x ) в точках х Ф Xi, i = 0 ,1 ,..., п. 9.2 Алгоритмы интерполяции и приближения функций 217 Пусть па отрезке [а, Ь] задана система функций'{<рг(ж)}”=0 и определим tP(x ) = Y l c i<Pi(x) (9.1) г= 0 с действительными коэффициентами с*,г = 0 , 1 , . . . , п. При интерполирова­ нии функции f( x ) для нахождения коэффициентов используются условия <p(xi) = f(x i), г = 0 ,1 ,..., n. (9.2) В частном случае алгебраической интерполяции ipi(x) = х \ i = 0 ,1 ,... , п. При интерполяции сплайнами функция f( x ) приближается многочленами невысокой степени на частичных отрезках [ж*,а;*+1], где г = 0 ,1 ,... ,п —1. Рассматривается также задача построения обобщенного многочлена ср(х) приближающего заданную функцию f( x ) . В линейном нормированном про­ странстве коэффициенты обобщенного многочлена <р(х) определяются из условия минимальности нормы погрешности интерполирования: и Ы - 'Е 'Ь У Ш г=0 (9.3) Аналогично ставится задачи интерполяции и приближения многомерных функций. 9.2 А л го р и тм ы и н тер п о л яц и и и п р и б л и ж ен и я ф у н к ц и й Для одномерных функций задачи интерполяции решаются с использованием алгебраических многочленов Лагранжа и Ныотона, параболических и куби­ ческих сплайнов, рассмотрена задача наилучшего приближения в гильберто­ вом пространстве. Полиномиальная интерполяция При аппроксимации полиномами используются функции < P i(x )-x \ * = 0,1 и интерполяционный многочлен (см. (9.1)) имеет вид П <р(х) = L n(x) = Y ^ CiX*1=0 Интерполяционный многочлен Лагранжа записывается в виде 218 Интерполирование и приближение функций где и ( х ) — многочлен степени п + 1: п ш(х ) = П ( г - х<)> г= 0 а // \ / \ Можно использовать другую запись интерполяционного многочлена в ви­ де интерполяционного многочлена Ныотона, которая строится с помощью разделенных разностей. Разделенной разностью первого порядка называется отношение № „ * „ ,) = %i+1 Разделенная разность к -го порядка определяется по рекуррентной формуле / (З Щ * ^ г + 1 ) • • • 5 З^г+А:) / (^ г+ 1 ) ^ г+ 2 ) • • • )3'i+k) f (^г? ^'i+l ?• • • j ^i+k—l) •^i+k С использованием таких обозначений получим L n{x) = f ( x 0) + ( х - x 0) f ( x 0,x i)+ + (ж - х 0) ( х - X l ) f ( x 0, X 1,X2) + . . . ... + ( х - х 0){х - Xi) ■■■(х - x n- i ) f ( x o ,x l t . . ,,х„). (9.5) Интерполяционные сплайны Пусть функция f( x ) задана в узлах а = х 0 < х i < ... < х п = Ь. Интерполя­ ционный сплайн S m(x) порядка т определяется из условий: 1. на каждом отрезке [ж*,.Тг+i],i = 0 ,1 ,... ,n —1 S m(x) является полиномом степени га; 2. на всем отрезке [а, 6] S m(x) имеет непрерывные производные до порядкаr n — 1; 3. в узлах интерполяции *5т (^г) — f (^г) j ^ —0 ,1 ,... , 71. При т > 2 единственность Sm{x) обеспечивается т — 1 дополнительным11 условиями. Обычно эти условия формулируются на концах отрезка интерн0' ляции [а, Ь]. g 2 Алгоритмы интерполяции и приближения функций 219 Интерполяционный кубический сплайн Ss(x) на отрезке [xi,Xi+\] задается полиномом третьей степени: s i l) = а ,+ bi(х - Xi) + ^ ( x - Xif + j ( x - Xi)3, X{ < x < xi+1, i = 0 ,1 ,..., n — 1, (9.6) причем «, = ^ ( 4 Ь = d2S f . . Ci~ , dx2 ^ d3S f , i_ . da;3 По определению для S^(x) выполнены условия: S ^ & i ) = f(x i), г= 0 , 1 ,..., n - 1 , 5 ^ ’(a;i+1) = f( x i +i), i = 0 ,1 ,... ,n - 1, d S f. . dSii+1), . - ^ - ( a ; i+i) = d^ — (x i+l), d2S f , . d2s £ + 1 ). dx2 (x<+1) — dx2 . n , г = 0 ,1 ,..., n - 2, . ^ i+1^’ . , г 0 ,1 ,..., гг 2. Два дополнительных условия можно взять в виде (естественные кубические сплайны) d?si0), . dx2 (X'o) “ .. n (Жп) " ' d2S<n- 1> ’ da:2 Приближение функций в нормированном пространстве Пусть Н — вещественное гильбертово пространство со скалярным произве­ дением (f , g ) и нормой II/H = (/, Z)1/2. В случае Н = L2(a,6) имеем (f,0) = / f(x)g(x)dx, D/ll = !/(ж)| В задаче о паилучтем приближении по системе функций <р{(х) € Я, г = 0 ,1 ,... ,п строится обобщенный многочлен (9.1) (элемент наилучшего приближения), который для заданной приближаемой функции f( x ) £ Н минимизирует нор­ му отклонения (9.3). Интерполирование и приближение функций 220 Коэффициенты элемента наилучшего приближения находятся из решении следующей системы линейных уравнений: = (/.¥>«)) г = 0 ,1 ,..., п. (9.7) з=о 9.3 У п р а ж н е н и я У п р а ж н ен и е 9.1 Напишите программу для интерполирования данных на основе интерполяционного многочлена Ныотона. С помощью этой програм­ мы интерполируйте данные в равноотстоящих узлах для функции Рунге /(;х) = (1 + 25ж2)-1 на интервале [-1,1] при п = 4,6,10. В модуле interpolation функция coef () предназначена для вычисления коэф­ фициентов интерполяционного многочлена Ныотона, а функция in te r p o la ­ tio n () — для вычисления значения интерполяционного полинома в заданной точке. e s iiiiiiis def in t e r p o l a t i o n ^ , х, xO): кпн E valuates Newton’s polynom ial a t xO. иии # Degree of polynomial n = le n (x ) - 1 yO = c[n] fo r k in ra n g e d ,n + 1 ): yO = с [n-k] ■+ (xO - x [n -k ]) * yO re tu rn yO def c o ef(x , y ) : иии Computes th e c o e f f ic ie n ts of Newton’s polynom ial. иии # Number of d a ta p o in ts m = len (x ) с = у . copy() fo r k in ra n g e d ,m ): с [k:m] = (c[k:m] - c [ k -l])/(x [k :m ] - x [ k - l] ) re tu rn с Решение задачи полиномиальной интерполяция для функции Рунге дается следующей программой. import numpy as np д з Упражнения Рис. 9.1 Интерполяция функции Рунге f(x) = (1 + 25т2) 1 import m a tp lo tlib .p y p lo t as p i t from in te r p o la tio n import in te r p o la tio n , coef def f ( x ) : re tu rn 1. / (1 + 25*x**2) a = -l. b = l. X1 - n p .lin s p a c e (a , b, 200) У1 = f ( x l) p i t .p l o t ( x l , y l) aL ist = [4, 6, 10] s g lis t = [ ’ — \ f °r k in r a n g e ( le n ( n L is t) ) : n = n L ist[k ] x = n p .lin s p a c e (a , b, n+1) У = f(x ) p i t . s c a t t e r ( x , y, marker=, o , ) с = co ef(x , y) yl = i n t e r p o l a t i o n ^ , x, x l) s i = ,n=> + s tr ( n ) 221 222 Интерполирование и приближение функций sg = s g l i s t [к] p i t . p l o t ( x l , y l, sg, la b e l= s l) p i t . x l a b e l ( ’x ’) p it.g rid (T r u e ) p i t . Iegend(loc=0) p i t . showO Расчетные данные, приведенные на рис. 9.1, демонстрируют недостатки по­ линомиальной аппроксимации при больших га. У п р а ж н е н и е 9.2 Напишите программу для интерполирования данных па основе естественного интерполяционного кубического сплайна. С помощую этой программы интерполируйте данные в равноотстоящих узлах для функции Рунге f( x ) = (1 + 25ж2)-1 на интервале [-1,1] при п = 4,6,10. Сначала получим расчетные формулы для коэффициентов естественною ку­ бического сплайна. Введем обозначения Iti — Xi Ъ— 1 ,2 ,... , 77». Для кубического сплайна S3(x) с учетом представления (9.6) получим следу­ ющую систему уравнений: ai = f(x i), г = 0 ,1 ,..., га- 1 , с d at + bihi+i + ^h%+1 + = f ( x i+i), bi + Cihi+i + -^h?+1 = b{+1, Ci + dihi+1 = ci+1, c0 = 0, (9.8) i = 0 ,1 ,... i = 0 ,1 ,..., n —2, г = 0 ,1 ,... ,ra - 2, cn_i + d n ^h n = 0. ,ra - 1, (9.9) (9.10) (9.11) (9.12) Формально доопределим cn = 0, тогда из (9.11) и второго условия (9.12) получим di = Ci+1~ C\ k+ i i = 0 ,1 ,..., n - 1 , (9.13) а вместо (9.12) будем иметь с0 = 0, сп = 0. (9.14) Подстановка (9.8), (9.13) в (9.9) дает следующее представление для коэффи' циентов bi: bi = /(a:i+1/) ~ /(a;i) - fli+1 0 i = 1 ,2 ,..., га —1. + 2cj), (9.15) 223 Q'3 Упражнения О учетом (9.13), (9.15) соотношения (9.10) приводят к уравнению ( f { x i + l ) - f ( Xj) f(Xi) - f ( X i _i ) N F^H-1 <9i6) i — 1 ,2 ,..., n — 1. Тем самым приходим к линейной системе уравнений (9.14), (9.16) с трехдиа­ гональной матрицей с диагональным преобладанием. Решение этой системы всегда существует и единственно. Другие коэффициенты сплайна определя­ ются в соответствии с (9.8), (9.13), (9.15). В модуле spline функция coef s p lin e () предназначена для вычисления коэф­ фициентов интерполяционного кубического сплайна, а функция sp lin e () — для вычисления значения кубического сплайна в заданной точке. Для нахо­ ждения коэффициентов сплайна используется функция solveLU3() (решение системы уравнений с трехдиагональной матрицей) из модуля 1иЗ. Модуль s p lin e import numpy as np from lu3 import solveLU3 def sp lin e (x , y, c, xO): иии E valuates cubic s p lin e a t xO. ик и def fin d (x , xO): ■. иии Find th e segment spanning xO иии iL = 0 iR = len (x ) - 1 w hile iR - iL > 1: i = (iL + iR) / 2 i f xO < x [ i ] : iR = i e ls e : iL = i r e tu rn iL i = fin d (x , xO) h = x [i+ l] - x [i] yO = ((x [i+ l] - x0)**3/h - (x [i+ l] - x0)*h) * c [i] / 6 . \ + ((xO - x [i])* * 3 /h - (xO - x [i])* h ) * c [i+ l] / 6 . \ + ( y [ i] * ( x [ i+ l] - xO) + у [i+1]*(x0 - x [ i ] ) ) / h re tu rn yO def c o e fsp lin e (x , y ) : Интерполирование и приближение функций 224 иии Computes th e c o e f f ic ie n ts of cubic s p lin e . иии n = a = b = с = f = fo r len (x ) - 1 n p .o n e s ((n + l), ’f l o a t ’) n p .z e ro s((n + 1 ), ’f l o a t ’) n p .z e ro s ( (n+1), ’f l o a t ’) n p .z e ro s ( (n+1), ’f l o a t ’) i in r a n g e d , n ) : a [ i] = 2. * (x [i+ l] - x [ i - l ] ) b [ i] =x [i+ l] - x [i] с [i] =x [i] - x [i-1 ] f [i] =6 .* (y [i+ l] - у [ i ] ) / (x [i+ l] - x [ i ] ) \ - 6 .* (y [i] - у [ i - 1 ] ) / (x [i] - x [ i - l ] ) re tu rn solveLU3(a, b, c, f) Решение задачи интерполяции сплайнами для функции Рунге дается следу­ ющей программой. Рис. 9.2 Сплайп-интерполяция функции Рунге }{х) = (1 + 25а;2) 1 ехег - 9 2 ру g 4 Задачи 225 import numpy as np impo r t m a tp lo tlib .p y p lo t as p i t from s p lin e import s p lin e , c o e fsp lin e def f ( x ) : r e t u r n 1. / (1 + 25*x**2) a = -!• b = 1. m = 200 xl = n p .l in s p a c e ( a , b, m) yl = f ( x l ) p i t . p l o t ( x l , yl) nList = [4, 6, 10] sg list = ’ : ’] for к in r a n g e ( le n ( n L is t) ): n = nL ist[k] x = n p .l in s p a c e ( a , b, n+1) у = f(x ) p i t . s c a t t e r ( x , y, m a r k e r ^ o ’ ) с = c o e fs p lin e (x , y) f o r i in range(m): y l [ i ] = s p lin e ( x , y, c, x l [ i ] ) s i = ’n=’ + s t r ( n ) sg = s g l i s t [ k ] p i t . p l o t ( x l , y l , sg, la b e l= s l) p i t . x l a b e l ( ’x*) p it.g r id ( T r u e ) p it.le g e n d (lo c = 0 ) p i t . show () Преимущества интерполяции сплайнами иллюстрируются рис. 9.2. 9.4 Задачи З а д а ч а 9.1 Напишите программу для пахоэюдения значения интерполиру­ ющего полинома в точке х.на основе рекуррентных соотношений (алгоритм Невилля): Ри{х) = у и 0 < г < п, p { x ) = (x - x i) P u - i( x ) + (x * - x ) * - M t о < i< j< n . Xi — Xj С помощью этой программы найдите значения в точках х = 1.5, 2.5 при интерполировании функции f( x ) = (arctan(l+ a;2))“ 1 при использовании рав­ ноотстоящих узлов на интервале [—3,3] при п = 4, 6,10. 226 Интерполирование и приближение функций З а д а ч а 9.2 Напишите программу для интерполирования данных на оспо* ее кусочно-линейного восполнения (интерполяционного линейного сплайна) С помощью этой программы интерполируйте данные в равноотстоящие узлах для функции f( x ) = (arctan(l + х 2))~1 на интервале [—3,3] при п ^ 4,6,10. З а д а ч а 9.3 Напишите программу для приблиэ/сения сеточной функции уи i = 0 ,1,...,п полиномом р т(х) = с0 щ х -Ь 4" стх т, т < п методов наименьших квадратов. Работоспособность программы проиллюстрируйте на примере аппроксимации Уг = Xi—ih , 1 -co s(zi), h = 1/п, г = 0 ,1, п для п = 10 и т = 1,2,3. З а д а ч а 9.4 Напишите программу для приблиэюения сеточной функции yi} i = 0 ,1,...,п функцией £(.т) = аеЬх методом наименьших квадратов. С по­ мощью этой программы аппроксимируйте сет,очную функцию Vi = Xi=ih, для п = 10. 1 - cos(.Tj), h = l / n, г = 0, 10 Численное интегрирование Задача приближенного интегрирования состоит в вычислении определенного интеграла по значениям подынтегральной функции в отдельных точках. Рас­ сматриваются классические квадратурные формулы прямоугольников, тра­ пеций и Симпсона. Проводится рассмотрение формул интегрирования при заданных узлах квадратурной формулы. В более общем случае проводится оптимизация квадратурных формул за счет выбора узлов. О сновн ы е обо зн ачен и я f( x ) д(х) х 0 < х г < ... < х п с», г = 0 ,1 ,... ,п L n{x) 10.1 —подынтегральная функция — весовая функция — узлы квадратурной формулы —коэффициенты квадратурной формулы — интерполяционный многочлен п-го порядка З а д а ч и п р и б л и ж ен н о го вы ч и сл ен и я и н тегр ал о в Рассматривается задача приближенного вычисления определенных интегра­ лов pb g (x )f(x )d x (Ю-1) / J а на некотором классе функций f( x ) с заданной весовой функцией д(х). С этой целыо подынтегральная функция задается в отдельных точках :r, отрезка |а ,b\, i = 0 , 1 , . . . , п. Под квадратурной формулой понимается при­ ближенное равенство [ Q {x)f{x)dx (10.2) Численное интегрирование 228 в котором с*, г = 0 ,... ,п — коэффициенты квадратурной формулы. Через г= 0 определим погрешность квадратурной формулы. Минимизация погрешности (увеличение точности) квадратурной формулы на выбранном классе функций может достигается прежде всего за счет вы­ бора коэффициентов квадратурной формулы а также за счет выбора узлов интегрирования. 10.2 А л го р и тм ы п р и бл и ж ен н о го в ы чи сл ен и я и н теграл ов Рассматриваются простейшие квадратурные формулы прямоугольников, трапеций и Симпсона для приближенного вычисления определенных инте­ гралов. Строятся квадратурные формулы интерполяционного типа с задан­ ными узлами квадратурной формулы, обсуждаются вопросы оптимизации квадратурные формулы за счет выбора узлов. Классические квадратурные формулы составного типа Будем рассматривать задачу вычисления интеграла т.е. весовая функция g(x) = 1. Представим интеграл в виде суммы по частич­ ным отрезкам: Приведем некоторые простейшие квадратурные формулы для приближенно­ го вычисления интеграла на частичном отрезке [xi-i,Xi\. Формула (10.3) называется формулой прямоугольников на частичном отрезке [x*_1,х ф где Хг-1/2 = (Zi-i + Х ,)/2. Для случая равномерной сетки uj = { x \ x = Xi = a + ih , г = 0 ,1 ,..., n, nh = b —а} 10.2 Алгоритмы приближенного вычисления интегралов 229 суммирование (10.1) по г от 1 до N дает составную формулу прямоугольников f f(x )d x « J a f ( x i - i /2)h. 1=1 При использовании значений интегрируемой функции в узлах простейшей является квадратурная формула трапеций. В этом случае f (10.4) а для всего отрезка при использовании равномерной сетки получим Г Ja л ^ ^ Ё i= 1 № , ~')2+ Л д‘) о. Z К формуле трапеций мы приходим при замене подынтегральной функции f(x ) кусочно-линейной функцией, которая проходит через точки (.Тг-ь / f e - i ) , (ж»,/(я*). При интерполировании подынтегральной функции на частичном отрезке с использование трех точек (яг-ъ /(e»-i)> f e . i , / (.х*г_1/2) и (.Tj,/(^i) получим квадратурную формулу Симпсона частичного отрезка: £ ' /(» № « № - ) + + / ( 1 , ) (х, - *,-,)■ (10.5) На всем отрезке соответствующая квадратурная формула составного типа имеет вид f f(x )d x * £ ^ >=1 Л * 4 -1 )+ 4 / ( * г - 1 / 2 ) + / ( ^ 6 Квадратурные формулы интерполяционного типа Приведенные выше квадратурные формулы построены на основе разбиения отрезка интегрирования [а, Ь\ на частичные отрезки 1, .тф г = 1 ,2 ,..., п и использованию некоторых простейших интерполяций для подынтегральной функции на этих отрезках. Можно ориентироваться на применение квадра­ турные формул интерполяционного типа, когда подынтегральная функция заменяется интерполяционным многочленом сразу на всем отрезке .интегри­ рования [а, Ь]. Подынтегральная функция f( x ) в (10.1) заменяется интерполяционным мно­ гочленом Лагранжа 230 Численное интегрирование Для коэффициентов квадратурной формулы (10.2) получим представление • - O ' 1- " " ’ (« « I Квадратурные формулы Гаусса Для повышения точности квадратурной формулы можно оптимизировать выбор не только коэффициентов квадратурной формулы с*, г = 0 ,1 ,..., п, по и узлов интерполяции г — 0 ,1 ,... ,п. Квадратурные формулы интерполя­ ционного типа (10.2), (10.6) являются точными для алгебраических полино­ мов степени п. За счет выбора узлов интерполирования строятся квадратур­ ные формулы наивысшей алгебраической степени точности (квадратурные формулы Гаусса), которые точны для любого алгебраического многочлена степени 2n + 1. Потребуем, чтобы квадратурная формула (10.1) была точна для любого ал­ гебраического многочлена степени т. Это означает, что формула точна для функций f( x ) = х а, а = 0 , 1 ,..., т: ь п g (x)xadx = г = 0, (10.7) г= 0 Для определения 2п + 2 неизвестных с», ж*, г = 0 ,1 ,... ,п имеем нелинейную систему (10.7) т + 1 уравнений. Для знакопостоянной весовой функции д(х) система уравнений (10.7) при m = 2п+1 имеет единственное решение. При этом квадратурная формула яв­ ляется интерполяционной, т.е. коэффициенты вычисляются согласно (10.6), а узлы должны быть такими, чтобы многочлен п ш(х ) = П ( * г= 0 был ортогонален с весом д(х) любому многочлену q(,т) степени меньше n + V. ь g(x)w(x)q(x)dx = 0. 10.3 У п р а ж н е н и я У п р аж н е н и е 10.1 Напишите программу для приближенного вычисления интеграла от функции f( x ) на интервале [а, Ь\ с использованием квадро' туриой формулы трапеций на основе рекуррентного уточнения при увеличспии числа частичных отрезков в два раза. С помощью этой программы 231 10.3 Упражнения рассчитайте значение интеграла ошибок при х = 1 с различной точностью. Пусть имеется 2п частичных отрезков длиной h = (b - a ) /2 n. При п — 0 имеем /о = (/(<>)+/(& ))£, при п — 1 — h = (/(а ) + /(Ь ))£ + / ( а + h))h = l- I 0 + f( a + h))h. В общем случае имеет место рекуррентное соотношение In+1 = 2п“ 1 ^ / ( а + (2г —1)/г)/г. г=1 Тем самым при увеличении числа частичных отрезков вычисления проводят­ ся только в новых точках. В модуле trap функция t r a p () вычисляет приближенное значение интеграла по рекуррентной квадратурной формуле трапеций. def t r a p ( f , a, b, t o l = l .e - 6 ) : нни I n te g r a l of f(x ) from a to b computed by tra p e z o id a l ru le иии h = b - a Io ld = h * ( f (a ) + f ( b ) ) / 2. m= 1 kMax = 25 fo r k in r a n g e d , kMax): x = a + h / 2. sum = 0. fo r i in range(m ): sum = sum + f(x ) x = x + h Inew = (Io ld + h*sum) /2 i f (k > 1) and (abs(Inew - Io ld ) < t o l ) : break Io ld = Inew m= m* 2 h = h / 2. r e tu rn Inew 232 Численное интегрирование Решение задачи приближенного вычисления интеграла ошибок дается следу, ющей программой. import math as mt from t r a p import t r a p def f ( x ) : r e t u r n 2.*mt.exp(-x**2) / m t.s q r t ( m t.p i) a = 0. b = 1. f o r n in range(5, 11): e r = 10.**(-n) Inew = t r a p ( f , a, b, to l= e r) p r i n t ’t o l = ’ , e r , ’I n te g r a l = ) , Inew Й 1 Й 1 1 щ (||1 ^ Точность вычислений контролируется параметром tol, при его уменьшении точность вычислений повышается (erf(ж) = 0.8427007929497...). У п р а ж н е н и е 10.2 Напишите программу для приблиоюенного вычисления интеграла от функции f( x ) на интервале [а, Ь\ с использованием квадра­ турной формулы Гаусса с весом q{x) на основе табличного задания узлов и коэффициентов. Используйте эту программу для вычисления интеграла при различном числе узлов и сравните приблиэюенпое значение интеграла точным. с Узлы и коэффициенты для рассматриваемой квадратурной формулы Гаусса— Лежандра даны в табл. 10.1. В модуле gauss функция gauss () вычисляет приближенное значение интегра­ ла по этим табличным данным. |||||||||||||||||( |||||||||| import numpy as np def g a u s s ( f , a, b, n ) : иии I n t e g r a l of f(x ) from a to b computed by Gauss-Legendre quadrature using m nodes. lO-3 Упражнения 233 Таблица 10.1 Квадратурная формула- Гаусса—Лежандра n 2 3 4 5 6 7 8 узлы Xi ± 0.57735027 ± 0.77459667 0. ± 0.86113631 ± 0.33998104 ± 0.90617985 ± 0.53846931 0. ± 0.93246951 ± 0.66120939 ± 0.23861919 ± 0.94910791 ± 0.74153119 ± 0.40584515 0. ± 0.96028986 ± 0.79666648 ± 0.52553241 ± 0.18343464 коэффициенты сг 1. 0.5555.5556 0.88888889 0.34785485 0.65214515 0.23692689 0.47862867 0.56888889 0.17132449 0.36076157 0.46791393 0.12948497 0.27970539 0.38183005 0.41795918 0.10122854 0.22238103 0.31370665 0.36268378 пип i f п > 8 or п < 2: p r in t ’The number of nodes must be g r e a te r than 2 and le s s than 8 ’ re tu rn 0 x = n p .z e ro s(n , ’f l o a t ’) с = n p .z e ro s(n , ’f l o a t ’) l == 2: x[0] = 0.57735027 x [l] = - x[0] c[0] = 1. c [ l] = c[0] i == 3: x[0] = 0.77459667 x [l] = - x[0] x[2] = 0. с [0] = 0.55555556 c [ l] = с [0] с [2] = 0.88888889 l == 4: x[0] = 0.86113631 x [l] = - x[0] x [2] = 0.33998104 x[3] = - x [2] 234 Численное интегрирование с [0] = 0.34785485 с[1] = с [0] С [2] = 0.65214515 с [3] = с [2] п == 5: х[0] = 0.90617985 х[1] = - х [0] х [2] = 0.53846931 х[3] = - х [2] х[4] = 0. с [0] = 0.23692689 с[1] =. с [0] с [2] = 0.47862867 с [3] = с [2] с [4] = 0.56888889 п == 6: х[0] = 0.93246951 х[1] = - х[0] х [2] = 0.66120939 х [3] = - х [2] х[4] = 0.23861919 х [5] = - х[4] с [0] = 0.17132449 с[1] = с [0] с [2] = 0.36076157 с [3] = с [2] с [4] = 0.46791393 с [5] = с [4] п == 7: х[0] = 0.94910791 х[1] = - х[0] х[2] = 0.74153119 х[3] = - х[2] х [4] = 0.40584515 х [5] = - х[4] х [6] = 0. с [0] = 0.12948497 с[1] = с [0] С [2] = 0.27970539 с [3] = с [2] с [4] = 0.38183005 с [5] = с [4] с [6] = 0.41795918 п == 8: х [0] = 0.96028986 235 10.3 Упражнения x[l] = - х[0] x[2] = 0.79666648 x[3] = - х[2] x[4] = 0.52553241 x[5] = - х [4] x[6] = 0.18343464 x[7] = - х [6] c[0] = 0.10122854 c [ l] = с[0] с [2] = 0.22238103 c[3] = с [2] с [4] = 0.31370665 с [5] = с [4] с [6] = 0.36268378 с [7] = с [6] c l = (b + a ) /2 . c2 = (b - a ) / 2 . sum = 0. f o r i in rang e(n): sim = sum + c [ i ] * f (c l + c2*x [i]) r e t u r n c2*sum Решение задачи приближенного вычисления рассматриваемого интеграла да­ ется следующей программой. ехег-10,2*ру import math as mt from gauss import gauss def f ( x ) : r e t u r n - m t.lo g(x) / (1. - x) a = 0. b = 1. {or n in ra n g e (2, 9): I = g a u s s ( f , a, b, n) p r i n t ’n = ’ , n, ’I n t e g r a l = ’ , I Ie x a c t = mt.pi**2 / 6. p r i n t ’Exact value =’ , Iex act n ^ 2 n ^ 3 n -= 4 n = 5 n = 6 n ^ 7 n - 8 E xact In te g ra l In te g ra l In te g ra l In te g ra l In te g ra l In te g ra l In te g ra l v a lu e = ^ L54712020996 ^ 1 .5 9 4 2 6 0 8 5 3 4 6 = 1 61 4 0 7 7 9 4 1 1 5 = 1 624 2 0 8 1 1 0 9 3 - 1 630065 4 1 6 3 2 ^ 1 633 7 5 2 1 3 6 4 = l 63.622112467 1 644934 0 6 6 8 5 236 Численное интегрирование Относительно невысокая точность вычислений связана с особенностью подынтегральной функции при х —» 0. 10.4 З а д а ч и З а д а ч а 10.1 Напишите программу для приближенного вычисления инте­ грала от функции f( x ) на интервале [а, Ь] с использованием составной квад­ ратурной формулы Симпсона. Продемонстрируйте работоспособность про­ граммы при вычислении интеграла />71-/2 1= ln(sin (x))dx Jo при различном числе узлов и сравните найденное приблиэюенное значение с точным. З а д а ч а 10.2 Рекуррентную квадратурную формулу трапеций (см. упразд­ нение 10.1) запишем в виде 2 - 1 R (n + 1,1) = - R {n , 1) + ^ 2 f ( a + № ~ 1)h)h. i=1 В методе Ромберга эти данные используются для уточнения приблиэюенного значения интеграла согласно рекуррентным соотношениям т^/ „ ч _ж ч R (n + l,m + 1) - R (n + 1,га) R (n + l,r a + 1) = R (n + l,m ) H------------------— — ---------------- , m < n. Напишите программу для приближенного вычисления интеграла от функ­ ции f( x ) на интервале [а, Ь] методом Ромберга на основе рекуррентной квад­ ратурной формулы трапеций. С использованием этой программы вычисли­ те интеграл 1 = [ \ 4 - x 2)1/2dx Jo при различных п и сравните найденное приблиэюенное значение с точным. З а д а ч а 10.3 Напишите программу для приблиэюенного вычисления инте­ грала от функции (1 — x 2)~1^2f( x ) на интервале [—1,1] с использованием квадратурная формула Гаусса— Чебышева, в которой для узлов и коэффици­ ентов имеют место соотношения x i = cos (2i + 1)тг ■ , 2 ( п + 1) тг а = — — , . г п + 1 = 0,1,..., п . С помощью этой программы вычислите интеграл I = [ Jo при различном числе узлов. (sin (x))~l/2dx 23 7 10.4 Задачи З а д а ч а 10.4 Узлы квадратурной формулы Гаусса для вычисления интегра­ ла от функции /(;х) на интервале [—1,1] есть нули полиномов Леоюандра /_1\П ЛП 1 v ' 2Пп\ dxn u J а для коэффициентов квадратурной формулы имеет место выраоюение с . = ____- ____( d p n + L < x .) Сг (1 - х > ) { 2 dx (Xl) С учетом этих соотношений напишите программу для вычисления узлов и коэффициентов квадратурной формулы Гаусса—Леоюандра. Д ля нахооюдения корней полиномов Леоюандра используйте метод Ныотона и начальные приблиоюения х г ~ cos (г + 3/4)7г п + 3/2 . г = 0 , 1 , п. С помощью этой программы рассчитайте параметры квадратурной фор­ м улы Гаусса—Леоюандра для п = 2,3,..., 8 и сравните эти результаты с данными в табл. 10.1. 11 Интегральные уравнения Среди типичных интегральных уравнений можно выделить интегральные уравнения Фредгольма второго рода. Для их приближенного решения приме­ няется метод квадратур. Второй широко используемый класс методов реше­ ния интегральных уравнений — различные варианты проекционных методов. Отдельно необходимо выделить интегральные уравнения с переменными пре­ делами интегрирования — интегральные уравнения Вольтерра. Интеграль­ ные уравнения Фредгольма первого рода являются характерным примером некорректных задач, для численного решения которых используются методы регуляризации. О сновн ы е о б означен ия ^2 to II н K (x ,s ) — ядро интегрального уравнения X — числовой параметр — узлы квадратурной формулы а — параметр регуляризации ук — приближенное решение на к-й итерации — линейно независимые 1р 1(х), г = 1,2 координатные функции 11.1 З а д а ч и д л я и н те гр а л ь н ы х у р ав н ен и й Будем рассматривать одномерные интегральные уравнения, решение когорых есть и(х), х G [а, Ь]. Линейное интегральное уравнение с постоянным11 пределами интегрирования (уравнение Фредгольма) записывается в виде д(х)и(х) — Х Сь Jа K (x ,s)u (s) = f( x ) , х G [а, Ь], (11.1) 239 11.1 Задачи для интегральных уравнений где k(x,s) — ядро интегрального уравнения, g ( x ),f(x ) — заданные функции, а Л — заданный или неизвестный числовой параметр. Наибольшее внимание уделяется нахождению приближенного решения инте­ грального уравнения Фредгольма второго рода: и(х) - А / К {х, s)u(s)ds = f( x ) , х € [а, 6] (11.2) при заданном А. При f( x ) уравнение (11.2) есть однородное уравнение Фредгольма (11.3) которое всегда имеет тривиальное решение и(х) = 0. Те значения параметра А, при которых уравнение (11.3) имеет ненулевое решение, называются харак­ теристическими числами, а соответствующие ненулевые решения уравнения — собственными функциями (1/А — собственные значения). Линейное интегральное уравнение Фредгольма первого рода имеет вид .6 (11.4) т.е. в общей записи (11.1) д(х) = 0 и А = - 1 . Принципиальные трудности приближенного решения этого уравнения порождены тем, что задача нахо­ ждения решения интегрального уравнения первого рода является некоррект­ но поставленной. Некорректность обусловлена, прежде всего, отсутствием устойчивости решения по отношению к малым возмущениям правой части уравнения (11.4). Отдельного рассмотрения заслуживают интегральные уравнения с перемен­ ными пределами интегрирования. Интегральное уравнение Вольтсрра второ­ го рода записывается в виде х 6 [а,Ь]. (11.5) По аналогии с (11.4), (11.5) для уравнения Вольтерра первого рода имеем ( 11 .6 ) В вычислительной практике рассматриваются и более общие задачи для ин­ тегральных уравнений, среди которых отметим прежде всего многомерные интегральные уравнения. Большое внимание уделяется разработке числен­ ных методов для специальных классов интегральных уравнений. Отметим, в частности, интегральные уравнения с разностным ядром К (х — s). 240 Интегральные уравнения 11.2 М етоды р еш ен и я и н те гр а л ь н ы х у р авн ен и й Выделены основные классы методов приближенного решения интегральных уравнений. Метод квадратур (механических квадратур) основан на замене интегралов конечными суммами с использованием квадратурных формул. В проекционных методах приближенное решение ищется в виде разложения по системе известных линейно независимых функций. Отмечаются особенности решения интегральных уравнений Вольтерра, кратко обсуждаются методы решения интегральных уравнений первого рода. Интегральные уравнения Фредгольма второго рода Будем рассматривать алгоритмы численного решения интегральных уравне­ ний (11.2), считая заданным параметр Л. В основе метода квадратур лежит та или иная квадратурная формула. Пусть х г < х 2 < • • • < х п — узлы, а Сг, г = 1 ,2 ,... ,п — коэффициенты квадратурной формулы на отрезке инте­ грирования [а, 6]. При использовании квадратурной формулы г=1 приближенное решение интегрального уравнения (11.2) определим из систе­ мы линейных алгебраических уравнений п Vi~ ^ Y ^ ciK {xi,Sj)V j i = где уi — приближенное решение в узле = 1,2,... ,n , (11.7) г = 1 ,2 ,..., п. В проекционных методах приближенное решение интегрального уравнения (11.2) ищется в виде П ( 11.8 ) i=l где <Pi(x), г = 1 ,2 ,..., п — заданные линейно независимые функции, которые называются координатными. Часто удобнее ориентироваться па несколько отличное от (11.8) представление приближенного решения: n (П.9) i=1 Метод проекционного типа характеризуется выбором координатных функций <Pi(;х ) , г = 1,2, . . . , п и способом определения вектора неизвестных коэффи­ циентов с = {ci,c2, . . . ,сп}. Отметим некоторые возможности по нахождению коэффициентов в представлении (11.8), (11.9). 241 11.2 Методы решения интегральных уравнений При использовании представления (11.8) определим невязку п pb п r(x ,c ) = ^ 2 c iip i{ x ) - X / K { x ,s ) '$ 2 c j tpj {s)ds - f{ x ). Ja i= 1 3=1 В методе наименьших квадратов постоянные с*, г = 1 , 2 ,..., п находятся из минимума квадрата нормы невязки в L2(a, b), т.е. гъ J(c) = / r 2(x,c)d x min, с £ R n. J а Для определения с*, г = 1,2, ...,т г получим систему линейных алгебраиче­ ских уравнений п ^ ^ = 6j, 2 1, 2, . . . , (11.10) 71, 3= 1 где />Ь /*6 аи = / K {x,s)(fii(s)ds)x J a J а x(ipj(x) — А / K (x^s)ipj(s)ds)dx1 Ja pb b i= pb f ( x ) ( 4 >i(x) - A / K (x,s)ifii(s)ds)dx, ./a * = 1 ,2 ,...,» . «/a Тем самым матрица системы (11.10) симметрична. В методе Галеркина коэффициенты с*, i = 1 ,2 ,..., п определяются из усло­ вия ортогональности в L2(a, 6) невязки г (ж, с) функциям ipi(x), г = 1 ,2 ,..., п: / r ( x )c)(pi (x)d x, г = 1 , 2 , . . . , п. •/ a В этом случае имеем систему линейных уравнений (11.10), в которой o>ij — / (</?j{x) — X Ja K (x,s)(p j(s)d s)vi(x)dx, Ja bi= f(x)ipi(x)dx, г = 1 ,2 ,... ,n. J a Отметим среди проекционных методов и метод коллокации. В этом случае на отрезке [a,b] выбирается п точек коллокации а;*, г = 1 ,2 ,... ,п и коэффи­ циенты С\, г = 1 ,2 ,... ,п в представлении (11.8) (или (11.9)) выбираются так, нто невязка обращалась в нуль в точках коллокации, т.е. г(х*г, с) = 0, г = 1 ,2 ,..., п. 242 Интегральные уравнения Для коэффициентов матрицы и правой части системы (11.10) при использо­ вании представления (11.8) получим O ij = < P j ( x i ) - А [ K ( x iy s)(fj(s)ds Ja bi = f(x i), i — 1 ,2 ,,.. ,n. Для решения системы линейных алгебраических уравнений (11.10) примениются прямые или итерационные методы. Интегральные уравнения с переменными пределами интегрирования При приближенном решении интегрального уравнения Вольтерра второго рода (11.5) используется как метод квадратур, так и проекционные мето­ ды. Для определенности, будем считать, что Х\ = а, х п = Ь. Для точек х и i = 1 ,2 ,..., п из (11.5) получим и (х{) - А / K (x i,s)u (s)d s = f(x i), Jа z = l,2 ,...,n . (H -ll) Принимая во внимание то, что интегрировать необходимо по отрезку пере­ менной длины, запишем используемую квадратурную формулу в виде Г Ja 6(x)dx « ^ 2 c^ 0 { x j)i г = 2 ,3 ,..., n. j=i Применение к (11.11) дает систему линейных уравнений г y i - \ ' ^ c f K { x i , S j ) y j = f ( x i ), 3= г = 1 ,2 ,..., п. (11.12) 1 Отличительная особенность системы уравнений (11.12) состоит в том, что матрица ее коэффициентов треугольная. Это позволяет найти приближен­ ное решение интегрального уравнения у и у2, . . . , уп последовательно друг за другом по рекуррентным формулам в предположении, что все диагональные элементы матрицы ненулевые. Наиболее простые расчетные формулы при решении интегрального уравнения Вольтерра второго рода мы получим при использовании квадратурной формулы трапеций. При численном решении интегрального уравнения первого рода (11.6) мож­ но ориентироваться на использование метода квадратур. Подобно (11.11) из (11.6) будем иметь К ((£{, s),u(s)c/5 —f (Tj), i — 1 ,2 ,..., 71, 243 11.2 Методы решения интегральных уравнений что дает систему линейных алгебраических уравнений ф c f K ( x u Sj)yj = f(xi), i = 1 , 2 , ... , п. 3= 1 Для того чтобы решение этой системы существовало необходимо потребовать выполнение условия К (х /х ) Ф 0. При численном решении интегральных уравнений часто полезно провести предварительное преобразование исходной задачи. Типичным примером яв­ ляется приведение интегрального уравнения Вольтерра первого рода к инте­ гральному уравнению второго рода. Будем считать, что ядро и правая часть дифференцируемы К (х ,х ) ф 0. Тогда от уравнения (11.6) можно перейти к уравнению “w +Г k U ' которое представляет собой интегральное уравнения Вольтерра второго рода. Интегральное уравнение Фредгольма первого рода Интегральное уравнение (11.4) есть наиболее характерный пример некор­ ректно поставленной задачи. Некорректность обусловлена тем, что при ма­ лых возмущениях правой части f( x ) не гарантируется малого возмущения решения. Помимо (11.4) рассмотрим уравнение с возмущенной правой частью f K (x ,s)u (s)d s = f(,х), хе[а ,Ь ]. (11.13) Jа Ядро K (x ,s ) есть вещественная непрерывная функция двух аргументов, а f ( x ) ,f ( x ) е L 2(a,b), причем 11/(4 - / (я) II < <5, при использовании обозначений 1И4Ц = ((« ,« ))1/2, ( u ,v ) = f u(x)v(x)dx. Ja При 5 —>0 норма погрешности решения \\й(х) — г/(х)|| не стремиться к нулю. Определим линейный интегральный оператор A y = f K (x ,s)y (s )d s, жЕ [а,6]. (И-14) Jа Задачу с неточной правой частью (11.13) запишем в виде операторного урав­ нения первого рода Au = f . (11.15) 244 Интегральные уравнения В методе регуляризации Тихонова приближенное решение задачи (11.15) на­ ходится из минимума сглаживающего функционала: ./« (у )-> min, у е Ь2{а,Ь), (11.16) где М у) = 1 И у - / ||2 + а ||у ||2, а а > 0 — параметр регуляризации. Обозначим решение задачи (11.16) через уа. Оно может быть найдено как решение уравнения Эйлера для вариационной задачи (11.16) а уа + А* А уа = А* / , где А*у = f K ( s }x)y(s)ds, Jа х Е [а,Ь\. Тем самым приходим к интегральному уравнению Фредгольма ауа + [ G(x, s)ya(s)ds = ф(х), Jа с симметричным ядром х 6 [а,Ь\ G (x ,s )= ( K (t,x )K (t,s )d t Ja и правой частью ф(х) = j K (s ,x )f(s )d s . Ja Принципиальный момент в методе регуляризации связан с выбором пара­ метра регуляризации а, его согласованием с погрешностью входных данных. При использовании принципа невязки параметр регуляризации выбирается из условия I\АУа - /II = <5. При таком выборе а = а(5) норма погрешности \\уа — и\\ —> 0 при 6 —>0, т.е. приближенное решение стремится к точному решению задачи. 11.3 У праж нения У п р а ж н ен и е 11.1 Напишите программу для численного решения инте­ грального уравнения Фредгольма второго рода методом квадратур с исполь­ зованием квадратурной формулы трапеций при равномерном разбиении ин- 11.3 Упражнения 245 щервала интегрирования. С помощью этой программы найдите приблилсенпое решение интегрального уравнения при различном числе частичных отрезков. В модуле fredholm функция fredholm O обеспечивает приближенное решение интегрального уравнения при использовании квадратурной формулы трапеций в методе квадратур. Для решения системы линейных уравнений используется функция solveLUO из модуля lu. import numpy as np from lu import solveLU def fredholm (k, f , a, b, n ) : иии S o lu tio n Fredholm in te g r a l eq u atio n of th e second kind. k (x ,s ) i s th e k e rn e l of th e in te g r a l eq u atio n , f(x ) i s th e r ig h t p a r t , 0 < x ,s < b. Method w ith tra p e z o id a l q u ad ratu re form ula. иии h = A= r = fo r (b - a) / n n p .id e n tity (n + 1 , ’f l o a t ’ ) n p .z e ro s((n + 1 ), ’f l o a t ’ ) i in ra n g e (n + l): x = a + i*h A [i,0 ] = A [i,0 ] - k (x ,a )* h /2 f o r j in r a n g e ( l ,n ) : s = a + j* h A [ i,j] = A [ i,j] - k (x ,s )* h A [i,n ] = A [i,n ] - k (x ,b )* h /2 r [ i ] = f (x) у = solveLU(A, r) re tu rn у Для приближенного решения модельного интегрального уравнения при ис­ пользовании различного числа узлов уи г = 1,2,..., п используется следующая программа. s x e r - 1 1 1 py Рис. 11.1 Приближенное решение при числе узлов п = 6,11,51 import numpy as np import m a tp lo tlib .p y p lo t as p i t from fredholm import fredholm def k ( x , s ) : re tu r n l . / ( n p . p i * ( l . + (x-s)* * 2 )) def f ( x ) : re tu r n 1. a = -1. b = 1. n L ist = [5, 10, 50] s g lis t = ’ : ’] fo r kk in ra n g e (le n (n L is t)): n = nL ist[kk] x = n p .lin s p a c e (a , b, n+1) у = fredholm (k, f , a, b, n) s i = 5n=J + s tr ( n + l) sg = s g lis t[ k k ] p i t . p l o t ( x , y, sg, la b e l= s l) p i t . x l a b e l ( , x >) 247 11.3 Упражнения p it.g r id (T r u e ) p i t . Iegend(loc=0) p i t . showO Сходимость приближенного решения при увеличении числа разбиений п де­ монстрируется рис. 11.1. У п р а ж н ен и е 11.2 Напишите программу для численного решения инте­ грального уравнения Фредгольма первого рода методом квадратур с исполь­ зованием квадратурной формулы прямоугольников при равномерном разбие­ нии интервала интегрирования с симметризацией матрицы системы урав­ нений и ее итерационном решении методом сопряэюенных градиентов. С по­ мощью этой программы найдите приблиэюенное решение интегрального уравнения при различной точности приблиэюенного решения системы линейных урав­ нений и сравните его с точным решением интегрального уравнения. После дискретизации приходим к системе уравнений Ay = f. Итерационный метод сопряженных градиентов применяется для приближен­ ного решения системы уравнений A* A y = A* f. В модуле fredholml функция fre d h o lm l() обеспечивает приближенное реше­ ние интегрального уравнения при использовании квадратурной формулы прямоугольников в методе квад­ ратур. Для решения системы линейных уравнений используется функция eg () из модуля eg. import numpy as np from eg im port eg def fred h o lm l(k , f , a, b, n, t o l = 1 .0 e -9 ): иll II S o lu tio n Fredholm in te g r a l eq u atio n of th e f i r s t k (x ,s ) i s th e k e rn e l of th e in te g r a l e q u atio n , f (x ) is th e r ig h t p a r t, 0 < x, s < b. CG i t e r a t i v e method w ith re c ta n g le q u ad ratu re form ula. ииll kind. Интегральные уравнения 248 h = А= r = for (b - а) / ii n p .z e r o s ( ( n , n ) , ’f l o a t ’) n p .z e r o s ( ( n ) , ’f l o a t ’) i in range(n): x = a + h / 2. + i*h r [i] = f(x) f o r j in range(n): s = a + h / 2. + j*h A[ i , j] = k (x ,s )* h # Symmetrization В = np.copy(A) r r = np.copy(r) f o r i in range(n): r [ i ] = n p .d o t(B [i,0 :n ] , r r [ 0 : n ] ) f o r j in range(n): A[ i , j ] = n p . dot (B [ i , 0: n] , В [0: n , j ]) y, i t e r = cg(A, r , t o l = t o l ) r e tu r n y, i t e r Точное решение интегрального уравнения есть Для его приближенного решения используется следующая программа. import numpy as np import m a t p lo tlib .p y p lo t as p i t from fredholml import fredholml def k ( x , s ) : r e tu r n abs(x-s) def f ( x ) : r e t u r n x**2 a = -1. b = 1. n = 100 h = (b - a) / n x = n p .1in s p a c e (a + h /2 ., b - h / 2 . , n) e r L is t = [1.0e-3, 1.0e-5, 1.0e-10] s g l i s t = [ ’- ’ , , ’ : ’] fo r kk in r a n g e ( l e n ( e r L i s t ) ): er = e r L is t [kk] ;г Рис. 11.2 Приближенное решение при различной точности решения системы уравнений у, i t e r = fre d h o lm l(к, f , a, b, n, t o l = er) p r in t ’i t e r a t i o n = ’ , i t e r , ’to le ra n c e = ’ , e r s i = ’to le ra n c e = ’ + s t r ( e r ) sg = s g lis t[ k k ] p i t . p l o t ( x , y, sg, la b e l= s l) j ) l t . x la b e l ( ’ $x$ ’) p it.y lim ( - 2 , 3) p it.g rid (T r u e ) p i t . legend(loc=8) p i t . showO i t e r a t i o n =. 3 t o l e r a n c e “ 0 001 i t e r a t i o n — 21 t o l e r a n c e — l e —05 i t e r a t i o n = 99 t o l e r a n c e — l e —10 Приближенное решение при различном уровне точности итерационного реше­ ния системы линейных уравнений представлено на рис. 11.2. Некорректность задачи проявляется в нарастании погрешности приближенного решения вбли­ зи концов интервала при увеличении точности решения системы уравнений. 250 Интегральные уравне 11.4 З а д а ч и З а д а ч а 11.1 Напишите программу для численного решения интегралг го уравнения Фредгольма второго рода методом квадратур с использова ем квадратурной формулы Симпсона при равномерном разбиении интерв интегрирования. Используйте эту программу для приблиэюепного реше интегрального уравнения Исследуйте зависимость точности численного решения от числа част ных отрезков. З а д а ч а 11.2 Напишите программу для численного решения интегральь уравнения Фредгольма второго рода методом Галеркина при использоваi кусочно линейных координатных функций ip i( x ) ^ 0 , х^г < х< хш , г = 1,2, ...,п и равномерного разбиения интервала интегрирования. С помощью этой п граммы найдите приблиэюенное решение интегрального уравнения при различных п. З а д а ч а 11.3 Напишите программу для численного решения интегральп уравнения Вольтерра второго рода методом квадратур при использоваi квадратурной формулы трапеций с равномерным разбиением интервала гпегрирования. Примените эту программу для приблиэюепного решение тегрального уравнения при различном числе частичных отрезков. З а д а ч а 11.4 Напишите программу для численного решения интегральн уравнения Фредгольма первого рода методом Тихонова при использова? квадратурной формулы прямоугольников с равномерным разбиением инт вала интегрирования. С помощью этой программы найдите приблиэюен решение интегрального уравнения при ц = 0.05,0.1,0.2. 12 Задача Коши для обыкновенных дифференциальных уравнений В вычислительной практике часто приходится иметь дело с задачами с на­ чальными данными для системы дифференциальных уравнений. Для при­ ближенного решения таких задач традиционно широко используются методы Рунге—Кутта, связанные с вычислением правой части системы уравнений в некоторых промежуточных точках. Второй большой класс методов состав­ ляют многошаговые методы, когда в вычислениях участвуют три и более расчетных слоев. Отдельно выделяются задачи, для которых решение имеет разномасштабные гармоники (жесткие системы обыкновенных дифференци­ альных уравнений). О сновн ы е о б о зн ачен и я и = { u i, • • •, ит} / = { fi, / 2, • • •, /rn} = {tn = пт, п = 0 ,1 ,...} т> 0 уп = у (tn) — -— — — вектор неизвестных вектор правых частей равномерная сетка no t шаг сетки приближенное решение при t = tn 12.1 З а д а ч и с н а ч а л ь н ы м и у сл о в и ям и д л я систем обы кн овен н ы х д и ф ф е р е н ц и а л ь н ы х у р ав н ен и й Рассматривается задача Коши для системы обыкновенных дифференциаль­ ных уравнений = fi{ t,u u u2, . . . , u m), tti(0 )= u ? , t > О, г = 1 ,2 ,..., m. (12.1) (12.2) С использованием векторных обозначений задачу (12.1), (12.2) можем запи­ сать как задачу Коши для одного уравнения: 252 Задача Коши для дифференциальных уравнений (12.3) гг(0) = и°. (12.4) В задаче Коши по известному решению в точке t — 0 необходимо найти из уравнения (12.4) решение при других t. 12.2 Ч и сл ен н ы е м етоды р еш ен и я за д ач и К ош и Отмечаются классические методы Рунге—Кутта и многошаговые методы ре­ шения задачи Коши для систем обыкновенных дифференциальных уравне­ ний, обсуждается специфика численного решения жестких систем. Методы Р унге—К ут т а При построении численных алгоритмов будем считать, что решение этой дифференциальной задачи существует, оно единственно и обладает необхо­ димыми свойствами гладкости. При численном решении задачи (12.3), (12.4) будем использовать равномер­ ную, для простоты, сетку по переменной t с шагом т > 0: = {t„ = ПТ , п = 0 ,1 ,...} . Приближенное решение задачи (12.3), (12.4) в точке t = tn обозначим уп. Метод сходится в точке tn, если \уп - u(tn)\ —» 0 при т —>0. Метод имеет р-й порядок точности, если \уп — u (tn) \ = 0 ( т р), р > 0 при т —» 0. Простейшая разностная схема для приближенного решения задачи (12.3), (12.4) есть л.71+1 —уП --------------= a f ( t n+l,y n+l) + ( l - a ) f { t n,y n), п = 0 ,1 ,... (12.5) При а = 0 имеем явный метод Эйлера и в этом случае разностная схема аппроксимирует уравнение (12.4) с первым порядком. Симметричная схема (а = 0,5 в (12.5) имеет второй порядок аппроксимации. Эта схема относится к классу неявных — для определения приближенного решения на новом слое необходимо решать нелинейную задачу. Явные схемы второго и более высокого порядка аппроксимации удобно строить ориенти­ руясь на метод предиктор-корректор. На этапе предиктора (предсказания) используется явная схема Уп+1Т Уп = /(* „, Уп), 253 12.2 Численные методы решения задачи Коши а на этапе корректора (уточнения) — схема П +1 V _ T ? /П 1 = Д /(* » + i , r +1) + f( t n ,y n)), I n = 0, 1, . . . В одношаговых методах Рунге—Кутта идеи предиктора-корректора реализу­ ются наиболее полно. Этот метод записывается в общем виде „ п + 1 _ ».п « --------т = £г> Л , <=? (12.6) где S h = f(t„ + CiT,yn + T ^ 2 a ijkj ), 3= г = 1 ,2 ,..., s. (12.7) 1 Формула (12.6) основана на s вычислениях функции / и называется s-стадий­ ной. Если dij = 0 при j > г имеем явный метод Рунге—Кутта. Если = 0 при j > г к а ц ф 0, то ki определяется неявно из уравнения г-1 h = f(tn + С,Г, УП + Т ^ 2 aijkj + Тйикг). 3= 1 О таком методе Ру иге—Кутта говорят как о диагонально-неявном. Параметры bi, с{, а^ определяют вариант метода Рунге—Кутта. Используется следующее представление метода (таблица Бутчера): А Ь* ап Cl С2 ^21 dl2 &22 Cs ^sl aS2 *' bi 62 ••* ^Is а>2з С'зз bs Одним из наиболее распространенных является явный метод Рунге—Кутта четвертого порядка: h = f ( t n,y n), к2 = f ( t „ + ^ , y n + т у ) > к3 = f(^ „ + ^ , y n + t ~ J , п+1 _ и к4 = f { t n + T,yn + тк3), 2 --------------— 7(^1 + 2/с2 + 2/с3 + к4). т о 254 Задача Коши для дифференциальных уравнений В компактном представлении (12.8) этого метода имеем с 0 0 1 1 2 2 А - ь* 2 0 0 0 0 0 0 0 - 0 2 1 0 0 1 6 0 1 0 1 1 3 3 1 6 Применяя метод Рунге—Кутта (12.6), (12.7) к решению задачи Коши для уравнения du(t) :/(<), t > о, dt получим уП+1 _ уп = ^ т &.дгп + ат). »=1 Правую часть можно рассматривать как квадратурную формулу для правой части равенства /*tn+i u{tn+1) - u (tn) = Исследование устойчивости используемых разностных схем при решении за­ дачи Коши для систем обыкновенных дифференциальных уравнений прово­ дится чаще всего на модельном одномерном уравнении ^ = Ли, t > 0, (12.9) где Л — комплексное число. Для конкретного численного метода рассматри­ вается множество всех точек комплексной плоскости ц = тА, для которых имеет место устойчивость. Для явного метода Эйлера область устойчивости представляет круг единичного радиуса с центром в точке (—1,0). Метод на­ зывается А-устойчивым, если область его устойчивости содержит полуплос­ кость Re /i < 0. При Re А < 0 устойчиво решение уравнения (12.9) и поэтому для этой задачи условие А-устойчивости означает абсолютную устойчивость (устойчивость при всех т > 0). Многошаговые методы В методах Рунге—Кутта в вычислениях участвуют значения приближенного решения только в двух соседних узлах у к и уп+1 — один шаг по переменной t. 255 12.2 Численные методы решения задачи Коши Линейный m -шаговый разностный метод записывается в виде -I т т - E ai2/n+1_i = 5 3 b i / ( t n+1-i,?yn+1-i). Т г= 0 п = т — 1 ,т ... (12.10) г= 0 Вариант численного метода определяется заданием коэффициентов ai,bi) i = 0 ,1 ,..., rn, причем а0 ф 0. Для начала расчетов по рекуррентной формуле (12Л0) необходимо задать га начальных значений ?/°, т/1, . . . Различные варианты многошаговых методов (методы Адамса) решения зада­ чи с начальными условиями для систем обыкновенных дифференциальных уравнений могут быть получены на основе использования квадратурных фор­ мул для правой части равенства u (tn+1) - u (tn) = J f(t,u )d t. (12-11) Для получения неявного многошагового метода используем для подынте­ гральной функции интерполяционную формулу по значениям функции 1 r n + J £ (л . . ,п + 1\ f — .1 \г п + 1 )У ) ,J n r n + l - m ?•••)/ 5 т.е. ть~\~1 ш ть = E V ( W i -г,Уп+1Л -----т— 1 (12.12) 1=0 Для интерполяционного метода Адамса (12.12) наивысший порядок аппрок­ симации равен га + 1. Для построения явных многошаговых методов можно использовать процеду­ ру экстраполяции подынтегральной функции в правой части (12.11). В этом случае приближение осуществляется по значениям / п, / п-1, . . . , f n+1~m и по­ этому 7 / п + 1 ________ m ----------- = Е т Ш уп+1-% (12.13) Для экстраполяционного метода Адамса (12.13) погрешность аппроксимации имеет га-й порядок. Примерами методов Адамса (12.12), (12.13) при га = 3 являются п+ 1 _ п ---------Т n+1 _ 1 = ^ г ( 9 /п+1 + 1 9 /п - 5 / n_1 + / п- 2), z4 п 1 ----- —— = тт;(23/п —1 6 /n_1 + 5 / п_2) Т (12.14) 1Z (12.15) соответственно. На основе методов Адамса строятся и схемы предиктор-корректор. На этапе предиктор используется явный метод Адамса, на этапе корректора — ана­ лог неявного метода Адамса. Например, при использовании методов третьего 256 Задача Коши для дифференциальных уравнет порядка аппроксимации в соответствии с (12.15) для предсказания реш ет положим —?/n 1 --------— = 7^(23Г - 1 6 /" - 1 + 5 /" " 2). Т 1Z Для уточнения решения (см. (12.14)) используется схема /11^+1 уП 1 т = ^ ( 9 / ( < n + i , r +1) + 19/" - 5 / " - 1 + г ~ 2). Аналогично строятся и другие классы многошаговых методов. Ж есткие системы обыкновенных дифференциальных уравнениг При численном решении задачи Коши для систем обыкновенных диффере] циальных уравнений (12.1), (12.2) могут возникнуть дополнительные тру, ности, порожденные жесткостью системы. Локальные особенности поведет решения в точке и = w передаются линейной системой dVi{t) А0Д, 3= 1 ч J Пусть А*(£), г — 1 ,2 ,... ,га — собственные числа матрицы A(t) = {dijit)}, а ф ) = ^ - { t,w ) . Система уравнений (12.1) является жесткой, если число п /,\ _ max |ReAi(£) 1 < г < т ___________ min iReAj(t) 1 < г< т 1 V ' велико. Э то означает, что в решении присутствуют составляющие с силы различающимися масштабами изменения по переменной t. Для численное решения жестких задач используются вычислительные алг< ритмы, которые имеют повышенный запас устойчивости. Необходимо орие! тироваться на использование A-устойчивых или А(а)-устойчивых методов. Метод называется A-устойчивым, если при решении задачи Коши для ура) нения (12.9) область его устойчивости содержит угол |arg(-M)|<a, ц = Хт. Среди A-устойчивых методов можно выделить чисто неявные многошаговь методы (методы Гира), когда 12.3 Упражнения 257 В частности, при га = 3 имеем схему п?+‘ - Щ Г + 9у ~ '- Ъ Г * = 6т которая имеет третий порядок аппроксимации. 12.3 У праж нения У п р аж н ен и е 12.1 Напишите программу для численного решения задачи Коши для системы обыкновенных дифференциальных уравнений явным ме­ тодом Рунге—Кутта четвертого порядка. Продемонстрируйте работоспо­ собность этой программы при решении задачи Коши d2u — = - sin(гг), / ч и(0) = 1, 0 < t < 47т, du , ч — (0) = 0. В модуле rungeKutta функция rungeK uttaO реализует решение задачи Коши для системы ОДУ методом Рунге—Кутта четвертого порядка. Модуль ru n g e K u tta ^ import numpy as np def ru n g e K u tta (f, tO, yO, tEnd, t a u ) : ики Solve the i n i t i a l value problem y* = f ( t , y ) by 4 th -o rd e r Runge-Kutta method. t0 ,y 0 are the i n i t i a l c o n d itio n s, tEnd i s the term inal value of t , ta u i s the s te p . иии def increm ent(f, t , y, ta u ) : kO = ta u * f(t,y ) kl = ta u * f(t + t a u / 2 . , у+kO/2.) k2 = ta u * f(t + t a u / 2 . , у+k l / 2 . ) k3 = ta u * f(t + ta u , у + k2) r e t u r n (kO + 2.* kl + 2.*k2 + k3) / 6. t = [] у = [] t . append(tO) у .append(yO) while tO < tEnd: ta u = m in(tau, tEnd - tO) yO = yO + increm ent(f, tO, yO, tau) 258 Задача Коши для дифференциальных уравнений tO = tO + ta u t . append(tO) у . append(yO) r e tu r n n p .a r r a y ( t ) , n p .a rra y (y ) При приближенном решении модельной задачи Коши для уравнения второго порядка сначала переходим от одного уравнения второго порядка к системе из двух уравнений = - sin(j/i)>. 0 < £ < 4 т г . Решение задачи при заданном шаге интегрирования т обеспечивает следую­ щая программа. Р ис. 12.1 Приближенное решение задачи при т = 0.25 im port numpy a s np im p o rt m ath as mt im p o rt m a t p l o t l i b .p y p l o t a s p i t from ru n g e K u tta im p o rt ru n g e K u tta def f ( t , y ): f = n p . z e r o s ( ( 2 ) , ’f l o a t ’ ) 259 12.3 Упражнения f[0 ] = у[1] f [ l ] = - m t. s in ( y [0]) re tu r n f tO = 0. tEnd = 4 .*n p .p i yO = n p . a r r a y ( [ 1 . , 0 .] ) tau = 0.25 t , у = r u n g e K u tta (f, tO, yO, tEnd, tau) f o r n in ra n g e (0, 2): r = у [ : , n] s t = ’$y$’ sg = i f n == 1: s t = , $ \ \f r a c { d y H d t J S ’ sg = p i t . p l o t ( t , r , sg, la b e l= s t) p i t . Iegend(loc=0) p i t . x l a b e l ( ’$ t $ ’) p i t.g r id ( T r u e ) p i t . show() В рассматриваемой задарю (колебания маятника) при малых у имеем sin (у) « у и решение уравнение имеет период равный 2тт. Нелинейность проявляется, в частности, в увеличении периода (см. рис. 12.1). У п р а ж н е н и е 12.2 Напишите программу для численного решения задачи Коши для системы обыкновенных дшрференциалъных уравнений с использо­ ванием двухслойной схемы с весом при решении системы нелинейных урав­ нений на новол1 временном слое методом Ньютона. Используйте эту про­ грамму для решения задачи Коши (модель Лотка—Вольтерра) dip = У\ ~ 2/12/2, duo = —2/2 + 2/12/2, 2/1(0) = 2, 0 < t < 10, у2(0) = 2. Реализация двухслойной (одношаговой) схемы с весом проводится функцией oneStepO в модуле oneStep. Для решения системы нелинейных уравнений используется модуль newton. Модуль o n e S te p . import numpy as np from newton import newton def oneStep(f, tO, yO, tEnd, nTime, t h e t a ) : ii ии Solve the i n i t i a l value problem y ’ = f ( t , y ) by one-step methods im p l i s i t method. 260 Задача Кош и для дифференциальных уравнений t0 ,y 0 are the i n i t i a l c o n d itio n s , tEnd i s the te rm in al value of t , nTime i s the number of s te p s . кии ta u = (tEnd - tO) / nTime def f 1( y l ) : f l = y l - ta u * t h e t a * f ( t 0 + t a u , y l ) \ - yO - ta u * ( 1 . - th e ta ) * f(t0 + ta u ,y 0 ) r e tu r n f l t = [] у = [] t . append(tO) у .append(yO) f o r i in range(nTime): r = yO - ta u * f(t0 + ta u ,y 0 ) y l , i t e r = n ew ton(fl, r) yO = yl tO = tO + ta u t . append(tO) у .append(yO) r e t u r n n p . a r r a y ( t ) , n p .a rra y (y ) Решение модельной задачи Коши при постоянном шаге по времени обеспечи­ вает следующая программа. import numpy as np import m a tp lo tlib .p y p lo t as p i t from oneStep import oneStep def f ( t , y ) : f = n p . z e r o s ( ( 2 ) , ’f l o a t ’) f COD = у [0] - у [0] *y [1] f [1] = -yCl] + y [0 ]* y [l] r e tu r n f tO = 0. tEnd = 10. у0 = n p . a r r a y ( [ 2 . , 2. ]) nTime = 50 th eta = 0 . 5 t , у = oneStep(f, tO, yO, tEnd, nTime, t h e ta ) fo r n in ra n g e (0, 2): r = у [ : , n] s t = ’$y _l$’ sg = i f n == 1: 261 12.4 Задачи Рис. 12.2 Решение задачи при в = 0.5 s t = ’$у_2$’ sg = p i t . p l o t ( t , r , sg, la b e l= s t) p i t . legend(loc=0) p i t . x la b e l ( ’$ t$ 0 p it.g r id ( T r u e ) p it.sh o w () Решении задачи при 50 шагах по времени и использовании симметричной схе­ мы в = 0.5 (второй порядок точности) показано на рис. 12.2. Использование чисто неявной схемы 9 = 1 приводит к заметному уменьшению амплитуды колебаний. 12.4 З а д а ч и З а д а ч а 12.1 Д ля контроля шага интегрирования при использовании явно­ го метода Рунге—Кутта используется следующая процедура (метод Рунге— Кутта—Фельберга). Сначала вычисляются следующие значения h = f( t„ ,y n), k3=f{^+lT’yn+hTki +:k Tk2)' ,Л 12 „ 1932 , k* = f [ t n + — T,y + _ rt, n ,Л 439 , 7296 , 2197T 3,1 7200 , „ , 3680 , h = f [ t n + т,у + — rk, - 8тк2 + — 845 тк3 - ш , тк4 , = ft[(t.n +, -т. 1 у n - -8т к, , + о2rk2 , - -3544 , + — 1859 тк, , - -11т к, ъ ke — rk3 Затем ищется приблиэюенное решение методом Рунге—Кутта четверто, порядка, когда ~n+i _ уп 25 1408 — 777*4 + 7777 2197 х + 77777^4 _ 7 ^5- г 216 2565 4104 5 Это решение сравнивается с более точным, которое мы получаем методо Рунге—Кутта пятого порядка точности: уп+1 _ уп 1б б б5 б 285б1 т " 135 + 12825 + 56430 Оптимальная величина шага есть sr, где er g 2 " М *5 + 5 5 ^ N1/4 ч2|уп+1 - уп+1\ а е — заданная допустимая погрешность приблилсепного решения. Напиши те программу, которая реализует подобную стратегию контроля шага г времени для численного решения задачи Коши для системы обыкновеппь дифференциальных уравнений. Проведите численные эксперименты решет с различной точностью е задачи du 9 — = 1+ и , £>0, и(0) = 0. З а д а ч а 12.2 Напишите программу, которая реализует метод предикто\ корректора: Tjn + 1 _ v n ■ т ?уп + 1 — 7/n т 1 = ^ ( 5 5 / п - 59/ " - 1 + 37 - 9 / п_3), 1 = 2 4 (9 /(i„+ i,r+I) + 19/n - 5 /" - 1 + Г ' 2). С помощью этой программы решите задачу dy\ -ц Г = У 2 -У з, dy2 - ^ = V i + a y 2, dy^ , ч — = b + уз(Vi - с ) , 0 < й < 100, 263 12.4 Задачи l/i(0) = l, у2(0) = 1, 2/з (0) = 1 при а, 6, с = 0.2,0.2,2.5 и а,Ь,с = 0.2,0.2,5. З а д а ч а 12.3 Напишите программу для приблиэюеппого решения задачи Ко­ ши для уравнения второго порядка § = /(* ,« ), и (0 )= и ° , 0 <<<Г, ~^(0) — v° методом Штёрмера третьего порядка точности: 7 /П + 1 — 9 7 / n -I - 7 in — 1 Д 7 1 = ^ ( 1 3 /( < „ )2/") - 2 f( tn- u y”- 1) + f ( t n_2,y n- 2)). Используйте эту программу для решения задачи с правой частью f{ t,u ) = —si и (гг) при Т = Ак и начальных условиях и0 = 1 и v° = 0. З а д а ч а 12.4 Напишите программу для приблиэюеппого решения задачи Ко­ ши для системы обыкновенных дифференциальных уравнений первого поряди ка методом Гира четвертого порядка точности: 25уп+1 - 48уп + 36г/п-1 - 16уп~2 + 3г/”" 3 ^ ------------------------- — — = f \ t n+i,y + ). С ее помощью найдите решение задачи ^ = №. ^ = 2/i (0) = 2, при ц = 50. 0 <<<100, 1/2(0) = О 13 Краевые задачи для обыкновенных дифференциальных уравнений Наиболее важным классом краевых задач для обыкновенных дифференци­ альных уравнений являются задачи для уравнения второго порядка. От­ мечены основные подходы к построению дискретных аналогов краевых за­ дач с различными граничными условиями. Рассмотрены вопросы сходимости приближенного решения к точному и вычислительной реализации на основе использования прямых методов линейной алгебры. Помимо уравнений второ­ го порядка кратко обсуждаются краевые задачи для модельного обыкновен­ ного дифференциального уравнения четвертого порядка. Основное внимание уделяется разностным методам приближенного решения краевых задач. О сновны е о б означен ия 0 и — и(х), х Е [0, 1] .Tq?X1, . . . , X/у — 1 h U) дш Н — — — — — — Ух (•.о Ml = (у(х + h ) ~ y (x ))/h — — — Ух = {у(х) - у(х - h ))/h — У°х = Ухх \{У х = (г/х - У х) — V i)/h — + неизвестная функция узлы сетки шаг равномерной сетки множество внутренних узлов множество граничных узлов гильбертово пространство сеточных функций скалярное произведение в Н норма в Я правая разностная производная в точке т левая разностная производная в точке х центральная разностная производная в точке т вторая разностная производная в точке х 265 13.1 Краевые задачи 13.1 К р а е в ы е за д ач и В качестве базового рассматривается обыкновенное дифференциальное урав­ нение второго порядка - iL + q^ u = 0< х < * (i3-i) с переменными коэффициентами к(х) > к, > 0, q(x) > 0. Для однозначного определения неизвестной функции и(х) уравнение (13.1) дополняется двумя граничными условиями на концах отрезка [0, /]. Задавать­ ся может функция, например, и(х) (граничное условие первого рода), поток du w (x ) = - к ( х ) — (х) (граничное условие второго рода) или же их линейная dx ч комбинация (граничное условие третьего рода): и( 0) = Ни и(1) = /*2, -к (0 )^ (0 )= /п , du - * ( 0 ) ^ ( 0 ) + crlU(0) = Mi, (13.2) * ( 0 ^ ( 0 = А*2. (13.3) du H I)— (I) + <r2u{l) = lit. (13.4) Эллиптические уравнения второго порядка, прототипом которых является уравнение (13.1), используются при моделирование многих физико-механичес­ ких процессов. В задачах с разрывными коэффициентами (контакт двух сред) формулиру­ ются дополнительные условия. Простейшие из них (условие идеального кон­ такта) для уравнения (13.1) связывается с непрерывностью решения и потока в точке контакта х = х*: [и(ж)] = 0, k^d £ = 0, х = х*. где использованы обозначения Ь(*)] = 9(х + 0) - д(х - 0). Отдельного рассмотрения заслуживают задачи с несамосопряженным опера­ тором, когда, например, ~~ £ + + П х )и = Я ж)> 0 < х < I. (13.5) Уравнение конвекции-диффузии (13.5) является модельным при исследова­ ние процессов в механике сплошной среды. При описании деформаций пластин и оболочек, задач гидродинамики мате­ матические модели включают эллиптические уравнения четвертого порядка. Их рассмотрение необходимо начать с краевой задачи для обыкновенна дифференциального уравнения четвертого порядка. Простейшим такой з; дачей является задача для уравнения d4u — (ж) = f( x ) , 0 < х < I. (ш В этом случае задаются по два граничных условиях па концах отрезка. Н; пример, уравнение (13.6) дополняется условиями первого рода: и(0) = Ни и(1) = ц2, (13.1 При формулировке других типов краевых задач для уравнения (13.6) в гр* ничных точках могут участвовать вторая и третья производные. 13.2 Ч и сл ен н ы е м етоды р еш ен и я к р а е в ы х зад ач При построении вычислительных алгоритмов для приближенного решени краевых задач для обыкновенных дифференциальных уравнений основнс внимание уделяется вопросам аппроксимации уравнений, краевых услови и условий сопряжения для задач с разрывными коэффициентами. Прове дится исследование точности приближенного решения в различных норма? обсуждаются особенности прямых методов решения сеточных уравнений дл рассматриваемого класса задач. Аппроксимация краевых задач Обозначим через Q равномерную сетку, для простоты, с шагом h на интер вале [О,/]: и = {х | х = Xi = ih, г = 0 ,1 ,..., N, N h = /}, причем и — множество внутренних узлов, а ди — множество граничных у: лов. Будем использовать безындексные обозначения, когда и = щ = u(xi). Дл левой разностной производной имеем du h d 2u 2 Иг = — — = d ^ {Xi)- 2 d ^ {Xi) + 0 { h ) Тем самым левая разностная производная и$ аппроксимирует первую прои: водную du/dx с первым порядком (погрешность аппроксимации 0(h ) в кал< дом внутреннем узле) при и(х) G С ^ (П ). Аналогично для правой разпостно производной получим ui+i —щ du , ч h d2u 13.2 Численные методы решения краевых задач 267 Для трехточечного шаблона (узлы х*_1,х*,x i+i ) можно использовать цен­ тральную разностную производную: ui+i — “^ - 4 5 — d u , . h2 d3u . 4 = 5 ы + ¥ ^ М + о<П которая аппроксимирует производную du/d x со вторым порядком при и(х) G С {3)(П). Для второй производной d2u /d x 2 получим ^х U$I = — — ^г+1 “Ь ‘Uj—i = £5 • Этот разностный оператор аппроксимирует в узле х = ж* вторую производ­ ную со вторым порядком при w(x) G С ^ ( О,/). Для внутренних узлов сетки аппроксимируем дифференциальный оператор CU = d ^ ( f c ( x ) ^ ) + ^(х)^, dx x g (0,Z) (13.9) с достаточно гладкими коэффициентами и решением разностным оператором Ly = -{аух)х + су, х G о;. (13.10) Для аппроксимации со вторым порядком необходимо выбрать коэффициенты разностного оператора так, чтобы ^^±^ = £ ы + о (/12), (i3 .li) * ± 1 ± * = к (х < ) + 0 № ), (13.12) с, = q(Xi) + 0 ( h 2). (13.13) В соответствии с (13.13) положим, например, с* = у(х*),а условиям (13.11), (13.12) удовлетворяют, в частности, следующие формулы для определения а*: а» = 1/2 = k(xi - 0.5/i), А,‘г—1 + аг ~ ЛI 1 ~ , 1 Метод формальной замены дифференциальных операторов разностными мо­ жет использоваться и при аппроксимации граничных условий. Для построе­ ния разностных схем в задачах с разрывными коэффициентами необходимо ориентироваться на использование интегро-интерполяционного метода (ме­ тода баланса). 268 Краевые задачи для дифференциальных уравнений При построении разностных схем естественно исходить из законов сохранения (балансов) для отдельных ячеек разностной сетки. В уравнении (13.1) выде­ лим контрольные объемы в виде отрезков £4- 1/2 < х < £4+1/2» где £4- 1/2 = (г —1/2)h. Интегрирование уравнения (13.1) по контрольному объему дает x i + 1/2 J Qi+1/2 ~ Qi-i /2 + х г+1/2 q(x)u{x)dx = j f(x )d x . Для получения разностного уравнения из этого балансного соотношения необ­ ходимо использовать те или иные восполнения сеточных функций. Само ре­ шение будем искать в целых узлах (у (х ), х = ж*), а потоки — в полуцелых (■q(x), х = 24+1/2)* Это приводит нас к разностному уравнению Ly = <р, х е и, (13.14) в котором оператор L определен согласно (13.10) с коэффициентами -1 (13.15) 1/2 Zi=h J q^dx' x i —1/2 Правая часть уравнения (13.14) есть 4>i 11 ^г+1/2 xi+1/2 J f(x )d x . Zi-1/2Аналогично проводятся аппроксимации уравнения (13.1) и на неравномерных сетках. Построение дискретных аналогов краевых задач для уравнения (13.1) может осуществляться на основе метода конечных элементов. Используя простей­ шие кусочно-линейные элементы, представим приближенное решение в виде (13.16) где пробные функции Wi(x) имеют вид Wi(x) = г 0, х < Я4_1, (х - X i_i)/h, £4—i < х < х {, ( z i+ l 0, -x )/ h , X i<X < £ ^> £j+1. £4+1, 269 13.2 Численные методы решения краевых задач Коэффициенты разложения в методе Галеркина определяются из системы линейных уравнений, которую мы получаем после умножении исходного урав­ нения (13.1) на функцию Wi(x) и интегрирования по всей области. С учетом финитности пробных функций получим I i+ 1 Xi+ 1 Xi- 1 I Q(x )y(x )Wi(x )dx = / Xi- 1 Zi+l J f(x)v)i(x)dx. Xi-1 Подстановка представления приближенного решения (13.16) приводит к трех­ точечному разностному уравнению (13.14), в котором ^ Xi ai = ^ J k(x)dx - Xi- Ci = 1 ( Xi J Xi- / q(x)(x-xi-i)(xi-x)dx, 1 i+1- x)dx I, Q(x )(x ~ xi -i) dx + I <l{x)(x V i-1 Xi-1 ^ = h ( / J ~ Xi- ^ dx + / V i-l Xi- f (x)(x*+1 - •г’И т 1 • 1 / Наиболее просто аппроксимируются граничные условия (13.2): Vo = Hu VN = V2 - (13.17) Для аппроксимации граничных условий второго и третьего рода со вторым порядком вграничных узлах х = х 0 = 0 и х = х ^ = I привлекается уравне­ ние (13.1) — аппроксимация на решениях задачи. В случае уравнения (13.1) краевые условия (13.4) аппроксимируются разностными соотношениями ( h + ( 0i + ( h \ hx )2/о — Mi + 2*1°’ \ h£ ^n Vx,n + Iбг2 + —q^ \yN — /i2 + — Jn К подобным аппроксимациям мы приходим при использовании интегро-ин­ терполяционного метода и построении схем конечных элементов. Сходимость разностных схем Исследование сходимости приближенного решения к точному при числен­ ном решении краевых задач базируется на основе априорных оценок в сеточ­ ном гильбертовом пространстве. При исследовании сходимости в равномер­ ной норме привлекается принцип максимума и разностная функция Грипа. 270 Краевые задачи для дифференциальны х уравнени На множестве внутренних узлов ш и на сетке ш* = {х \ х = Xi = ih, г = 1 ,2 ,..., TV, N h — I} определим скалярные произведения (у, w ) = ^ 2 v{x)w (x)h, x£u> {у, w)+ = y(x)w (x)h. x€ u /+ В сеточных гильбертовых пространствах Н и норму введем соотношение! Иг/ll = (у, у)1/2, 1М1+ = ({у, г/)+)1/2Рассмотрим разностное уравнение (13.14) при однородных краевых условия первого рода: 2/о = 0, yN = 0. (13.18 Д ля любых сеточных функций, обращающихся в пуль на дш, верно неравен ство (разностное неравенство Фридрихса) IMI2 < М о ( Ы Г ) 2, Мо = ^ . (13.19 С учетом этого на множестве сеточных функций,удовлетворяющих (13.18) разностный оператор L, определяемый согласно (13.10), является самосоиря жснпым и положительно определенным: L = L* > -£ -Е . “ М0 (13.20 Для исследования точности разностной схемы (13.14), (13.17) рассмотрю задачу для погрешности приближенного решения z(x) = у(х) — и(х), х ей. Для погрешности приближенного решения задачи (13.1), (13.2) получим раз постную задачу L z = ф(х), Zq = где ф(х) 0, хеш , Zyv = 0, погрешность аппроксимации: ф(х) = (р(х) - L u , хеш . В случае достаточно гладких коэффициентов и решения для norpciiiiiocTi аппроксимации получим ф(х) = 0 (/i2), х е ш. 271 13 .2 Численные методы решения краевых задач Для погрешности рассматриваемой разностной схемы справедлива априор­ ная оценка М 1^2 1Ы Г < гь которая обеспечивает сходимость разностного решения к точному решению дифференциальной задачи со вторым порядком. При рассмотрении одномерных задач конвекции-диффузии мы ориентируем­ ся на использовании трехточечных разностных схем, которые запишем для внутренних узлов в виде —ог*з/*_1 +ЪУг - 0iVi+i = г = 1 ,2 ,... , 7 V - 1. (13.21) Для граничных узлов считаем выполненными условия (13.18). Будем рассматривать разностные схемы (13.18), (13.21), в которых oti > О, Д > 0, 7 г > о, г = 1 ,2 ,..., N - 1. Сформулируем критерий монотонности разностной схемы, т.е. сформулируем условия, при которых разностная схема удовлетворяет разностному принципу максимума. Пусть в разностной схеме (13.18), (13.21) > 0 для всех г = 1 ,2 ,..., N - 1 (или же ifi < 0 для г = 1 ,2 ,..., TV —1). Тогда при выполнении условий 7i ><* + &, имеет место > 0, г = 1 ,2 ,...; iV —1 г = 1 ,2 ,..., N — 1 (?д < 0, (13.22) г = 1 ,2 ,..., TV —1). Для разностных схем (13.18), (13.21), для которых выполнены условия моно­ тонности (13.22), доказывается сходимость в равномерной норме. Исследова­ ние базируется на применении соответствующих теорем сравнения и постро­ ении мажорантных функций. Пусть для разностной схемы (13.18), (13.21) выполнены условия (13.22) и w(x) — решение задачи OL{W\^1 4“ 7 2 w0 = 0, 1 ,2 ,..., N 1, w N = 0. Тогда при Ш <Фи г = 1 ,2 ,..., TV- 1 Ы < ® г, г = 1 ,2 ,..., TV- 1. справедлива оценка Функция w(x) называется мажорантной функцией для решения задачи (13.18), (13.21). Если удается построить мажоранту, то это значит, что по­ лучена априорная оценка для решения задачи в Ьоо(и): НгДаОНоо < МаОИоо, (13.23) 272 Краевые задачи для дифференциальных уравнений где на множестве сеточных функций, обращающихся в нуль па д и , ||Щ)||ос = max |j/(a;)|. x£u> На основе рассмотрения задачи для погрешности с использованием оценки (13.23) устанавливается сходимость исследуемой разностной схемы. Д р у г и е задачи Среди более общих чем (13.1), (13.4) краевых задач отметим задачи для урав­ нения (13.5). Простейшая цегггральноразностностная аппроксимация члена с первой производной дает разностное уравнение - (а>Ух)х + Ъуох + су = (р, х е сщ (13.24) где, например, bi = v(xi). Разностная схема (13.17), (13.24) аппроксимирует краевую задачу (13.2), (13.5) со вторым порядком. Ее основной недостаток связан с тем, что эта схема монотонна только при достаточно малых шагах сетки h. Безусловно монотонные разностные схемы для уравнения (13.5) можно по­ строить при использовании для конвективного слагаемого аппроксимаций первого порядка направленными разностями. Вместо (13.24) рассмотрим раз­ ностное уравнение - (аух)х + Ь+у* + Ъ~у х + су = <р, хе (13.25) где Ь(х) = Ь+(х) + Ъ~ (ж), Щ я ) = 1(Ь(ж) + |6(ж)|) > о, Ь~(х) = \{Ь{х) - |Ь(ж)|) < 0. К сожалению, схема (13.17), (13.25) имеет только первый порядок аппрокси­ мации. При разностной аппроксимации краевой задачи для обыкновенного диффе­ ренциального уравнения четвертого порядка (13.8)—(13.11) удобно использо­ вать расширенную сетку с дополнительными (фиктивными) узлами x_i = —/г, Xyv+i = I + h. Тогда дифференциальному уравнению (13.8) можно сопо­ ставить разностное уравнение Ухххх = хеш . (13.26) Аппроксимация краевых условий (13.9) и (13.10) дает 1/0 = P i. l/w = P 2, (13.27) 273 13.2 Численные методы решения краевых задач 2/1J/-1 VN+l 2h (1328) V N - l= 2h При вычислительной реализации значения в фиктивных и граничных узлах находятся из (13.27), (13.28) непосредственно, а для определения приближен­ ного решения в узлах х £ и из (13.26) получим пятидиагональную систему линейных алгебраических уравнений. Решение сеточных уравнений Для нахождения приближенного решения краевой задачи для обыкновен­ ного дифференциального уравнения необходимо решить соответствующую систему линейных алгебраических уравнений. Для нахождения разностного решения используются традиционные прямые методы линейной алгебры. Из­ лагаемый метод прогонки (алгоритм Томаса), как хорошо известно, является классическим методом Гаусса для матриц специальной ленточной структуры. Для примера рассмотрим разностное трехточечное уравнение (13.21) с од­ нородными условиями (13.18). В подобном виде записываются и разностные схемы для задачи с краевыми условиями третьего рода (на расширенной сет­ ке с у- i = 0, Vn +i = I + h. В матричном виде рассматриваемая разностная задача имеет вид Ay = xG w , где 7i А = 0 0 0 0 0 -- 0 1 72 -- a 3 7з 0 0 0 ~<*2 02 ... In- Для нахождения решения сеточной задачи используются следующие рекур­ рентные формулы для вычисления прогоночных коэффициентов (прямая прогонка): 6+1 = .. А , , 'Уг Oii^i 4 +1 — * = 1 ) 2 ,..., ЛГ —1, <Pi + M i 7i - ’ при 6=0, 0 X=O. Для решения имеем (обратная прогонка) Vi = 6+iJ/i+i + 0*+i> * = 0 ,1 ,... , Л Г - 1, y N = 0. 274 Краевые задачи для дифференциальных уравнений Тогда алгоритм прогонки корректен, т.е. в расчетных формулах 7*— ф 0. В настоящее время существует ряд вариантов метода прогонки, ориентиро­ ванных на определенный класс сеточных задач. Среди них отметим прогонку для задач с периодическими граничными условиями, метод прогонки для пя­ титочечных разностных уравнений. 13.3 У п р а ж н е н и я У п р а ж н е н и е 13.1 Метод стрельбы (пристрелки) при приблиэюенном ре­ шении краевой задачи и( 0 )= Ц и и(1) = ц 2 основан на решении задач Коши для системы уравнений первого порядка — = v, ах с начальными условиями — = f( x ,u ,v ) , ах и(0) = /хь О< х< 1 г>(0) = 9. Величина в подбирается так, чтобы выполнялось граничное условие и(1) = р>2 • Напишите программу, которая реализует этот метод при решении кра­ евой задачи для нелинейного уравнения второго порядка. Д ля нахождения параметра пристрелки 9 используйте метод бисекции для решения соот­ ветствующего нелинейного уравнения, а для решения задачи Коши для си­ стемы обыкновенных дифференциальных уравнений — явный метод Рунге— Кутта четвертого порядка точности. Продемонстрируйте работоспособ­ ность этой программы при решении краевой задачи — = 100гх(гг —1), ах1 м(0) = 0, 0 <* < 1 и( 1) = 2 на различных сетках. В модуле shooting функция sh o o tin g () реализует решение краевой задачи на основе решения задач Коши для системы обыкновенных дифференциаль­ ных уравнений методом Рунге—Кутта четвертого порядка с использованием модуля rungeKutta. Решение нелинейной задачи для параметра пристрелки проводится с использованием функция b is e c t ion О модуля bisection. 13.3 Упражнения 275 Модуль s h o o tin g import numpy as np from b is e c tio n import b is e c t io n from rungeKutta import rungeKutta def s h o o tin g (f, mul, mu2, a, b, n, t h e t a l , t h e t a 2 ) : иии Solution of the D ir ic h l e t problem f o r second-order equation by th e method of shooting. B isec tio n method f o r fin d in g the boundary co n d itio n s. Runge-Kutta f o u r th order f o r the s o lu tio n of the Cauchy problem, иии h = (b - a) / n # I n i t i a l values def yO(theta): r e t u r n n p . a r r a y ( [mul, t h e t a ] ) # Boundary co nd itio n r e s id u a l def r ( t h e t a ) : x, у = ru n g e K u tta (f, a, yO (the ta ), b, h) yb = у [len(y) - 1] r = yb [0] - mu2 r e tu r n r t h e t a = b i s e c t i o n ( r , t h e t a l , th e ta 2 ) x, у = ru n g e K u tta (f, a, y O (th eta), b, h) r e t u r n x, у [ : , 0] Решение модельной задачи обеспечивается следующей программой. ЩЯ Ш import numpy as np import m a tp lo tlib .p y p lo t as p i t from shooting import shooting def f ( x , y ) : f = n p .z e r o s ( ( 2 ) , ’f l o a t ’) f [0] = y [l] f [13 = 100*( y [0]-l ) * y [0] retu rn f mul = 0. mu2 = 2. a = 0. b = 1. t h e t a l = 0. th e ta 2 = 10. nL ist = [5, 10, 100] s g l i s t = [ ’- ’ , J- - J , 9: ’] - :^иУ?ККЗ?^Nй|- 276 Краевые задачи для дифференциальных уравнений х Рис. 13.1 Решение нелинейной краевой задачи fo r k in r a n g e (le n (n L is t)): n = n L ist[k ] x, у = s h o o tin g (f, mul, mu2, a, b, n, t h e t a l , th e ta 2 ) s i = ’n=’ + s tr ( n ) sg = s g lis t[ k ] p i t .p l o t ( x , y, sg, la b e l= s l) p i t . x l a b e l ( ’x ’) p it.g rid ( T r u e ) p i t . legend(loc=2) p i t . showO Сходимость приближенного решения к точному иллюстрируется рис. 13.1, на котором приведены результаты расчетов при разбиение расчетного интервала на п = 5,10,100 частей. У п р аж н е н и е 13.2 Напишите программу для приблиясенного решения раз­ ностным методом задачи конвекции-диффузии: 13.3 Упражнения 277 Д ля аппроксимации конвективного слагаемого используйте центрально-раз­ ностные аппроксимации и аппроксимации направленными разностями. С помощью этой программы решите краевую задачу d2u du ~dxt + m t e = 0' u(0) = 0, 0 < t< 1 ' u( 1) = 1 на равномерных сетках с h = 0.1,0.01. В модуле fdm функция fdm() дает сеточное решение краевой задачи для урав­ нения конвекции-диффузии на равномерной сетке при использовании двух отмеченных аппроксимаций конвективного слагаемого. Решение сеточной за­ дачи дается функцией solveLU3() модуля 1иЗ. Щ Щ |Й ||1 Ш щ 1 ||||||1 ||||||||||||||||§ ^ import numpy as np from lu3 import solveLU3 def fdm(v, f , mul, mu2, a, b, n, p ) : иии F in ite d iffe re n c e method fo r so lv in g th e D ir ic h le t problem fo r th e c o n v e c tio n -d iffu sio n eq u atio n . When p = 0 we use th e scheme w ith upwind d iffe re n c e approxim ation, when p = 1 - c e n tr a l- d if fe r e n c e approxim ation. иии h = (b - a) / n x = n p .lin s p a c e (a , b, n+1) a = n p .o n e s( (n+1) , ’f l o a t ’) b = n p .z e ro s ( (n+1) , ’f l o a t ’) с = n p .z e ro s ( (n+1), ’f l o a t ’) r = n p .z e ro s ( (n+1), ’f l o a t ’) i f p == 0: fo r i in r a n g e d , n ) : vp = max(0, v ( x [ i] ) ) vm = min(0, v ( x [ i] ) ) a [ i] = 2 . + (vp-vm)*h b [ i] = - 1. + h * v m c [ i] = - 1. - h * vp r [ i ] = f(x [i])* h * * 2 e ls e : fo r i in r a n g e d , n ) : a [ i] = 2. b [ i] = - 1. + h * v ( x [ i] ) / 2. c [ i] = - 1. - h * v ( x [ i] ) / 2. r [i] = f(x [i])* h * * 2 Краевые задачи для дифференциальных уравнений 278 r[0 ] = mul r[n ] = mu2 у = solveLU3(a, b, с, г) r e tu rn х, у Для численного решения тестовой задачи используется следующая программа. Рис. 13.2 Решение задачи конвекции-диффузии ехег - 1 3 2 ру import m a tp lo tlib .p y p lo t as p i t from fdm import fdm r = 100. def f ( x ) : re tu rn 0. def v ( x ) : re tu rn - r mul = 0. mu2 = 1. a = 0. b = 1. n L ist = [10, 100] 279 13.4 Задачи s g lis t = к = О fo r n in n L ist: х, у = fdm(v, f , mul, mu2, a, b, n, 0) s i = , n=> + s tr ( n ) + ’ (upw ind)’ sg = s g lis t[ k ] к = k+1 p i t .p l o t ( x , y, sg, la b e l= s l) x, у = fdm(v, f , mul, mu2, a, b, n, 1) s i = ’n=J + s tr ( n ) + ’ ( c e n tr a l) 9 sg = s g lis t[ k ] к = k+1 p i t .p l o t ( x , y, sg, la b e l= s l) p i t . x l a b e l ( ’x ’) p it.g rid (T r u e ) p i t . Iegend(loc=0) p i t . showO При использовании центрально-разностных аппроксимаций для конвектив­ ного слагаемого на грубых сетках (в нашем примере при п = 10) проявляет­ ся немонотонность (см. рис. 13.2) разностной схемы. Схема с направленными разностями является безусловно монотонной, но имеет только первый поря­ док точности. 13.4 З а д а ч и З а д а ч а 13.1 Напишите программу для приблиэюенного решения задачи ^ = /(ж ,и ), и(0) = Hi, 0 < х <1, и(1) = Н2 разностным методом на равномерной сетке при итерационном решении нелинейной сеточной задачи методом Ньютона. Используйте эту програм­ м у для решения задачи с правой частью f ( t , и) = —е~и при I = 1 и граничных условиях pi —р>2 = 9. З а д а ч а 13.2 Напишите программу для разностного решения краевой задачи ^ /^\ u(0) = Pi, = /(*), 0 < а; < /, du ^ ( 0) = ^ , и(1) = р2 /i\ du ,i\ = Д ля решения соответствующей сеточной задачи используйте вариант LU разлоэюения для пятидиагональной матрицы. С помощью этой программы 280 Краевые задачи для дифференциальных уравнений найдите решение задачи при /(;х) — 1,1 = 1 и fii = различных сетках. = 0, vx = v2 — 0 на З а д а ч а 13.3 Разностная схема ~ ( а У х )х = <р{х), хеш , в которой для приближенного решения задачи - £ { к{х)^ ] = П х ) ' и (0 )= ц и о<х<1’ и (1 )= ц 2 являет,ся т,очной. Напишите программу разностного решения краевых за­ дач с использованием точной разностной схемы при применении квадратур­ ных формул трапеций для вычисления коэффициентов. Примените эту про­ грамму для решения краевой задачи (при 1 = 1 и pi = = 0) с разрывным коэффициентом j*/ л Г 1) J[X) ~ \ 100, 0 < х < 0.5, 0.5 < я < 1 и правой частью f( x ) = 0. Сравните приблиэюениое решение па последова­ тельности трех влооюениых друг в друга сетках h = ho,h0/2,ho/4. З а д а ч а 13.4 Напишите программу, которая реализует метод конечных элементов для приблиэюенного решения краевой задачи ( * ( я ) ^ ) + q(X)U = f ( X), и{ 0) = 0, 0<х<1, и(1) = 0. Постройте схему конечных элементов с представлением решения в виде (13.16) на основе минимизации функционала (метод Ритца) = (fc^ (sz) + q^ v2^ dx ~ J0 n * W d x . Используйте эту программу для того, чтобы найти численное решение за­ дачи для I = 1 и k(x) = l,g (x ) = х (х — 1), f( x ) = 0 при различных N . 14 Краевые задачи для эллиптический уравнений Среди стационарных задач математической физики наибольшее внимание уделяется краевым задачам для эллиптических уравнений второго порядка. Рассматриваются вопросы аппроксимации таких уравнений и краевых усло­ вий, формулируется принцип максимума для сеточных уравнений. Проводит­ ся исследование сходимости приближенного решения к точному в различных нормах. Отмечаются некоторые основные итерационные методы решения се­ точных уравнений. / О сновны е о б о зн ачен и я и = и(х), X = ( x i,x 2) h iJ h UJ ди Н — — — — - (v ) Ml Ух = {у{х + h) - y{x))/h Ух = {у{х) - у(х - h ))/h У* = ъ{Ух + Ух) УXX {Ух ~ Ух)/Ь неизвестная функция шаги равномерной сетки множество внутренних узлов множество граничных узлов гильбертово пространство сеточных функций скалярное произведение в Я норма в Н правая разностная производная в точке х левая разностная производная в точке х центральная разностная производная в точке х вторая разностная производная в точке х 282 Краевые задачи для эллиптический уравнений 14.1 Д в у м ер н ы е краевы е задач и Будем рассматривать двумерные краевые задачи, когда расчетная область есть прямоугольник П = {х | х = (х и х 2), 0 < х а < /а , а = 1,2}. Основным объектом нашего исследования будет эллиптическое уравнение второго порядка 2 £ ^ ( М х) | г )+ < 7 ( х )« = / ( х ), (14.1) хбй. На коэффициенты уравнения накладываются ограничения к(х) > к > 0, q(x) > 0 , х G Q. Характерным примером является уравнение Пуассона 2 Я2?/ — = /( х ) , - Дм = - хеп, (14.2) а а= 1 т.е. в уравнении (14.1) k(x) = 1, q(x) = 0. Для уравнения(14.1) будем рассматривать граничные условия первого рода и(х) = р(х), х Е dfi. (14.3) На границе области или ее части могут задаваться и граничные условия вто­ рого и третьего рода, например, ди к (х )— + а (х)и = /х(х), on х G dft, где п — внешняя по отношению к $1 нормаль. 14.2 Ч и сл ен н ое р еш ен и е краевы х зад ач Приведем некоторые факты по аппроксимации краевых задач для эллип­ тических уравнений, сформулируем достаточные условия для выполнения принципа максимума для сеточных функций, рассмотрим вопросы оценки точности приближенного решения и проблемы решения сеточных уравнений. Аппроксимация краевых задач для эллипт ических уравнений Будем использовать равномерную по каждому направлению сетку. Для сеток по отдельным направлениям х а, а = 1,2 используем обозначения UJa {Фа | Ха ^q^q) ^а б, 1, ... , iVQ, N ak a la }, 283 14.2 Численное решение краевых задач где UJa — {ха | Ха — 1) 2, • • • ) -^Va {Xq | ХЛ ^а^а, ^сх^а 1, N aha -/Vq,, ^а} ^а}* Для сетки в П положим и —cJi х ои2 — {х | х = (х ь х 2), х а е й а, а = 1,2}, CJ = СЩX U2. Для гладких коэффициентов уравнения (14.1) разностная схема строится на основе непосредственного перехода от дифференциальных операторов к раз­ ностным. Подобно одномерному случаю для краевой задачи (14.1), (14.3) по­ ставим в соответствие разностное уравнение 2 L V = Y ; Ь(а)У = ^ ( Х)> (14.4) Х 6 Ш- где L {a)y = ~ (a (a)ysa)xa + в ас(х)у, хеш , а = 1,2, (14.5) где 01 + в2 = 1. Для коэффициентов при старших производных можно положить а (1)(х) = к{х 1 - 0, 5/ib x 2), х г Gu f, х 2 G ш2, а (2)(х) = к{хи х 2 - 0,5 /i2), Xi G ад, x2 G cjJ. Для младшего коэффициента и правой части (14.4), (14.5) имеем с(х) = д(х), р(х) = /(х ), х G ш. В общем случае применяется интегро-интерполяционный метод. Интегриро­ вание по контрольному объему для отдельного узла х сетки и П х = {s |s = (s i,s 2), x i — 0,5Л-! < Si < Xi + 0,5/ii, х 2 - 0, 5/i2 < s2 < х 2 - h 0 ,5/i2} дает, например, -1 dsi. 284 Краевые задачи для эллиптический уравиеы. Для граничных узлов ди (си = cj(Jdu) используемся аппроксимация у(х) = /Дх), х G дш (14.6) краевых условий (14.3). Принцип максимума Разностное уравнение (14.4), (14.5) запишем в виде S y(x) = <р{х), X 6 0J, (14.7) где линейный оператор S определяется формулой Sv{x) = A (x)v(x) - в (х,£М £)- (14'8) £gw'(x) Здесь W (x) — шаблон. a W ' E W \{x} — окрестность узла х £ ал Будемсчитать, что для рассматриваемых эллиптическихуравнений второ­ го порядкашаблон W содержит узлы (x±hu x 2), ( x i,x 2± h2) (шаблон, как минимум, пятиточечный), а коэффициенты удовлетворяют условиям Л (х )> 0 , Б ( х , О > 0, D (x) = А (х) - ^ Y2 fe W '( x ) , (14.9) •^(х > 0 > 0> х е и. t€W'(x) Для разностного уравнения (14.7), (14.8) при выполнении (14.9) справедлив принцип максимума. В частности, если сеточная функция у(х), удовлетворя­ ет граничным условиям у(х) = 0, х е да;, (14.10) а правая часть <^(Х) < 0 (^(Х) > 0)> Х^ то у(х) < 0 (у(х) > 0). На основе принципа максимума устанавливаются теоремы сравнения для ре­ шений сеточных эллиптических уравнений. Рассмотрим, например, задачу Sw (x) = 0(х), w(x) = ^(х), х е и, х е ди и пусть |<р(х)| < ф(х), |д(х)| < 1/(х), X6W, х е дак 285 14.2 Численное решение краевых задач Тогда для решения задачи (14.6), (14.7) справедлива оценка \у{х)\ < w(x), хеш . Отсюда следует, что для решения однородного уравнения (14.6) (<р(х) = О, х е и) с граничными условиями (14.7) имеет место априорная оценка устой­ чивости m ax \у(х)\ < ш ар ф (х )|. хбы xeduj С привлечением подобных априорных оценок доказывается сходимость раз­ ностных схем в равномерной норме. Будем использовать для приближенного решения задачи Дирихле для уравнения Пуассона (14.2), (14.3) разностное уравнение _ Ух\Х\ ~ Ух2X2 = V^(X)> X G W, (14:.11) дополнив его граничными условиями (14.6). Для погрешности z(x) = у(х) — и(х), ХЕШ получим задачу %Х\Х\ %Х2Х2 — ^ ( Х)> z(x) = 0, X е CJ, х е ди> где ф(х) = О (hi + hi) — погрешность аппроксимации. Выбрав в качестве мажорантной функции Ц х ) = ^{l\ + ll - х\ - a^HV’MHoo, где Kx)lloo = m ax |w (x )|, для погрешности получим оценку ||у(х) - «(xJHoo < + г1)||^(х)||оо- Тем самым разностная схема (14.6), (14.11) сходится в Ь ^ ш ) со вторым по­ рядком. Разностные уравнения в гильбертовом пространстве Остановимся на решении уравнения (14.1) с однородными граничными усло­ виями первого рода (/i(x) = 0 в (14.2)), которой ставится в соответствие раз­ ностная схема (14.4), (14.5), (14.10). Для сеточных функций, обращающихся в нуль на множестве граничных узлов ди, определим гильбертово простран­ ство Н = Ь2(и), в котором скалярное произведение и норма задаются следу­ ющим образом: (г/, w) = Y , г /(х М х ) М 2, ||г/|| = (у, у )1/2- 286 Краевые задачи для эллиптический уравнений Определим для двумерных разностных функций, обращающихся в нуль на ди сеточный аналог нормы в W^co): Ш 2= £ £ ( г / г,)2м 2 + £ £ { v A h 2. *i€u/+ *260/2 xi€u;i Х2ви;+ На Н разностный оператор L самосопряжен и справедлива при наших пред­ положениях о коэффициентах уравнения (14.1) оценка (L y,y) > к\\Уу\\2. (14.12) Для сеточных функций у(х), обращающихся в нуль на ди, верно неравенство (неравенство Фридрихса для двумерных сеточных функций) Иг/ll2 < М о Ш 2, м 0~1 = | + ( 1 4 . 1 3 ) Из (14.12), (14.13) следует оценка оператора L снизу L > k, \ qE, Ао — М0 *. (14.14) Приведем также оценку оператора L сверху: L < М ХЕ (14.15) с постоянной 4 а (1)( х ) + а (1)(я i + h u x 2) Мг = т ^т а х ^ ^ h{ хеа/ 2 4 a (2)(x) + a<2)(a;1,a;2 + /i2) , + —г m a x -------------------------hi хба; 2 х€о/ , , ^ h max с(х) . л Задача для погрешности разностного решения г(х) = у(х) - и(х), х GQ имеет вид L z = ф(х), xG w , где г/>(х), как обычно, погрешность аппроксимации: ф(х) = (р(х) — L u , х в со. Будем считать, что решение краевой задачи имеет достаточно гладкое клас­ сическое решение. На равномерной прямоугольной сетке погрешность ап­ проксимации в этих условиях при использовании разностного оператора (14.4), (14.5) имеет второй порядок: V;(x) = 0 (|/i|2), \h\2 = hi + h i, x e со. 287 14.2 Численное решение краевых задач Для рассматриваемой разностной схемы (14.4)—(14.6) справедлива априорная оценка для погрешности М 1/2 ||V*|| < —М М . К В силу этого разностная схема сходится в ИТДи;) со вторым порядком. Решение сеточных уравнений Исходная дифференциальная задача при аппроксимации заменяется сеточ­ ной. Соответствующие разностные (сеточные) уравнения есть система линей­ ных алгебраических уравнений для неизвестных значений сеточной функции. Для их нахождения используются методы линейной алгебры, которые макси­ мально учитывают специфику сеточных задач. Особенности сеточных задач проявляются в том, что соответствующая матрица системы алгебраических уравнений является разреженной, т.е. содержит много нулевых элементов, имеет ленточную структуру. При решении многомерных задач матрица име­ ет' очень большой порядок, равный общему числу узлов сетки. Классических подход к решению простейших линейных задач математиче­ ской физики связан с использованием метода разделения переменных. Есте­ ственно ожидать, что аналогичная идея получит свое развитие и примени­ тельно к сеточным уравнениям. Рассмотрим сеточную задачу для уравнения Пуассона (14.10) с однородными краевыми условиями (14.11). Для применения метода Фурье для решения этой двумерной задачи рассмот­ рим задачу на собственные значения для разностного оператора второй про­ изводной по переменной х\\ —Vxixi + Аг> = 0, vQ= 0, Xi е сщ vNl = 0. Соответствующие собственные значения и собственные функции обозначим Аь v {k){xi), к = 1,2, Будем искать приближенное решение задачи (14.10), (14.11) в виде разложения: /V!-1 (14.16) 288 Пусть Краевые задачи для эллиптический уравнений к)(х2) — коэффициенты Фурье правой части: N i-l 4>(к){хг) = 2 3 V>(x )v(k)(x i)hi- (14.17) (14.18) (14.19) Разностная задача (14.18), (14.19) при каждом к = 1 ,2 , . . . , Ni — 1 решается методом прогонки. Таким образом метод Фурье основан на определении собственных функций и собственных значений одномерной сеточной задачи, вычислении коэффи­ циентов Фурье правой части согласно (14.17), решении задач (14.18), (14.19) для коэффициентов разложения и, наконец, решение задачи определяется по формулам суммирования (14.16). Эффективные вычислительные алгоритмы метода разделения переменных связаны с быстрым преобразованием Фурье (FFT). В этом случае можно вычислить коэффициенты Фурье правой части и восстановить решение при затратах Q = 0 ( N i N i log Ni). Для задач с постоянными коэффициентами можно использовать преобразование Фурье по обоим переменным (разложе­ ние по собственным функциям двумерного сеточного оператора L). Для приближенного решения многомерных сеточных эллиптических задач с переменными коэффициентами используются итерационные методы. Основ­ ные понятия теории итерационных методов решения систем линейных урав­ нений обсуждались выше. Здесь мы отметим только наиболее важные особен­ ности итерационного решения краевых задач для эллиптических уравнений, которые касаются выбора оператора В (переобуславливателя) при переходе на новое итерационное приближение. Для разностной задачи (14.4), (14.5), (14.10) запишем соответствующую си­ стему линейных уравнений Ау = (р (14.20) для нахождения сеточного решения ?/(х), х Е и. Здесь А рассматривается как линейный оператор, действующий в конечномерном гильбертовом про­ странстве Н = L 2(<jo), а у?(х) — заданный элемент Н. Для приближенного решения уравнения (14.20) с А = А* > 0 будем использовать двухслойный итерационный метод (14.21) 289 14.2 Численное решение краевых задач Особенности итерационных методов для решения эллиптических задач про­ являются при построении оператора В. Пусть априорная информация об операторах В и А задана в виде двухсто­ роннего операторного неравенства Ъ В < А < Ъ В, 7i > 0, (14.22) т.е. операторы В и А энергетически эквивалентны с постоянными энерге­ тической эквивалентности 7 а , а = 1,2. В итерационном методе (14.21) при оптимальным значением итерационного параметра 2 Т = То = — - — 71+ 72 для числа итераций К , необходимых для достижения точности £, справедли­ ва оценка К > К 0(е) = 0 , (14.23) In go где лo - -i z I lл ’ t^- l l Q l+ £ 72 При использовании чебышевского набора итерационных параметров и для метода сопряженных градиентов имеем к > Ко(е) = ^ 0 , In Qi (14.24) где ^ 1 _ ^V 2 61 1 + ^ / 2’ * Ъ ' Для явного итерационного метода В = Е и в силу (14.14), (14.15) (А = L) для постоянных энергетической эквивалентности получим 71 = кМ 0-1 = 0 (1), 72 = М , = 0 ( \h \- 2). В методе простой итерации при оптимальном значении итерационного пара­ метра из (14.23) получим в д - о ^ щ ! ) . Для метода сопряженных градиентов оценка (14.24) дает * .W = О ( д ь 1 ) . (14.25) При применении попеременно-треугольного итерационного метода используеггся разложение А — А\ Н- А% — А* > О, А 2 = А\ 290 Краевые задачи для эллиптический уравнений и оператор В задается в виде B = {G + v A 1)G -1{G + v A 2), (14.26) где G = G* > 0. При априорной информации А > SG, 8 > 0, < ^А (14.27) оптимальным является выбор параметра 2 причем для числа итераций верна оценка (14.28) при использовании чебышевского набора итерационных параметров или ме­ тода сопряженных градиентов. Для эллиптических уравнений второго порядка имеет место следующая за­ висимость от шагов сетки <5 = 0 (1), Д = 0 (\h \~ 2). Поэтому для числа итераций попеременно-треугольного итерационного ме­ тода получим Оптимизация метода достигается за счет выбора оператора D = D* > 0. 14.3 У п р а ж н е н и я У п р аж н ен и е 14.1 Напишите программу численного решения на равномер­ ной по каэ/сдому направлению сетке задачи Дирихле для уравнения Пуассона в прямоугольнике методом разделения переменных. Д ля прямого и обрат­ ного преобразований Фурье используйте возмоэюпости пакета NumPy. Про­ демонстрируйте работоспособность этой программы при решении краевой задачи — /2/2 1 *^i) 4” ^ 2(^2 и(х) = 0, ^2))) х G 9, х е д£1. Приближенное решение соответствующей сеточной эллиптической задачи получим на основе алгоритма (14.16)—(14.19). Синус-преобразование Фурье проводится с помощью функций f f t . r f f t O (прямое преобразование) и 14.3 Упражнения 291 f f t . i r f f t O (обратное преобразование) пакета NumPy. Исходная веществен­ ная сеточная функция продлевается нечетным образом, к которой затем при­ меняется дискретное преобразование Фурье. В модуле fftPoisson функция f f tP o is s o n O реализует численное решение сеточной эллиптической задачи разделением переменных с преобразованием Фурье по первой переменной. Ре­ шение систем уравнений с трехдиагоналыюй матрицей обеспечивается функ­ цией solveLU3() модуля 1иЗ. Модуль f f t Р о i s s о п import numpy as np import math as mt from lu3 import solveLU3 def f f t P o i s s o n ( f , 11, 12, n l , n 2 ) : иии Numerical Solutio n of the D i r i c h le t problem f o r Poisson equation in a re c ta n g le . Fast F ourier transform in the v a r ia b le x. иии hi = 11 / nl h2 = 12 / n2 # F ourier c o e f f i c i e n t s of th e r i g h t sid e , у = n p .z e r o s ( (nl+1, n 2 + l ) , ’f l o a t* ) r = n p . z e r o s ( ( 2 * n l ) , ’f l o a t ’) t t = n p . z e r o s ( ( n l + l ) , ’c f l o a t ’) f o r j in r a n g e ( l,n 2 ) : f o r i in r a n g e d , n l ) : r [ i ] = f d * h l , j*h2) r[2 * n l-i] = - r [ i] r t = n p .fft.rfft(r).im ag у [0:nl+1, j] = r t [0:nl+l] # F ourier c o e f f i c i e n t s f o r the s o lu tio n , a = n p .o n e s ( ( n 2 + l) , ’f l o a t ’) b = n p .z e r o s ( ( n 2 + l), ’f l o a t ’) с = n p .z e r o s ( ( n 2 + l), ’f l o a t ’) q = n p .z e r o s ( (n 2 + l), ’f l o a t ’) f o r i in r a n g e d , n l ) : f o r j in r a n g e d , n 2 ) : a [ j] = 2. + ( 2 .* m t.s in d * m t .p i/(2* nl))/hl)* *2 *h2 ** 2 b [j] = - 1. c [ j] = - 1. qCj] = y [i,j]* h 2 * * 2 p = solveLU3(a, b, c, q) y [i,:] = p # Inverse Fou rier transform , f o r j in r a n g e ( l,n 2 ) : Краевые задачи для эллиптический уравнений 292 fo r i in r a n g e d ,n l ) : t t [ i ] = y [i, j] * l. j yt = n p .f f t. i r f f t ( t t ) у [ 0 : n l , j] = y t[ 0 :n l] re tu rn у Решение модельной задами с точным решением 10 «(*) = 1 О1 - Xi )x2{l2 - х 2) обеспечивается следующей программой. 1.0, 1.050000 0.900000 I 0.750000 0.600000 0.450000 0.300000 0.150000 - Р и с . 14.1 Решение задачи для уравнения Пуассона ехег - 1 4 1 ру import numpy as np from fftP o is s o n import fftP o is s o n import m a tp lo tlib .p y p lo t as p i t 11 = 2. 12 = 1. def f ( x , y ) : re tu rn 3 2 .* (x * (ll-x )+ y * (1 2 -y ))/(ll* 1 2 )* * 2 n l = 32 0.000001 293 14.3 Упражнения n2 = 16 у = f f tP o is s o n ( f , 11, 12, n l , n2).T p r in t ’max у = ’ , np.amax(y) x l = n p .lin s p a c e ( 0 ., 11, nl+1) x2 = n p .lin s p a c e ( 0 ., 12, n2+l) XI, X2 = n p .m e sh g rid (x l, x2) p i t . co n to u rf(X I, X2, y, cm ap=plt. cm.gray) p i t .c o lo rb a rO p i t . showO На рис. 14.1 показано численное решение при ' = 2, /2 = 1 сетке (33 х 17). У п р а ж н е н и е 14.2 Напишите программу численного решения на равномер­ ной по каэюдому направлению сетке задачи Д ирихле для уравнения конвек­ ции-диффузии ^—-ч д^и ., v ди /•/ \ а=1 и(х) = 0, х е дО,. Используйте аппроксимации центральными разностями для конвективного слагаемого и итерационный метод релаксации. С помощью этой программы исследуйте зависимость скорости сходимости от параметра релаксации при численном решении задачи с /( х ) = 1 и 6(х) = 0,10. В сеточной задаче Лу = f 'представим матрицу А в виде суммы диагональной, нижней треугольной и верхней треугольных матриц А = D + L + U. Метод релаксации соответствует использованию итерационного метода llk+l _ 7/fc (D + u L ) -------------- b A y k = /. и При и > \ говорят о верхней релаксации, при и < 1 — о нижней релаксации. Приближенное решение эллиптической задачи с использованием заданного параметра релаксации ш реализуется функцией r e la x a tio n О модуля relaxa­ tion. ■■■■ import numpy as np import math as mt def re la x a tio n (b , f , 11, 12, n l , n2, omega, t o l = l .e - 8 ) : i: 294 Краевые задачи для эллиптический уравнений 11ИII Numerical S o lu tio n of th e D ir ic h le t problem fo r c o n v e c tio n -d iffu sio n equatio n in a re c ta n g le . Method of r e la x a tio n . иии h i = 11 / n l h2 = 12 / n2 d = 2. / hl**2 + 2. / h2**2 у = n p .z e ro s ((n l+ 1 , n 2 + l), ’f l o a t ’) f f = n p .z e ro s ( (n l+ 1 , n 2 + l), ’f l o a t ’) bb = n p .z e ro s((n l+ 1 , n 2 + l), ’f l o a t ’) fo r j in r a n g e d ,n 2 ) : fo r i in r a n g e d ,n l ) : f f [ i , j] = f ( i * h l , j*h2) b b [ i , j ] = b ( i* h l, j*h2) # th e maximum number of i te r a t i o n s i s 10000 fo r k in r a n g e d , 10001): rn = 0. fo r j in r a n g e d ,n 2 ) : fo r i in r a n g e d ,n l ) : r r = - ( y [ i - 1 , j] - 2.*y [ i , j] + у [i+ 1 , j ] ) / hl**2 \ - ( y [ i , j-1 ] - 2.*y [ i , j ] + у [ i , j + 1 ] ) / h2**2 \ + b b [ i ,j ] * ( y [i+ 1 ,j] - у [ i - 1 , j ] ) / ( 2 .*hl) - f f [ i , j] rn = rn + rr**2 y [ i , j ] = у [ i , j ] - omega * r r / d rn = rn*hl*h2 i f rn < to l* * 2 : re tu r n y, k p r in t ’R elax atio n method f a il e d to c o n v erg e:’ p r in t ’a f t e r 10000 i t e r a t i o n r e s id u a l = ’ , m t.s q rt(rn ) Решение модельной задачи в единичном квадрате на сетке hi = h2 = 0.04 обеспечивается следующей программой. import numpy as np from re la x a tio n import re la x a tio n import m a tp lo tlib .p y p lo t as p i t b cL ist = [0 ., 10.] s g lis t = [ ’- ’ , kk = 0 fo r be in b c L ist: 11 = 1 . 12 = 1 . def f ( x , y ) : r e tu rn 1. Рис. 14.2 Число итераций метода релаксации def b ( x ,y ) : r e tu rn be n l = 25 n2 = 25 m = 20 от = n p .lin s p a c e ( l., 1.95, т) i t = n p .z e ro s ( ( т ) , ’f l o a t ’) fo r k in range(m ): omega = om[k] y, i t e r = r e la x a tio n (b , f , 11, 12, n l , n2, omega, to l= l.e - 6 ) it[ k ] = i t e r s i = ’b =’ + s tr ( b c ) sg = s g lis t[ k k ] kk = kk+1 p i t . p l o t (от, i t , sg, la b e l = s i ) p i t .x la b e l( ’$\\om ega$’) p i t .y la b e l( ’i t e r a t i o n s ’) p i t . legend(loc=0) p it.g r id ( T r u e ) p i t . show() Краевые задачи для эллиптический уравнений 296 На рис. 14.2 показана зависимость числа итераций от параметра релакса­ ции для уравнения Пуассона (6(х) = 0) и уравнения конвекции-диффузии (6(х) = 10). Для сеточного уравнения Пуассона оптимальное значении пара­ метра релаксации находится аналитически, а итерационный метод сходиться при 0 < и < 2. 14.4 З а д а ч и З а д а ч а 14.1 Напишите программу численного решения на равномерной по каэюдому направлению сетке задачи Дирихле для уравнения Пуассона в пря­ моугольнике методом разделения переменных с использованием быстрого преобразования Фурье по обоим переменным. С помощью этой программы найдите численное решение на последовательности сгущающихся сеток для задачи в единичном квадрате с точным решением и(х) = ех у х е дО.. З а д а ч а 14.2 Напишите программу для приближенного решения уравнение Пуассона в круге с граничными условиями lim г — (г, ip) = 0, u(R, (р) = 0 и условиями периодичности и (г, ц>) = гх(г, 27г + у>), 0 < г < R, 0 < (р < 2 тг Используйте равномерную по каждому направлению сетку с преобразова­ нием Фурье по углу. Работоспособность программы продемонстрируйте на решении задачи с /(г , р) = г sin(y?), R = 1. З а д а ч а 14.3 Напишите программу численного решения на равномерной по каэюдому направлению сетке задачи u(x) = 0 , х е dSl в прямоугольнике Q. Используйте итерационный метод Якоби (В = D ) и выбор итерационных параметров по метод'у сопряоюенпых градиентов. С помощью этой программы решите краевую задачу в единичном квадрате с 297 14.4 Задачи /( х ) = 1 и и W \ - / !> - ° '5)2 + “ °-5)2 > 0Л25> I X, (*1 - 0.5)2 + (ага - 0.5)2 < 0.125 при х = Ю 2, 1, Ю2. З а д а ч а 14.4 Напишите программу численного решения на равномерной по каждому направлению сетке задачи 2 82н - Ё № + з(х)«= /(х)> х е п а= 1 Q и(х) = 0, Х Е Ш в прямоугольнике Q. Используйте попеременно-треугольный итерационный метод с В = (Е -Ь vA\)E -Ь vA?), А = А\ -Ь А2, Ai = А2 и с выбором итерационных параметров по методу сопряэюенных градиен­ тов. Параметр v задается равным и = 1/0 = Ш где 4 . о 7Гh\ 4 . 2 7t/i2 s = ft !sm й Г + к | 8ш й ? А - — — ~ h\ + h% и является оптимальным для сеточного оператора Лапласа. Возмоэюпости программы продемонстрируйте на численном решении краевой задачу в еди­ ничном квадрате с /( х ) = 1 и / ч при х = 0 ,1 0 ,102. / “ l i, { x i~ 0.5)2 X, (Xl ~ 0.5)2 + (х2 ~ 0.5)2 > 0.125, + (аг2 - 0.5)2 < 0.125 15 Нестационарные задачи математической физики Рассматриваются разностные методы приближенного решения краевых за­ дач для нестационарных уравнений с частными производными. Основное внимание уделяется построению и исследованию разностных схем для па­ раболических уравнений второго порядка. Теоретической основой при иссле­ довании сходимости разностных схем является общая теория устойчивости операторно-разностных схем. Приведены основные результаты об устойчи­ вости двух- и трехслойных разностных схем по начальным данным и пра­ вой части. Отмечаются особенности исследования схем для гиперболических уравнений второго порядка. Строятся экономичные разностные схемы для приближенного решения многомерных нестационарных задач математиче­ ской физики. О сновн ы е об озн ачен и я u = u (x ,t) h т uh — — - неизвестная функция шаг равномерной сетки по х шаг сетки по времени t множество внутренних узлов по пространству d u h - множество граничных узлов н - гильбертово пространство сеточных функций ( v ) - скалярное произведение в Н Ml - норма в Н Ух = (y(x + h) - y(x))/h — правая разностная производная в точке х Ух = {y(x) - y(x - h))/h - левая разностная производная в точке х iг - решение на момент времени t = tn 2It = (yn+1 ~ Уп) / г — производная вперед по переменной t m = (yn - уп~х)/т - производная назад но переменной t 299 15.1 Нестационарные краевые задачи 15.1 Н естац и о н ар н ы е к р а е в ы е за д ач и В качестве базового нестационарного уравнения математическойфизики вы­ ступает одномерное параболическое уравнение второго порядка. В прямо­ угольнике QT = H x [0 ,T ], П = {х\0<х<1}, 0 <t<T, рассматривается уравнение di t = t ( k{x)d£ ) + f [ x ' t]' 0<х<1' 0<* - т- (15Л) Оно дополняется (первая краевая задача) граничными гх(0,*) = 0, u (l,t) = 0, 0 <t<T, (15.2) и начальными и(х, 0) = v°(x), 0 <х<1, (15.3) условиями. Для простоты изложения мы ограничились однородными граничными усло­ виями и зависимостью коэффициента к только от пространственной перемен­ ной, причем к(х) > к > 0. Вместо условий первого рода (15.2) могут задаваться другие граничные усло­ вия. Например, во многих прикладных задачах необходимо ориентироваться на формулирование граничных условий третьего рода: du -k (0 ) — (0,t)+<Ti(t)u(0,t) =Hi(t ), (15.4) du k(l) — (lyt) +.a2(t)u(l,t) = ц 2(£), 0 < t <T. Среди других нестационарных краевых задач необходимо выделить гипербо­ лическое уравнение второго порядка. В одномерном по пространству случае ищется решение уравнения д2и _ д - (к (х )^ -) +f(x,t), X \ ox J 0 <х<1, 0 <t<T. (15.5) Для однозначного определения решения этого уравнения помимо граничных условий (15.2) задаются два начальных условия и(х, 0) = м0(а;), ди — (0, t) = Ui(x), at 0 <х<1. (15.6) Особое внимание необходимо уделять методам численного решения много­ мерных нестационарных задач математической физики. Примером может 300 Нестационарные задачи математической физики служить двумерное параболическое уравнение. Будем искать в прямоуголь­ нике Q = {х | х = (хи х 2), 0 < х а < 1а, а = 1,2} функцию u(x,t), удовлетворяющую уравнению 1 \ ! £ ( а д ё ) - ,(М )“ + Л,М)' хбИ , (15.7) 0 <t <Т и условиям u(x, t) = 0, хЕШ и(х, 0) = гг0(х), 0 <t<T, (15.8) х ей (15.9) Аналогично формулируются и другие нестационарные многомерные краевые задачи для уравнений с частными производными. 15.2 Разностны е методы реш ения нестационарных задач Прежде чем проводить исследование конкретных разностных схем для неста­ ционарных уравнений математической физики введем базовые понятия тео­ рии устойчивости операторно-разностных схем, рассматриваемых в конечно­ мерных гильбертовых пространствах. На основе приведенных оценок устой­ чивости двух- и трехслойных разностных схем по начальным данным и пра­ вой части проводится исследование разностных схем для уравнений парабо­ лического и гиперболического типов. Устойчивость двухслойных операторно-разностных схем Дадим некоторые основные понятия и определения общей теории устойчиво­ сти операторно-разностных схем. Пусть задано вещественное конечномерное гильбертово пространство Н и сетка по времени й Т = и тU {Т} = {tn = пт, п = 0,1, ...,N 0; tNq= Т}. Обозначим через А , В : Н ^ > Н линейные операторы в Я и пусть они, для простоты, не зависят от r , t n. Рассмотрим задачу Коши для операторно-раз­ ностного уравнения в Уп+1 - уп + АуП = У° = «о, где уп = y(tn) Е Я - искомая функция, a ipn,u 0 6 Н — заданы. (1510) (15.11) 301 15.2 Разностные методы решения нестационарных задач Определим двухслойную разностную схему как множество задач Коши (15.10), (15.11), зависящих от параметра г, а запись (15.10) (15.11) будем называть канонической формой двухслойных схем. Двухслойная схема называется устойчивой, если существуют такие положи­ тельные постоянные mi и т 2, не зависящие от г и выбора и0, <р, что при любых и0 е Н, (р е Н, t € й т для решения задачи (15.10), (15.11) справедли­ ва оценка ||?/n+l || < mjwoll + m 2 max ||<р*||„, tn e w T, (15.12) где || • || и || • ||* — некоторые нормы в пространстве Я . Неравенство (15.12) отражает свойство непрерывной зависимости решения задачи (15.10), (15.11) от входных данных. Обычно разделяют понятия устой­ чивости по начальным данным и устойчивости по правой части. Разностная схема (15.13) Т (15.14) У° - и0 называется устойчивой по начальным данным, если для решения задачи (15.13), (15.14) выполняется оценка ||j/n+1|| < m ju o ll, tn e uj T. (15.15) Двухслойная разностная схема (15.16) (15.17) устойчива по правой части, если для решения выполняется неравенство (15.18) Получение оценок устойчивости чаще всего базируется на априорных оценках разностного решения при переходе с одного временного слоя на другой. Для самосопряженного положительного оператора R через На обозначим гиль­ бертово пространство, состоящее из элементов пространства Н и снабженное скалярным произведением и нормой Разностная схема (15.13), (15.14) называется p-устойчивой (равномерно устой­ чивой) по начальным данным в Н а , если существуют постоянная д > 0 и Нестационарные задачи математической физики 302 постоянная т i, не зависящая от т, п, такие, что при любых п и при всех уп Е Н для решения уп+1 разностного уравнения (15.13) справедлива оценка ||г/п+1||я<£>||2/п||л, J n причем (15.19) Qn < Т П \ . В теории разностных схем в качестве константы д выбирается обычно одна из величин е = 1, в = 1 + ст, в = ехр(сг), с > 0, где постоянная с не зависит от т, п. Из оценки разностного решения на слое \\уп+1\\< Ф Л \+ т \\< Р п 1 следует априорная оценка (разностный аналог леммы Гронуолла) lll/n+lll < Qn + 1 \\ yo\\ + Y , T Q n - k \\ipk \\m. к =О Сформулируем основные критерии устойчивости двухслойных операторно­ разностных схем по начальным данным. Основным является следующий ре­ зультат о точных (совпадающих необходимых и достаточных) условиях устой­ чивости в Ид. Пусть в уравнении (15.13) оператор А является самосопряженным положи­ тельным оператором. Условие в > l;A, teuT (15.20) необходимо идостаточно для устойчивости в Н А, т.е. для выполнения оценки Иг/n+ilU < I k lU , t е ш т. (15.21) При рассмотренииобщих нестационарных задач необходимо ориентироваться на условия р-устойчивости. Пусть А = А*, В = В* > 0, тогда условия < А < (15.22) необходимы и достаточны для p-устойчивости в Н П схемы (15.13), (15.14), т.е. для выполнения lll/n+i||я < 9\\Уп\\в- 15.2 Разностные методы решения нестационарных задач 303 Из устойчивости разностной схемы по начальным данным в H r , R = R* > 0 следует и устойчивость схемы по правой части. Более точно это утверждение формулируется следующим образом. Пусть разностная схема (15.10), (15.11) p-устойчива в H r по начальным дан­ ным, т.е. имеет место оценка (15.19) при <рп = 0. Тогда разностная схема (15.10), (15.11) устойчива по правой части и для решения справедлива апри­ орная оценка lh /+1||fl < 0n+1I W k + £ r 0 " - * | | B - V fclk- (15.23) к =О Приведем оценку устойчивости по начальным данным и правой части при загрублении критерия устойчивости (15.20). Пусть А — самосопряженный и положительный оператор, а В удовлетворяет условию В > ТА (15.24) с некоторой постоянной е > 0, не зависящей от т. Тогда для разностной схемы (15.10), (15.11) справедлива априорная оценка 1|уп+1|1л < Ы Г л + к=о (15-25) Оценки устойчивости по правой части используются при исследовании точ­ ности разностных схем для нестационарных задач. У ст о й чи во ст ь т р е х с л о й н ы х р а зн о с т н ы х с х е м При приближенном решении нестационарных задач математической физи­ ки наряду с двухслойными разностными схемами часто используют и трех­ слойные. Здесь мы формулируем некоторые основные условия устойчивости трехслойных операторно-разностных схем. Используется следующая каноническая форма трехслойных разностных схем: ?.п + 1 _ ? п - 1 Ву 2 tJ ■+ R (yn+1 - 2уп + г/"-1) + А уп = п = 1 ,2 ,... при заданных У° = и0, УХ= Щ ■ (15.27) Сформулируем условия устойчивости по начальным данным при постоянных, не зависящих от ?г, самосопряженных операторах А , В, Я, т.е. вместо (15.26) 304 Нестационарные задачи математической физики будем рассматривать BJ 2/ + R(yn+l ~ 2у" + у " " 1) + Лу» = 0, 52 п = 1,2,... При выполнении условий В > 0, А > 0, R > (15.29) для разностной схемы (15.27), (15.29) имеет место априорная оценка ~^\\Уп+1 + У п \\ а + ll ^/n+l — V ti Wr ~ - ^ \ \ Уп+1 ~ У п \ \ л < < jll'2/n + Уп- i Wa + b n - У п - iIIh - \ \ \ У п - Уп - 1 \ \ 2а , (15.30) т.е. операторно-разностная схема (15.27), (15.29) устойчива по начальным данным. Устойчивость рассматриваемых трехслойных операторно-разностных схем установлена в гильбертовых пространствах со сложной составной нормой (см. (15.30)). Можно получить оценки устойчивости в более простых за счет несколько более жестких условий устойчивости. Пусть в операторно-разностной схеме (15.28) операторы R и А являются са­ мосопряженными. Тогда при выполнении условий В > О, R>^-^A Л >0, (15.31) с е > 0 имеют место априорные оценки \\Уп+ г\\2А < 2 ^ ( 1 Ы | 2Л + ||2/i - 2/о||д), 1 к +1||2л + ||!/„ ~ Уп-Л1 < + 112/1 - 2/о||я)- (15.32) (15.33) Для разностной схемы (15.26) при тех же предположениях об операторах R и А при выполнении операторных неравенств В > еЕ, А > 0, R > ^А (15.34) с постоянной е > 0 для разностного решения справедливы априорные оценки ^ +1 < ^ 1 + ^ Е г | | ^ | | 2, ^ к=1 + (15.35) (15.36) к=1 305 15.2 Разностные методы решения нестационарных задач Здесь = \ { А ( у п + 1 + У п ) ,У п + 1+ Уп) + {R{yn+1 - У п ) ,У п + 1- J /n )- -\{А {У п+ 1 - 2/п),2/п+1 - Уп)При сформулированных ограничениях величина £п задает норму. Разностные схемы для параболического уравнения Рассмотрим разностные схемы для одномерного параболического уравнения (15.1). По пространству будем использовать равномерную сетку ujh — {х \ х — Xi — ih, N h = /}, г = 0 , 1 , , AT, и пусть Uh — множество внутренних узлов (г = 1 ,2 ,..., N — 1), а дин — множество граничных узлов. При приближенном решении задачи (15.1)—(15.3) определим сеточный опера­ тор А у = —{аух)х, х е (15.37) для сеточных функций у = 0, х £ и h- Для задания коэффициента можно использовать выражения = ^(^г-1/2)) *£г-1/2 = ^? ai = 0,5(/c(zi_i) + k(xi)), a% dx Г h JXi_x k(x) [l - В H = L^iyJh) скалярное произведение и норму введем соотношениями (y,v) = У } 2 у^ А \\у \\ = {у , у )1/2- г= 1 Оператор А является самосопряженным и положительным: А* = А > 0. (15.38) Приведем также оценки оператора А снизу и сверху: 6Е < А < Д £ , (15.39) где 8 5 = -гг min k(x), /2 о < х <1 4 Д = — шах к(х). h 2 0<х<1 v ' 306 Нестационарные задачи математической физики Исходной дифференциальной задаче (15.1)—(15.3) поставим в соответствие задачу Коши для дифференциально-разностного уравнения: dv - + Av = <p(t), v(0) = и0. Д ля ее решения используем схему с весами yn+l ~ уп + А (а уп+1 + ( 1 -< 7 )уп) = <рп, в = 0 , 1 ,..., У° = щ . (15.40) (15.41) Схема с весами будет устойчивой в Н а при 17 ^ " " Ч - З Д Г (1 5 '42) В частности, схема с а > 0,5 абсолютно (при всех т > 0) устойчива. Рассмотрим вопрос о точности разностной схемы с весами (15.40), (15.41). Сформулируем соответствующую задачу для погрешности приближенного решения Z (ж) у (з?) 'Il{x, tn)) *Е ^ Mh) tn ^ ^г с учетом z n(x) = 0, х Е d u h, tn eu) T. Начальное условие задается точно и поэтому положим z0(x) = 0 , х в u h. Для погрешности из (15.41) следует ^,71+1 _ уП --------------+ A (a zn+l + (1 - a )zn) = 1рп, т п = 0 ,1 ,... Предполагая достаточную гладкость точного решения и коэффициентов уравнения (15.1) для погрешности аппроксимации будем иметь ^ ( х ) = 0(\h\2+ т1 '), хеи, tn ecoT, где и = и(а) = 2 при а = 0,5 и и = 1, если а ф 0,5. Для погрешности верна априорная оценка ||гп+1| | л < | | Г | и - . + Е г | | ^ | | л - , к=1 где использованы обозначения Ш= уп - уп~ 1 ----- • 307 15.2 Разностные методы решения нестационарных задач Следовательно разностная схема с весами сходится в Н А со скоростью 0 ( h 2 + ти). На основе использования оценок устойчивости по правой части устанавлива­ ется сходимость и в других нормах. Гиперболические уравнения Рассмотрим теперь разностные схемы для решения краевой задачи для од­ номерного гиперболического уравнения второго порядка (15.2), (15.5), (15.6). После дискретизации по пространству придем к дифференциально-разност­ ной задаче d2v л , ч /ЛЧ dv . ч — + A v = <p(t), v ( 0 ) = u o, — (0) = «i с ранее рассмотренным разностным оператором А. Будем использовать разностную уравнение у ^ _ 2уп + уп-г + + ^ + = ^ ^ ^ п = 1 ,2 ,..., которое аппроксимирует (15.5) со вторым порядком по времени и по про­ странству. Схема (15.43) записывается в каноническом виде (15.28) при R — —- Е -ь 67А. т2 Условия устойчивости (15.29) дают следующие ограничения на вес: В = 0, 1 4 1 т2 С привлечением априорных оценок устойчивости по правой части исследует­ ся задача для погрешности и устанавливается сходимость разностной схемы (15.43). Многомерные задачи Будем рассматривать краевую задачу для параболического уравнения вто­ рого порядка (15.7)—(15.9) в прямоугольнике 9 . Введем равномерную прямо­ угольную сетку с шагами hi и /г2, так что u>h = {х I X = {хи х 2), х а = iaha, ia = 1 ,2 ,... , N a, N aha = la, a = 1,2} . Определим разностный оператор 2 А = ] Г Л (“), а=1 (15.44) 308 Нестационарные задачи математической физики где А^а\ а = 1,2 — одномерные разностные операторы А {а)у = ~( а{а)уха)Ха, су = 1,2, хЕ ^, (15.45) определенные для сеточных функций ?у(х) = 0, х ^ u>h. Для коэффициентов положим, например, а (1)(х) = k(xi - 0.5/ii, rr2), а (2)(х) = к{хи х 2 - 0.5h2). Вычислительная реализация неявных схем (а ф 0) (15.40), (15.41) для чис­ ленного решения задачи (15.7)—(15.9) связана с решением сеточной эллипти­ ческой задачи. В экономичных разностных схемах переход на новый времен­ ной слой осуществляется с вычислительными затратами на один узел, не за­ висящими от общего числа узлов дискретизации по пространству. Экономич­ ные схемы строятся на основе аддитивного представления (15.44), с перехо­ дом к последовательности более простых задач с операторами А^а\ а = 1,2. Приведем примеры некоторых схем расщепления. Для правой части уравнения используется аддитивное представление / .ATl I .-71' <Р — <Pi + Классическая разностная схема переменных направлений (схема ПисменаРэкфорда) при расщеплении (15.44), (15.45) состоит из двух шагов. Сначала по известному у п находиться вспомогательная сеточная функция, которую мы обозначим уп+1/2, из уравнения 7/^"Ы/2 ?.п -+ А {1)уп+1/2 + Л(2У = 2<р" (15.46) 0.5т Интерпретируя т/п+1/2 как решение на момент времени t = tn+1/2, можем заметить, чаю (15.46) при = <рп соответствует определению решения по чисто неявной схеме по переменной Х\ (оператор Д (1^) и по явной схеме по переменной х 2 (оператор Л(2)). 7/n+1 _ л.п+1/2 ----— ^-------- + А т уп+1/2 + Л(2У +1 = 2V?” (15.47) U .ОТ Тем самым второй шаг связывается с использованием явной схемы по первой переменной и чисто неявной — по второй переменной. Сформулируем условия устойчивости схемы переменных направлений. Пусть в схеме (15.46), (15.47) постоянные операторы > 0 , а = 1,2. Тогда для разностного решения имеет место следующая оценка устойчивости по началь­ ным данным и правой части: Е + - А {2) )yn+l я + £ л (2)'..° 2" 1у На основе этой оценки устанавливается, что схема переменных направлений сходится со скоростью 0 ( т 2 -h|/i|2) в соответствующей, зависящей от опера­ торов расщепления норме. 309 15.3 Упражнения Необходимо выделить аддитивные схемы, которые относятся к классу без­ условно устойчивых разностных схем при расщеплении на произвольное чис­ ло операторов — схемы многокомпонентного расщепления. Аддитивные раз­ ностные схемы для задач с расщеплением на три и более попарно некоммути­ руемых операторов традиционно строятся на основе понятия суммарной ап­ проксимации - схемы покомпонентного расщепления (локально-одномерные схемы). Для двумерной задачи (15.7)—(15.9) имеем УП+а/2- Г На- 1)/2 + А Ы { а а 1 Г 0 + (1 _ = <р”, а = 1 ,2 , = (15 48) гг = 0 ,1 ,... При оа > 0.5 схема покомпонентного расщепления (15.48) безусловно устойчива. Приведем соответствующую априорную оценку устойчивости по на­ чальным данным и правой части. Для правых частей </?£, а = 1,2 будем использовать специальное представ­ ление 2 ¥>"„)=£«+ £С> а = 1,2, £Й = 0. (15.49) а=1 При 0.5 < ста < 2, а = 1,2 и т > 0 для решения задачи (15.48), (15.49) выполняется априорная оценка Н / + 1 Н < 1 1 /1 1 + к=0 Ё т а=1 Е ( |' 1 Й И + т 1 И (а ) {3=а Е й I При исследовании сходимости локально-одномерных схем существенно учи­ тывается специальное представление для погрешности погрешности типа (15.49). Отметим также, что устойчивость локально-одномерных схем уста­ навливается не только в гильбертовых пространствах сеточных функций, но и при использовании принципа максимума — в равномерной норме. 15.3 У п р а ж н е н и я У п р аж н ен и е 15.1 Напишите программу численного решения на равномер­ ной по пространству и времени сетке задачи т = д ^ { к^ д ^ ) + ^ х ' ^ ' u ( 0 ,t) = 0 , 0<х<1' u(l,t) = о, 7/(я, 0) = г?(т), ° < ^ г> о < £ < т, 0< х < I Нестационарные задачи математической физики 310 при использовании двухслойной схемы с весом а (см. (15.40), (15.41))- С помощью этой программы проведите численные эксперименты по прибли­ женному решению задачи с k(x) = 1, f ( x , t ) = 0 и точным решением (1 = 1) и (х , t) = е ~ ^ ьsin(7nr) + е_1б7г2*sin(47nr) на различных сетках по времени при использовании симметричной (а — 0.5,) и чисто неявной (а = 1) разностных схем. В модуле paraboliclD функция p arab o liclD O реализует численное решение краевой задачи для одномерного параболического уравнения с однородны­ ми граничными условиями первого рода с использованием двухслойной раз­ ностной схемы с весом. Для решение систем уравнений с трехдиагональной матрицей привлекается функция solveLU3() модуля 1иЗ. Модуль p a r a b o lic lD import numpy as np from lu3 import solveLU3 def p arab o lic lD (k , f , v, 1, tEnd, n, ta u , sigma): к ии Numerical S o lu tio n of th e D iric h le t problem fo r one-dim ensional p a ra b o lic equation. Use tw o -lay er scheme w ith th e weight of sigma. иик h = 1 / n a = n p .o n e s( (n+1), ’f l o a t ’) b = n p .z e ro s ((n + 1 ), ’f l o a t ’) с = n p .z e ro s ( (n+1), ’f l o a t ’) d = n p .z e ro s ( (n+1) , ’f l o a t ’) q = n p .z e ro s ((n + 1 ), ’f l o a t ’) tO = 0. yO = n p .z e ro s ( (n+1), ’f l o a t ’) f o r i in r a n g e d , n ) : x = i*h yO[i] = v(x) d [i] = k (x -h /2 .) d[n] = k ( l - h / 2 . ) t = [] у = □ t.append(tO ) у .append(yO) w hile tO < tEnd - ta u : fo r i in r a n g e d , n ) : a [ i] = 1. / ta u + sigma* (d[i+1] + d [i])/h * * 2 b [i] = - sigm a*d[i+l] /h**2 c [ i] = - sigm a*d[i] /h**2 311 15.3 Упражнения Г 1.5 г 1.0 Рис. 15.1 Решение параболической задачи q [i] = f ( i* h , tO + tau /2 .) + y 0 [ i ] /t a u \ + (l.-s ig m a )* (d [i+ l]* (y O [i+ l]-y O [i]) \ - d [ i ] * ( y 0 [ i ] - y 0 [ i - l ] ))/h * * 2 yO = solveLU3(a, b, c, q) tO = tO + ta u t . append(tO) у .append(yO) re tu rn n p .a r r a y ( t) , n p .a rra y (y ) Для приближенного решение модельной задачи при разных шагах по времени используется следующая программа. ехег - 1 5 1 ру import numpy as np import math as mt from parab o liclD import p arab o liclD import m a tp lo tlib .p y p lo t as p i t from m pl_ to o lk its.m p lo t3 d import Axes3D def k ( x ) : 312 Нестационарные задачи математической физики r e t u r n 1. def f ( x , t ) : r e t u r n 0. #mt.exp(x) def v ( x ) : r e t u r n m t.sin (m t.p i* x ) + m t.sin (4 .* m t.p i* x ) 1 = 1. n = 50 h = 1 / n tEnd = 0 . 1 u = n p .z e r o s ( (n+1) , ’f l o a t ’) ta u L i s t = [0.01, 0.005, 0.0025] f o r ta u in ta u L is t: p r i n t ’ta u = ’ , ta u f o r sigma in [0.5, 1.0]: t , у = parab oliclD (k , f , v, 1, tEnd, n, ta u , sigma) erMax = 0. f o r m in r a n g e ( l e n ( t ) ): yk = у [m,:] f o r i in r a n g e ( l , n ) : x = i*h p t = mt.pi**2*t[m] u [ i] = m t.s in (m t.p i* x )* m t.e x p (-p t) \ + m t. s i n ( 4 . *mt.pi*x)*m t. exp( - 1 6 .*pt) er = m t. s q r t (np. dot (y k-u , yk-u) *h) i f e r > erMax: erMax = er p rin t ’ sigma = ’ , sigma, ’e r = ’ , erMax fig = p lt.fig u re O ax = Axes3D(fig) xx = n p . l i n s p a c e ( 0 . , 1, n+1) t , у = parabo liclD (k , f , v, 1, tEnd, n, 0.001, 0.5) X, T = np.meshgrid(xx, t ) a x .p l o t . s u r f а с е (X, T, y, r s t r i d e = l , c s t r i d e = l , cmap=’g r a y ’) p i t . showO ta u — 0 01 sigm a “ 0 5 sigm a = 1 0 ta u “ 0 005 sigm a = 0 5 sigm a = 1 0 ta u = 0 0025 sigm a = 0 .5 sigm a = 1 0 e r = 0 0607892675115 e r = 0 129310302279 e r = 0 0127223352908 e r = 0 07606480772 e r = 0 00199840149212 er = 0 0 454283258452 313 15.3 Упражнения Приведенные данные иллюстрируют теоретические оценки скорости сходи­ мости для схемы с весами при сг = 0.5 и а = I. Само численное решение показано на рис. 15.1. У п р а ж н е н и е 15.2 Напишите программу численного решения на равномер­ ной по пространству и времени сетке двумерной задачи д 2и д 2и . . т = Щ + Щ +Л х А ди и(х, t) = 0, х G dft и(х, 0) = v( x) , _ п хеП' 0<‘ ST' 0 < t < Т, х Е ft в прямоугольнике Q при использовании схемы переменных направлений Письмена—Рэкфорда (см. (15.46), (15.47)). Работоспособность программы продемонстрируйте на численном решении задачи с точным решением u(x, t) = tx(li - х)у{12 - у) на различных сетках по времени. В модуле parabolic2D функция parabolic2D() предназначена для решения краевой задачи для двумерного параболического уравнения с однородными граничными условиями первого рода при использовании схемы Письмена— Рэкфорда. Решение систем уравнений с трехдиагональпой матрицей прово­ дится функцией solveLU3() модуля 1иЗ. Модуль: p a r a b o lic 2D; import numpy as np from lu3 import solveLU3 def para b o lic 2 D (f, v, 11, 12, tEnd, n l , n2, ta u ) : иии Numerical S olution of the D ir ic h le t problem f o r two-dimensional p a ra b o lic equation. Use a d d itiv e d if f e r e n c e scheme of a l t e r n a t i n g d i r e c t i o n s . иии hi h2 al bl cl ql a2 b2 c2 q2 tO = = = = = = = = = = = 11 / nl 12 / n2 n p.o nes( ( n l+ 1 ), ’f l o a t O n p .z e r o s ( ( n l+ 1 ), ’f l o a t ’) n p .z e r o s ( (n l+ 1 ), ’f l o a t ’) n p .z e r o s ( (n l+ 1 ), ’f l o a t ’) n p .o n e s((n 2 + l), ’f l o a t ’) n p .z e r o s ( (n 2 + l), ’f l o a t ’) n p .z e r o s ( (n 2 + l), ’f l o a t ’) n p .z e r o s ( ( n 2 + l) , ’f l o a t ’ ) 0. Нестационарные задачи математической физики 314 yO = n p .z e ro s ( (nl+1 ,п2+1), ’f l o a t ’) fo r i in r a n g e d ,n l ) : fo r j in r a n g e d ,n 2 ) : yO [ i , j ] = v d * h l,j* h 2 ) у = np.copy(yO) w hile tO < tEnd - 0.001*tau: ta u = m in(tau, tEnd - tO) # x l d ir e c tio n fo r j in ra n g e (l,n 2 ): fo r i in r a n g e d ,n l ) : a l [ i ] = 2 . / ta u + 2 ./h l* * 2 b l [i] = - 1 ./hl**2 c l [i] = - 1 ./h l* * 2 q l [ i ] = f ( i * h l , j*h2, tO + tau /2 .) + 2 . * y [ i , j ] / t a u \ + ( y [ i , j + l ] - 2 .* y [ i ,j ] + y [ i ,j - l ] ) / h 2 * * 2 y O [:,j] = solveLU 3(al, b l, c l , q l) # x2 d ir e c tio n fo r i in r a n g e d ,n l ) : fo r j in r a n g e d ,n 2 ) : a 2 [j] = 2 . / ta u + 2./h2**2 b2 [j] = - 1. /h2**2 c2 [j] = - 1. /h2**2 q 2 [j] = f ( i * h l , j*h2, tO + tau /2 .) + 2 . * y 0 [i, j ] / t a u \ + ( y 0 [ i + l ,j ] - 2 .* y 0 [ i ,j ] + y 0 [ i - l ,j ] ) / h l * * 2 y [ i , : ] = solveLU3(a2, b2, c2, q2) tO = tO + ta u re tu rn tO, у Численное решение модельной задачи на трех различных сетках по времени дается следующей программой. ехег —15.2 ру import numpy as np from parabolic2D import parabolic2D import m a tp lo tlib .p y p lo t as p i t from m pl_ to o lk its.m p lo t3 d im port Axes3D 11 = 1 . 12 = 1 . def f ( x , y , t ) : re tu rn x*(11-x)*y*(12-y)+ 2 .*t*(x*(11-x)+ y*(12-y)) def v ( x ,y ) : re tu rn 0. def u ( x , y , t ) : re tu rn t*x*(11-x)*y*(12-y) n l = 50 315 15.3 Упражнения +*0.06 " 0.05 Рис. 15.2 Решение двумерной Задачи п2 = 50 tEnd = 1. х = п р .1in sp a c e ( 0 ., 11, nl+1) у = n p .lin s p a c e ( 0 ., 12, п2+1) u t = n p .z e r o s ( ( n l+ l,n 2 + l) , ’f l o a t ’) fo r i in r a n g e ( l,n l ) : fo r j in r a n g e d ,n 2 ) : u t [ i , j ] = u (x [i] ,y [ j] ,tEnd) ta u L is t = [0 .1 , 0 .0 5 , 0.025] fo r ta u in ta u L is t: t , U = p a ra b o lic 2 D (f, v, 11, 12, tEnd, n l , n2, ta u ) p r in t ’ta u = ’ , ta u , ’e r r o r = ’ , abs(np.am ax(ut-U )) f ig = p i t . f i g u r e d ax = Axes3D(fig) X, Y = np.m eshgrid(x, y) ax .p lo t_ su rfa c e (X , Y, U, r s t r i d e = l , c s tr id e = l, cmap=’g ra y ’) p i t .showO tau - 0.1 error - 0.000736477377029 Нестационарные задачи математической физики 316 ta u ta u - 0.05 e r r o r - 0 .0 0 0 1 8 4 1 2 0 3 6 3 3 2 4 0. 025 e r r o r - 4 .6 0 3 0 0 9 0 8 7 1 3 e -0 5 Приближенное решение на конечный момент времени (Т = 1) приведено па рис. 15.2. Сходимость при уменьшении шага по времени иллюстрируется рас­ четными данными для трех значении шага по времени т. 15.4 Задачи З а д а ч а 15.1 Напишите программу численного решения на равномерной по каэюдому направлению сетке задачи для уравнений переноса ди ди ^ 7 + b{x,t) — = 0, at ох при начальном условии О< х < 1 , и(х, 0) = v(x), 0 <t <Т 0< х <I и периодических условиях по пространству и(х + l,t) —и (х 51) — б, 0 < t < Т. Используйте явную двухслойную схему при аппроксимации конвективного слагаемого центральными и направленными разностями. С помощью этой программы найдите численное решение на разных сетках задачи при 1 = 1, b(x, t) = 1 и начальном условии ■v{x) = | 1, 0.1 < х < 0.3, 0, х < 0.1, х > 0.3. З а д а ч а 15.2 Напишите программу для численного решения краевой задачи для одномерного параболического уравнения с краевыми условиями третьего рода: ди д^и ~di = fa? du —^ { 0 , t ) + a l (t)u (0,t ) =t i i ( t ) , 0<х<1’ 0<t<T, du — (l,t) + a2( t ) u ( l , t ) = n 2(t), u(x, 0) = v(x), 0 <t<T, 0< x <I на равномерной no пространству и времени сетке при использовании чисто неявной разностной схемы. Продемонстрируйте возмоэюности программы при приблиэюенном решении задачи (I = 1; = а2 = 0,10,100^ с точным решением и (х , t) = sin(i)(l + 2х —За;2). 317 15.4 Задачи З а д а ч а 15.3 Напишите программу для числеппого решения одномерного уравнения конвекции-диффузии которое дополнено граничными и начальными условиями и{ 0 ,^ = 0, u(l,t) = 0, и ( х, 0) = v ( x), 0 <t<T, 0 < х <1. Используйте двухслойную явно-неявную схему, когда на равномерной по про­ странству и времени сетке диффузионное слагаемое берется с верхнего слоя по времени, а конвективное слагаемое — с нижнего при центрально-разност­ ных аппроксимациях конвективного слагаемого. Используйте эту програм­ му для приближенного решения задачи при I = 1, f ( x , t) = 0 и Ъ(х) = v = 0 ,10,100. У п р аж н ен и е 15.3 Напишите программу численного решения на равномер­ ной по пространству и времени сетке задачи ii(0, t) = 0, и(х, u(l,t) = 0, 0 < t < Т, ди 0 )= v (x ), — (x,0) = w(x), 0 <х<1 при использовании трехслойной схемы с весом а (см. (15.43)). Примените эту программу для приблиэюенного решению задачи с к(х) = 0, f ( x , t ) = 0 и точным решением (1 = 1) и(х, t) = cos(2?rt) sin(27nr) на различных сетках по времени при а = 0,0.25. Список литературы [1] Бахвалов Н. С., Ж идков Н. П., Кобельков Г. М. Численные методы. — М.: Бином, 2008. [2] Бахвалов Н. С., Лапин А. В., Чижонков Е. В. Численные методы в задачах и упраж ­ нениях. — М.: Высшая школа, 2000. 13] Березин И. С., Ж идков Н. П. Методы вычислений. — М.: Наука, 1966, т.1; Физматгиз, 1962, т.2. [4] Бизли Д.М . Язы к программирования Python. Справочник. — Киев.: ДиаСофт, 2000. [5] Васильев Ф. П. Численные методы решения экстремальных задач. — М.: Наука, 1988. [6] Волков Е. А. Численные методы. — М.: Лань, 2004. [7] Гавурин М. К. Лекции по методам вычислений. М.: Наука, 1971. [8] Годунов С. К., Рябенький В. С. Разностные схемы. — М.: Наука, 1977. [9] Дробышевич В. И., Дымников В. П., Ривин Г. С. Задачи по вычислительной мат е­ матике. — М.: Наука, 1980. [10] Завьялов Ю. С., Квасов Б. И., Мирошниченко В. Л. Методы сплайн-функций. — М.: Наука, 1980. [11] Калиткин Н. Н. Численные методы. — М.: Наука, 1978. [12] Каханер Д ., Моулер К., Нэш С. Численные методы и программное обеспечение. — М.: Мир, 2001. [13] Коллатц Л., Альбрехт Ю. Задачи по прикладной математике. — М,: Мир, 1978. [14] Коновалов А. Н. Введение в вычислительные методы линейной алгебры. — Ново­ сибирск: Наука, 1993. [15] Крылов В. И., Бобков В. В., Монастырный П. И. Вычислительные методы. — М.: Наука, 1976, т.1; 1977, т.2. [16] Лейнингем И. Освой самостоятельно Python за 24 часа. — Киев: Вильямс, 2001. [17] Лутц Марк. Изучаем Python. — СПб: Символ-Плюс, 2009. [18] Лутц Марк. Программирование на Python. — СПб: Символ-Плюс, 2002. [19] Ляшко И. И., Макаров В. Л., Скоробогатько А. А. Методы вычислений. — Киев: Высшая школа, 1977. [20] Марчук Г. И. Методы вычислительной математики. — М.: Лань, 2009. [21] Марчук Г. И. Методы расщепления. —М.: Наука, 1988. [22] Марчук Г. И., Агошков В. И. Введение в проекционно-сеточные методы. — М.: Наука, 1981. [23] Мэтьюз Дж он Г., Финк Куртис Д . Численные методы. Использование M ATLAB. — М.: Вильямс, 2001. [24] Ортега Д ж ., Пул У. Введение в численные методы решения дифференциальных уравнений. — М.: Наука, 1986. [25] Ортега Д ж ., Рейнболдт В. Итерационные методы решения нелинейных систем уравнений со многими неизвестными. — М.: Мир, 1975. Список литературы 3 19 [26] Петров И. Б., Лобанов А. И. Лекции по вычислительной математике. — М.: Бином, 2009. [27] Плохотпиков К. Э. Вычислительные методы. Теория и практика в среде MATLAB. — М.: Горячая Линия - Телеком, 2009. [28] Сборник от задачи по числени методи. — София: Наука и изкуство, 1986. [29] Самарский А. А. Введение в численные методы. — М.: Лань, 2009. [30] Самарский А. А. Теория разностных схем. — М.: Наука, 1989. [31] Самарский А. А., Андреев В. Б. Разностные методы для эллиптических уравнений. — М.: Наука, 1976. [32] Самарский А. А., Вабищевич П.Н. Аддитивные схемы для задач математической физики. — М.: Наука, 1999. |33] Самарский А. А., Вабищевич П.Н. Численные методы решения задач конвекциидиффузии. — М.: URSS, 2009. [34] Самарский А. А., Вабищевич П.Н. Численные методы решения обратных задач математической физики. — М.: URSS, 2009. [35] Самарский А. А., Вабищевич П.Н., Самарская Е. А. Задачи и упраж нения по чис­ ленным методам. — М.: URSS, 2009. [36] Самарский А. А., Гулин А. В. Устойчивость разностных схем. — М.: URSS, 2009. [37] Самарский А. А., Гулин А. В. Численные методы. — М.: Научный мир, 2000. [38] Самарский А. А., Николаев Е. С. Методы решения сеточных уравнений. — М.: Наука, 1978. [39] Саммерфилд Марк. Программирование на Python 3. Подробное руководство. — СПб.: Символ-Плюс, 2009. [40] Сборник задач по методам вычислений. — М.: Физматлит, 1994. [41] Соболь Б.В., Месхи Б.Ч., Пешхоев И. Практикум по вычислительной математике. — М.: Феникс, 2008. [42] Современные численные методы решения обыкновенных дифференциальных yjxieнений. — М.: Мир, 1979. [43] Стренг Г., Фикс Д ж . Теория метода конечных элементов. — М.: Мир, 1980. [44] Сузи Р. А. Язык программирования Python. — М.: Бином, 2007. [45] Сузи Роман. Python. Наиболее полное руководство. — СПб.: БХВ-Петербург, 2002. [46] Сухарев А. Г., Тимохов А. В., Федоров В. В. К урс методов оптимизации. — М.: Физматлит, 2005. [47] Тихонов А. Н., Арсенин В. Я. Методы решения некорректных задач. — М.: Наука, 1986. [48] Тыртышников Е. Е. Методы численного анализа. — М.: Академия, 2007. [49] Фаддеев Д . К., Фаддеева В. П. Вычислительные методы линейной алгебры. — М.: Лань, 2009. [50] Хайрер Э., Ваннер Г. Решение обыкновенных дифференциальных уравнений: Ж ест ­ кие и дифференциально-алгебраические задачи алгебры. — М.: Мир, 1999. [51] Хайрер Э., Нерсетт С., Ваннер Г. Решение обыкновенных дифференциальных урав­ нений: Нелсесткие задачи. — М.: Мир, 1990. [52] Яненко Н. Н. Метод дробных шагов решения многомерных задач математической физики. — Новосибирск: Наука, 1967. Петр Николаевич ВАБИЩЕВИЧ Доктор физико-математических наук, профессор. Специалист в области вы числительной математики и м а тем ати^ского моделирования. Работает в Институте прикладной матема­ тики им. М. В. Келдыша РАН и Институте проблем безопасного развития атомной энергетики. П. Н. Вабищевичем разра­ ботаны новы е эф ф ективные вы числительны е алгоритмы для численного решения м ногомерных задач математиче­ ской ф изики, внесен большой вклад в разработку методов численного решения обратны х задач математической фи­ зики. Созданные им методы применяются при решении прикладны х проблем механики сплошной среды, тепло- и массопереноса. П. Н. Вабищевич — автор более 300 научны х работ, в том числе нескольких монографий и учебны х пособий, а также более 10 патентов РФ. Н аш е издательство пред л агает следую щ ие кн иги: М 2 В Ю 113321 Н АУЧН АЯ И У ЧВВН АЯ Л И П Я А Т У Я Л Тел /факс 7(499)135-». Тел /флкс 7 (4 9 9)135-4:1 ■Меняя $ 'им явМв t Шшт и м и и • нра> ■ «мамеим ы чтЛ ш ш п • м чем м п м WW Vт»