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
从您的示例中无法确定您是想要简单的线性方程求解还是更一般的系统求解器。如果是后者,请查看BB
和nleqslv
软件包。
您可能还对一个由某些非常扭曲的思维编写的“包装器”工具感兴趣,它在ktsolve
软件包中。最后这个工具可以让您设置任意一组方程,并反向求解任何所需的变量集。