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
и заменяем любые 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
Update: Обобщенные так что теперь не все переменные должны быть в каждом уравнении, а также переменные могут быть в разных порядках в разных уравнениях.
Для чего вы это используете? Это меньше ввода для ввода матрицы непосредственно. – Roland