Решите нелинейное уравнение символически в R с помощью пакета `Ryacas` или альтернативы

#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 предоставляет функциональные возможности для решения NLE

2. да. опечатка с моей стороны. исправлено

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 ).