Aide sur un algorithme en dec-C++

cs_viagra Messages postés 2 Date d'inscription jeudi 27 novembre 2003 Statut Membre Dernière intervention 27 novembre 2003 - 27 nov. 2003 à 04:02
cs_viagra Messages postés 2 Date d'inscription jeudi 27 novembre 2003 Statut Membre Dernière intervention 27 novembre 2003 - 27 nov. 2003 à 14:36
je souhaiterais être aidé sur un algorithme sur lequel j'éprouve des problemes. en effet lorsque je compile aussi bien au niveau de dev-c++ et MSYS, la compilation se passe avec succes. cependant lorsque je lance l'exécutable , un message d'erreur s'affiche. j'ai beau chercher je ne trouve pas d'explications. si vous voulez bien m'aider. voici-joint l'algorithme.

#include <stdio.h>
#include <stdlib.h>
#include <gsl/gsl_math.h>
#include <time.h>
#include <gsl/gsl_rng.h>
#include <gsl/gsl_sf_trig.h>

double norminv(double);
gsl_rng * Q;

int main() {
FILE *longstaff = NULL;
const gsl_rng_type * T; // T pointe sur le type de générateur GSL à choisir

double **tab,**ITM, **vchapeau, **indice,**S, **cashflow;
double strike, dt, r, sigma, echeance, somme, somme2, sommeXY, sommeY,S0,ASJ;
double beta1, beta2,exponentielle,volatilite,t1,PutA;
double ntraj,temps,prix,RM,S1,S2,Z,detention;
int nbexercice,op,f,b,c,d,e,i,j,a,K,iterateur;

gsl_rng_env_setup(); // Environnement GSL "Random Number Generation"
T = gsl_rng_default; // T désigne le type de générateur GSL choisi
Q = gsl_rng_alloc(T); // Q pointe maintenant sur le générateur GSL

S0 = 40;
r = 0.0488;
iterateur = 4;
ntraj = 100000;

longstaff = fopen("longstaff.txt", "w");

for( op = 1; op <= 2; op++){
nbexercice = 5 + (op - 1) * 20;
for( f = 1; f <= 2; f++){
sigma = 0.2 * f;
for(b = 1; b <= 3; b++){
strike = 35 + (b - 1) * 5;
for(c = 1; c <= 2;c++){
echeance = 1 / 12 + (c - 1) * 0.5;
dt = echeance / nbexercice;
exponentielle = (r - sigma * sigma / 2) * dt;
volatilite = sigma * sqrt(dt);
temps = 0;
prix = 0;
RM = 0;
for(d = 1; d <= 5; d++){
t1 = clock();
S = (double **)malloc((ntraj - 1)*sizeof(double));
for(e = 1; e <= (ntraj - 1); e++){
S[e] = (double *)malloc((nbexercice - 1)*sizeof(double));
}
cashflow = (double **)malloc((ntraj - 1)*sizeof(double));
for(e = 1; e <= (ntraj - 1); e++){
cashflow[e] = (double *)malloc(1*sizeof(double));
}
ITM = (double **)malloc(0*sizeof(double));
ITM[0] = (double *)malloc((nbexercice - 1)*sizeof(double));

// calcul de l'actif sous-jacent aux différentes périodes d'exercice
for(i = 1; i <= (ntraj / 2); i++){
S1 = S0;
S2 = S0;
for( j = 1; j <= nbexercice; j++){
Z = gsl_rng_uniform(Q);
Z = norminv(Z);
S1 = S1 * exp(exponentielle + volatilite * Z);
S2 = S2 * exp(exponentielle - volatilite * Z);
if (S1 < strike) ITM[0][j - 1] = ITM[0][j - 1] + 1;
if (S2 < strike) ITM[0][j - 1] = ITM[0][j - 1] + 1;
S[(i - 1)* 2][j - 1] = S1;
S[(i - 1)* 2 + 1][j - 1] = S2;
}
}

// initialisation des vecteurs temps et cash-flow
for(i = 1; i <= ntraj; i++){
cashflow[i - 1][0] = nbexercice;
if(strike - S[i - 1][nbexercice - 1] > 0) cashflow[i - 1][1] = strike - S[i - 1][nbexercice - 1];
else cashflow[i - 1][1] = 0;
}
// on débute a l'avant derniere date
for(j = nbexercice; j <= 1 ;j--){
if ((ITM[0][nbexercice - (j + 1)]) > 0 ){
indice = (double **)malloc(((ITM[0][nbexercice - (j + 1)]) - 1)*sizeof(double));
for(e = 1; e <= ((ITM[0][nbexercice - (j + 1)]) - 1); e++){
indice[e] = (double *)malloc(0*sizeof(double));
}
K = 0;
sommeXY =0;
somme2 = 0;
sommeY = 0;
somme = 0;

//regression linéaire
for(i = 1; i <= ntraj; i++){
if (S[i - 1][nbexercice - (j + 1)] < strike){
indice[K][0] = i - 1;
ASJ = S[i - 1][nbexercice - (j + 1)];
detention = cashflow[i - 1][1] * exp( - r * dt * (cashflow[i - 1][0] - (nbexercice - (j + 1))));
sommeXY = sommeXY + ASJ * detention;
somme2 = somme2 + ASJ * ASJ;
sommeY = sommeY + detention;
somme = somme + ASJ;
K = K + 1;
}
}
beta2 = sommeXY / somme2;
beta1 = sommeY / K - beta2 * somme / K;
vchapeau = (double **)malloc((ITM[0][nbexercice - (j + 1)] - 1)*sizeof(double));
for(e = 0; e <= (ITM[0][nbexercice - (j + 1)] - 1); e++)
vchapeau[e] = (double *)malloc(0*sizeof(double));
// calcul des cash-flow
for(a = K; a <= 0; a--){
vchapeau[a][0] = beta1 + beta2 * S[(int) indice[a][0]][nbexercice - (j + 1)];
if ((strike - (S[(int)indice[a][0]][0]) - (nbexercice - (j + 1))) > 0 && (strike - (S[(int) indice[a][0]][0]) - (nbexercice - (j + 1))) > vchapeau[a][0] ){
cashflow[(int) indice[a][0]][0] = nbexercice - j;
cashflow[(int) indice[a][0]][1] = strike - S[(int) indice[a][0]][nbexercice - ( j + 1)];
}
}
}
}
somme = 0;
somme2 = 0;
// actualisation des cash-flow
for(i = 1; i <= ntraj; i++){
PutA = cashflow[i - 1][1] * exp ( - r * dt * cashflow[i - 1][0]);
somme = somme + PutA;
somme2 = somme2 + PutA * PutA;
}
prix = prix + somme / ntraj;
RM = RM + sqrt((somme2 / (ntraj - 1) - (somme * somme / ntraj) / ( ntraj - 1)) / (ntraj)); //variance
t1 = clock() - t1;
temps = temps + t1;
}
//temps = temps / 5;
prix = prix / 5;
RM = RM / 5; fprintf(longstaff, "PRIX %f RM %f\n ", prix,RM);

}
}
}
}
}

