RSymPy - 处理多元方程

时间:2017-02-24 21:25:03

标签: r sympy

当我尝试使用 RSymPy 库解决方程时,我得到 NotImplementedError:多元方程错误。

我不确定我在哪里错了,或者我应该使用其他库来获取多元方程式,还是有解决方法使其工作?

此外,我无法将变量形式的值传递给方程参数(ymax,ymin和ec50),而无需对其进行硬编码。

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

1 个答案:

答案 0 :(得分:3)

1)如果你试图解决((y-ymin)*(ec50 + x))+ abs(ymax)* x = 0表示x代表y的另一个变量是已知的,然后试试这个:

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)

,并提供:

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

2)或者如果你想要x代表所有其他符号,那么不要替换它们的值,而是将其他变量定义为yacas符号:

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)

,并提供:

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

如果您需要更多信息,请阅读vignette,帮助文件并运行Ryacas附带的演示。

3)multiroot 而不是执行符号操作,另一种方法是使用rootSolve包以数字方式查找根:

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)

,并提供:

$root
[1] -1.099856

$f.root
[1] 0

$iter
[1] 3

$estim.precis
[1] 0

使用我们在(1)中使用Ryacas得出的等式进行仔细检查:

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

3a)nlm 实际上,我们可以在没有任何包的情况下以数字方式执行此操作。使用与(3)中相同的设置:

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

3b)uniroot 如果你能够将x值括起来,比如介于-10和10之间,那么在没有使用相同设置的任何包的情况下执行此操作的另一种方法是(3)是:

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

注意:

  • 虽然方程有两个变量x和y,但这通常被认为是一个单变量问题,而不是一个多变量问题,因为我们用y来解决一个变量x

  • 问题ymin中的
  • 超过ymax所以我们已经交换了