#r #symbolic-math #solver #equation-solving
#r #символьная математика #решатель #решение уравнений
Вопрос:
Из чистого любопытства мне интересно, есть ли функция / пакет, который позволяет решать простые нелинейные уравнения в R?
Допустим, я хочу (символически) решить 0 = C 1/x^2
. Ожидаемый результат для приведенного выше примера x = sqrt(-1/-C)
Я попробовал Ryacas
пакет:
library("Ryacas")
Solve(yacas("C 1/x^2"))
Это возвращает ошибку:
Ошибка в Sym(«Solve(«, x, «,», y,»)») : аргумент «y» отсутствует, значение по умолчанию отсутствует
Так я и сделал:
Solve(yacas("C 1/x^2"), 0)
который не возвращает ничего полезного:
Yacas vector:
character(0)
Я следовал инструкциям по ?yacas
установке yacas
. Кажется, что yacas
работает, demo(Ryacas)
генерирует вывод. Вот первая часть:
demo(Ryacas)
---- ~~~~~~
Type <Return> to start :
> x <- -3 (0:600)/300
> exp0 <- expression(x ^ 3)
> exp1 <- expression(x^2 2 * x^2)
> exp2 <- expression(2 * exp0)
> exp3 <- expression(6 * pi * x)
> exp4 <- expression((exp1 * (1 - sin(exp3))) / exp2)
> res1 <- yacas(exp4); print(res1)
expression(3 * (x^2 * (1 - sin(6 * (x * pi))))/(2 * x^3))
> exp5 <- expression(Simplify(exp4))
> res2 <- yacas(exp5); print(res2)
expression(3 * (1 - sin(6 * (x * pi)))/(2 * x))
> plot(x, eval(res2[[1]]), type="l", col="red")
Какие-нибудь подсказки?
Комментарии:
1. пакет
rootSolve
предоставляет функциональные возможности для решения NLE2. да. опечатка с моей стороны. исправлено
3. Пакет
Ryacas
может помочь.4. @symbolrush Извините, я неправильно понял ваш вопрос (здесь рано).
RootSolve
не сможет помочь вам с вашей конкретной проблемой. Для вашейRyacas
проблемы: вы установили yacas? Без этого Ryacs не будет работать.?yacas
инструкции см. в разделе5.
Solve("C 1/x^2 == 0","x")
работает для меня
Ответ №1:
Мы можем использовать package Ryacas
(спасибо за подсказку @Bhas) интерфейс к библиотеке yacas
для решения символьных уравнений:
library(Ryacas)
expr <- yacas("C 1/x^2 == 0") #Generate yacas expression | note the double equals!
solv <- Solve(expr,"x") # Solve the expression for x
[1] x == root(abs(1/C), 2) * complex_cartesian(cos(argument(-1/C)/2), sin(argument(-1/C)/2))
[2] x == root(abs(1/C), 2) * complex_cartesian(cos((argument(-1/C) 2 * pi)/2), sin((argument(-1/C) 2 * pi)/2))
Yacas, очевидно, генерирует комплексное решение, потому что для положительных значений C
это уравнение имеет только комплексные корни (квадратный корень из отрицательного числа). Также ожидается два решения, поскольку у нас есть квадратное уравнение.
complex_cartesian
Часть относится к вращению в комплексной плоскости, которое зависит от значения C (в основном значения a в комплексном числе типа z=a*i b
).