Комплекс скалярное произведение имеет два различных определений решает условные обозначения : · ¯u T V или ¯u T ° V . В BLAS я нашел подпрограммы cdotu, zdotu и cdotc, zdotc. Первые две подпрограммы фактически вычисляют u T v (поддельное внутреннее произведение!), А последние две подпрограммы сопрягают первый вектор во внутреннем произведении. Кроме того , любой из определения (конъюгат U или V ), ⟨ U , V ⟩ = ¯ ⟨ V , U ⟩с сопряжением! Более того, как указано в комментарии, выбор основных значений для многозначных сложных функций может зависеть от соглашения.
Мой вопрос: вызывает ли это осложнение реальную опасность для использования сложной арифметики в научных вычислениях? Этот вопрос подчеркивается авторами deal.ii, которые предлагают всегда разбивать комплексные числа на вещественную и мнимую части и использовать только действительную арифметику. Но я никогда не находил подход к расщеплению удобным. Например, подумайте о PML для гармонических по времени уравнений Максвелла.
Кажется, что беспокойство по поводу использования комплексных чисел преобладает в большинстве программ FEM с открытым исходным кодом, за исключением FreeFem ++ и libmesh. Но даже для двух исключений сложная арифметика менее проверена, чем действительная.
Мой последний вопрос: будем ли мы всегда избегать использования комплексных чисел?
источник
Ответы:
Вы говорите, что проблема со сложной арифметикой заключается в том, что существуют разные способы определения скалярного произведения для сложных векторов, по сравнению с одним способом в реальном случае. Я думаю, что реальная проблема со сложным скалярным произведением - это еще одна проблема, которая, однако, тесно связана с вашим наблюдением.
В сложной арифметике порядок аргументов скалярного произведения имеет значение, а в реальной арифметике - нет. Многие алгоритмы по сути одинаковы в сложной и реальной арифметике, а это означает, что вам просто нужно написать их один раз, а затем использовать один и тот же код для сложной и реальной арифметики. (Например, в C ++ вы можете использовать шаблоны для этой цели.) Когда вы закончите писать свой код, вы обычно тестируете его. Чтобы выявить ошибки в порядке аргументов в некотором скалярном продукте, вы должны протестировать свой код с помощью комплексного тестового примера.
Вы часто получаете реальный код для алгоритма бесплатно, когда у вас есть рабочий код для комплексных задач. Когда вы проверили свой код с помощью комплексного тестового примера, код часто также корректен для действительных чисел. Однако превращение реального кода в сложный требует дополнительной работы. Следовательно, существует только больше кодов, которые просто работают (и проходят тщательную проверку) для реальных, чем для сложных задач.
Я бы сказал «Да» следующим образом. Когда код недостаточно хорошо протестирован для сложных задач, существует большая вероятность ошибок в коде, но это зависит от конкретного кода, который вы просматриваете. Когда код хорошо протестирован, проблем нет.
Как уже указывалось, существуют проблемы, которые невозможно решить с помощью действительных чисел. Например, вычисление собственных значений несимметричных матриц. Следовательно, нам нужна сложная арифметика.
источник
Эта статья актуальна:
Отрезки ветвей для элементарных сложных функций или много шума из ничего не знакового бита.
http://people.freebsd.org/~das/kahan86branch.pdf
источник