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