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