Опасность сложной арифметики в научных вычислениях

11

Комплекс скалярное произведение имеет два различных определений решает условные обозначения : · ¯u T V или ¯u T ° V . В BLAS я нашел подпрограммы cdotu, zdotu и cdotc, zdotc. Первые две подпрограммы фактически вычисляют u T v (поддельное внутреннее произведение!), А последние две подпрограммы сопрягают первый вектор во внутреннем произведении. Кроме того , любой из определения (конъюгат U или V ), U , V = ¯ V , U u,vu¯TvuTv¯uTvuvu,v=v,u¯с сопряжением! Более того, как указано в комментарии, выбор основных значений для многозначных сложных функций может зависеть от соглашения.

Мой вопрос: вызывает ли это осложнение реальную опасность для использования сложной арифметики в научных вычислениях? Этот вопрос подчеркивается авторами deal.ii, которые предлагают всегда разбивать комплексные числа на вещественную и мнимую части и использовать только действительную арифметику. Но я никогда не находил подход к расщеплению удобным. Например, подумайте о PML для гармонических по времени уравнений Максвелла.

Кажется, что беспокойство по поводу использования комплексных чисел преобладает в большинстве программ FEM с открытым исходным кодом, за исключением FreeFem ++ и libmesh. Но даже для двух исключений сложная арифметика менее проверена, чем действительная.

Мой последний вопрос: будем ли мы всегда избегать использования комплексных чисел?

Хуэй Чжан
источник
3
1ii
@hardmath Спасибо! Я добавил это в вопросе.
Хуэй Чжан
@hardmath: «небольшой набор тестовых примеров» - в большинстве библиотек, которые всесторонне реализуют операции линейной алгебры, вероятно, будут десятки или сотни мест, где взяты внутренние продукты. Для проверки их правильности потребуются сотни тестов, а для правильной реализации могут потребоваться месяцы. Конечно, это не невозможно, и некоторые библиотеки сделали это. Это просто большая работа, и не все авторы библиотек уверены, что они правильно поняли :-(
Вольфганг Бангерт
@WolfgangBangerth, может быть, вы могли бы объяснить решение сделки. III дизайн?
Билл Барт
3
Должны ли мы всегда избегать использования комплексных чисел? Пожалуйста, не надо. Я полагаю, что каждый ученый в области вычислений нуждается, например, в несимметричных разложениях по собственным значениям.
Федерико Полони

Ответы:

2

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

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

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

Мой вопрос: вызывает ли это осложнение реальную опасность для использования сложной арифметики в научных вычислениях?

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

Мой последний вопрос: будем ли мы всегда избегать использования комплексных чисел?

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

Х. Риттих
источник
-1

Эта статья актуальна:

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

http://people.freebsd.org/~das/kahan86branch.pdf

Джулиан Сьенфуэгос
источник
5
Добро пожаловать в SciComp! Возможно, вы могли бы объяснить больше, почему статья, на которую вы ссылаетесь, актуальна? Резюме сделает ваш ответ более ценным и с большей вероятностью будет проголосовано. Мы склонны препятствовать ответам, которые добавляют ссылки без достаточного контекста.
Джефф Оксберри