4
julia> A = [1 2; 3 4] 
2x2 Array{Int64,2}: 
1 2 
3 4 

julia> A * inv(A) 
2x2 Array{Float64,2}: 
1.0   0.0 
8.88178e-16 1.0 

Почему результат в левом нижнем углу, а не 8.88178e-160.0, как в верхнем правом углу? Как я могу выполнить операцию, чтобы получить результат [1.0 0.0; 0.0 1.0].Умножение матриц обратное в Джулии

Есть ли способ отобразить результат по желанию, но фактически выполнить операцию с матрицей символически, как можно было бы в muPad или какой-либо другой символический оценщик?

+4

Вот как работают номера с плавающей запятой. 64 бита удвоения IEEE дают 16 цифр точности. https://en.wikipedia.org/wiki/IEEE_floating_point – duffymo

+3

Добро пожаловать в мир вычислений с плавающей запятой. Это нормально. Вы можете реализовать свои собственные матричные операции с десятичным символом, но есть причина, почему числа с плавающей запятой доминируют в научном мире. – sascha

+3

Вы можете использовать 'SymPy', если вы хотите использовать символическую математику в' Julia': ' использование SymPy; A = [Sym (1) 2; 3 4]; A * inv (A) '. (Это просто передает задачу в модуль Sympy Python.) – jverzani

ответ

4

Как упоминалось в комментариях, наилучшим способом является использование типа Rational. E.x., A = Rational{Int}[1 2;3 4], чтобы получить выход в нужном формате, A*float(inv(A)). Кредиты для @mschauer.

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

Julia однако очень легко определить другие числовые типы и работать с ними, если хотите. Один из них - тип рационального числа, который может точно представлять дроби. Мы можем создать массив как рациональные числа:

julia> A = Rational{Int}[1 2;3 4] 2x2 Array{Rational{Int64},2}: 1//1 2//1 3//1 4//1

Затем, операции на этом массиве будут возвращать точный рациональные результаты

julia> A*(inv(A)) 2x2 Array{Rational{Int64},2}: 1//1 0//1 0//1 1//1

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

julia> float(A*(inv(A))) 2x2 Array{Float64,2}: 1.0 0.0 0.0 1.0

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

Смежные вопросы