Обзор области - от кризиса к кризису

Кризисы численного программирования

Программировать - значит понимать // Кристин Нюгард

Кризис математики

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

Несмотря на то, что эффективное использование вычислительной техники для математиков всегда было связано с определенными трудностями, сейчас умение самостоятельно использовать возможности компьютеров в работе совершенно необходимо в большинстве областей математики. Одновременно быстрое проникновение компьютеров во все области человеческой деятельности создает благоприятные условия для более широкого использования в этих областях математических методов. В действительности, те математики, которые оказались неспособны адаптироваться к использованию новых возможностей, оказались оттеснены в область интеллектуальных головоломок, не имеющих никакой практической пользы. Программирование - одна из наиболее трудных отраслей прикладной математики: слабым (poor) математикам лучше оставаться чистыми (pure) математиками (Э. Дейкстра).

Кризис численных алгоритмов

Научное программирование обычно понимается как синоним численных расчетов, которые были одной из первых областей применения компьютеров. Численные приложения имеют в настоящее время самый долгий опыт взаимодействия с миром компьютеров и сильнее всего изменились под их влиянием. К моменту появления компьютеров было разработано большое количество численных методов и накоплен огромный опыт их использования в ручных вычислениях. В то время бытовало убеждение, что достаточно реализовать в программах все накопленное в домашинной вычислительной математике многообразие численных методов и компьютер станет универсальным решателем численных задач.

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

Кризис численного программирования

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

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

Математические библиотеки

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

Довольно быстро было разработано несколько общеупотребительных численных библиотек, получивших широкое распространение. Например, библиотека SSP (Scientific Subroutine Package) фирмы IBM распространялась в составе базового программного обеспечения машин IBM-360 и рассматривалась пользователями чуть ли не как часть операционного окружения. При этом библиотека SSP была одной из самых некачественных библиотек и журнальная литература тех лет полнится сообщениями об ошибочных результатах, полученных при ее использовании. Всем ветеранам численного программирования памятен датчик случайных чисел RANDU из библиотеки SSP, дающий на удивление далекие от случайных 3-мерные векторы. В то же время к математической библиотеке, претендующей на звание "стандартной" должны предъявляться весьма высокие требования в смысле надежности и качества.

Кризис библиотек

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

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

Кризис сложности реализаций

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

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

Кризис документации

Громоздкость математических библиотек привела к кризису технической документации по ним, которая стала быстро разрастаться в объеме. Документация, описывающая все возможности крупной библиотеки матричной математики составляет толстый том, поиск в котором нужного метода представляет собой нетривиальную задачу. Во многих случаях пользователь, неплохо информированный в свой предметной области, знакомясь с такой библиотекой, обнаруживает, что он даже не представляет причин такого разнообразия методов. Действительно, зачем иметь 10 разных методов решения задачи на собственные значения для симметричной положительно определенной матрицы? Ответ знают только эксперты.

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

Кризис черного ящика

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

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

Кризис языка

Традиционно все программы, связанные с численными расчетами писались (и зачастую пишутся сейчас) на Фортране. Проникновение в эту область других языков сдерживается огромным фондом разработанного программного обеспечения и библиотек. Однако со временем стало ясно, что повсеместное использование Фортрана является дорогим удовольствием, поскольку из-за его слабых выразительных возможностей возрастает удельная стоимость разработки программ. Кроме того, вычислительные задачи часто интегрируются с задачами нечисловой обработки информации (базы данных, графика), в которых несостоятельность Фортрана оказывается уже вопиющей.

Довольно давно созрела уверенность, что Фортран абсолютно неадекватен каким бы то ни было серьезным применениям. Тем не менее, в течение многих лет Фортран регулярно реанимируется производителями математического программного обеспечения, продолжающими выпускать и поддерживать программы на Фортране. Фортран - "младенческое расстройство" с двадцатилетним стажем - безнадежно неадекватен какому бы то ни было применению ЭВМ сегодня: он слишком неуклюж, слишком опасен и слишком дорог, чтобы его применять (Э. Дейкстра).

Тупик развития

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

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

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

Резюме

Таким образом, можно сделать следующие выводы:

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

Эти выводы не оставляют места для оптимизма относительно благополучия в области численного программирования.

Современное состояние отрасли

