J'ai déjà mis un poste la dessus sauf que dans cette version j'ai retiré tous les pointeurs et les CLASS, enfin tous les trucs lié à la pile qui pouvez, à mon sens causer sa, et bien non même erreur quand il doit me renvoyer le resultat de la fonction RI. Et pourtant cela compile sans problême. Perso je manque d'expérience sur ce genre de problême.
#include "iostream.h"
#include "math.h"
#define Tol 0.000000001
#define R 0.6180339 //golden section
#define C (1-R)
#define N 100 //max iter
#define Pi 3.14159
double RI(double a, double b, double alpha,double beta,double theta,double x,double eta);
double TR(double n, double a, double b, double alpha,double beta,double theta,double x,double eta);
double ff(double i, double alpha,double beta,double theta,double x,double eta);
double Ink(double R1,double R2,int k);
double Gsearch(double a, double b, double c, double alpha,double beta,double theta,double x,double eta);
double F(double x, double alpha, double beta);
int main()
{
cout << endl
<<F(1, 1.4, 0.5);
cout << endl;
return 0;
}
double F(double x, double alpha, double beta)
{
double eta, theta, c1, r1, r2, gg;
double MF;
theta=-beta*tan(Pi*alpha*0.5);
if(alpha==1){eta=Pi/2;}
else{eta=(1/alpha)*atan(-theta);}
if(alpha<1){c1=(1/Pi)*(Pi/2-eta);}
else{c1=1;}
if(alpha!=1 && x>theta)
{
gg=Gsearch(-eta,Pi/2,(Pi/2-eta)/2,alpha,beta,theta,x,eta);
r1=RI(-eta,gg,alpha,beta,theta,x,eta);
r2=RI(gg,Pi/2,alpha,beta,theta,x,eta);
MF=c1+(1/Pi)*fabs(1-alpha)/(1-alpha)*(r1+r2);
}
if(alpha!=1 && x==theta)
{
MF=(1/Pi)*(Pi/2-eta);
}
if(alpha!=1 && x<theta)
{
MF=1-F(-x,alpha,-beta);
}
if(alpha==1)
{
MF=999;
}
return MF;
}
double Gsearch(double a, double b, double c, double alpha,double beta,double theta,double x,double eta)
{
double f1, f2, x0, x1, x2, x3;
int n;
n=0;
x0=a;
x3=c;
if( fabs(c-b)>fabs(b-a) )
{
x1=b;
x2 = b + C * (c - b);
}
else
{
x2 = b;
x1 = b - C * (b - a);
}
f1 = ff(x1,alpha,beta,theta,x,eta);
f2 = ff(x2,alpha,beta,theta,x,eta);
while( fabs(x3-x0) > Tol*(fabs(x1)+fabs(x2)) || n == N)
{
if(f2 < f1)
{
x0 = x1;
x1 = x2;
x2 = R * x1 + C * x3;
f1 = f2;
f2 = ff(x2,alpha,beta,theta,x,eta);
}
else
{
x3 = x2;
x2 = x1;
x1 = R * x2 + C * x0;
f2 = f1;
f1 = ff(x1,alpha,beta,theta,x,eta);
}
n++;
}
if(f1 < f2){return x1;}
else{return x2;}
}
double RI(double a, double b, double alpha,double beta,double theta,double x,double eta)
{
const int MaxIter = 10;
double temp1;
double Mresult[MaxIter][MaxIter];
int n, k, i, m;
m = 0;
for(k=0;k<=MaxIter;k++)
{
n = static_cast<int>(pow(2,k));
if(n==1) {Mresult[m][0] = TR(n,a,b,alpha,beta,theta,x,eta);}
else {Mresult[m][0] = TR(n,a,b,alpha,beta,theta,x,eta);}
for(i=1;i<=k;i++)
{Mresult[m][i] = Ink(Mresult[m][i-1], Mresult[m - 1][i-1], i);}
temp1= fabs(Mresult[m-1][m-1] - Mresult[m][m]);
if(temp1<Tol && m>=2){k = 10;}
temp1= Mresult[m][m];
m++;
}
return temp1;
}
double TR(double n, double a, double b, double alpha,double beta,double theta,double x,double eta)
{
double i, temp, H;
temp=0;
H = (b - a) / n;
for(i=a; i<=b; i+=H)
{
if(i==a || i==b )
{temp +=ff(i, alpha,beta,theta,x,eta) / 2;}
else
{temp +=ff(i, alpha,beta,theta,x,eta);}
}
return temp * H;
}
double Ink(double R1,double R2,int k)
{
return (pow(4,k) * R1 - R2) / (pow(4,k) - 1);
}
double ff(double i, double alpha,double beta,double theta,double x,double eta)
{
double tt;
if(i!=eta)
{
tt=pow(cos(alpha * eta),1/(alpha-1));
tt*=pow(cos(i)/sin(alpha * (eta + i)),alpha/(alpha-1));
tt*=cos(alpha * eta + (alpha - 1) * i) / cos(i);
tt*=pow(x-theta, alpha/(alpha-1));
}
return -exp(-tt);
}
#undef Tol
#undef R
#undef C
#undef N
#undef Pi