1

我在 R 中使用 Ryacas 包,并试图用变量代替值,但不简化或求解方程以显示计算结果。我搜索了 Stackoverflow,阅读了 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

任何帮助表示赞赏。

4

1 回答 1

1

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

我们使用 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}"

添加

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

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

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

# https://stackoverflow.com/questions/21858668/symbolic-matrix-multiplication-by-ryacas
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)

###

# https://stackoverflow.com/questions/22739173/matrix-transpose-in-ryacas
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)

###

# https://stackoverflow.com/questions/49572184/how-to-derivate-using-ryacas

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)
于 2021-12-09T16:33:51.800 回答