Вы не делаете Монте-Карло здесь. Монте-Карло - это метод моделирования, который помогает аппроксимировать интегралы с использованием сумм / средних на основе случайных величин.
Вы должны сделать что-то в этом духе (возможно, вам придется убедиться, что правильно сказать, что среднее значение вывода f может приблизительно соответствовать вашему интегралу:
f <- function(n){
x <- runif(n)
return(
((cos(x))/x)*exp(log(x)-3)^3
)
}
int_gral <- mean(f(10000))
То, что делает ваш код, таково: взяв число n
и вернув ((cos(n))/n)*exp(log(n)-3)^3
, в этом нет случайности
Обновление
Теперь, чтобы получить более точные оценки, вам нужно повторить этот шаг K
раз Вместо использования loop
вы можете использовать функцию replicate
:
K <- 100
dist <- data.frame(
int = replicate(K, mean(f(10000)))
)
Вы получаете распределение оценок для вашего интеграла:
library(ggplot2)
ggplot(dist) + geom_histogram(aes(x = int, y = ..density..))
![enter image description here](https://i.stack.imgur.com/ZTd0B.png)
и вы можете использовать mean
для получения числового значения:
mean(dist$int)
# [1] 2.95036e-05
Вы можете оценить точность своих оценок с помощью
sd(dist$int)
# [1] 2.296033e-07
Здесь он маленький, потому что N уже большой, что дает вам хорошую точность первого шага.