【问题标题】:What is R's equivalent to Matlab's subs(f, x, value) for symbolic substitution?什么是 R 等效于 Matlab 的 subs(f, x, value) 用于符号替换?
【发布时间】:2020-07-03 17:30:27
【问题描述】:

在 Octave 中,我使用以下方法来区分 2 变量的函数,然后使用 subs() 将 x 替换为 0。基本上在做矩生成函数、泰勒级数展开等时,我们先微分然后用一些 a 代替 x。我在 R 中找不到等效的替换函数。你能告诉我怎么做吗?谢谢

pkg load symbolic; #octave symbolic package
syms lamb, x; #declare lamb, x symbols
mgf = lamb / (lamb - x); #moment generating function of exponential
mgf1 = diff(mgf, x, 1); #1st differivative
mgf1_0 = subs(mgf1, x, 0); #substitute 0 for E(X)

【问题讨论】:

  • 如果您包含必要的包加载和变量定义步骤,您的示例将对未来的读者更有用...
  • 添加了 pkg。看看你的未来对 R 的帮助,我在很多方面都很困惑。

标签: r matlab octave


【解决方案1】:

使用基础 R:

f <- quote( lambda / (lambda - x) )
Df <-  D(f, "x")

do.call("substitute", list(Df, list(x = 0)))
## lambda/(lambda - 0)^2

或者我们可以在特定的 x 和 lambda 值处评估 Df:

eval(Df, list(x = 0, lambda = 3))
## [1] 0.3333333

创建表示结果的函数

我们可以使用 Df 定义一个 R 函数 der,它计算特定 x 和 lambda 值的导数。

der <- function(x, lambda) {}
body(der) <- Df
der(0, 3)
## [1] 0.3333333

柯里化

如果我们想将 x 设置为 0 并创建 lambda 的结果函数

make_der0 <- function(x = 0) function(lambda) der(x, lambda)
der0 <- make_der0()
der0(3)
## [1] 0.3333333

这被称为 currying 或 partialling,各种包也有这个:

library(functional)
der0a <- Curry(der, x = 0)
der0a(3)
## [1] 0.3333333

library(purrr)
der0b <- partial(der, x = 0)
der0b(3)
## [1] 0.3333333

【讨论】:

  • 使用quotesubstitute的酷答案,+1!
  • 这很好,但不会简化结果。 (我觉得你写 rSymPy 有点讽刺意味,我的回答使用它......)
  • 对了,我对rSymPy的发展状况有点迷茫。我在github.com/cjgb/rSymPy 发布了一个问题,但我不确定它是否是最新的:rsympy.googlecode.com 看起来坏了...?
  • 我愿意,但我只能做愚蠢的 R 级维护工作(例如,维护 CRAN 合规性)。如果内部有任何问题,我能够修复它的概率将是
  • @BB,已将讨论移至电子邮件。
【解决方案2】:

这似乎使用了symbolic 包,而该包又依赖于sympy Python 库。 R 没有内置的符号操作功能,但它确实 (TIL) 有一个类似的 rSymPy 包。

## https://kevinkotze.github.io/mm-tut1-symbolic/
library(rSymPy)

rSymPy 没有内置的subs() 函数,所以我们定义一个:

subs <- function(expr,x,y) {
    Sym(expr,".subs(",x,",",y,")")
}

定义这个也很有用(不确定是否有更好的方法):

r_eval <- function(s,eval_list) {
   eval(parse(text=sympy(unclass(s))), eval_list)
}

其余代码看起来几乎与 Octave 代码相同。定义变量:

## NOTE: 'lambda' is a reserved word in Python, so trying to use it as 
## a variable gives rise to confusing errors ...
lam <- Var("lam")
x <- Var("x")
f <- lam/(lam-x)

区分:

mgf1 <- deriv(f,x,1)

替补:

subs(mgf1,x,0)

从 R 到符号数学引擎还有其他接口,例如Ryacas.

如果你想通过计算 f''(0) 来计算二阶矩,这并不难:

v <- subs(deriv(f,x,2),x,0)  ## "2/lam**2"
r_eval(v, list(lam=5))  ## 0.08

【讨论】:

  • 我一直在使用 Octave 中的矩生成函数和泰勒级数展开等,并且一直依赖 subs(f,x,value)。没想到一个看似简单的操作在R中竟然这么麻烦。
  • 好吧,这两个平台都没有本地符号计算,我刚刚展示了如何在 R 中像在 Octave 中一样轻松地做到这一点......我应该首先定义 subs() 函数,那么代码将与您的代码几乎相同(除了您省略了包加载和变量定义步骤...
  • 在 R 或 Octave 中做大学数学时遇到类似的问题,请你帮忙解释一下stackoverflow.com/questions/62853882/…
【解决方案3】:

也许你可以试试包Deriv

library(Deriv)
f <- function(l,x) l/(l-x)
fprim <- Deriv(f,"x")(2,0) 

这样

> fprim(2,0)
[1] 0.5

【讨论】:

  • 不知道那个包。只能代替x吗?我看到你用 eval(mgf1) 代替 l=2, x=0。
猜你喜欢
  • 2015-09-08
  • 1970-01-01
  • 2019-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-21
相关资源
最近更新 更多