如何在 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
未知,我们仍然可以将 s0
与 P
相乘。我们称这个新向量为 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,还必须求解其他方程。
我和我的朋友(都是非 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
未知,我们仍然可以将 s0
与 P
相乘。我们称这个新向量为 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,还必须求解其他方程。