在R中将线性方程转换成矩阵形式的函数?

时间:2014-11-22 11:36:39

标签: r matrix equation-solving linear-equation

我想知道R是否存在能够将线性方程组转换成矩阵形式的任何包或其他预构建解决方案(例如,通过Gauss Seidel algorithm解决方案),类似于{{1 }} function in Matlab

Matlab的一个例子:

equationsToMatrix(eqns,vars)

关于构建块的建议也非常有用。

2 个答案:

答案 0 :(得分:4)

1)这不是你要求的,但也许它会有所帮助:

library(Ryacas)
x <- Sym("x")
y <- Sym("y")
Simplify(Solve(List(x - y == 0, x + 2*y == 3), List(x, y)))

,并提供:

expression(list(list(x - y == 0, y - 1 == 0)))

2)如果我们知道这些是完全符合问题所示形式的线性方程式,那么试试这个。两个strapply调用执行正则表达式与args组件的匹配,捕获括号内正则表达式部分匹配的字符串,并使用捕获的字符串调用指定为第三个参数的函数作为参数。我们使用strapply合并rbind.fill输出,并将其生成的任何NAs替换为零。

library(gsubfn) # strapply
library(plyr) # rbind.fill

eqn <- function(...) {
  args <- c(...)
  x2num <- function(x, y) { # determine coefficient value as a numeric
       z <- gsub(" ", "", x)
       setNames(if (z == "-") -1 else if (z == "") 1 else as.numeric(z), y)
  }
  lhs <- strapply(args, "(-? *\\d*)[ *]*([a-z])", x2num)
  lhs <- do.call(rbind.fill, lapply(lhs, function(x) as.data.frame(t(x))))
  lhs <- as.matrix(lhs)
  lhs[] <- ifelse(is.na(lhs), 0, lhs)
  list(lhs = lhs, rhs = strapply(args, "== *(\\d)", as.numeric, simplify = TRUE))
}

# test it out
eqn("x - y == 0", "2*y == 3")

,并提供:

$lhs
     x  y
[1,] 1 -1
[2,] 0  2

$rhs
[1] 0 3

更新:广义,以便现在不是所有变量都需要在每个等式中,并且变量可以在不同的等式中以不同的顺序。

答案 1 :(得分:2)

无法从您的示例中了解您是否只需要简单的线性方程求解或更通用的系统求解器。如果是后者,请查看BBnleqslv个包。

你可能也对包ktsolve包中由一些严重扭曲的思想写的“包装”工具感兴趣:-)。最后一个工具允许您设置一组任意方程,并对任何所需的变量集进行反求解。