Следующие примеры, которые показывают, как выполнить основные линейные алгебраические операции, основаны на символьной версии 3х3 Гильбертовой матрицы.
Сгенерируйте 3х3 Гильбертову матрицу. С format short
MATLAB® распечатывает показанный вывод.
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