2017-05-02 109 views
1

我已嵌合的功能到我的数据:哪里函数等于一定值

BCF.plot <- function(x) { 
    vv[2] +((vv[3]/(2*(1-vv[4])))*(cos(x-vv[1])-vv[4]+abs(cos(x-vv[1])-vv[4]))) 
} 

这是基线(B)余弦波,即具有在其顶部上的余弦波的基准。现在我在Y轴上有一个确定的值(dlmo_val),我想知道哪个x值对应于它。我已经试过这样的事情:

BCF.dlmo <- function(x, dlmo_val = 0) { 
    vv[2] +((vv[3]/(2*(1-vv[4])))*(cos(x-vv[1])-vv[4]+abs(cos(x-vv[1])-vv[4])))-b-dlmo_val ## find point where function minus baseline & dlmo_val is 0 
} 

vv = c(2.3971780, 2.0666526, 11.1775231, 0.7870128) 
b = 2.066653 
H = 11.17752 

dlmo_val = 0.4*H ## dlmo*peak height above baseline, H is result from optimisation 
uniroot(BCF.dlmo, c(0.2617994, 6.021386), dlmo_val=dlmo_val) ## lower & upper are min(x) and max(x) 

然而,uniroot告诉我

"...values at end points not of opposite sign" 

我真的不知道如何去了解这一点。任何建议都比欢迎!

+1

什么是'B'和'^ h '等于? –

+0

对不起,忘了这个,并相应地编辑了这个帖子...... –

+0

'curve(BCF.dlmo(x,dlmo_val = dlmo_val),from = 0.2617994,to = 6.021386)'显示函数等于零 - 你想找到他们两个吗?只有一个? –

回答

1

As described in this post,uniroot()设计用于在函数中只找到一个零,而您有两个零。你可以把它在一个较小的区间:

uniroot(BCF.dlmo, c(0.2617994, 2.5), dlmo_val = dlmo_val)$root 
# [1] 1.886079 

由于该职位描述,您可以改用在rootSolve packageunitroot.all功能找到两个零:

library(rootSolve) 
uniroot.all(BCF.dlmo, c(0.2617994, 6.021386), dlmo_val = dlmo_val) 
# [1] 1.886084 2.908276 
+0

你可以在'extendInt =“yes”'参数中使用'uniroot',它会通过延长间隔在给定的初始范围之外找到一个零。但即使这个过程有其缺点。 – Spacedman