我正在尝试使用包multiroot
中的rootSolve
函数来解决R中的隐式方程。
我正在使用parse
从文本文件中读取隐式等式。此外,要解决的变量从文本文件中读取为字符。
使用multiroot
,
multiroot(function, initial_guess, ....))
我们必须从读取的等式中生成一个函数。
我这样做了fun <- function(op) {fun <- eval(expr.im)}
op = as.name(opim.names)
其中expr.im
是读隐式等式作为文本文件中的表达式,opim.names
是要作为字符解决的变量。
但是当我将要解析的变量op
作为符号传递给函数时,问题就出现了。它给出了一个错误,说明了对象
&#34;要解决的变量&#34;没找到。
我认为变量符号没有在函数中正确传递。
请告诉我如何正确地做到这一点。
由于我的代码中有很多内容,我不能在这里发布整个内容。 让我举一个小例子。
var.name = "x1" # This is what I read from the text file #
var.sym = as.name(var.name)
func <- function(var.sym){
func = x1^2 # the expression x1^2 is also read from a text file #
} # I am trying to solve the implicit equation x1^2 = 0 #
initial_guess = 1
root = multiroot(f=func, start = initial_guess)
按照尼古拉的要求,这就是我想要的 -
我有一个文本文件给我变量的名称和它的初始猜测。
我将变量名称(例如&#34; x&#34;)和初始猜测值(比如1)读入变量var
(字符)和guess
(数字)。
我还有另一个包含以下等式的文本文件 -
x^3-1
我把它读作变量expr
中的表达式。
我想找到隐式方程expr
的解。
(文本文件可以有不同的变量名称,相应地是另一个文件中的隐式表达式)
如您所知,对于使用多根功能,我们需要一个功能。
问题是我无法将var
中存储的变量名称传递给函数。
如果被问及,将会给予进一步的澄清。
答案 0 :(得分:1)
您可以通过以下方式构建您的功能。
#input: function expression, variable names and initial guess
expr<-"x^3-1"
var.name<-"x"
initial.guess<-2
#we build an "empty" function
func<-function() {}
#now we set the formal arguments and the body of the function
formals(func)<-eval(parse(text=paste0("alist(",paste(var.name,collapse="=,"),"=)")))
body(func)<-parse(text=expr)
#we can see that func is correctly defined
func
#function (x)
#x^3 - 1
#now we can call multiroot
multiroot(func,initial.guess)
#$root
#[1] 1
#$f.root
#[1] 3.733019e-08
#$iter
#[1] 6
#$estim.precis
#[1] 3.733019e-08
如果要处理多个变量的函数,则需要更加小心。请参阅?multiroot
以查看如何传递参数。基本上你必须只传递一个参数,它是所有函数参数的向量。如果你花点时间看看我是如何建立func
的,那应该不难。如果您只处理一个变量函数,则应使用基本uniroot
函数。
答案 1 :(得分:0)
无法完全理解说明。但要回答标题,您可以尝试这个程序 -
a = "random_string"
b = "a"
eval(parse(text = b))
[1] "random_string"