Rationale for Ada 2005: Predefined library
RUSTOPBACKNEXT
ENG |
6. Numerics annex
@ When Ada 95 was being designed, the Numerics Rapporteur Group pontificated at length over what features should be included in Ada 95 itself, what should be placed in secondary standards, and what should be left to the creativeness of the user community. @ A number of secondary standards had been developed for Ada 83. They were
|
|
|
|
|
|
|
Rationale for Ada 2005: Predefined library
@ENGRUSTOPBACKNEXT6. Приложение численных данных
@ При разработке ada Numerics Rapporteur Group (Группа Докладчика Численных данных) определила какие возможности должны быть включены в Аду 95 непосредственно, какие должны быть помещены во вторичные стандарты, а что нужно оставить к творческому началу пользовательского сообщества.
@ Для Ады 83 были разработаны следующие вторичные стандарты:
@ Первые два (11430 и 11729) были включены в базовый язык. Элементарные функции (11430 (Sqrt, Sin, Cos и т.д)) оказались в пакете Ada.Numerics.Generic_Elementary_Functions в A 5.1, а примитивные функции (11729) стали различными атрибутами, такими как Floor, Ceiling, Exponent и Fraction в A 5.3. Оригинальные стандарты были отброшены.
@ Другие два стандарта, хотя первоначально и были разработаны как стандарт Ады 83 но они не были одобренны вподь до 1998.
@ Функциональные возможности 13814 были включены в приложение Численных данных ada в пакет Ada.Numerics.Generic_Complex_Elementary_Functions в G 1.2. Соответственно оригинальный стандарт теперь утратил силу.
@ Однако, ситуация относительно 13813 не была настолько ясна. Он покрывал четыре области
@ Первый из них был включен в приложение Численных данных ada как пакет Ada.Numerics.Generic_Complex_Types в G 1.1, последний так же стал пакетом Ada.Text_IO.Complex_IO в G 1.3. Однако, пакеты реальных и комплексных массивовне не были включены в Аду 95.
@ Причина этого вычеркивания объяснена в Секции G 1.1 Разъяснения для ada [3] где говорится, что решение было принято чтобы сократить пакеты ada, опуская векторные и матричные типы и операции. Одна из причин состояла в том, что такие типы и операции были в значительной степени самоочевидны, ??? так чтобы небольшая реальная справка была предоставлена, определяя их в языке ???. Другая причина была в том, что будущая версия Ады могла бы добавить расширения для манипуляции массивами и, таким образом, было бы неуместно блокировать такие операции надолго.
@ Одно из расширений которое ожидалось было средство для манипулирования произвольным подразделением массивов как в Алголе 68. Эти скорее узкоспециализированные средства так и не были добавлены в Аду 2005, и весьма сомнительно их добавление в обозримом будущем. Вторая причина для того чтобы опустить вектора и матричные средства 13813 таким образом исчезает.
@ Чтобы преодолеть возражение, что все самоочевидно, мы проявили подход, что мы должны добавить такие основные средства которые хотя и не совсем тривиальны, но с математической точки зрения хорошо понятны.
@ Таким образом, в результате Ада 2005 включает почти всё из 13813 плюс подпрограммы для:
@ Небольшое количество операций, которые не были связаны с линейной алгеброй, было удалено (такие как подъем всех элементов матрицы к данной мощности).
@ Так Ада 2005 включает два новых пакета Ada.Numerics.Generic_Real_Arrays и Ada.Numerics.Generic_Complex_Arrays. Здесь мы даем только сокращенную форму реального пакета в котором спецификации обычных операторов опущены (т.к. полная спецификация заняла бы слишком много места):
|
@ Многие из этих операций весьма самоочевидны. Основная идея состоит в представлении обычных арифметических операций в привычном для написания виде, как было показано во Введении. Но следующие пункты должны быть отмечены.
@ Есть две операции "abs" обрабатывающие Real_Vector следующим образом:
|
@ Первая возвращает вектор, каждый элемент которого - абсолютное значение соответствующего элемента параметра (ничего необычного), а другой возвращает скаляр, который является так называемой L2-нормой вектора. Это - квадратный корень внутреннего продукта вектора с собой или v (Sxixi) - или только v (xixi) использование соглашения суммирования (который знаком тем, кто балуется относительным миром тензоров). Для этого предоставляется отличная операция, которая позволяет избежать любого промежуточного переполнения, которое могло бы произойти, если бы пользователь вычислял его непосредственно используя ??? внутренний продукт "*" ???.
@ Есть две функции Solve для того, чтобы решить соответственно одну или несколько систем линейных уравнений. Таким образом, если у нас есть система из n уравнений:
|
@ тогда мы можем написать:
|
@ и если мы имеем m систем из n уравнений, тогда мы можем написать:
|
@ Функции Inverse и Determinant предоставлены для функциональной полноты, хотя они должны использоваться осторожно. Ибо, весьма глупо решать систему уравнений следующим образом:
|
@ потому что это весьма медленно и склонно к ошибкам. Основная проблема с Determinant состоит в том, что она склонна к переполннению и потере порядка даже для умеренных размеров матриц. Так, если количество элементов будет иметь порядок 1000, а у матрицы порядок 10, то величина детерминанта будет иметь порядок 1030. Пользователю, вероятно, поэтому придется масштабировать данные.
@ Две подпрограммы предоставлены для того, чтобы определить собственные значения и собственные векторы симметричной матрицы. Они обычно требуются во многих вычислениях в доменах, таких как адаптационная способность, моменты инерции, области уверенности и так далее. Функция Eigenvalues возвращает собственное значение (которое будет неотрицательным) как вектор в порядке убывания. Процедура Eigensystem вычисляет и собственные значения и векторы; параметр Values - то же самое, поскольку полученное, вызывая функцию Eigenvalues и параметр Vectors является матрицей, столбцы которой - соответствующие собственные векторы в том же самом порядке. Собственные векторы взаимно orthonormal (то есть, длины модуля и взаимно ортогональны), даже когда есть повторенные собственные значения. Эти подпрограммы применяются только к симметричным матрицам и если матрица не симметрична тогда возбуждается исключение Argument_Error.
@ Другие ошибки, такие как несоответствие границ массива поднимают исключение Constraint_Error по аналогии со встроенными операциями над массивами.
@ Читатель заметит, что средства, предоставленные здесь, довольно скромны и представлены в простом стиле черного ящика. Важно понять, что мы не видим предопределенную библиотеку численных данных как альтернативу какой-нибудь из профессиональных библиотек, таких как известная BLAS (Основные Линейные Подпрограммы Алгебры, см. www.netlib.org/blas). Действительно, наша полная цель является двоякой: 1) предоставить обычно требуемые простые средства пользователю, который не является профессионалом в численных методах; 2) обеспечить базовую линию типов и операций, которые обеспечили бы основу для перехода к более мощными средствами, такими как BLAS.
@ Мы не ожидаем, что пользователи применят операции в наших пакетах к огромным матрицам, которые возникают в областях, таких как частичные дифференциальные уравнения. Такие матрицы имеют часто специальную природу такую как ??? banded ??? и нуждаются в средствах всесторонней числовой библиотеки. Мы вместо этого стремились предоставить удобные средства программисту, у которого есть потребность решить небольшое количество уравнений, которые могли бы возникнуть например в навигационных приложениях.
@ ??? Простота очевидна таких функций как Solve, не показывают почти неизбежную основную декомпозицию логического блока или обеспечивают параметры, управляющие например, должны ли быть применены дополнительные итерации. Однако, реализациям советуют применить дополнительную итерацию и должны зарегистрировать, делают ли они или нет. ???
@ Соображения простоты также привели к решению не делать автоматическое масштабирование для детерминанта или обеспечить функции только для наибольшего собственного значения и так далее.
@ Так же мы только предусматриваем eigensystems симметричных реальных матриц. Они чаще встречаются и обычно хорошо ведутся себя. В отличие от них с общими несимметричными матрицами может быть масса проблем.
@ Соответствующие требования точности определены для внутреннего продукта и операций L2-norm.
@ Требования точности для Solve, Inverse, Determinant, Eigenvalues и Eigenvectors - определяются реализацией, что означает, что реализация должна зарегистрировать их.
@ Пакет Complex очень похож и не будет описан подробно. Однако, универсальные формальные параметры интересны. Они следующие:
|
@ Таким образом, мы видим, что здесь есть два формальных пакета, которые являются соответственно пакетом реальных массивов и существующим в Аде 95 пакетом комплексных типов и операций. Формальный параметр первого <>, а второго Real, который экспортируется из первого пакета, что гарантирует что оба иллюстрируются с одним и тем же типом с плавающей запятой.
@ Так же как очевидный массив и матричные операции, у комплксного пакета также есть операции для того, чтобы составить комплексные массивы из декартовых и полярных реальных массивов, и вычислить сопряженный массив по аналогии со скалярными операциями в пакете комплексных типов. Там также смешаны реальные и комплексные операции над массивами, но не смешиваются мнимые, реальные и комплексные операции над массивами. В целом пакет комплексных массивов объявляет приблизительно 80 подпрограмм (в пакете реальных массивов их приблизительно 30), и добавление мнимых операций над массивами сделали бы пакет весьма громоздким (а справочное описание слишком тяжёлым).
@ По аналогии с реальными симметричными матрицами у комлексного пакета есть подпрограммы для того, чтобы определить eigensystems Hermitian матриц. ??? Матрица Hermitian - тот, сопряженный комплекс которого равняется перемещать; ??? такие матрицы имеют реальные собственные значения и хорошо ведутся себя.
@ Завершая это обсуждение приложения Численных данных упомянем одно мелкое изменение относительно комплексного ввода - вывода. Ада 2005 включает предиллюстрированную примерами форму Ada.Text_IO.Complex_IO, такую как Ada.Complex_Text_IO (для случая, когда основной реальный тип - Float), Ada.Long_ Complex_Text_IO (для типа Long_Float) и так далее. Они аналогичны Float_Text_IO, Long_Float_Text_IO и их исключение из ada в своё время теперь считается оплошностью.
2010-10-24 00:26:58
. .