Aplikacja zliczająca sumę szeregu.

0

Cześć!
Chciałbym się zwrócić do Was z prośbą o pomoc, ponieważ zauważyłem, że ostatnio pomogliście tutaj z podobnym problemem. Mam napisać aplikację zliczającą sumę szeregu, z dokładnością obliczeń 0<Eps<1 - jego wartość podaje użytkownik.
Mój szereg:
suma.png

do tej pory zapisałem to tak:

public static double jsObliczSzereg(double jsx, int jsilosc)
        {
            double jswynik = 0;

            for (int n = 1; n < jsilosc + 1; n++)
            {
                jswynik += Math.Pow(jsx, 2 * n + 1) / (2 * n + 1);
            }

            return 2 * jswynik;
        }

jednak jest to zła droga (zupełnie nie przydatna aby kodu użyć w dalszym projekcie).

Najlepiej jakby ogólny zapis programu wyglądał tak:

 static void SumaSzergu(float Esp, float x,out float suma,out int n)
        {
            float w;

            suma = 0.0f;

            w = 1.0f;

            n = 0;

            do
            {// liczenie:
                suma += w;
                n++;
                w *= 1 * x / n; //TUTAJ NALEZY WPISAC WZÓR REKURENCYJNY
            }
            while (Math.Abs(w)>Esp);
        } 

A niestety nie potrafię zapisać tego wzoru :/
Dzięki wielkie za pomoc!

0

Czemu pierwsza to zła droga, wydaje sie, że działa, pseudokod(nie znam C#):

bound = 300
eps = 0.0001
s = 0.0
x = 0.5
s0 = 0
s1 = 0
for n = 1 to bound:
    s0 = s
    s += (exp(x, (2 * n + 1))) / (2 * n + 1)
    s1 = s
    if abs(s1 - s0) <= eps:
        break

print(2 * s)

abs - wartość bezwzględna, rekurencja sprawdzi się słabo jak będzie za dużo iteracji i rozwali Ci stos. x bezpiecznie, żeby była zbieżność, dałem 0.5.

0

dwójkę wyciągnąłem z mianownika i skróciłem z tą z przed sumy :)

static void SumaSzergu(float Esp, float x,out float suma,out int n)
        {
            float w;
 
            suma = 0.0f;
 
            w = 1.0f;
 
            n = 0; 
            
            float x_do_dwa_razy_n_plus_jeden = x*x*x;            
 
            do
            {// liczenie:
                suma += w;
                n++;              
                w = (x_do_dwa_razy_n_plus_jeden / (n + 0.5f)); 
                
               x_do_dwa_razy_n_plus_jeden *= x * x;
              
            }
            while (Math.Abs(w)>Esp);
        }

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