Снова читаю книжки по численным методам. В этот раз под раздачу попала Numerical Recipes in C: The Art of Scientific Computing. Авторов — целая куча: Press W.H., Teukolsky S.A., Vetterling W.T., Flannery B.P. Есть даже официальный сайт, где можно бесплатно почитать кусочки из книги:
Обратите внимание, что в интернете доступно два издания этой книги — второе, вышедшее в 1992 году, и третье — 2007 года. Я начинал читать второе, и был очень разочарован некоторыми «находками» авторов. Скажем, в давнем споре о том, как должны нумероваться элементы массива — с 0 или с 1 — они заняли «компромиссную» позицию — иногда элементы массивов нумеровались с 0, а иногда — с 1, как удобнее в каждом конкретном случае. Предлагался диковатый способ хранения матриц — в общем, уже с первой главы стало понятно, что весь найденный в книге код придется переписывать в соответствии со своими эстетическими представлениями.
В третьем издании на титульном листе упоминается уже C++, и книга основательно переписана. Скажем, нумерация массивов с 1 благополучно забыта — и это прекрасно! Вместо этого, правда, появляются сомнительные «классы» — а к ООП в численных методах меня приучили относиться с подозрением (может, и зря). Разумеется, это не «чистый» C++, а «C on steroids» — но от этого все равно не легче. Рекомендация из предыдущего абзаца остается в силе — встретив в книге «простыню» кода, попытайтесь ее понять и переписать. Особенно этот совет будет полезен, если вы имеете обыкновение читать лицензии — весь код в книге лицензирован под какой-то чудовищной, затрудняющей всякое разумное применение лицензией.
Еще одно маленькое замечание касательно кода — местами возникает впечатление, что программы аккуратно переписаны с Фортрана. В общем, код в книге довольно дикий, сочетающий использование относительно современного C++ с какими-то жуткими древностями — еще один аргумент за «понять и переписать».
Круг рассматриваемых тем довольно широк (скажем, он «перекрывает» программу двухсеместрового курса по численным методам) — решение систем линейных уравнений (и связанные с этим сюжеты, вроде QR-разложения матриц), поиск собственных значений, различные методы вычисления функций (в том числе всевозможных «специальных функций», типа бета- и гамма-функций), интерполяция, решение нелинейных уравнений, поиск экстремумов, вычисление интегралов, численные методы решения дифференциальных уравнений (задача Коши и краевые задачи), уравнения в частных производных, интегральные уравнения, статистические задачи, (быстрое) преобразование Фурье и все с ним связанное, вычислительная геометрия, и пара глав посвящена более «дискретным» задачам — вроде сортировки, кодирования и сжатия данных. Естественно, такое количество задач сложно более-менее подробно рассмотреть даже на 1262 страницах — так что компромиссы неизбежны.
В этой книге авторы решили пожертвовать математическим обоснованием используемых алгоритмов. Как выглядит глава по любимой мной теме — решению задачи Коши для дифференциальных уравнений? Десяток страниц посвящен организации вычислений — придумана довольно «общая» C++-ная библиотека, примерно то, что называют «фреймворком» — а реализуемые методы будут под нее подстраиваться. Дальше излагаются основы метода Рунге-Кутты, приводятся с иллюстрациями «на пальцах» коэффициенты методов 2-го и 4-го порядков. Следующий раздел посвящен автоматическому выбору длины шага — и тут уже разговор идет на языке «делай раз, делай два», без попытки привести хоть какое-то обоснование используемых формул. Наконец, приводится исходный текст реализации метода Дормана-Принса 5-го порядка и упоминается о методе 8-го порядка — здесь, правда, решили поэкономить бумагу и просто дали ссылку на сайт с его реализацией.
В общем, книжка находится где-то посередине между учебником по численным методам и справочником «наиболее полезных алгоритмов» — для первого она получается слишком краткой, а для второго — слишком подробной. Немного спасают ситуацию списки литературы по каждой из тем — насколько я могу судить, вполне адекватные. Склоняюсь к тому, чтобы считать книгу довольно полезной — но с оговорками.