如何使用代码在R或Python中求解矩阵方程PAP^T=I

如何使用代码在R或Python中求解矩阵方程PAP^T=I,python,r,Python,R,出去 我想解PAP^T=I,其中p是3x3,p^T是p的转置,I是3x3单位矩阵。解算(A)解出PA=I,但我想要PAP^T=I。我找不到答案,将矩阵相乘将花费太长时间。有人知道如何在R或Python中实现这一点吗?我也不想使用P也可以是^(-1/2)的事实。通过代码的解决方案会很好 > A [,1] [,2] [,3] [1,] 10.166746 -2.619763 -6.717475 [2,] -2.619763 3.291888 3.05

出去

我想解PAP^T=I,其中p是3x3,p^T是p的转置,I是3x3单位矩阵。解算(A)解出PA=I,但我想要PAP^T=I。我找不到答案,将矩阵相乘将花费太长时间。有人知道如何在R或Python中实现这一点吗?我也不想使用P也可以是^(-1/2)的事实。通过代码的解决方案会很好

> A
          [,1]      [,2]      [,3]
[1,] 10.166746 -2.619763 -6.717475
[2,] -2.619763  3.291888  3.052898
[3,] -6.717475  3.052898 22.313351
给我方程式

library(stringr)
A=matrix(c(letters[1:4], letters[6:8], letters[10:11]), nrow=3)
mult=function(A, B) {
  AB=matrix(nrow=3, ncol=3)
  for (r in 1:3) {
    for (c in 1:3) {
      AB[r,c]=str_c("(", A[r,1], ")*(", B[1,c], ")+(", A[r,2], ")*(", B[2,c], ")+(", A[r,3], ")*(", B[3,c], ")")
    }
  }
  return(AB)
}
AB=mult(A,B)
ABAT=mult(AB, t(A))

seteq=function(A, B) {
  E=matrix(nrow=3, ncol=3)
  for (r in 1:3) {
    for (c in 1:3) {
      E[r,c]=str_c(A[r,c], "=", B[r, c])
    }
  }
  dim(E)=c(9,1)
  return(E[,1])
}
Eq=seteq(ABAT, diag(rep(1, 3)))
res=""
for (i in 1:9) {
  res=str_c(res, Eq[i])
  if (i!=9) res=str_c(res, ",")
}
res

但是Wolfram Alpha没有识别出这个输入。

因为在这个问题上有一些混淆,为了澄清问题,需要在注释末尾的输入A中找到p

1)本征值假设A是对称正定矩阵,在问题中它是:

((a)*(18.9052758456522)+(d)*(0.834836569187845)+(h)*(9.76575358263375))*(a)+((a)*(0.834836569187845)+(d)*(0.555656932954595)+(h)*(1.03585433030833))*(d)+((a)*(9.76575358263375)+(d)*(1.03585433030833)+(h)*(6.84209765783974))*(h)=1,((b)*(18.9052758456522)+(f)*(0.834836569187845)+(j)*(9.76575358263375))*(a)+((b)*(0.834836569187845)+(f)*(0.555656932954595)+(j)*(1.03585433030833))*(d)+((b)*(9.76575358263375)+(f)*(1.03585433030833)+(j)*(6.84209765783974))*(h)=0,((c)*(18.9052758456522)+(g)*(0.834836569187845)+(k)*(9.76575358263375))*(a)+((c)*(0.834836569187845)+(g)*(0.555656932954595)+(k)*(1.03585433030833))*(d)+((c)*(9.76575358263375)+(g)*(1.03585433030833)+(k)*(6.84209765783974))*(h)=0,((a)*(18.9052758456522)+(d)*(0.834836569187845)+(h)*(9.76575358263375))*(b)+((a)*(0.834836569187845)+(d)*(0.555656932954595)+(h)*(1.03585433030833))*(f)+((a)*(9.76575358263375)+(d)*(1.03585433030833)+(h)*(6.84209765783974))*(j)=0,((b)*(18.9052758456522)+(f)*(0.834836569187845)+(j)*(9.76575358263375))*(b)+((b)*(0.834836569187845)+(f)*(0.555656932954595)+(j)*(1.03585433030833))*(f)+((b)*(9.76575358263375)+(f)*(1.03585433030833)+(j)*(6.84209765783974))*(j)=1,((c)*(18.9052758456522)+(g)*(0.834836569187845)+(k)*(9.76575358263375))*(b)+((c)*(0.834836569187845)+(g)*(0.555656932954595)+(k)*(1.03585433030833))*(f)+((c)*(9.76575358263375)+(g)*(1.03585433030833)+(k)*(6.84209765783974))*(j)=0,((a)*(18.9052758456522)+(d)*(0.834836569187845)+(h)*(9.76575358263375))*(c)+((a)*(0.834836569187845)+(d)*(0.555656932954595)+(h)*(1.03585433030833))*(g)+((a)*(9.76575358263375)+(d)*(1.03585433030833)+(h)*(6.84209765783974))*(k)=0,((b)*(18.9052758456522)+(f)*(0.834836569187845)+(j)*(9.76575358263375))*(c)+((b)*(0.834836569187845)+(f)*(0.555656932954595)+(j)*(1.03585433030833))*(g)+((b)*(9.76575358263375)+(f)*(1.03585433030833)+(j)*(6.84209765783974))*(k)=0,((c)*(18.9052758456522)+(g)*(0.834836569187845)+(k)*(9.76575358263375))*(c)+((c)*(0.834836569187845)+(g)*(0.555656932954595)+(k)*(1.03585433030833))*(g)+((c)*(9.76575358263375)+(g)*(1.03585433030833)+(k)*(6.84209765783974))*(k)=1
4)nls-2这也使用nls,但使用不同的p参数化,即对角矩阵(3个参数)乘以斜对称矩阵(3个参数)的指数。请注意,斜对称矩阵的指数是正交的,因此参数化将P约束为对角乘以正交

