Разложение векторов по базису


Теперь мы готовы найти точное разложение векторов по базису для случая, если координаты всех векторов заданы в виде целых чисел или посредством обыкновенных дробей (рациональные числа).

Задание 4. Разложить по базису

a) вектор

b) вектор

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

.

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

, и .

Поступая аналогично предыдущим вычислениям, образуем в Excel расширенную матрицу W и считываем ее в матрицы A и B:

# Работа с буфером обмена

Data <- read.table("clipboard", h=FALSE, dec=",", sep = "\t") # Чтение из буфера обмена excel-формата

W <- data.matrix(Data) # Объявить таблицу чисел матрицей в R

A <- W[ , 1:3]; A # Считываем матрицу A системы

B <- W[ , 4]; B # Считываем правый столбец системы

с результатом, представленным на рисунке 3

Рис. 3

Далее остается запустить операцию решения системы:

solve(A, B) # Приближенно решаем систему AX=B

solve.bigq(A, B) # Точно решаем систему AX=B

с результатом для обоих случаев:

> solve(A, B) # Приближенно решаем систему AX=B

V1 V2 V3

3.0000000000000000 6.0000000000000000 -4.9999999999999991

 

> solve.bigq(A, B) # Точно решаем систему AX=B

Big Rational ('bigq') 3 x 1 matrix:

[,1]

[1,] 3

[2,] 6

[3,] -5

Таким образом, искомое разложение по базису принимает вид:

Аналогично, для вектора получим:

B <- c(6, -3.5, 14.5); B

solve(A, B) # Приближенно решаем систему AX=B

solve.bigq(A, B) # Точно решаем систему AX=B

> B <- c(6, -7/2, 29/2); B

[1] 6.0 -3.5 14.5

> solve(A, B) # Приближенно решаем систему AX=B

V1 V2

5.0000000000000000e-01 5.0000000000000000e-01

V3

-2.0438670584833814e-17

 

> solve.bigq(A, B) # Точно решаем систему AX=B

Big Rational ('bigq') 3 x 1 matrix:

[,1]

[1,] 1/2

[2,] 1/2

[3,] 0

с ответом:

Заключение

Заметим, что если в координатах вектора указать обыкновенную дробь, например, для вектора запустив строку кода:

b <- c(1/3, 2/7, 4/5)

b

> b <- c(1/3, 2/7, 4/5);

> b

[1] 0.3333333 0.2857143 0.8000000

то последующее решение solve.bigq(A, b) уже не будет точным, т.к. дроби 1/3 и 2/7 успеют потерять точность после округления в десятичном представлении double-арифметики.

Для сохранения точности необходимо такой вектор изначально заявлять как bigq:

b <- c(as.bigq(1, 3), as.bigq(2, 7), as.bigq(4, 5))

b

> b <- c(as.bigq(1,3), as.bigq(2,7), as.bigq(4,5))

> b

Big Rational ('bigq') object of length 3:

[1] 1/3 2/7 4/5

Если же координаты вектора заданы как иррациональные числа, например, , то ответом solve.bigq(A, b) станут обыкновенные дроби, наиболее близкие к истинным иррациональным результатам. То есть сам по себе ответ в виде обыкновенных дробей еще не говорит об абсолютной точности! Проверяйте результаты прямыми подстановками.

Замечание. Важно знать, что функция solve.bigq иногда отказывается работать с вполне хорошими невырожденными матрицами, ошибочно объявляя их вырожденными. В такие моменты всегда непосредственно проверяйте равенство нулю определителя det(A). В случае ошибки остается использовать лишь приближенное решение с помощью функции solve, которая с практической точки зрения ничем не уступает solve.bigq.

Впрочем, нет сомнений, что со временем подобная ошибка будет устранена авторами библиотеки.



Дата добавления: 2022-02-05; просмотров: 147;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.009 сек.