Традиционно в области численного программирования господствуют две противоборствующие школы:

  • Часть математиков считает, что достаточно научиться писать простые программы на одном из языков программирования, чтобы начать заниматься разработкой научных программ. Такие люди обычно думают, что программирование математических методов заключается в формальном кодировании формул. Эта школа производит большое количество неустойчивых и полных ошибок программ, не вызывающих доверия и непригодных для использования. В старые добрые времена физики повторяли опыты друг друга, чтобы быть уверенными в результатах. Сейчас они придерживаются Фортрана, перенимая друг у друга программы с ошибками (Э. Дейкстра).
  • Другая часть математиков знает с какими трудностями связано создание качественного научного программного обеспечения. Они много слышали о таинственных опасностях, подстерегающих тех неосторожных, кто осмелился написать собственную реализацию какого-нибудь численного алгоритма. Такие люди вообще не пишут программ и стараются пользоваться готовыми математическими пакетами, таким как Matlab, полагая, что их писали волшебники. Если представителю этой школы и приходится написать собственную программу, то она будет целиком состоять из вызовов библиотечных функций из какой-нибудь популярной библиотеки научных подпрограмм, которую тоже, вероятно, написал чародей.

Между описанными крайностями находятся люди, которые пишут простые, легко обозримые, открытые для изучения, надежные численные программы. Эти люди знакомы с ловушками численного программирования и понимают, что для создания надежной и устойчивой реализации численного алгоритма необходим труд, знания и опыт. Чаще всего в таком случае используются более современные и мощные языки программирования, чем традиционный Фортран. Для разработки численных программ совершенно необходимо также хорошо знать основные технические приемы, выработанные поколениями экспертов и позволяющие обходить простые ловушки. Ясно, что открытость исходного кода для изучения предполагает минимизацию и тщательное документирование всех неочевидных особенностей реализации. Численное программное обеспечение, удовлетворяющее сформулированным выше требованиям я называю "легким" программным обеспечением.

В предыдущем разделе было продемонстрировано неутешительное положение, сложившееся в настоящее время в области разработки математического программного обеспечения. Основная причина такого положения кроется в закрытости численного программирования как области деятельности людей. Из-за сложности математических библиотек профессиональные знания и опыт, накопленные "гуру" численного программирования фактически остаются корпоративной тайной даже в случае открытости исходного кода. Здесь приведен краткий обзор современного состояния так называемого "легкого" численного программирования и перечислены основные его положения.

UNIX и численное программирование

Широкое распространение операционной системы UNIX и языка C привело к появлению небольшого отряда пользователей, которые стали использовать этот язык для реализации численного программного обеспечения. Работы таких пользователей обычно не поддерживались крупными производителями программного обеспечения и тенденция к стандартизации и созданию библиотек долго не проявлялась. Программирование математики на C оставалось полем деятельности любителей-одиночек. До сих пор многие считают, что серьезные люди пишут всю математику на Фортране.

Некоторый прогресс наметился, когда численное программирование на C как область деятельности стали замечать. Второе издание известной книги "Numerical Recipies", содержащей исходные тексты обширной библиотеки научных программ, вышло в трех редакциях, ориентированных на Fortran, Pascal и C соответственно. Книга "Numerical Recipies" вообще является незаурядным явлением в области численного программирования и заслуживает более внимательного рассмотрения.

Numerical Recipies

Книга "Numerical Recipies" представляет собой подробное описание большой коллекции реализаций численных алгоритмов. Исходный код для всех алгоритмов приведен в тексте и дополнительно распространяется в электронном виде. Сам текст книги доступен в сети, но его использование ограничивается лицензионным соглашением. Даже купив книгу и компакт с исходниками библиотеки, вы будете вынуждены соблюдать массу ограничений. Самое существенное из них заключается в том, что исходные тексты программы, включающей в себя код из NR нельзя сделать общедоступными.

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

Язык C и численное программирование

Огромное влияние и широкое распространение языка C неизбежно привело к появлению научных программ, написанных на этом языке. Здесь наиболее важно то, что математическое программное обеспечение, написанное на C имеет большие шансы быть востребованным в тех промышленных приложениях, которые пишутся на этом языке. Вместе с тем использование C для численного программирования связано со многими трудностями. Популярность Фортрана во многом была обусловлена наличием встроенной поддержки матриц и комплексных чисел. В языке C стандарта ANSI нет ни того ни другого.

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