double norminv(double u) {

double A0,A1,A2,A3,A4;
double B0,B1,B2,B3,B4;
double x,y;
double v;

A0 =-0.322232431088;
A1 =-1;
A2 =-0.342242088547;
A3 =-0.0204231210245;
A4 =-0.0000453642210148;

B0 = 0.099348462606;
B1 = 0.588581570495;
B2 = 0.531103462366;
B3 = 0.10353775285;
B4 = 0.0038560700634;

v = u;

if (v > 0.5) v = 1 - u;

y = sqrt(-log(v*v));
x = y + (A0 + y*(A1 + y*(A2 + y*(A3 + y*A4))))/(B0 + y*(B1 + y*(B2 + y*(B3 + y*B4))));

if (u < 0.5) return -x;
else return x;
}

2 réponses

garslouche Messages postés 583 Date d'inscription mardi 26 novembre 2002 Statut Membre Dernière intervention 29 mai 2015 1
27 nov. 2003 à 09:00
Quelle erreur as-tu exactement ?
Dslé je ne peux pas compiler ton prog, je n'ai pas GSL.
Mais à vue de nez, je dirais que ton utilisation des pointeurs m'a l'air douteuse...

On ne force pas une curiosité, on l'éveille.
.................................................Daniel Pennac
0
cs_viagra Messages postés 2 Date d'inscription jeudi 27 novembre 2003 Statut Membre Dernière intervention 27 novembre 2003
27 nov. 2003 à 14:36
j'ai lu ton message, en fait mon probleme se pose au niveau de mes pointeurs sur tableau. essaie de voir si la structure utilisée est bonne.
Merci.
0
Rejoignez-nous