mATh Studio - Soft - Mehedinti - 2006 Nationala

Maestre, primitiva functiei asteia nu poate fi exprimata doar cu functii elementare. Iti mai trebuie si niste functii speciale.



Prima data, ai functia erorilor (error function) erf(x)… care este primitiva lui e^(-x^2), inmultita cu 2/sqrt(pi)… bun… functia are limita -1 in -inf, limita 1 in inf… si trece prin 0.



Acuma raspunsul la intrebarea ta este functia erfi(x)=erf(i x)/i, unde i=sqrt(-1) :laughing: , mai precis primitiva lui e^(-x^2) e este sqrt(pi)/2*erfi(x).



Mai aveti intrebari?.. ca mai am raspunsuri.

:sunglasses:

exact raspunsul asta l-am gasit pe un site care-ti integreaza orice functie i-o dai (the integrator) :laughing:

Ce coincidenta…

Ia vezi daca gasesti si o metoda de evaluare a lui erf(x), cu precizie de cel putin 4 zecimale peste tot realul… :sunglasses:

http://publib.boulder.ibm.com/infocente ... lr/erf.htm


daca ma pui, iti fac un programel sa-ti calculeze erf in punctul x si cu 10 zecimale exacte

@admin: sorry ca am stricat layoutul site-ului, dar linkul ala e marisor :stuck_out_tongue:

Ma, sa le gasesti gata implementate in fortran e simplu… dar totusi… in C sau in delphi… cum evaluezi functia daca nu o ai gata-facuta? :laughing:



Fara suparare, dar nu pot sa refuz o provocare :wink:

mi se pare ca tu m-ai provocat pe mine :laughing:



later edit: integrala aia e o serie taylor: x - x^3/3 + x^5/52! - x^7/73! + … , iar de aici si pana la surse mai e un singur pas:

long double erf(long double x)

{

double suma=x,ics=x; //ics=termenul curent

int i=1;

do{

ics*=xx/i; suma-=ics/(2i+1); i++;

ics*=xx/i; suma+=ics/(2i+1); i++;

}while(fabs(ics/suma)>1E-20); //20 zecimale exacte :smiling_imp::

return 1.128379167095512574*suma; //2/radical(pi) = 1.1283…

}

ce zici ? :wink:

Provocarea este reciproca si benefica :wink:

Nu vreau sa starnim o discutie aprinsa pe forum pe o tema care nu e chiar relevanta… Sincer, as prefera s-o continuam la Galaciuc…

Deocamdata ma rezum la urmatoarele observatii:

0) N-ai scris bine… corect e x - x^3/3 + x^5/(52!) - x^7/(73!) + …

1) Seriile Taylor-Maclaurin sunt o metoda foarte proasta de a evalua functii speciale (mai ales pentru valori mari ale lui x)

2) Seriile Taylor-Maclaurin ale functiilor speciale sunt (in cel mai bun caz) foarte foarte greu convergente (adica ti-ar manca muuuult timp de executie) - asta daca nu sunt divergente.

3) Seriile Taylor-Maclaurin sunt convergente cel mult pe un domeniu/interval finit al argumentului (si de obicei, unul foarte mic)

4) Presupunand ca ar fi convergente au o precizie proasta si necesita foarte multe iteratii.





Ca sa nu ma lungesc… Incearca functia scrisa de tine pentru… sa zicem erf(51) … imi place mie numarul asta… sa-mi spui de cati termeni a fost nevoie si cat a durat evaluare functiei, pentru 5, nu pentru 20 de zecimale exacte.



Mai mult, tine cont… ca functia asta e cat-de-cat prietenoasa… adica pentru orice valoarea a lui x… pana la urma converge. Dar sunt clase de functii gen Lambert-W care sunt pur si simplu divergente (pentru un x>~0.4, la functia Lambert, daca nu ma insel), oricati termeni ai lua in considerare.



Cu permisiunea ta, continuam discutia asta la Galaciuc, unde iti voi spune si o metoda global-convergenta de evaluarea a acestei functii, cu eroare de maxim 10^-5 si cu timp de evaluare invariabil de ordinul de marime al parametrului (dureaza la fel de mult erf(23) cu erf(1777) ).



Pana atunci,

Toate bune.

merge bine pana la erf(5)=0.99999998190957706, insa erf(6)>1 :confused: cred ca pt x>6, trebuie calculat erf(x)=1-erfc(x). you were right. continuam la galaciuc :arrow_right: