《quantitative finance with cpp》阅读笔记10---计算标准正太分布的概率密度及-1.96到1.96的累计分布
作者:yunjinqi   类别:    日期:2023-12-26 17:10:43    阅读:124 次   消耗积分:0 分    

10.6.2 Write a class NormalPDF and compute its integral from −1.96 to 1.96.


解决这个问题,尝试实现了一个NormalPDF类并进行了简单的测试,代码并不保证完全正确,仅供参考。

代码地址:对比视图(696b685bd6a102a92762a6724de523a4deaf57c5...d71848d08f52555c17957ad173a192e8339551a8) · 云金杞/learn_cpp_series - Gitee.com


NormalPDF.h

#pragma once
#include "RealFunction.h"
#include "matlib.h"
#include "testing.h"
class NormalPDF : public RealFunction {
public:
	NormalPDF();
	double v;
	double evaluate(double x);
	double integral(double a, double b, int nPoints);
};

void testNormalPDFIntergal();


NormalPDF.cpp

#include "NormalPDF.h"
#include <cmath>

NormalPDF::NormalPDF() {
    v = 0;
}

double NormalPDF::evaluate(double x) {
    static const double inv_sqrt_2pi = 0.3989422804014327;
    return inv_sqrt_2pi * std::exp(-0.5 * x * x);
}


double NormalPDF::integral(double a, double b, int nPoints) {
    double h = (b - a) / nPoints;
    double x = a + 0.5 * h;
    double total = 0.0;
    for (int i = 0; i < nPoints; i++) {
        double y = evaluate(x);
        total += y;
        x += h;
    }
    return h * total;
}

/*
 TESTS for NormalPDF
*/

static void testNormalPDF() {
    rng("default");
    NormalPDF nPdf;
    double p = nPdf.integral(-1.96, 1.96,10000);
    ASSERT_APPROX_EQUAL(p, 0.95, 0.1);
}

static void testEvaluate0() {
    rng("default");
    NormalPDF nPdf;
    double p = nPdf.evaluate(-1000000000);
    ASSERT_APPROX_EQUAL(p, 0, 0.1);
    
}

static void testEvaluate1() {
    rng("default");
    NormalPDF nPdf;
    double p1 = nPdf.evaluate(0);
    ASSERT_APPROX_EQUAL(p1, 0.3989, 0.1);
}

static void testEvaluate2() {
    rng("default");
    NormalPDF nPdf;
    double p2 = nPdf.evaluate(10000000000);
    ASSERT_APPROX_EQUAL(p2, 0, 0.1);
}

void testNormalPDFIntergal() {
    TEST(testNormalPDF);
    TEST(testEvaluate0);
    TEST(testEvaluate1);
    TEST(testEvaluate2);
}


版权所有,转载本站文章请注明出处:云子量化, http://www.woniunote.com/article/375
上一篇:《quantitative finance with cpp》阅读笔记9---用cpp给二元期权(digital option) 进行定价
下一篇:《quantitative finance with cpp》阅读笔记11---用数值积分法计算从x到无穷大的定积分函数