2014-11-22 18 views
5

Мне было интересно, существуют ли какие-либо пакеты или другие готовые решения для R, которые способны переводить множества линейных уравнений в матричную форму (например, для решения через Gauss Seidel algorithm), аналогично function in Matlab?Функция перевода линейных уравнений в матричную форму в R?

Пример из Matlab:

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

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

b = 
    0 
    3 

Предложения для строительных блоков было бы очень полезно, тоже.

+1

Для чего вы это используете? Это меньше ввода для ввода матрицы непосредственно. – Roland

ответ

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

+0

Это очень близко к тому, что я ищу, спасибо! – dreamon

2

Невозможно рассказать по вашему примеру, хотите ли вы простое решение линейного уравнения или более общий системный решатель. Если последний, посмотрите на пакеты BB и nleqslv.

Вы также можете быть заинтересованы в инструменте «обертки», написанном некоторыми серьезными искаженными мыслями :-), в пакете ktsolve. Этот последний инструмент позволяет вам установить произвольную систему уравнений и вернуться к решению для любого желаемого набора переменных.

+0

Я понятия не имел, что это существует. Удивительный материал! Большое спасибо! – dreamon

 Смежные вопросы

  • Нет связанных вопросов^_^