funkcja gamma

0

Witam, mam problem z napisaniem programu obliczającego funkcję gamma.
Napisałam tak jak mi się wydaję jednak gdzieś jest błąd, bo program nie działa tak jak powinien. Może powinnam użyć innej pętli?
Proszę o pomoc, bądź jakiekolwiek wskazówki, bo naprawdę nie mam pojęcia co jest źle.
Tutaj jest link do tej funkcji.
http://upload.wikimedia.org/math/f/a/b/fab341984e209f5b84d38a3d3aa37ec3.png
Chodzi mi o program obliczający tą funkcję.

Ja zrobiłam tak.

#include <iostream>
#include <math.h>
#include <fstream>
int main()
{
int n;
double k = 0.5772156649;
double x,y;
std::ofstream plik ("program.txt", std :: ios :: app);
for(x=-10;x<=10; )
{
y=x*pow(M_E, k*x);
for(n=0; n<10000; n++)
{
y=y*((1+(x/n))*(pow(M_E,(-x/n))));
}
double z=1/y;
plik << x << "\t" << z << "\n";
x=x+1;
std::cout << x << "\n";
}
system("PAUSE");
return 0;
}
0

Albo źle czytam z wiki ale korzystać wzór na odwrotność a ten wyżej jest na funkcje gamma http://upload.wikimedia.org/math/f/1/7/f17c45d79bea17d4b81cc01cfb8ed2d1.png
Ale nie jestem pewien ;)

0

Aby numerycznie obliczyć przybliżenia tej funkcji stosuje się inne metody: http://en.wikipedia.org/wiki/Gamma_function#Approximations

Oczywiście możesz zastosować ten bezpośredni wzór (ten, który podał zidu89 w poście powyżej), tylko pamiętaj, że funkcja ta jest określona dla liczb zespolonych. Do ich obsługi masz w C++ std::complex.

Btw: w C99 i C++11 jest funkcja tgamma.

0

Ale lepiej jak najmniej się zapętlać ;p Lepsze są wzory bezpośrednie tak jak u kolegi wyżej ;) I fajnie gdybyś w kodzie używał inkrementacji bo x=x+1; to z takim kodem ludzie różnie odbierają ;) Dla mnie to be różnicy ;p

0

Zmieniłam program.
Jednak nie wiem jak mam zadeklarować ten ciąg?
Nie mogę policzyć z wzoru jaki podał zidu89,bo ćwiczeniowca kazał nam policzyć z tego wzoru co napisałam wyżej.
A nie umiem policzyć numerycznie wykorzystaniem metody podanej przez Endrju.

#include <iostream>
#include <math.h>
#include <fstream>

int main()
{
int n;
double k = 0.5772156649;
double x,y,z,c;
std::ofstream plik ("program.txt", std :: ios :: app);
for(z=-10;z<=10;z++)
{
y=z*(pow(M_E,(kz)))c;
for(n=1; n<10000; n++)
{
c=c
((1+(z/n)))
(pow(M_E,(-z/n)));
}
x=1/y;
plik << z << "\t" << x << "\n";
std::cout << z << "\t" << y << "\n";
}
system("PAUSE");
return 0;
}

0
double ..., c;
/* ... */
for(...)
{
    y=...*c; // <--- tutaj mnożysz przez niezainicjowaną zmienną 'c'
    for(...)
    {
        c=c*...; //  <--- dramat, myślisz że jak pomnożysz 'c' przez cośtam to automagicznie 'y' też będzie przemnożone? tak niestety nie będzie.

Wywal to 'c':

double ...;
/* ... */
for(...)
{
    y=...;
    for(...)
    {
        y=y*...;
edith91 napisał(a):

pow(M_E,...)
Do tego służy funkcja exp.

1 użytkowników online, w tym zalogowanych: 0, gości: 1