📄 brownianbridgepath.h
字号:
#define BrownianBridgePath_H
#include<vector>
#include <iostream>
using namespace std;
class BrownianBridgePath
{
public:
BrownianBridgePath(int k, int M,int NumberOfPaths)
{
K=k;
m=M;
PathNumber=NumberOfPaths;
for(int i=0;i<=PathNumber;i++)
{
vector<double>v(m);
W.push_back(v);
}/*
for(int i=0;i<=100000;i++)
for(int j=0;j<=m;j++)
W[i].push_back(0);*/
}
void GetVanillaPath()
{
RandomParkMiller generator1(1);
generator1.ResetDimensionality(1);
MJArray VariateArray1(1);
int PathPerStrata=PathNumber/K;
for(int k=0;k<PathPerStrata;k++)
{
for(int i=1;i<=K;i++)
{
generator1.GetUniforms(VariateArray1);
double U=VariateArray1[0];
double V=(i-1+U)/K;
W[i+K*k][1]=InverseCumulativeNormal(V);
}
}
}
void GetAsianPath()
{
RandomParkMiller generator1(1);
generator1.ResetDimensionality(1);
MJArray VariateArray1(1);
RandomParkMiller generator2(1);
generator2.ResetDimensionality(1);
MJArray VariateArray2(1);
int PathPerStrata=PathNumber/K;
for(int i=1;i<=K;i++)
{
for(int e=1;e<=PathPerStrata;e++)
{
generator1.GetUniforms(VariateArray1);
double U=VariateArray1[0];
double V=(i-1+U)/K;
W[(i-1)*PathPerStrata+e][m]=InverseCumulativeNormal(V);
}
for(int j=1;j<=m-1;j++)
{
double tj=j/(double)m;
double tjminus1=j/(double)m-1.0/m;
double a=(1-tj)/(1-tjminus1);
double b=(tj-tjminus1)/(1-tjminus1);
double c=sqrt((1-tj)*(tj-tjminus1)/(1-tjminus1));
for(int e=1;e<=PathPerStrata;e++)
{
generator2.GetGaussians(VariateArray2);
double Z=VariateArray2[0];
cout<<Z<<endl;
W[(i-1)*PathPerStrata+e][j]=a*W[(i-1)*PathPerStrata+e][j-1]+b*W[(i-1)*PathPerStrata+e][m]+c*Z;
}
}
}
}
double getW(int i,int j)
{return W[i][j];}
void print()
{
for(int i=1;i<40;i++)
for(int j=0;j<=6;j++)
cout<<W[i][j]<<endl;
}
private:
int K;
int m;
int PathNumber;
vector<vector<double>>W;
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -