R:中的根查找:来自MATLAB的fzero(f,x0)命令?

时间:2014-03-15 15:02:34

标签: r matlab

我正在尝试将一些MATLAB代码转换为R. MATLAB代码使用fzero(f,x0)来查找x0附近的根,但我不确定RI中的哪个命令可以用来做同样的事情。我知道R中有uniroot(f, c(a,b)),但这需要在ab之间的时间间隔内进行搜索。有谁知道R中是否有与MATLAB fzero(f,x0)类似的东西?

谢谢!

编辑:我在R包fzero中找到pracma,会尝试并报告我的结果。

2 个答案:

答案 0 :(得分:0)

来自fzero包的

pracma为我工作

答案 1 :(得分:0)

我知道有答案,但它与示例不同。

MatLab中的“fzero”(是的,我老了)具有可以将参数传递给用户自定义函数的功能。

例如,请考虑以下内容(来自MatLab中的fzero帮助):

 myfun = @(x,c) cos(c*x);  % The parameterized function.
 c = 2;                    % The parameter.
 X = fzero(@(x) myfun(x,c),0.1)

(旁白)我喜欢MatLab帮助文档。我认为这是价值主张的一个主要部分。它非常容易学习,并且是为自学而建的。

在这个规范的MatLab(或MATLAB)代码中,在找到附近的根之前,将参数“c”传递给“myfun”。 R中的规范答案必须至少做到这一点。 如何在R?

中获得相应的效果

当然我们需要“pracma”库,以便我们拥有“fzero”功能。

#library with the fzero function
library(pracma)

这是声明的函数。请注意,“t”不是输入。这使得free variable没有本地范围。

#make a user-defined function
myfun <- function(x) {
     temp <- t - (exp(-0.5*x)/(exp(0)+exp(-0.5*x)));
     return(temp);
}

复制是完全不公平的,所以我做了一个新的。

以下是我如何找到附近值和函数的“目标”。

#y-values (weights) of interest
target <- c(0.999,0.99,0.95,0.9,0.8,0.75,0.66,0.5,
            0.33,0.25,0.20,0.1,0.05,0.01,0.001)

#initialize for loop
xlist <- numeric()

#loop
for (i in 1:length(target)){
     y <- target[i]
     temp <- fzero(myfun,3)

     xlist[i] <- temp$x
}

然后我可以绘制它并评估性能。

#plot it 
plot(x=xlist,
     y=target,
     xlab = "AIC value",
     ylab = "max Akaike weight",
     type="p")

est <- smooth.spline(xlist,target)
x2 <- seq(from=min(xlist),to=max(xlist),length.out=100)
lines(x2,predict(est,x2)$y,col="green")
grid()

结果图如下: enter image description here

检查显示它完全符合要求。