首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >具有R的非平方线性系统的求解

具有R的非平方线性系统的求解
EN

Stack Overflow用户
提问于 2013-11-04 08:01:44
回答 2查看 9.1K关注 0票数 10

如何求解具有R:A X = B的非平方线性系统?

(在这种情况下,系统没有解或无穷多个解)

例子:

代码语言:javascript
运行
复制
A=matrix(c(0,1,-2,3,5,-3,1,-2,5,-2,-1,1),3,4,T)
B=matrix(c(-17,28,11),3,1,T)

A
     [,1] [,2] [,3] [,4]
[1,]    0    1   -2    3
[2,]    5   -3    1   -2
[3,]    5   -2   -1    1


B
     [,1]
[1,]  -17
[2,]   28
[3,]   11
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-04 12:13:14

如果矩阵A的行数多于列数,则应使用最小二乘拟合。

如果矩阵A的行数少于列,则应执行奇异值分解。每一种算法都会尽最大努力,通过假设给出一个解决方案。

下面的链接展示了如何使用SVD作为求解器:

review.pdf

让我们将其应用于您的问题,看看它是否有效:

输入矩阵A和已知的RHS向量B

代码语言:javascript
运行
复制
> A=matrix(c(0,1,-2,3,5,-3,1,-2,5,-2,-1,1),3,4,T)
> B=matrix(c(-17,28,11),3,1,T)
> A
     [,1] [,2] [,3] [,4]
[1,]    0    1   -2    3
[2,]    5   -3    1   -2
[3,]    5   -2   -1    1
> B
     [,1]
[1,]  -17
[2,]   28
[3,]   11

让我们分解您的A矩阵:

代码语言:javascript
运行
复制
> asvd = svd(A)
> asvd
$d
[1] 8.007081e+00 4.459446e+00 4.022656e-16

$u
           [,1]       [,2]       [,3]
[1,] -0.1295469 -0.8061540  0.5773503
[2,]  0.7629233  0.2908861  0.5773503
[3,]  0.6333764 -0.5152679 -0.5773503

$v
            [,1]       [,2]       [,3]
[1,]  0.87191556 -0.2515803 -0.1764323
[2,] -0.46022634 -0.1453716 -0.4694190
[3,]  0.04853711  0.5423235  0.6394484
[4,] -0.15999723 -0.7883272  0.5827720

> adiag = diag(1/asvd$d)
> adiag
          [,1]      [,2]        [,3]
[1,] 0.1248895 0.0000000 0.00000e+00
[2,] 0.0000000 0.2242431 0.00000e+00
[3,] 0.0000000 0.0000000 2.48592e+15

关键是:d中的第三个特征值非常小;相反,adiag中的对角线元素非常大。在求解之前,将其设为零:

代码语言:javascript
运行
复制
> adiag[3,3] = 0
> adiag
          [,1]      [,2] [,3]
[1,] 0.1248895 0.0000000    0
[2,] 0.0000000 0.2242431    0
[3,] 0.0000000 0.0000000    0

现在,让我们计算解决方案(请参阅我上面给您的链接中的幻灯片16 ):

代码语言:javascript
运行
复制
> solution = asvd$v %*% adiag %*% t(asvd$u) %*% B
> solution
          [,1]
[1,]  2.411765
[2,] -2.282353
[3,]  2.152941
[4,] -3.470588

现在我们有了一个解决方案,让我们用它来代替它,看看它是否给了我们相同的B

代码语言:javascript
运行
复制
> check = A %*% solution
> check
     [,1]
[1,]  -17
[2,]   28
[3,]   11

这就是你从B开始的一面,所以我认为我们很好。

下面是来自AMS的另一个很好的SVD讨论:

http://www.ams.org/samplings/feature-column/fcarc-svd

票数 12
EN

Stack Overflow用户

发布于 2017-10-16 09:24:53

目的是解决Ax = b问题

其中,给定A<>E 211和E 112bE 213,对于xx为q =1,b为p=1。

方法1:广义逆: Moore-Penrose inverse

将方程的两边相乘,我们得到

A‘A=A’b

其中A'A的转位。注意,A'A现在是q乘Q矩阵。解决这个问题的一种方法是用A'A的逆将方程的两边相乘。这给了,

x = ( A‘A)^{-1} A’b

这就是广义逆背后的理论。这里G = (A'A)^{-1} A'A的伪逆.

代码语言:javascript
运行
复制
library(MASS)

ginv(A) %*% B

#          [,1]
#[1,]  2.411765
#[2,] -2.282353
#[3,]  2.152941
#[4,] -3.470588

方法2:使用SVD的广义逆。

@duffymo利用SVD方法得到A的伪逆。

但是,svd(A)$d的最后一个元素可能不像本例中的那么小。因此,可能不应该像那样使用该方法。这里有一个例子,A的最后一个元素没有一个接近于零。

代码语言:javascript
运行
复制
A <- as.matrix(iris[11:13, -5])    
A
#   Sepal.Length Sepal.Width Petal.Length Petal.Width
# 11          5.4         3.7          1.5         0.2
# 12          4.8         3.4          1.6         0.2
# 13          4.8         3.0          1.4         0.1

svd(A)$d
# [1] 10.7820526  0.2630862  0.1677126

一种选择是将cor(A)中的奇异值看作

代码语言:javascript
运行
复制
svd(cor(A))$d
# [1] 2.904194e+00 1.095806e+00 1.876146e-16 1.155796e-17

现在,很明显只有两个大的奇异值存在。因此,现在可以将svd应用到A上,得到如下伪逆。

代码语言:javascript
运行
复制
svda <- svd(A)
G = svda$v[, 1:2] %*% diag(1/svda$d[1:2]) %*% t(svda$u[, 1:2])
# to get x
G %*% B
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19763698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档