当前位置: 首页 > 知识库问答 >
问题:

用蒙特卡罗法确定积分不具有可接受的误差

司空宗清
2023-03-14

我想计算e^(-landax)cosx从零到正无穷大的积分。精确解是landa/((landa^2)+1)。我试图解决的例子迫使我有0.01的最大误差。这里,我采用的方法是,首先从均匀分布函数[0,1]生成一个随机数,然后通过(-1/landa ln(x))对其进行变换,这样,现在每个变量将具有(landa*e^(-landa x))的概率。我不明白的是,当我把N从100万增加到1亿时,误差以以下方式变化,当然这不符合问题的标准,奇怪的是,从1000000的N增加到10000000的N,误差在增加。与N相对应的错误为:

N=1000000    0.0997496
N=100000000  0.0999462
N=100000000  0.0999341 

下面是我的代码:

#include <iostream>
#include <random>
#include <fstream>
#include <iomanip>
using namespace std;
double landa = 1;
double function(double x) {
    return (exp(-landa * x) * cos(x));
}

int main()
{
    unsigned seed = 0;
    srand(seed);
    double exact_solution = landa / (pow(landa, 2) + 1);
    const int N = 100000000;
    default_random_engine g(seed);
    uniform_real_distribution<double> distribution(0.0f, nextafter(1.0f, DBL_MAX));
    double sum = 0.0;
    double app;
    double error;
    for (int i = 0; i < N; i++) {
    double x = distribution(g);
    // transform xs 
    x = (-1.0 / landa) * log(x);
    sum = sum + function(x);
    }

    app = sum / static_cast<double> (N);
    error = exact_solution - app;
    cout << N << "\t" << error << endl; 

}

共有1个答案

常彭薄
2023-03-14

您产生了一个混乱:一旦您生成了具有适当分布的x,那么您必须简单地集成cos(x)

    sum = sum + cos(x);

输出:

1000000         -0.0010428
10000000        0.000105266
100000000       -2.08618e-05
 类似资料:
  • 从名字我们可以看出,MCMC由两个MC组成,即蒙特卡罗方法(Monte Carlo Simulation,简称MC)和马尔科夫链(Markov Chain ,也简称MC)。要弄懂MCMC的原理我们首先得搞清楚蒙特卡罗方法和马尔科夫链的原理。我们将用三篇来完整学习MCMC。在本篇,我们关注于蒙特卡罗方法。 2. 蒙特卡罗方法引入 蒙特卡罗原来是一个赌场的名称,用它作为名字大概是因为蒙特卡罗方法是一种

  • 我正在写一个蒙特卡罗模拟来检查有多少次y不是紧挨着另一个y。我变出了一个40 x和10 y的向量,放置在向量中的随机位置。我的目标是计算向量中没有任何相邻y的概率。以下是我尝试过的: 结果是一个非常小的数字,这对我来说似乎没有意义。

  • 我试图模拟来自rho=0.7的AR(1)模型的数据(Y)。然后我将使用这些数据在截距上运行Y的回归(通过这样做,参数估计成为Y的平均值),然后使用鲁棒的标准错误。我想对这个假设运行一个蒙特卡罗模拟,使用2000次重复不同的滞后值。目的是显示当滞后变化时Newey West估计器的有限样本性能 我的问题是:上面的代码是进行这种模拟的正确方法吗?如果是,我如何得到一个代码来重复这个过程在HAC测试中的

  • 我有以下型号 在此处输入图像描述 我需要使用蒙特卡洛实验并获得统计数据。一个例子应该是。 在此处输入图像描述 但在运行时,图形上不会显示任何内容。如何将此统计数据链接到模型?

  • 1 前言 在上一篇文章中,我们介绍了基于Bellman方程而得到的Policy Iteration和Value Iteration两种基本的算法,但是这两种算法实际上很难直接应用,原因在于依然是偏于理想化的两个算法,需要知道状态转移概率,也需要遍历所有的状态。对于遍历状态这个事,我们当然可以不用做到完全遍历,而只需要尽可能的通过探索来遍及各种状态即可。而对于状态转移概率,也就是依赖于模型Model

  • 蒙特卡罗方法也称为统计模拟方法(或称统计实验法),是一种基于概率与统计的数值计算方法。该计算方法的主要核心是通过对建立的数学模型进行大量随机试验,利用概率论求得原始问题的近似解,与它对应的是确定性算法。