如何在 R 中求解矩阵方程

How to solve a matrix equation in R

我和我的朋友(都是非 R 专家)正在尝试求解 R 中的矩阵方程。我们有矩阵 y,其定义为:

 y=matrix(c(0.003,0.977,0,0,0,0,0,0,0,0,0,0.02,0,0.0117,0.957,0,0,0,0,0,0,0,0,0.03,0,0,0.0067,0.917,0,0,0,0,0,0,0,0.055,0,0,0,0.045,0.901,0,0,0,0,0,0,0.063,0,0,0,0,0.0533,0.913,0,0,0,0,0,0.035,0,0,0,0,0,0.05,0,0,0,0,0,0.922,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.01,0,0,0,0,0,0,0,0,0,0,0,0,0.023,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
nrow=12, ncol=12, byrow=TRUE)

这个矩阵模拟了我们学校的学生传到下一年的方式。通过将该矩阵与包含每年学生人数的向量相乘,我们将在一年后获得每年的学生人数。

具有函数:

sumfun<-function(x,start,end){
 return(sum(x[start:end]))

我们将每年在校的学生人数相加,得到我们学校的总学生人数。我们想用当前在校学生的数量填充向量(我们用矩阵乘以数组),并将新学生的数量(向量的第一个数字)作为我们的变量 X

例如:

sumfun(colSums(y*c(x,200,178,180,201,172,0,0,200,194,0,0)),2,6)

我们想将这个等式等同于 1000,即我们校舍可以容纳的最大学生人数。这样一来,我们就可以计算出我们学校可以录取多少新生。我们不知道该怎么做。我们会预制 X 介于 100 和 300 之间。如果有人可以帮助我们,我们将不胜感激!

我建议探测各种 x 值并查看结果答案。从中,您可以看到趋势并使用它来找出答案。这是一个例子:

# Sample data
y=matrix(c(0.003,0.977,0,0,0,0,0,0,0,0,0,0.02,0,0.0117,0.957,0,0,0,0,0,0,0,0,0.03,0,0,0.0067,0.917,0,0,0,0,0,0,0,0.055,0,0,0,0.045,0.901,0,0,0,0,0,0,0.063,0,0,0,0,0.0533,0.913,0,0,0,0,0,0.035,0,0,0,0,0,0.05,0,0,0,0,0,0.922,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.01,0,0,0,0,0,0,0,0,0,0,0,0,0.023,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
         nrow=12, ncol=12, byrow=TRUE)

# funciton f will return a total number of students in the school for a given 'x'
f <- function(x) {
  z <- c(x,200,178,180,201,172,0,0,200,194,0,0)
  sum(t(y[,2:6]) %*% z)
}

# Let's see the plot
px <- 1:1000
py <- sapply(px,f) # will calculate the total number of students for each x from 1 to 1000
plot(px,py,type='l',lty=2)

# Analyze the matrices (the analysis is not shown here) and reproduce the linear trend
lines(px,f(0)+sum(y[1,2:6])*px,col='red',lty=4)

# obtain the answer using the linear trend
Xstudents <- (1000-f(0))/sum(y[1,2:6])
floor(Xstudents)

我不熟悉 R,但我可以指导求解这个矩阵方程的主要过程。假设您的矩阵称为 P:

并让当前学生向量被调用s0:

s0 = {x, 200, 178, 180, 201, 172, 0, 0, 200, 194, 0, 0};

请注意,我们保留 x 未定义,因为我们稍后要求解此变量。请注意,即使 x 未知,我们仍然可以将 s0P 相乘。我们称这个新向量为 s1.

s1 = s0.P = {0.003*x, 2.34 + 0.977*x, 192.593, 173.326, 177.355, 192.113, 0, 0, 0, 0, 0, 192.749 + 0.02*x}

我们可以验证这对于 2-6 年级的学生来说是正确的,只有 2 年级受到新生数量的影响 (x)。因此,如果现在像您的示例中那样对 2-6 年求和,我们发现总和为:

s1[2:6] = 737.727 + 0.977*x

剩下的就是求解 s1[2:6] == 1000:

这个简单的方程
s1[2:6] == 1000
737.727 + 0.977*x == 1000
x = 268.447

让我知道这是否正确!这一切都是在 Mathematica 中完成的。

以下代码显示了如何在 R 中执行此操作:

y=matrix(c(0.003,0.977,0,0,0,0,0,0,0,0,0,0.02,0,0.0117,0.957,0,0,0,0,0,0,0,0,0.03,0,0,0.0067,0.917,0,0,0,0,0,0,0,0.055,0,0,0,0.045,0.901,0,0,0,0,0,0,0.063,0,0,0,0,0.0533,0.913,0,0,0,0,0,0.035,0,0,0,0,0,0.05,0,0,0,0,0,0.922,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.01,0,0,0,0,0,0,0,0,0,0,0,0,0.023,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
nrow=12, ncol=12, byrow=TRUE)


sumfun<-function(x,start,end){
  return(sum(x[start:end]))
}

students <- function(x) {
  students = sumfun(colSums(y*c(x,200,178,180,201,172,0,0,200,194,0,0)),2,6);
  return(students - 1000);
}

uniroot(students, lower=100, upper=300)$root;

只要函数是 0,函数 uniroot 就会查找。因此,如果您定义一个函数,其中 returns 学生人数为 x 并减去 1000,它将找到学生人数为 1000 的 x


注意:这里只描述学生总量的短期行为。要使学生人数长期达到1000,还必须求解其他方程。