2014-11-22 23 views
5

Ich frage mich, ob es irgendwelche Pakete oder andere vorgefertigte Lösungen für R gibt, die Sätze linearer Gleichungen in Matrixform übersetzen können (z. B. für die Lösung über die Gauss Seidel algorithm), ähnlich der equationsToMatrix(eqns,vars)function in Matlab?Funktion, um lineare Gleichungen in Matrixform in R zu übersetzen?

Ein Beispiel aus Matlab:

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

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

b = 
    0 
    3 

Vorschläge für Bausteine ​​wäre auch sehr hilfreich sein.

+1

Wofür würden Sie das verwenden? Es ist weniger Tipparbeit, um die Matrix direkt einzugeben. – Roland

Antwort

4

1) Dies ist nicht genau das, was Sie fordern, aber vielleicht hilft es sowieso:

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

geben:

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

2) Wenn wir diese wissen linear sind Gleichungen genau der Form in der Frage gezeigt dann versuchen Sie dies. Die beiden Aufrufe strapply führen Übereinstimmungen des regulären Ausdrucks mit den Komponenten von args aus, erfassen die Strings, die von den Teilen der regulären Ausdrücke übereinstimmen, in Klammern und rufen die als drittes Argument angegebene Funktion mit diesen erfassten Strings als Argumente auf. Wir kombinieren die strapply Ausgänge unter Verwendung rbind.fill und ersetzen alle NAs, die es mit Null generiert.

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

geben:

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

$rhs 
[1] 0 3 

Update: generali so dass jetzt nicht alle Variablen in jeder Gleichung sein müssen und auch können Variablen in verschiedenen Ordnungen in unterschiedlichen Gleichungen.

+0

Dies ist sehr nah an dem, was ich suche, danke! – dreamon

2

Kann nicht anhand Ihres Beispiels feststellen, ob Sie nur eine einfache lineare Gleichungslösung oder einen allgemeineren Systemlöser wünschen. Wenn letzteres zutrifft, sehen Sie sich die Pakete BB und nleqslv an.

Sie könnten sich auch für ein "Wrapper" -Werkzeug interessieren, das von einigen ernsthaft verdrehten Geist geschrieben wurde :-), im Paket ktsolve. Mit diesem letzten Werkzeug können Sie einen beliebigen Satz von Gleichungen erstellen und für jede gewünschte Gruppe von Variablen zurücklösen.

+0

Ich hatte keine Ahnung, dass das existiert. Beeindruckendes Zeug! Danke vielmals! – dreamon

Verwandte Themen