2016-07-18 44 views
2

我有單個變量和各種參數的函數。對於其中一個參數(其他參數是固定的)的每個值,都有一個函數根。從參數的向量中,我想生成一個向量的根(使用uniroot)。生成函數向量

我正在做的實際例子有點混亂,但我會給它。下面是固定的參數:

eta_inf = -0.0139 
eta_0 = 178.5 
lambda = 2.4954 
m = 0.83094 

下面是函數:

crossFnc <- function(gamma_dot) tau - gamma_dot*(eta_inf + (eta_0-eta_inf)/(1 + (lambda*gamma_dot)^m)) 

下面是tau蛋白參數的特定值的根的示例:

tau=10 
uniroot(crossFnc, c(0,1))$root 

[1] 0.06900807

我想產生這些根的載體,例如,用於:

tau <- seq(0,10,length.out=101) 

感謝,

史蒂夫

+0

這是什麼語言? Root是一個不好的標籤(因爲它意味着代表Unix超級用戶)。 – cristobalito

+0

這個問題的答案是否有幫助:http://stackoverflow.com/questions/26508519/how-to-add-elements-to-a-list-in-r-loop – cristobalito

回答

2

也許你可以使用一個for循環:

my.roots <- vector() 
tau.seq <- seq(0,10,length.out=101) 
for (i in seq_along(tau.seq)) { 
    tau <- tau.seq[i] 
    my.roots[i] <- uniroot(crossFnc, c(0,1))$root 
} 
#> head(my.roots) 
#[1] 0.000000000 0.000566379 0.001142346 0.001726677 0.002257765 0.002848007 
+0

正試圖避免一個循環。答案很簡單。往上看。謝謝。 – SteveK

+1

@SteveK循環出了什麼問題? 'sapply'只是隱藏你的循環。 – Gregor

+0

@SteveK這可能是有趣的:http://stackoverflow.com/a/2276001/4770166 – RHertel

1

利用sapply

# Notice the second argument 
crossFnc <- function(gamma_dot, tau) { 
    tau - gamma_dot*(eta_inf + (eta_0-eta_inf)/(1 + (lambda*gamma_dot)^m)) 
} 

# I only use length.out = 10 
tau <- seq(0,10,length.out=10) 

# Apply function(x) to every value in tau 
myRoots <- sapply(tau, function(x) { 
    uniroot(crossFnc, c(0,1), tau=x)$root 
}) 

myRoots 

>[1] 0.000000000 0.006433349 0.013166577 0.020236503 0.027594321 0.035253401 0.043217816 0.051493442 0.060087456 
>[10] 0.069008069 
+0

工程! crossFnc2 < - 函數(gamma_dot,tau蛋白)的tau - gamma_dot *(eta_inf +(eta_0-eta_inf)/(1 +(拉姆達* gamma_dot)^ M)) sapply(TAU,函數(X){ + uniroot (crossFnc2,C(0,1),tau蛋白= X)$根 +}) [1] 0.000000000 0.000566379 0.001142346 0.001726677 0.002257765 0.002848007 [7] 0.003427169 0.004009318 0.004594418 0.005182443 0.005773373 0.006367191 等謝謝! – SteveK