【发布时间】:2016-11-03 18:41:01
【问题描述】:
我得到了一个矩阵:
P <- matrix(c(0, 0, 0, 0.5, 0, 0.5, 0.1, 0.1, 0, 0.4, 0, 0.4, 0, 0.2, 0.2, 0.3, 0, 0.3, 0, 0, 0.3, 0.5, 0, 0.2, 0, 0, 0, 0.4, 0.6, 0, 0, 0, 0, 0, 0.4, 0.6), nrow = 6, ncol = 6, byrow = TRUE)
使用函数mpow、rows_equal、matrices_equal。我想知道P^n 何时收敛,换句话说,n 是什么,当矩阵中的所有行都相等时以及何时P^n = P^(n+1)。
仅通过查看函数i 已经设法推断出在n=19-21 附近矩阵将收敛。
虽然,我想使用循环找到正确的 n。下面是函数mpow、rows_equal 和matrices_equal。我知道它们可以用不同的方式写,但请保持原样。
mpow <- function(P, n, d=4) {
if (n == 0) diag(nrow(P)))
else if (n== 1) P
else P %*% mpow(P, n - 1))
}
rows_equal <- function(P, d = 4) {
P_new <- trunc(P * 10^d)
for (k in 2:nrow(P_new)) {
if (!all(P_new[1, ] == P_new[k, ])) {
return(FALSE)}
}
return(TRUE)
}
matrices_equal <- function(A, B, d = 4) {
A_new <- trunc(A * 10^d)
B_new <-trunc(B * 10^d)
if (all(A_new == B_new)) TRUE else FALSE
}
现在,要编写循环,我们应该按照以下方式进行:
首先像这样创建一个函数:
when_converged <- function(P) {...}
和
for (n in 1:50)
在 t.ex n = 50 时尝试。
虽然我不知道如何正确编写代码来做到这一点,但有人可以帮我吗?
感谢您阅读我的问题。
【问题讨论】:
-
嗯,我想使用函数 mpow、rows_equal 和 matrices_equal 找到 P 何时收敛。我的老师建议我们可以创建一个函数,该函数将矩阵 P 作为输入并向我们展示 n,P^n = P^n+1。我们应该使用例如“for (n in 1:50)”之类的循环来做到这一点。
-
请在您的代码中添加换行符。它不可读。我假设您将“收敛”定义为等于
d控制的精度?您可能知道必须证明收敛性,而不能通过数值练习真正证明。 -
你对矩阵了解多少?是不是例如二次和对称?见here。