1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
|
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
// Returns the erf() of a value (not super precice, but ok)
double erf(double x)
{
double y = 1.0 / ( 1.0 + 0.3275911 * x);
return 1 - (((((
+ 1.061405429 * y
- 1.453152027) * y
+ 1.421413741) * y
- 0.284496736) * y
+ 0.254829592) * y)
* exp (-x * x);
}
// Returns the probability of [-inf,x] of a gaussian distribution
double cdf(double x, double mu, double sigma)
{
return 0.5 * (1 + erf((x - mu) / (sigma * sqrt(2.))));
}
void tauchen(double rho, double mu, int sigma, int n, int kappa)
{
double zmin = mu - kappa*sigma / pow((1 - pow(rho,2)),0.5);
double zmax = mu + kappa*sigma / pow((1 - pow(rho,2)),0.5);
double zdel = (zmax - zmin) / (n - 1);
vector<double> z(n);
for (int i = 1; i < n+1; i=i+1)
z[i] = zmin + (i-1)*zdel;
vector<double> m(n-1);
for (int i = 1; i<n; i=i+1)
m[i] = (z[i]+z[i+1])/2;
vector<double> vecmu(n,mu);
vector<double> a(n);
for (int i = 1; i<n+1; i=i+1)
a[i] = (1-rho)*vecmu[i] + rho*z[i];
vector<vector<double> > ztrans(n,vector<double>(n));
for (int j=1;j<n+1;j=j+1)
{
ztrans[j][1] = cdf(m[1],a[j],pow(sigma,2));
for (int i=2;i<n;i=i+1)
ztrans[j][i] = cdf(m[i],a[j],pow(sigma,2)) - cdf(m[i-1],a[j],pow(sigma,2));
ztrans[j][n] = 1-cdf(m[n],a[j],pow(sigma,2));
}
}
int main()
{
double rho,mu;
int sigma,n,kappa;
vector<double> z(n);
vector<vector<double> > ztrans(n,vector<double>(n));
cout << "please enter the variables rho, mu, sigma, n, and kappa:";
cin >> rho >> mu >> sigma >> n >> kappa;
tauchen(rho,mu,sigma,n,kappa);
for (int i=1;i<n+1;i=i+1)
cout << z[i];
for (int i=1;i<n+1;i=i+1)
{
for (int j=1;j<n+1;j=j+1)
cout << ztrans[j][i];
}
return 0;
}
|