Рякас заменяет, но не упрощает и не оценивает

Я использую пакет Ryacas в R и пытаюсь заменить значения переменными, но не упрощаю и не решаю уравнение, чтобы показать результат. Я искал 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}"

Кто-нибудь знает, есть ли решение этой проблемы, например, передача команды yacas через yac_strили похожие. Я пробовал переводить на латекс с помощью 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}"

Хотя это можно сделать для простых выражений, существует множество исключений, таких как переменные a и c присутствие в \\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

Любая помощь приветствуется.

1 ответ

Возможно, вам придется настроить это еще немного, но этот общий подход может работать, если вы готовы это сделать.

Мы переводим слова в их значения с помощью gsubfn и обрабатываем часть \times в конце с помощью gsub. Обратите внимание, что frac не изменяется, потому что мы сопоставляем слова, а frac это не слово в списке, указанном во втором аргументе для gsubfn.

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

Добавлен

Возьмите первые три примера кода при поиске [r] Ryacas в stackoverflow, и он работал на всех из них. Обратите внимание, что они использовали оригинальную версию 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)
Другие вопросы по тегам