首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用“`Ryacas`”包或另一种方法象征性地求解R中的非线性方程

用“`Ryacas`”包或另一种方法象征性地求解R中的非线性方程
EN

Stack Overflow用户
提问于 2019-04-17 06:13:01
回答 1查看 850关注 0票数 1

出于纯粹的好奇心,我感兴趣的是,是否有一个函数/包允许在R中求解简单的非线性方程?

假设我想(象征性地)解决0 = C + 1/x^2。上述示例的预期结果是x = sqrt(-1/-C)

我尝试了Ryacas包:

代码语言:javascript
复制
library("Ryacas")
Solve(yacas("C+1/x^2"))

返回一个错误:

Sym中的错误(“求解( ",x,”",“,y,”)):参数"y“缺失,没有默认值

所以我做了:

代码语言:javascript
复制
Solve(yacas("C+1/x^2"), 0)

它不会返回任何有用的内容:

代码语言:javascript
复制
Yacas vector:
character(0)

我按照?yacas上的说明安装yacas。如果yacas工作正常,demo(Ryacas)会生成输出。以下是第一部分:

代码语言:javascript
复制
    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")

有什么暗示吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-17 09:04:15

我们可以使用包Ryacas (感谢提示@Bhas),它是库yacas的一个接口,用于求解符号方程:

代码语言:javascript
复制
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的值)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55721008

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档