2014-11-22 13 views
5

Mi chiedevo se esistono pacchetti o altre soluzioni predefinite per R che sono in grado di tradurre insiemi di equazioni lineari in forma di matrice (ad esempio per la soluzione tramite Gauss Seidel algorithm), analogamente allo equationsToMatrix(eqns,vars)function in Matlab?Funzione per tradurre equazioni lineari in forma matriciale in R?

Un esempio da Matlab:

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

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

b = 
    0 
    3 

Suggerimenti per blocchi di costruzione sarebbe molto utile, anche.

+1

Per che cosa utilizzeresti? È meno digitante per inserire direttamente la matrice direttamente. – Roland

risposta

4

1) questo non è esattamente quello che stai chiedendo, ma forse vi aiuterà in ogni modo:

library(Ryacas) 
x <- Sym("x") 
y <- Sym("y") 
Simplify(Solve(List(x - y == 0, x + 2*y == 3), List(x, y))) 

dando:

expression(list(list(x - y == 0, y - 1 == 0))) 

2) Se sappiamo questi sono lineari equazioni esattamente della forma mostrata nella domanda quindi provare questo. Le due chiamate strapply eseguono corrispondenze dell'espressione regolare con i componenti di args, acquisiscono le stringhe corrispondenti alle porzioni delle espressioni regolari tra parentesi e chiamano la funzione specificata come terzo argomento con quelle stringhe acquisite come argomenti. Combiniamo le uscite strapply usando rbind.fill e sostituiamo tutte le NA generate con zero.

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") 

dando:

$lhs 
    x y 
[1,] 1 -1 
[2,] 0 2 

$rhs 
[1] 0 3 

Aggiornamento: generalizzate in modo che ora non tutte le variabili devono essere in ogni equazione e anche le variabili possono essere in ordine diverso in diverse equazioni.

+0

Questo è molto vicino a quello che sto cercando, grazie! – dreamon

2

Impossibile capire dal proprio esempio se si desidera una semplice soluzione di equazione lineare o un risolutore di sistema più generale. Se quest'ultimo, dai un'occhiata ai pacchetti BB e nleqslv.

Potresti anche essere interessato a uno strumento "wrapper" scritto da alcune persone seriamente contorte :-), nel pacchetto ktsolve. Questo ultimo strumento ti consente di impostare un insieme arbitrario di equazioni e di risolvere i problemi per qualsiasi gruppo di variabili desiderato.

+0

Non avevo idea che esista. Roba impressionante! Molte grazie! – dreamon

Problemi correlati