Рякас заменяет, но не упрощает и не оценивает
Я использую пакет 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)