Язык C++ и численное программирование

До принятия стандарта язык C++ с точки зрения разработки простых численных программ мало чем отличался от языка C. Поддержка комплексных чисел и матриц может быть интегрирована в C++ более естественным образом, чем в C, но от этого она не перестает быть нестандартным расширением языка. В стандарте (это так называемая версия 3 языка C++) появилась поддержка комплексных чисел и матриц на уровне стандартной библиотеки. Класс valarray и разнообразные "срезы" (slices) реализуют простые одномерные массивы и позволяют обращаться с ними как с матрицами.

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

Шаблоны и численное программирование

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

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

Система Matlab

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

Важной особенностью Matlab-а является то, что он предлагает встроенную в язык стандартную поддержку комплексных чисел и матриц. В действительности каждая переменная является в Matlab-е матрицей, состоящей из комплексных чисел (скалярные величины рассматриваются как вырожденный случай матриц). Это делает Matlab привлекательной базой для создания открытого и переносимого математического программного обеспечения. С другой стороны, именно эта особенность приводит к заметному снижению производительности для программ, разработанных на базе Matlab-а. Автор наблюдал как Matlab-реализация некоего численного алгоритма работала в 150 раз (!) медленнее аналогичной реализации, написанной на C. Среди других недостатков отметим неестественную нотацию, которая предлагается (и навязывается) Matlab-ом для простых алгоритмических конструкций (например, для циклов). Многие исходные тексты, написанные на языке Matlab и использующие эту нотацию трудно назвать легко читаемыми. В то же время основные недостатком программ, разработанных с использованием Matlab-а является их замкнутость. Такие программы могут выполняться только в рамках среды, предоставляемой пакетом Matlab, а встраивание написанных на Matlab-е модулей в программы общего назначения представляется проблематичным.

Окружение для численного программирования

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

При использовании других языков (например, Фортрана) и систем программирования (например при работе в UNIX) пользователь оказывается лишен сервиса, предоставляемого системой Matlab. Для того, чтобы реализовать в рамках других систем программирования графический сервис, сходный по возможностям с предоставляемым в Matlab-е, требуется довольно большая подготовительная работа по созданию вспомогательных библиотек.

"Легкое" численное программирование

Перечислим кратко основные положения, которые нужно иметь в виду при разработке "легкого" численного программного обеспечения.

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

Несмотря на все проблемы, использование языков типа C и C++ для реализации численных алгоритмов показало свою эффективность. Основным достоинством такого подхода является легкость интеграции математических методов в промышленные програмные системы, что дает численному программированию необходимый импульс к развитию. C и C++ являются весьма мощними и выразительными языками и позволяют при меньших усилиях разрабатывать значительно более сложные программы, чем это было бы возможно при использовании Фортрана. Одновременно C является весьма устойчивым, переносимым и широко распространенным языком программирования и написанное на нем программное обеспечение во многом наследует эти свойства языка. Можно надеяться, что реализация численного алгоритма, написанная на C сохранит свою актуальность в течение длительного времени и для различных аппаратных платформ.

Проблемы, связанные с комплексной арифметикой оказались не столь серьезными (см. подробное обсуждение в разделе Шаблоны и численное программирование). Относительно матричной арифметики опыт книги Numerical Recipes убедительно продемонстрировал возможность вполне удовлетворительной универсальной и простой реализации. К сожалению, требование простоты и открытости исходного кода практически исключает использование оптимального представления для специальных типов матриц (симметричных, блочных). Алгоритмы, требующие (например для достижения приемлемой производительности) использования специальных методов представления матриц, следует считать специфическими. Общеупотребительные численные алгоритмы должны избегать таких представлений, если же использование специфических алгоритмов совершенно необходимо, то выигрыш от их использования должен окупать затраты на реализацию. Отметим, что отнесение алгоритма к общеупотребительным или специфическим сильно зависит от основной предметной области (например при работе с уравнениями математической физики специфические трехдиагональные матрицы становятся основной матричной структурой, а специфический алгоритм прогонки - общеупотребительным).

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

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

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

page_revision: 7, last_edited: 1207142665|%e %b %Y, %H:%M %Z (%O ago)
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License