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

5
我想知道是否存在任何预构建的R软件包或其他解决方案,能够将一组线性方程转换为矩阵形式(例如,通过高斯-塞德尔算法求解),类似于Matlab中的equationsToMatrix(eqns,vars)函数
来自Matlab的一个示例:
[A, b] = equationsToMatrix([x - y == 0, x + 2*y == 3, [x, y])

A =
[ 1, -1]
[ 1, 2]

b =
  0
  3

有关构建模块的建议也将非常有帮助。


1
你会用这个做什么?直接输入矩阵会更省敲击键盘的时间。 - Roland
2个回答

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 的组件之间的匹配,捕获由括号内的正则表达式部分匹配的字符串,并调用指定为第三个参数的函数并将这些捕获的字符串作为参数。使用 rbind.fill 组合 strapply 的输出,并将其生成的任何 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

更新:现在不是每个方程式都需要包含所有变量,并且变量可以在不同的方程式中以不同的顺序出现。

这非常接近我所寻找的,谢谢! - dreamon

2

从您的示例中无法确定您是想要简单的线性方程求解还是更一般的系统求解器。如果是后者,请查看BBnleqslv软件包。

您可能还对一个由某些非常扭曲的思维编写的“包装器”工具感兴趣,它在ktsolve软件包中。最后这个工具可以让您设置任意一组方程,并反向求解任何所需的变量集。


我不知道这个存在。太棒了!非常感谢! - dreamon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接