【问题标题】:R: How to plot use function which find a rootR:如何绘制找到根的使用函数
【发布时间】:2020-11-12 00:31:39
【问题描述】:

我构造了一个用户函数:

find.c <- function(q) { f <- function(c) {
(log(7.2 + 6 * c * q - 6) * q^6 * (1-q)^(6-6) * factorial(6) / factorial(6) / factorial(6-6)
 + log(7.2 + 6 * c * q - 5) * q^5 * (1-q)^(6-5) * factorial(6) / factorial(5) / factorial(6-5)
 + log(7.2 + 6 * c * q - 4) * q^4 * (1-q)^(6-4) * factorial(6) / factorial(4) / factorial(6-4)
 + log(7.2 + 6 * c * q - 3) * q^3 * (1-q)^(6-3) * factorial(6) / factorial(3) / factorial(6-3)
 + log(7.2 + 6 * c * q - 2) * q^2 * (1-q)^(6-2) * factorial(6) / factorial(2) / factorial(6-2)
 + log(7.2 + 6 * c * q - 1) * q^1 * (1-q)^(6-1) * factorial(6) / factorial(1) / factorial(6-1)
 + log(7.2 + 6 * c * q - 0) * q^0 * (1-q)^(6-0) * factorial(6) / factorial(0) / factorial(6-0)
 - log(7.2)
)}                                                                                          
 g <- uniroot(f, lower=0, upper=100, extendInt = "yes")[1]                                 
 g}

而我试图绘制:

plot(x = seq(0, 1 , 0.001), find.c(x)) 

然后它给了我:“uniroot 中的错误(f,lower = 0,upper = 100,extendInt = “yes”): 端点处的 f() 值不是相反符号"

还有什么方法可以使用'for'循环来简化这个功能?我尝试了 for 的方法,但是函数内部的函数非常复杂。

【问题讨论】:

  • 您的函数是否在 0 - 到 - 100 的范围内跨过 0?如果没有零点,就找不到零点。
  • find.c(0.1), find.c(0.001) 等给我输出,是的。
  • plot(x, sapply(x, find.c)) 是否显示您的期望?
  • 还有谁能解释我为什么要使用 sapply?例如 'sin' 不需要 sapply,但是这个使用函数需要它。那是因为我的函数不能有向量或列表输入吗?

标签: r plot


【解决方案1】:

我同意@r2evans 的建议,但我认为您可以在没有嵌套函数的情况下将其重组为更简单。

首先,使用c=q= 作为参数定义f

f <- function(c,q) {
(log(7.2 + 6 * c * q - 6) * q^6 * (1-q)^(6-6) * factorial(6) / factorial(6) / factorial(6-6)
 + log(7.2 + 6 * c * q - 5) * q^5 * (1-q)^(6-5) * factorial(6) / factorial(5) / factorial(6-5)
 + log(7.2 + 6 * c * q - 4) * q^4 * (1-q)^(6-4) * factorial(6) / factorial(4) / factorial(6-4)
 + log(7.2 + 6 * c * q - 3) * q^3 * (1-q)^(6-3) * factorial(6) / factorial(3) / factorial(6-3)
 + log(7.2 + 6 * c * q - 2) * q^2 * (1-q)^(6-2) * factorial(6) / factorial(2) / factorial(6-2)
 + log(7.2 + 6 * c * q - 1) * q^1 * (1-q)^(6-1) * factorial(6) / factorial(1) / factorial(6-1)
 + log(7.2 + 6 * c * q - 0) * q^0 * (1-q)^(6-0) * factorial(6) / factorial(0) / factorial(6-0)
 - log(7.2)
)}      

然后循环遍历每个q= 值:

mapply(function(...) uniroot(...)[[1]], 
   list(f), q=seq(0,1,0.001), lower=0, upper=100, extendInt="yes")

#   [1] 0.000000 1.076564 1.076460 1.076375 1.076291 1.076206 1.076122
#   [8] 1.076037 1.075953 1.075868 1.075784 1.075699 1.075614 1.075530
#   etc

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-05
    相关资源
    最近更新 更多