出于好奇,我想知道是否有一个函数/包可以解决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")
有任何提示吗?
答案 0 :(得分:1)
我们可以使用包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的值(基本上是z=a*i + b
类型的复数中a的值)。