首页 > 解决方案 > 使用 Caracas 包的 R 中 SymPy 矩阵的平方根

问题描述

语言: R ; 使用的包装: caracas

假设我有一个复杂的符号矩阵 M,我想找到矩阵的平方根。那就是找到一个这样的M = A %*% A。对于我的问题,M定义如下:

library(caracas)
# Define M
s_b <- matrix_(c(1, 0, 0, 1), 2, 2)
X <- matrix_(c(2, 1, 1, 1), 2, 2)
o <- symbol('o')
M <- inv(1/o * t(X) %*% X + inv(s_b))

我尝试使用包中的eigenvalandeigenvec函数caracas来生成特征值和特征向量的列表,但由于它们是 SymPy 对象的复杂列表,因此无法弄清楚如何将这些列表转换为矩阵。

这篇文章中的解决方案没有帮助,因为 R 不是将矩阵的平方根作为一个整体,而是取条目的平方根。

标签: rsympylinear-algebra

解决方案


我已经想出了解决方案。在这个解决方案中,我使用对角化方法。

要将任何符号值分配给符号矩阵,必须先将其转换为字符。IE。必须使用该as.character功能。

以下代码生成这样的示例符号P,D矩阵,RMM=P %*% D %*% inv(P)

图书馆(加拉加斯)

a=符号('a')

m=matrix_( c("1", "a", "a", "1"), 2)

eigenVec_V_b <- eigenvec(m)

D <- 矩阵_(c(0, 0), n, n)

for(i in 1:n){ D[i, i] <- as.character(eigenVec_V_b[[i]]$eigval) }

P <- 矩阵_(c(0, 0), 1, n)

for(i in 1:n){ P[,i] <- as.character(eigenVec_V_b[[i]]$eigvec) }

要测试代码是否正确实现,只需运行P %*% D %*% inv(P)并且它应该返回相同的矩阵M

要获得 M 的平方根,请运行P %*% sqrt(D) %*% inv(P). 这些条目并未完全简化(即使在应用该simplify函数之后),因此它们不会与原始矩阵匹配,但一旦手动简化,这些值就会显示正确。


推荐阅读