result2 <- nls(c(diag(3)) ~ c(p2P(p) %*% A %*% t(p2P(p))), 
  start = list(p = 1:6), algorithm = "port")
result2
## Nonlinear regression model
##   model: c(diag(3)) ~ c(p2P(p) %*% A %*% t(p2P(p)))
##    data: parent.frame()
##       p1       p2       p3       p4       p5       p6 
##  0.26049 -0.25733 -0.57448  0.07757  0.02702  0.22665 
##  residual sum-of-squares: 1.354e-22
##
## Algorithm "port", convergence message: absolute function convergence (6)

# check that PAP' equals diag(3)
P <- p2P(coef(result2))
P %*% A %*% t(P)
##              [,1]          [,2]          [,3]
## [1,] 1.000000e+00  7.954436e-13  5.084821e-14
## [2,] 7.954401e-13  1.000000e+00 -1.869643e-12
## [3,] 5.073719e-14 -1.869574e-12  1.000000e+00
库(expm)

p2P4由于对此存在一些混淆,为了澄清问题,需要在结尾注释中输入A的情况下找到p

1)本征值假设A是对称正定矩阵,在问题中它是:

((a)*(18.9052758456522)+(d)*(0.834836569187845)+(h)*(9.76575358263375))*(a)+((a)*(0.834836569187845)+(d)*(0.555656932954595)+(h)*(1.03585433030833))*(d)+((a)*(9.76575358263375)+(d)*(1.03585433030833)+(h)*(6.84209765783974))*(h)=1,((b)*(18.9052758456522)+(f)*(0.834836569187845)+(j)*(9.76575358263375))*(a)+((b)*(0.834836569187845)+(f)*(0.555656932954595)+(j)*(1.03585433030833))*(d)+((b)*(9.76575358263375)+(f)*(1.03585433030833)+(j)*(6.84209765783974))*(h)=0,((c)*(18.9052758456522)+(g)*(0.834836569187845)+(k)*(9.76575358263375))*(a)+((c)*(0.834836569187845)+(g)*(0.555656932954595)+(k)*(1.03585433030833))*(d)+((c)*(9.76575358263375)+(g)*(1.03585433030833)+(k)*(6.84209765783974))*(h)=0,((a)*(18.9052758456522)+(d)*(0.834836569187845)+(h)*(9.76575358263375))*(b)+((a)*(0.834836569187845)+(d)*(0.555656932954595)+(h)*(1.03585433030833))*(f)+((a)*(9.76575358263375)+(d)*(1.03585433030833)+(h)*(6.84209765783974))*(j)=0,((b)*(18.9052758456522)+(f)*(0.834836569187845)+(j)*(9.76575358263375))*(b)+((b)*(0.834836569187845)+(f)*(0.555656932954595)+(j)*(1.03585433030833))*(f)+((b)*(9.76575358263375)+(f)*(1.03585433030833)+(j)*(6.84209765783974))*(j)=1,((c)*(18.9052758456522)+(g)*(0.834836569187845)+(k)*(9.76575358263375))*(b)+((c)*(0.834836569187845)+(g)*(0.555656932954595)+(k)*(1.03585433030833))*(f)+((c)*(9.76575358263375)+(g)*(1.03585433030833)+(k)*(6.84209765783974))*(j)=0,((a)*(18.9052758456522)+(d)*(0.834836569187845)+(h)*(9.76575358263375))*(c)+((a)*(0.834836569187845)+(d)*(0.555656932954595)+(h)*(1.03585433030833))*(g)+((a)*(9.76575358263375)+(d)*(1.03585433030833)+(h)*(6.84209765783974))*(k)=0,((b)*(18.9052758456522)+(f)*(0.834836569187845)+(j)*(9.76575358263375))*(c)+((b)*(0.834836569187845)+(f)*(0.555656932954595)+(j)*(1.03585433030833))*(g)+((b)*(9.76575358263375)+(f)*(1.03585433030833)+(j)*(6.84209765783974))*(k)=0,((c)*(18.9052758456522)+(g)*(0.834836569187845)+(k)*(9.76575358263375))*(c)+((c)*(0.834836569187845)+(g)*(0.555656932954595)+(k)*(1.03585433030833))*(g)+((c)*(9.76575358263375)+(g)*(1.03585433030833)+(k)*(6.84209765783974))*(k)=1
4)nls-2这也使用nls,但使用不同的p参数化,即对角矩阵(3个参数)乘以斜对称矩阵(3个参数)的指数。请注意,斜对称矩阵的指数是正交的,因此参数化将P约束为对角乘以正交

