【问题标题】:Function to translate linear equations into matrix form in R?将线性方程转换为R中的矩阵形式的函数?
【发布时间】:2014-11-22 11:36:38
【问题描述】:

我想知道 R 是否存在任何包或其他预构建的解决方案,它们能够将线性方程组转换为矩阵形式(例如,通过Gauss Seidel algorithm 解决),类似于equationsToMatrix(eqns,vars) @987654322 @?

一个来自 Matlab 的例子:

[A, b] = equationsToMatrix([x - y == 0, x + 2*y == 3, [x, y])

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

b =
  0
  3

关于构建块的建议也会非常有帮助。

【问题讨论】:

  • 你会用这个做什么?直接输入矩阵就少了打字。

标签: r matrix equation-solving linear-equation


【解决方案1】:

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 输出并将其生成的任何NA 替换为零。

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

更新: 广义化,因此现在并非所有变量都需要在每个方程中,而且变量可以在不同方程中以不同的顺序排列。

【讨论】:

  • 这与我要找的非常接近,谢谢!
【解决方案2】:

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

您可能还对某个严重扭曲的头脑编写的“包装器”工具感兴趣:-),在包ktsolve 中。最后一个工具可让您设置任意一组方程并反解任何所需的变量集。

【讨论】:

  • 我不知道这存在。很棒的东西!非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-15
  • 1970-01-01
  • 1970-01-01
  • 2015-09-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多