Dzięki, ale i tak coś jest na rzeczy jeśli chodzi o dokładności obliczeń.
Wywołuje taką funkcję na zmiennych double (próbowałem z extended, to samo).
W pliku Unit1.cpp mam taki wywowałnie:
double MetodaRombergaSimpsonaCalka_ds2(void)
{ MetodaSimpsona(&dlugosc_cos,Param.granica_dolna,Param.granica_gorna,Param.h0,Param.iloraz,epsx,Param.ilosc_iteracji_ekstrapolacji) ;
return MetodaSimpsona.MetodaRombergaSimpsona();}
eps=1e-10 - zadana dokładność obliczeń
max ilość iteracji = 50
h0 - początkowy krok w iteracji
a=0 - dolna granica
b=1e-1000 - BCB6 chodziło - górna granica
b=1e-10 XE4 dopiero chodzi (tj z 1e-1000 też chodzi, ale wywala błąd 2 wiadomości wyżej) - górna granica długosc_cos - wzór na długość odcinka, który chcę całkować
template <class Typ, class TypFun>
void TCalkowanie<Typ,TypFun>::operator()(TypFun F,Typ a,Typ b,Typ h0,Typ q,Typ eps, int maxit)
{
Fh0=h0; Fq=q; Feps=eps; Fmaxit=maxit;
FJestOsiagnietePrzyblizenie=false;
//Wyznacz błąd Maszynowy
Typ x; Fepsm=1;
do
{
Fepsm=Fepsm/2; x=Fepsm+1;
} while (x>1) ;
FA26=26.0*Fepsm;
Fa=a; Fb=b;
FTypWzoruCalkowego=0;
Fun=F;
}
Swoją drogą nie rozumiem, jak jest obliczana dokładność maszynowa Fepsm? Nie mniej to przechodzi, a wywala się tutaj:
//Metoda do ekstrapolacji procesu F(h) dla długości kroku h
//zmierzającego do zera dla znanej struktury wzoru na bład obcięcia
//F(h)-F(0) = a1*(h)^2+ a2*(h)^4+...gdzie współczyniki a1,a2,...
//w kolejnych krokach iteracji Richardsona są rugowane wzór (3.7)
//p - początkowa potęga ekstrapolacji jest parzysta np. 2,4,..
template <class Typ>
int TEkstrapolacjaIterowana<Typ>::EkstrapolacjaRichardsonaPotParzyste(int p)
{
int m,k,blad;
Typ h,qp2k,epsx,pk,hm,a1,a2;
bool CzyZaMalyKrok;
InicjacjaMacierzy(FA,1,1);
h=FF(Fh0);
FA[0][0]=h; FA[0][1]=0;
m=0; h=Fh0; FF0=0;
if (Fq>1)
{
do
{
m++;
h/=Fq;
InicjacjaMacierzy(FA,m,m);
hm=FF(h);
FA[m][0]=hm ; FA[m-1][m]=0;
k=0;
do
{
k++;
pk=2.0*(k-1)+p;
qp2k=powl(Fq,pk);
FA[m][k]=FA[m][k-1]+(FA[m][k-1]-FA[m-1][k-1])/(qp2k-1);
a1=FA[m][k]; a2=FA[m-1][k];
epsx=absy(a1-a2) ;
FJestOsiagnietePrzyblizenie=epsx<Feps;
} while (!(k==m || FJestOsiagnietePrzyblizenie ));
if (FJestOsiagnietePrzyblizenie)
{
pk=2.0*(k+1);
qp2k=powl(Fq,pk);
FF0=FA[m][k]+(FA[m][k]-FA[m-1][k])/(qp2k-1) ;
}
CzyZaMalyKrok=h<Fepsm ;
} while (!(CzyZaMalyKrok || FJestOsiagnietePrzyblizenie ||(m>Fmaxit)));
if (CzyZaMalyKrok) return 2;
else if (m>Fmaxit) return 4; else return 0;
} else return 1;
}//EkstrapolacjaRichardsonaPotParzyste
Konkrtenie jest spełnioy warunek:
XE4=BCB6 Fepsm=~ 1.11e-16
Czyli krok h schodzi poniżej dokładności maszynowej - tylko, że w BCB6 nigdy takich przypadków nie było.
W sumie zmniejszyłem Param.granica_gorna z 1e-1000 na 1e-10 i poszło. Teraz się zastanawiam, czy dlaczego mi działało w BCB6, skoro ustawiłem bład esp=1e-10 to czemu powyżej takiej dokładności znajdywało? Teraz wydaje się się mieć ręce i nogi.