2017-02-24 2 views
0

Wenn ich versuche, eine Gleichung RSymPy Bibliothek, erhalte ich die NotImplementedError mit zu lösen: multivariate Gleichung Fehler.RSymPy - Umgang mit multivariaten Gleichung

Ich bin nicht sicher, wo ich falsch liege oder sollte ich eine andere Bibliothek für multivariate Gleichung verwenden oder gibt es einen Workaround, damit es funktioniert?

Auch ich bin nicht in der Lage, die Werte in Form von Variablen zu den Gleichungsparameter (ymax, ymin und ec50) ohne harte Codierung zu übergeben.

library(rSymPy) 
ymax <- Var("ymax") 
ymin <- Var("ymin") 
ec50 <- Var("ec50") 
sympy("var('x y')") 
sympy("expr = ((y-ymin)*(ec50+x))+abs(ymax)*x") 
sympy("solve(expr.subs([(ymin, 1615.72687), (ec50, 2.19835099), (ymax, -1607.73011)]),x, y)") 
+0

Was versuchst du genau zu tun? Was ist die erwartete Ausgabe? Scheint so, als ob die Eingabe für diese Funktionen nur Strings wären, also sehe ich nicht, warum man nicht einfach 'paste()' in literale Werte (oder 'sprintf()' oder was auch immer) einfügen könnte. – MrFlick

+0

Hi @MrFlick, Der Stolperstein löst die multivariate Gleichung mit den angegebenen Parameterwerten in R. Ist das möglich? – RanonKahn

+0

Ich verstehe immer noch nicht, was Sie hier "lösen". Gibt es irgendwo eine Gleichheit, die ich gerade vermisse? Erwarten Sie eine einzigartige Punktlösung? Oder eine Linie? Was (in Worten) versuchen Sie zu lösen? – MrFlick

Antwort

3

1) Wenn Sie versuchen zu lösen ((y-ymin) * (EC 50 + x)) + abs (ymax) * x = 0 für x symbolisch in Form von y, wo die anderen Variablen dann sind dafür bekannt, versuchen Sie dies:

library(Ryacas) 

ymin <- -1607.73011 
ymax <- 1615.72687 
ec50 <- 2.19835099 

x <- Sym("x") 
y <- Sym("y") 

e <- ((y-ymin)*(ec50+x))+abs(ymax)*x 

Solve(e, x) 

geben:

expression(list(x == -(2.19835099 * (y + 1607.73011)/(y + 3223.45698)))) 

2) oder wenn Sie x in Bezug auf alle anderen Symbole wollen dann stattdessen ihre valu substituieren es die anderen Variablen wie yacas Symbole definieren:

library(Ryacas) 

ymax <- Sym("ymax") 
ymin <- Sym("ymin") 
ec50 <- Sym("ec50") 
x <- Sym("x") 
y <- Sym("y") 

e <- ((y-ymin)*(ec50+x))+abs(ymax)*x 

Solve(e, x) 

geben:

expression(list(x == -((y - ymin) * ec50/(y - ymin + abs(ymax))))) 

Lesen Sie die vignette, die Hilfedateien und die Demos ausführen, die mit Ryacas kommen, wenn Sie weitere Informationen benötigen.

3) multiroot Anstatt führen symbolische maninpulation ein alternativer Ansatz ist die Wurzel numerisch mit dem rootSolve Paket zu finden:

library(rootSolve) 

ymin <- -1607.73011 
ymax <- 1615.72687 
ec50 <- 2.19835099 

f <- function(x, y) ((y-ymin)*(ec50+x))+abs(ymax)*x 

# using x=1 as the starting value find the value of x for which y=10 
y <- 10 
multiroot(f, 1, y = y) 

geben:

$root 
[1] -1.099856 

$f.root 
[1] 0 

$iter 
[1] 3 

$estim.precis 
[1] 0 

Überprüfen der Gleichung wir abgeleitet unter Verwendung von Ryacas in (1):

-(2.19835099 * (y + 1607.73011)/(y + 3223.45698)) 
## [1] -1.099856 

3a) nlm Eigentlich können wir dies numerisch ohne irgendwelche Pakete machen.Unter Verwendung des gleichen Aufbau wie in (3):

nlm(function(x, y) f(x, y)^2, 1, y = y) 

3b) uniroot Wenn Sie in der Lage sind, den x-Wert klammern, zwischen -10 und 10, sagen wir, dann eine andere Art und Weise, es zu tun, ohne alle Pakete mit der gleiche Aufbau ist wie in (3) ist:

uniroot(f, c(-10, 10), y = y) 

Anmerkung:

  • obwohl die Gleichung zwei variabl hat es, x und y, würde dies in der Regel als univariate Problem angesehen werden, keine multivariate Problem, weil wir für eine Variable zu lösen, x, in Bezug auf der y

  • in der Frage ymin überschreitet ymax so haben wir ausgetauscht sie

+0

Sehr geehrte @ G-Grothendieck Vielen Dank für Ihre umfassende Antwort. Ich schätze es dankbar. Ich habe eine globale Frage zur Kurvenanpassung als nächsten Schritt zur oben erwähnten Abfrage gepostet. Können Sie mich bitte beraten, wie Sie das Problem beheben und fortfahren können? http://stackoverflow.com/questions/42465934/dose-repsone-global-curve-fitting-using-r - Danke! – RanonKahn