Gotowy algorytm liczący sumę matematyczną

ne0
2015-03-28 17:22
ne0

Rejestracja: 12 lat temu

Ostatnio: 1 rok temu

Lokalizacja: Kraków

0

Hej,

nie mogę nigdzie znaleźć gotowego algorytmu liczącego sumę matematyczną (to duże takie E jakby). Mógłby mi ktoś pokazać jak takie coś zaimplementować ?

Chodzi mi dokładnie o zaimplementowanie tego wzoru:Image and video hosting by TinyPic

Jeśli chodzi o silnie, te wszystkie potęgi, pierwiastki to z tym nie ma żadnego problemu, po prostu nie wiem co zrobić z tą sumą...:(

Dane:
K = 40
n = 235
p ("ro") = 5


Pomogłem? To dobrze :)
edytowany 4x, ostatnio: ne0, 2015-03-28 17:42
Wrzuć obrazek do załączników posta; - furious programming 2015-03-29 23:57

Pozostało 580 znaków

2015-03-28 17:27
Moderator

Rejestracja: 11 lat temu

Ostatnio: 1 rok temu

0

O takie \Sigma duże E Ci chodzi?


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
dokładnie tak - ne0 2015-03-28 17:28
To jest grecka litera sigma. - bogdans 2015-03-28 17:55

Pozostało 580 znaków

2015-03-28 18:00

Rejestracja: 10 lat temu

Ostatnio: 15 godzin temu

Lokalizacja: Redmond, WA

2

W sensie ze nie umiesz policzyc sumy? Sprobuj uzyc plusa


░█░█░█░█░█░█░█░█░█░█░█░

Pozostało 580 znaków

2015-03-28 18:00
Moderator

Rejestracja: 11 lat temu

Ostatnio: 1 rok temu

1
double suma = 1.0;
double skladnik = 1.0;
for(int n=1;n<K;n++)
{
    skladnik = skladnik*p/n;
    suma+=skladnik;
}

To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell

Pozostało 580 znaków

ne0
2015-03-28 20:06
ne0

Rejestracja: 12 lat temu

Ostatnio: 1 rok temu

Lokalizacja: Kraków

0

Dobra Panowie,
tak wygląda to co mam teraz:

 class Program
    {
        static void Main(string[] args)
        {
            var k = 40;
            var n = 235;
            var p = 5;

            // liczenie wzoru P(n)
            BigInteger pnLicznik = Potega(p,n);
            BigInteger pnMianownik = Potega(k, (n-k)) * Silnia(k) ;

            // liczenie wzoru P(0)
            //---prawa strona
            BigInteger pk = Potega(p, k);
            BigInteger silniaK = Silnia(k);                                      //liczenie K! z mianownika
            BigInteger nawias = new BigInteger(1 - (p/k));            //liczenie nawiasu po silni
            BigInteger prawaMianownik = silniaK*nawias;             //liczenie mianownika ułamka po prawej stronie "plusa" 
            BigInteger prawacalosc = pk/prawaMianownik;          //liczenia całej prawej strony "plusa"
            //---lewa strona
            BigInteger suma = Suma(k, p, n);

            BigInteger p0Mianownik = suma + prawacalosc;

            BigInteger p0Calosc = 1/(p0Mianownik);

            BigInteger wynik = (pnLicznik*p0Calosc)/pnMianownik;

            Console.WriteLine(wynik);

            Console.ReadKey();
        }

        static BigInteger Suma(int k, int p, int n)
        {
            BigInteger suma = new BigInteger();
            var fin = k - 1;
            for (int i = 1; i < fin; i++)
            {
                suma += Ulamek(Potega(p, i), Silnia(n));
            }

            return suma;
        }

        static BigInteger Potega(int podstawa, int wykladnik)
        {
            return BigInteger.Pow(podstawa, wykladnik);
        }

        static BigInteger Silnia(int k)
        {
            if (k < 1)
                return 1;
            else return k*Silnia(k - 1);
        }

        static BigInteger Ulamek(BigInteger licznik, BigInteger mianownik)
        {
            return BigInteger.Divide(licznik, mianownik);
        }

    }

Błąd polega na tym że jak we wzorze dla P(0) robię ten ostatni ułamek p/k to wychodzi mi tam double, a ponieważ operuję na BigInteger no to chyba coś tu się miesza - czy mógłbym prosić o wskazanie błędu?

[EDIT]
To co teraz spróbowałem pozmieniać to zamiast BigInteger użyć BigRational (http://bcl.codeplex.com/wikip[...]ional&referringTitle=Home) oraz dodatkowo wszystkie działania robić za pomocą funkcji w tym typie BigRational i teraz wygląda to tak:

 class Program
    {
        static void Main(string[] args)
        {
            var k = 40;
            var n = 235;
            var p = 5;

            // liczenie wzoru P(n)
         BigRational pnLicznik = BigRational.Pow(p, n);
            BigRational pnMianownik = BigRational.Pow(k, (n - k)) * Silnia(k);

            // liczenie wzoru P(0)
            //---prawa strona
            BigRational pk = Potega(p, k);
            BigRational silniaK = Silnia(k);
            BigRational nawias = (BigRational.Subtract(1, BigRational.Divide(p, k)));//new BigInteger(1 - (p/k));
            BigRational prawaMianownik = BigRational.Multiply(silniaK, nawias);
            BigRational prawaCalosc = BigRational.Divide(pk, prawaMianownik);
            //---lewa strona
            BigRational suma = Suma(k, p, n);

            BigRational p0Mianownik = suma + prawaCalosc;

            BigRational p0Calosc = 1 / (p0Mianownik);

            BigRational wynik = (pnLicznik * p0Calosc) / pnMianownik;

            Console.WriteLine(wynik);            
            Console.ReadKey();
        }

        static BigRational Suma(int k, int p, int n)
        {
            BigRational suma = new BigRational();
            var fin = k - 1;
            for (int i = 1; i < fin; i++)
            {
                suma += BigRational.Divide(BigRational.Pow(p, i), Silnia(n));
            }

            return suma;
        }

        static BigRational Potega(int podstawa, int wykladnik)
        {
            return BigRational.Pow(podstawa, wykladnik);
        }

        static BigRational Silnia(int k)
        {
            if (k < 1)
                return 1;
            else return BigRational.Multiply(k, Silnia(k - 1));// k*Silnia(k - 1);
        }

        static BigRational Ulamek(BigRational licznik, BigRational mianownik)
        {
            return BigRational.Divide(licznik, mianownik);
        }

    }

Niestety jednak dostaję błąd w funkcji Suma na linijce w pętli for: DevidedByZeroException :(

Takie NEWBIE a jednak jakoś nikt nie rozwiązuje...


Pomogłem? To dobrze :)
edytowany 7x, ostatnio: ne0, 2015-03-29 00:56
Nie rozumiem po co ci funkcje na ułamek i potęge,które korzystają z już istniejących funkcji robiących dokładnie to samo. - Riw 2015-03-29 13:58
Trochę chybiona uwaga, w tym programie nie jest potrzebna żadna funkcja potęgująca, ani biblioteczna, ani własna. - bogdans 2015-03-29 21:36

Pozostało 580 znaków

2015-03-29 09:27
Moderator

Rejestracja: 11 lat temu

Ostatnio: 1 rok temu

0

Nie chce mi się szukać błędów w głupio napisanym kodzie. Wzoruj się na moim kodzie i wyrzuć funkcje Silnia oraz Potega.


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell

Pozostało 580 znaków

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