result2 <- nls(c(diag(3)) ~ c(p2P(p) %*% A %*% t(p2P(p))), 
  start = list(p = 1:6), algorithm = "port")
result2
## Nonlinear regression model
##   model: c(diag(3)) ~ c(p2P(p) %*% A %*% t(p2P(p)))
##    data: parent.frame()
##       p1       p2       p3       p4       p5       p6 
##  0.26049 -0.25733 -0.57448  0.07757  0.02702  0.22665 
##  residual sum-of-squares: 1.354e-22
##
## Algorithm "port", convergence message: absolute function convergence (6)

# check that PAP' equals diag(3)
P <- p2P(coef(result2))
P %*% A %*% t(P)
##              [,1]          [,2]          [,3]
## [1,] 1.000000e+00  7.954436e-13  5.084821e-14
## [2,] 7.954401e-13  1.000000e+00 -1.869643e-12
## [3,] 5.073719e-14 -1.869574e-12  1.000000e+00
库(expm)

p2P4正如你所注意到的,如果你把A分解成代数“平方根”

那么问题就变成了:

A = L * L^T
这意味着
p*L
是一个酉矩阵

因此,该解由任何酉矩阵U构成(
U*U^T=Id

有无限多的解决方案

您明确声明您不想要带有
U=Id
的琐碎解决方案
p=inv(L)
,但您没有说明原因,也没有提供关于p

请注意,@G.Grothendieck的好答案中的第一个解决方案就是:用特征向量V以对角形式D(特征值)减少A

P=inv(L)*U

正如你所注意到的,如果你用代数“平方根”分解A

那么问题就变成了:

A = L * L^T
这意味着
p*L
是一个酉矩阵

因此,该解由任何酉矩阵U构成(
U*U^T=Id

有无限多的解决方案

您明确声明您不想要带有
U=Id
的琐碎解决方案
p=inv(L)
,但您没有说明原因,也没有提供关于p

请注意,@G.Grothendieck的好答案中的第一个解决方案就是:用特征向量V以对角形式D(特征值)减少A

P=inv(L)*U

solve(P%*%A,solve(t(P)))
。虽然你的问题很好,但这是许多问题的重复。谷歌搜索中的“解线性方程组{language}stackoverflow”将是你的救星。这能回答你的问题吗?我不认为这完全回答了我的问题,因为第一个是PA=t(P)^(-1)。但我想要的是,当t(P)可能不可逆时,尝试解决它的东西@OliverGrothendieck的答案解决了这个问题。另一种方法是使用广义逆代替求解(t(P))
。也许我没有完全理解这个问题。我假设您的参数在
A
中,而不是
P
中。在这种情况下,当然不足以看到潜在的重复答案,这看起来很像退化的代数Riccati方程。因此,在一些R或Python包中,可能有一些函数可以用来解决这个问题,比如
care(…)
solve(P%*%A,solve(t(P))
。虽然你的问题很好,但这是许多问题的重复。谷歌搜索中的“解线性方程组{language}stackoverflow”将是你的救星。这能回答你的问题吗?我不认为这完全回答了我的问题,因为第一个是PA=t(P)^(-1)。但我想要的是,当t(P)可能不可逆时,尝试解决它的东西@OliverGrothendieck的答案解决了这个问题。另一种方法是使用广义逆代替求解(t(P))
。也许我没有完全理解这个问题。我假设您的参数在
A
中,而不是
P
中。在这种情况下,当然不足以看到潜在的重复答案,这看起来很像退化的代数Riccati方程。因此,在一些R或Python包中,可以使用类似于
care(…)
的函数来解决这个问题。。。
(P*L) * (P*L)^T = Id
P=inv(L)*U
inv(V)*A*V = D
D = sqrt(D)*sqrt(D)
P = inv(sqrt(D))*V