Линейные алгебраические операции

Символьная Гильбертова матрица

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

Сгенерируйте 3х3 Гильбертову матрицу. С format shortMATLAB® распечатывает показанный выход.

H = hilb(3)
H =
    1.0000    0.5000    0.3333
    0.5000    0.3333    0.2500
    0.3333    0.2500    0.2000

Вычисленные элементы H числа с плавающей запятой, которые являются отношениями маленьких целых чисел. H массив MATLAB класса double.

Преобразуйте H к символьной матрице.

H = sym(H)
H =
[   1, 1/2, 1/3]
[ 1/2, 1/3, 1/4]
[ 1/3, 1/4, 1/5]

Символьные операции линейной алгебры

Символьные операции на H приведите к результатам, которые соответствуют Гильбертовой матрице бесконечной точности, sym(hilb(3)), не его приближение с плавающей точкой, hilb(3).

Найдите инверсию H.

inv(H)
ans =
[   9,  -36,   30]
[ -36,  192, -180]
[  30, -180,  180]

Найдите определитель H.

det(H)
ans =
1/2160

Можно использовать оператор обратной косой черты, чтобы решить систему одновременных линейных уравнений. Например, решите H*x = b.

b = [1; 1; 1];
x = H\b
 x =
  3
 -24
  30

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

Арифметика переменной точности

Контрастируйте предыдущие операции с арифметикой переменной точности использование 20 цифр точности.

digits(20)
V = vpa(H)
V =
 
[                    1.0,                    0.5, 0.33333333333333333333]
[                    0.5, 0.33333333333333333333,                   0.25]
[ 0.33333333333333333333,                   0.25,                    0.2]

Десятичные точки в представлении отдельных элементов указывают, что MATLAB использует арифметику переменной точности. Результат каждой арифметической операции округлен к 20 значительным десятичным цифрам.

Инвертируйте матрицу и обратите внимание, что ошибки увеличены матричным числом обусловленности, который для hilb(3) приблизительно 500.

cond(V)
ans =
 
524.0567775860608

Вычислите различие инверсий версий бесконечной точности и переменной точности.

ih = inv(H)
ih =
 
[   9,  -36,   30]
[ -36,  192, -180]
[  30, -180,  180]
iv = inv(V)
iv =
 
[   9.0,  -36.0,   30.0]
[ -36.0,  192.0, -180.0]
[  30.0, -180.0,  180.0]

Несмотря на то, что эти матрицы выглядят одинаково, вычисляют разность, чтобы видеть, что они не.

dhv = ih - iv
dhv =
 
[ -5.4929962552349494034e-26,  2.4556924435168009098e-25, -2.1971985020939797614e-25]
[  2.4556924435168009098e-25, -1.2666203129718236271e-24,  1.1373733422604130529e-24]
[ -2.1971985020939797614e-25,  1.1373733422604130529e-24, -1.0856745539758488233e-24]

Решите уравнение V*y = b. Ответ выглядит одинаково как решение H*x = b.

y = V\b
y =
 
   3.0
 -24.0
  30.0

Вычислите разность между x и y видеть небольшую разницу между этими двумя решениями.

x-y
ans =
 
  8.0779356694631608874e-27
 -6.4623485355705287099e-26
  7.1085833891275815809e-26

Используя vpa с digits(16) предлагает сопоставимую точность использованию стандартных стандартных программ MATLAB с двойной точностью.

Символьное расследование сингулярного значения

Найдите значение s для H(1,1) это делает H сингулярный.

syms s
Hs = H;
Hs(1,1) = s
Z = det(Hs)
sol = solve(Z)
Hs =
[   s, 1/2, 1/3]
[ 1/2, 1/3, 1/4]
[ 1/3, 1/4, 1/5]

Z =
s/240 - 1/270

sol = 
8/9

Замените решением s в Hs.

Hs = subs(Hs, s, sol)
Hs =
[ 8/9, 1/2, 1/3]
[ 1/2, 1/3, 1/4]
[ 1/3, 1/4, 1/5]

Проверьте что определитель Hs нуль.

det(Hs)
ans =
0

Найдите пустой пробел и пробел столбца Hs. Оба пробела нетривиальны.

N = null(Hs)
C = colspace(Hs)
N=
3/10
 -6/5
    1

C =
[     1,     0]
[     0,     1]
[ -3/10,   6/5]

Проверяйте тот N находится на пустом пробеле Hs.

Hs*N
ans =
 
 0
 0
 0