Ryacas 替代但不简化或评估

Ryacas substitute but don't simplify or evaluate

我在 R 中使用 Ryacas 包,并试图用变量代替值,但不简化或求解方程以显示计算结果。我搜索了 Whosebug,阅读了 Ryacas 文档并试图在 Yacas 手册中找到它,但到目前为止还没有找到。我想我希望关闭简化以获得替代方程,然后再次打开以提供最终结果。

这里是一个只提供结果而不是工作的例子:

library(Ryacas)
# a <- 2
# b <- 3
# c <- 4
eq <- ysym(('(a * b) / c'))

solution <- with_value(with_value(with_value(eq, 'a', 2), 'b', 3), 'c', 4)
tex(solution)
# "\frac{3}{2}"

我想要得到的输出是:

# working out
# "\frac{2 \times 3}{4}

以及实际解决方案:

# solution
# "\frac{3}{2}"

有谁知道是否有解决此问题的方法,例如通过 yac_str 或类似方式将命令传递给 yacas。我尝试使用 tex() 命令转换为乳胶,然后在删除乘法运算符后替换,这意味着我需要查找并替换它们,这在处理符号时变得很讨厌:

tex(eq)
# "\frac{a b}{c}"

# substituting string values using stringi requires additional  
# work to deal with the missing `*` between `a` and `b`
# "\frac{2 3}{4}"

虽然这可以用于简单的表达式,但有许多例外情况,例如变量 ac 出现在 \frac

我也尝试过 TexForm 命令和各种形式的 substitute 但我仍然无法捕捉到未简化和未计算的方程式:

y_fn(substitute(with_value(eq, 'a', 2)), "TeXForm")
# "\frac{2 b}{c}"

eval(substitute(with_value(eval(substitute(with_value(eq, 'a', 2))), 'b', 3)))
# y: 6/c

感谢任何帮助。

您可能需要对此进行更多自定义,但如果您愿意,这种通用方法是可行的。

我们使用 gsubfn 将单词翻译成它们的值,并使用 gsub 处理末尾的 \times 部分。请注意,frac 未被修改,因为我们正在匹配单词并且 frac 它不是 gsubfn 的第二个 arg 中给出的列表中的单词。

library(magrittr)
library(gsubfn)
library(Ryacas)

eq <- ysym(('(a * b) / c'))

eq %>%
  tex %>%
  gsubfn("(\w+)", list(a = 2, b = 3, c = 4), .) %>%
  gsub("(\d) (\d)", "\1 \\times \2", .)
## [1] "\frac{2 \times 3}{4}"

已添加

在 Whosebug 中搜索 [r] Ryacas 时使用前三个代码示例,它对所有代码都有效。请注意,这些使用了 Ryacas 的原始版本,目前称为 Ryacas0,所以我使用了它。

library(Ryacas0)
library(gsubfn)
library(magrittr)

tex_sub <- function(.x, ...) {
  .x %>%
    gsubfn("(\w+)", list(...), .) %>%
    gsub("(\d) (\d)", "\1 \\times \2", .)
}

# 
x <- Sym("x")
mat1 <- List(
  List(x, 2),
  List(x^3, x))

mat2 <- List(
  List(x, x),
  List(3, 6 * x))

tt <- TeXForm(mat1 * mat2)
tex_sub(tt, x = 1)

###

# 
u=Sym("u")
v=Sym("v")
w=Sym("w")
DG=List(List(w-v), List(u-w), List(v-u))
tt2 <- TeXForm(DG)
tex_sub(tt2, u = 2, v = 3, w = 4)

###

# 

x <- Sym("x")
P <- Sym(1)
for (k in 1:3) {
  P <- Simplify((1+k*x)*P + x*(1-x)*deriv(P, x))
  print(P)
}
tt3 <- TeXForm(P)
tex_sub(tt3, x = 10)