मेरे पास एक परिवर्तन पैरामीटर (y) के साथ एक अभिन्न अंग है।

y <- seq(1,2,0.01)
integrand_1 <- function(t){
  
  A1 <- 30*(y*30^(1/2)-t)^2
  A2 <- (dnorm(t+30^(1/2))+dnorm(t-30^(1/2)))
  
  return(pchisq(A1, 30)*A2)
}
W <- integrate( f = integrand_1, 
                   lower = 0, 
                   upper = y*30^(1/2)
)

W <- W$value
W

हालाँकि, इंटीग्रल अनुक्रम पैरामीटर को इसे आयात करने की अनुमति नहीं दे सकता है।

मैं अनुक्रम पैरामीटर के साथ परिणाम कैसे प्राप्त कर सकता हूं और परिणामों को अनुक्रम (डब्ल्यू) बना सकता हूं?

समाधान प्रदान करने वाले किसी भी व्यक्ति को बहुत धन्यवाद।

0
To-cheng Wang 20 जिंदा 2021, 03:32

2 जवाब

सबसे बढ़िया उत्तर

इसे काम करने के लिए, हमें आपके कोड में कुछ छोटे बदलाव करने होंगे।

  1. हम जानते हैं कि integrate का पहला तर्क संख्यात्मक होना चाहिए। आपके उदाहरण में: t. हालाँकि, हमारे पास y भी है, जिसे फंक्शन में भी पास करना होता है। तो हमारा नया कार्य है:
integrand <- function(t, y) {
  a1 <- 30 * (y * 30 ^ (1 / 2) - t) ^ 2
  a2 <- (dnorm(t + 30 ^ (1 / 2)) + dnorm(t - 30 ^ (1 / 2)))
  
  pchisq(a1, 30) * a2
}

चूंकि हम एक वेक्टर को एकीकृत करने के लिए पास नहीं कर सकते हैं, लेकिन फिर भी y के सभी मूल्यों के लिए इसका मूल्यांकन करने की आवश्यकता है, मैं इसे lapply() अभिव्यक्ति में लपेटता हूं, जो एक सूची लौटाएगा अभिन्न के मूल्य के साथ Y का प्रत्येक मान।

# Let's call the vector of Y values capital Y and elements of this lower-case y
Y <- seq(1, 2, 0.01)

# Use the lapply to evaluate the integral for each y
W_list <- lapply(Y, function(y) {
  integrate(
    f = integrand, 
    lower = 0, 
    upper = y * 30 ^ (1 / 2),
    y = y # NOTE: This is where I pass the additional y argument to integrand inside integrate
  )
})

अंत में, हम मान निकालते हैं और उन्हें एक वेक्टर में जोड़ते हैं

W <- do.call(c, lapply(W_list, function(w) w$value))

W अब Y की लंबाई के समान है और इसमें मान शामिल हैं:

[1] 0.1626543 0.1763727 0.1908012 0.2059319 0.2217521
[6] 0.2382447
0
edsandorf 20 जिंदा 2021, 12:24

यह मानते हुए कि इंटीग्रैंड का edsandorf's संस्करण सही है, आप mapply और < के इस संयोजन का उपयोग कर सकते हैं कोड>लागू करें:

integrand <- function(t, y){
  A1 <- 30*(y*30^(1/2)-t)^2
  A2 <- (dnorm(t+30^(1/2))+dnorm(t-30^(1/2)))
  
  return(pchisq(A1, 30)*A2)
}
res <- mapply(integrate, upper = y*30^(1/2), y = y, SIMPLIFY = FALSE, 
              MoreArgs = list(f = integrand, lower = 0))
sapply(res, `[[`, "value")
#R>   [1] 0.1627 0.1764 0.1908 0.2059 0.2218 0.2382 0.2554 0.2732 0.2915 0.3104 0.3299 0.3498 0.3701 0.3908 0.4118 0.4330 0.4545 0.4761
#R>  [19] 0.4977 0.5194 0.5410 0.5625 0.5838 0.6048 0.6256 0.6460 0.6660 0.6855 0.7045 0.7230 0.7409 0.7582 0.7748 0.7908 0.8061 0.8206
#R>  [37] 0.8345 0.8477 0.8601 0.8718 0.8829 0.8932 0.9029 0.9119 0.9202 0.9280 0.9352 0.9417 0.9478 0.9534 0.9584 0.9630 0.9672 0.9710
#R>  [55] 0.9744 0.9775 0.9802 0.9827 0.9849 0.9868 0.9886 0.9901 0.9914 0.9926 0.9937 0.9946 0.9954 0.9960 0.9966 0.9971 0.9976 0.9980
#R>  [73] 0.9983 0.9986 0.9988 0.9990 0.9992 0.9993 0.9994 0.9995 0.9996 0.9997 0.9997 0.9998 0.9998 0.9999 0.9999 0.9999 0.9999 0.9999
#R>  [91] 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000
0
Benjamin Christoffersen 20 जिंदा 2021, 10:54