[C#] Wyznaczanie sumy szeregu

zangiev79
Użytkownik
Użytkownik
Posty: 19
Rejestracja: 13 lis 2016, o 22:35
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 1 raz

[C#] Wyznaczanie sumy szeregu

Post autor: zangiev79 »

Prefix _mm to wymóg formalny zadania, wszystkie zmienne mają mieć prefix od inicjałów, to nie mój pomysł.

coś to nie działa tak jak powinno - np. dla x=1 i eps=0,6 obliczył \(\displaystyle{ + \infty , k=3}\). Ale dla jakiś nieco większych wartości x=5, Eps=0,005 program już stoi.

nic z tego nie rozumiem.

tu jest cały kod:
Ostatnio zmieniony 15 lis 2016, o 13:49 przez Afish, łącznie zmieniany 1 raz.
Powód: Poprawa wiadomości.
kalwi
Użytkownik
Użytkownik
Posty: 1931
Rejestracja: 29 maja 2009, o 11:58
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 145 razy
Pomógł: 320 razy

[C#] Wyznaczanie sumy szeregu

Post autor: kalwi »

zangiev79 pisze: np. dla x=1 i eps=0,6 obliczył \(\displaystyle{ + \infty , k=3}\)
Nieprawda



zangiev79 pisze:Ale dla jakiś nieco większych wartości x=5, Eps=0,005 program już stoi.
Nic dziwnego. Oblicz sobie parę pierwszych wyrazów tego szeregu dla takiego x'a. Poza tym spójrz na treść zadania
zangiev79
Użytkownik
Użytkownik
Posty: 19
Rejestracja: 13 lis 2016, o 22:35
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 1 raz

[C#] Wyznaczanie sumy szeregu

Post autor: zangiev79 »

Kalwi, chodzi Ci o ograniczenie \(\displaystyle{ x}\) należy do \(\displaystyle{ (-1,1)}\)?

Dodam takie ograniczenie w kodzie i powinno być lepiej.

Co do wyniku oczywiście masz rację, coś pozmieniałem :/
Ostatnio zmieniony 15 gru 2016, o 13:40 przez Afish, łącznie zmieniany 1 raz.
Powód: Całe wyrażenia matematyczne umieszczaj w tagach [latex] [/latex].
kalwi
Użytkownik
Użytkownik
Posty: 1931
Rejestracja: 29 maja 2009, o 11:58
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 145 razy
Pomógł: 320 razy

[C#] Wyznaczanie sumy szeregu

Post autor: kalwi »

Tak, dla xów spoza tego zakresu ten szereg jest rozbieżny, no, oprócz minus jedynki. Czyli jego składniki będą coraz bardziej rosnąć zamiast maleć, więc ten warunek z epsilonem nigdy nie zostanie spełniony
zangiev79
Użytkownik
Użytkownik
Posty: 19
Rejestracja: 13 lis 2016, o 22:35
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 1 raz

[C#] Wyznaczanie sumy szeregu

Post autor: zangiev79 »

Kalwi - wielkie dzięki za Twoją cierpliwość! Pochwała oczywiście przyznana.
zangiev79
Użytkownik
Użytkownik
Posty: 19
Rejestracja: 13 lis 2016, o 22:35
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 1 raz

[C#] Wyznaczanie sumy szeregu

Post autor: zangiev79 »

Cześć,

dostałem kolejną część tego zadania, z którą znów nie potrafię sobie poradzić. Założyłem osobny temat, niestety bez echa, więc aktem rozpaczy spróbuję pociągnąć to jeszcze w tym wątku:

Należy zbudować program formularzowy, który dla szeregu:

\(\displaystyle{ \sum_{ n=1}^{ \infty} \frac{ x^{n} }{n}\text{ dla }x \in (-1,1)}\)

będzie udostępniał:

1. wizualizację obliczonej wartości sumy szeregu \(\displaystyle{ f(x)}\) w punkcie \(\displaystyle{ X}\)
2. tabelaryczną wizualizację wartości sumy szeregu \(\displaystyle{ F(X)}\) przy zmianie wartości zmiennej niezależnej \(\displaystyle{ X}\) z krokiem \(\displaystyle{ h}\) w przedziale \(\displaystyle{ [X_d, X_g]}\)

Mamy takie zmienne:
1. Zmienna niezależna \(\displaystyle{ X}\), do podania przez użytkownika
2. Dolna granica przedziału \(\displaystyle{ X_d}\) - do podania przez użytkownika
3. Górna granica przedziału \(\displaystyle{ X_g}\) - do podania przez użytkownika
3. Krok (przyrost) zmian wartości zmiennej niezależnej \(\displaystyle{ X}\) - do podania przez użytkownika.

Wcześniej liczyłem sumę tego szeregu z zadanym przybliżeniem \(\displaystyle{ Eps}\) takim wzorem:

Kod: Zaznacz cały

do
            {
                mm_a = (float)Math.Pow(mm_x, mm_k) / mm_k;
                mm_SumaSzeregu += mm_a;
                ++mm_k;
            }
            while (Math.Abs(mm_a) > mm_Eps);
Ale nie bardzo wiem jak to ugryźć teraz.
Jak obliczyć sumę szeregu w punkcie?
Ten zakres dolny i górny to rozumiem jest zdefiniowany przez użytkownika dowolny zakres dla \(\displaystyle{ X}\)?
Ten krok to może być po prostu przyrost dla \(\displaystyle{ X-a}\)?
Co ze zmienną \(\displaystyle{ n}\)?

Będę wdzięczny za wszystkie sugestie.

Pozdrawiam
Marcin
Ostatnio zmieniony 6 gru 2016, o 07:59 przez Afish, łącznie zmieniany 1 raz.
Powód: Poprawa wiadomości.
kalwi
Użytkownik
Użytkownik
Posty: 1931
Rejestracja: 29 maja 2009, o 11:58
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 145 razy
Pomógł: 320 razy

[C#] Wyznaczanie sumy szeregu

Post autor: kalwi »

Tekst umieszcza się w

Kod: Zaznacz cały

	ext{dla}
Jak chcesz zrobić znak spacji to po ostatnim znaku

Kod: Zaznacz cały

 frac{x^n}{n}   	ext{dla}
\(\displaystyle{ \sum_{ n=1}^{ \infty} \frac{ x^{n} }{n} \ \text{dla } x \in (-1,1)}\)
Jak obliczyć sumę szeregu w punkcie?
To jest dokładnie to co miałeś do policzenia w poprzedniej wersji tego zadania

\(\displaystyle{ f(x)=\sum_{ n=1}^{ \infty} \frac{ x^{n} }{n} \ \text{dla } x \in (-1,1)}\)

Nanosząc poprawki z nowymi oznaczeniami

\(\displaystyle{ f(X)=\sum_{ n=1}^{ \infty} \frac{ X^{n} }{n} \ \text{dla } X \in (-1,1)}\)

Ja to zadanie widzę w taki sposób:
- użytkownik podaje \(\displaystyle{ X}\)
- użytkownik podaje \(\displaystyle{ X_d}\)
- użytkownik podaje \(\displaystyle{ X_g}\)
- \(\displaystyle{ X,X_d,X_g \ \in \left( -1;1\right)}\)
- \(\displaystyle{ X_d < X_g}\)
- użytkownik podaje krok \(\displaystyle{ h}\), no i powiedzmy, że niech \(\displaystyle{ h\in\left( 0;0.1\right)}\), aczkolwiek to by było do dogadania z prowadzącym
- taki kod się wykona:

Kod: Zaznacz cały

double temp = X_d;
for(double temp = X_d; temp < X_g + h; temp += h)
     wywolaj funkcje liczaca(temp);
no i wynikiem powinna być tabelka w takim stylu

\(\displaystyle{ \begin{array}{|r|c|c|c|c|c|c|c|c|l|}
\hline
x & X_d &X_d+h & X_d+2h & \dots & X & \dots & X_g-2h & X_g-h & X_g \\ \hline
f(x) & f(X_d) & f(X_d+h) & f(X_d+2h) & \dots & f(X) & \dots & f(X_g-2h) & f(X_g-h) & f(X_g) \\ \hline
\end{tabular}}\)


i fajnie to by było zobrazować na wykresie, aczkolwiek w C# nigdy nie programowałem (ale chyba dosyć łatwo w tym języku coś takiego zrobić)
zangiev79
Użytkownik
Użytkownik
Posty: 19
Rejestracja: 13 lis 2016, o 22:35
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 1 raz

[C#] Wyznaczanie sumy szeregu

Post autor: zangiev79 »

Cześć, nie do końca jeszcze rozumiem co z tym \(\displaystyle{ n}\). Czy ono jest 1? Jeśli tak to \(\displaystyle{ f(x) = X}\).

I rozumiem, że jak liczymy w punkcie to dokładność nas nie interesuje, wiec nie będziemy mieli żadnego \(\displaystyle{ Eps}\).

Czy to może być jak poniżej?

Kod: Zaznacz cały


            float X, Xd, Xg, h, a, temp;
            int n = 1;

            SumaSzeregu = 0;

            for(float temp = X_d; temp < X_g + h; temp += h)
            {
                a = (float)Math.Pow(X, n) / n;
                SumaSzeregu = a;
             }

Czy jest zupełnie inaczej i z tym \(\displaystyle{ n}\) to dążymy od 1 do +nieskończoności i obliczenia musimy robić w pętli, aż osiągniemy jakąś założoną dokładność?
kalwi
Użytkownik
Użytkownik
Posty: 1931
Rejestracja: 29 maja 2009, o 11:58
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 145 razy
Pomógł: 320 razy

[C#] Wyznaczanie sumy szeregu

Post autor: kalwi »

To drugie
jest zupełnie inaczej i z tym n to dążymy od 1 do +nieskończoności i obliczenia musimy robić w pętli, aż osiągniemy jakąś założoną dokładność
Poza tym wydaje mi się, że nie rozumiesz polecenia (patrząc na ten kod).

Masz np. na dzień dobry
\(\displaystyle{ X= 0.5 \\
X_D=-0.1 \\
X_G=0.9}\)


oraz krok \(\displaystyle{ h=0.1}\)

no i teraz musisz wywołać tę funkcję stąd:
kalwi pisze:
zangiev79 pisze: np. dla x=1 i eps=0,6 obliczył \(\displaystyle{ + \infty , k=3}\)
Nieprawda



zangiev79 pisze:Ale dla jakiś nieco większych wartości x=5, Eps=0,005 program już stoi.
Nic dziwnego. Oblicz sobie parę pierwszych wyrazów tego szeregu dla takiego x'a. Poza tym spójrz na treść zadania
Dla następujących wartości:

Kod: Zaznacz cały

funkcja(-0.1);
funkcja(0.0)
funkcja(0.1)
...
funkcja(0.9)
a na wyjściu masz dostać mniej więcej coś takiego:

Kod: Zaznacz cały

wartość sumy w punkcie -0.1: -0.095
wartość sumy w punkcie 0.0: 0
wartość sumy w punkcie 0.1: 0.105
...
wartość sumy w punkcie 0.9: 2.303
zangiev79
Użytkownik
Użytkownik
Posty: 19
Rejestracja: 13 lis 2016, o 22:35
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 1 raz

[C#] Wyznaczanie sumy szeregu

Post autor: zangiev79 »

Wydaje się, że "na głowę" rozumiem:

1. pobrać dane
2 obliczyć wartość szeregu w punkcie X wg:

Kod: Zaznacz cały


            float mm_a;
            int mm_k = 1;
 
            mm_SumaSzeregu = 0;
            do
            {
                mm_a = (float)Math.Pow(mm_x, mm_k) / mm_k;
                mm_SumaSzeregu += mm_a;
                ++mm_k;
            }
            while (Math.Abs(mm_a) > mm_Eps);
            

oczywiście nazwy zmiennych muszą się zmienić na te ustalone wcześniej.

3. To wszystko wsadzić w pętlę 'for' i wykonywać aż podbijanie \(\displaystyle{ X-ów}\) o \(\displaystyle{ h}\) osiągnie \(\displaystyle{ Xg}\).
4. Wsadzić wynik do tabelki (kolejne wyzwanie).
5. Zaprezentować na wykresie (jak będzie tabelka to zrobi się pewnie i wykres).

Pytania:

1. Nic w zadaniu nie ma o \(\displaystyle{ Eps}\) - należy je na sztywno ustawić w kodzie? Inaczej ta pętla 'do' nie będzie działać.
2. jak do \(\displaystyle{ X}\) ma się \(\displaystyle{ Xd}\)? Po co ono jest skoro idziemy od \(\displaystyle{ X}\) do \(\displaystyle{ Xg}\)? A przynajmniej ja to tak rozumiem.

Pozdrawiam
kalwi
Użytkownik
Użytkownik
Posty: 1931
Rejestracja: 29 maja 2009, o 11:58
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 145 razy
Pomógł: 320 razy

[C#] Wyznaczanie sumy szeregu

Post autor: kalwi »

1. Tak, ustawiasz na sztywno w kodzie, tak jak poprzednim razem.
2. Nie, idziemy od \(\displaystyle{ X_d}\) do \(\displaystyle{ X_g}\), a \(\displaystyle{ X}\) jest gdzieś pomiędzy tymi dwiema wartościami. Na początek masz znaleźć wartość sumy dla \(\displaystyle{ X}\), a następnie dla iluś tam punktów w otoczeniu \(\displaystyle{ X}\), przy tym za otoczenie rozumiem przedział \(\displaystyle{ \left\langle X_d;X_g\right\rangle}\)
Tak by to wyglądało w C++:

Kod: Zaznacz cały

#include <iostream>
#include <cmath>
#include <iomanip> 

void obliczSume(double);

int main()
{
	double Xd = -0.33;
	double Xg = 0.77;
	double X = 0.11;
	double h = 0.07;

	std::cout << std::setprecision(2) << std::fixed;
	std::cout << "Wartosc sumy dla X = " << X << std::endl;
	obliczSume(X);

	std::cout << std::endl << "Wartosc sumy w otoczeniu X = " << X << ":" << std::endl << std::endl;

	for(double i = Xd; i < Xg; i += h)
		obliczSume(i);
	obliczSume(Xg);

	return 0;
}

void obliczSume(double x)
{
	double eps = 0.000001;		// ustawiam na sztywno
	double skladnik;
	double suma = 0;
	unsigned k = 1;
	if(std::abs(x) < eps)
	{
		std::cout << "Suma dla x = 0 jest rowna: 0" << std::endl;
		return;
	}

	do
	{
		skladnik = pow(x, k) / k;
		suma += skladnik; 
		++k;
	}
	while(std::abs(skladnik) > eps);
	std::cout << std::setprecision(2) << std::fixed;
	std::cout << "Suma dla x = " << x << " jest rowna: " << suma << std::endl;
}
I output:

Kod: Zaznacz cały

Wartosc sumy dla X = 0.11
Suma dla x = 0.11 jest rowna: 0.12

Wartosc sumy w otoczeniu X = 0.11:

Suma dla x = -0.33 jest rowna: -0.29
Suma dla x = -0.26 jest rowna: -0.23
Suma dla x = -0.19 jest rowna: -0.17
Suma dla x = -0.12 jest rowna: -0.11
Suma dla x = -0.05 jest rowna: -0.05
Suma dla x = 0.02 jest rowna: 0.02
Suma dla x = 0.09 jest rowna: 0.09
Suma dla x = 0.16 jest rowna: 0.17
Suma dla x = 0.23 jest rowna: 0.26
Suma dla x = 0.30 jest rowna: 0.36
Suma dla x = 0.37 jest rowna: 0.46
Suma dla x = 0.44 jest rowna: 0.58
Suma dla x = 0.51 jest rowna: 0.71
Suma dla x = 0.58 jest rowna: 0.87
Suma dla x = 0.65 jest rowna: 1.05
Suma dla x = 0.72 jest rowna: 1.27
Suma dla x = 0.77 jest rowna: 1.47
zangiev79
Użytkownik
Użytkownik
Posty: 19
Rejestracja: 13 lis 2016, o 22:35
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 1 raz

[C#] Wyznaczanie sumy szeregu

Post autor: zangiev79 »

Kalwi,

przede mną dużo dłuższa droga, niż myślałem :/. Starałem się przetłumaczyć Twój kod z C++ na C#, ale jest problem z deklaracją i wywołaniem metody. Próbowałem kopać na 4programmers, ale niewiele pomogło. Co robię źle?

Kod: Zaznacz cały

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace tmp_doprojektu_3
{
    class Program
    {
        static void Main(string[] args)
        {

            double Xd = -0.33;
            double Xg = 0.77;
            double X = 0.11;
            double h = 0.07;
            double sumaSzeregu = 0.0f;

            Console.WriteLine ("wartość sumy dla X = ");

            obliczSume(Xd, Xg, X, h, out sumaSzeregu);

            Console.WriteLine("Wartosc sumy w otoczeniu X = ", X);

            for (double i = Xd; i < Xg; i += h)
                //obliczSume(double Xd, double Xg, double X, double h, out double i);
                obliczSume(Xd, Xg, X, h, out suma); 

            return;



        }

        void obliczSume(double Xd, double Xg, double X, double h, out double suma)
        {
            double eps = 0.000001;
            double skladnik = 0;
            double suma = 0;
            int k = 1;
            if (Math.Abs(suma) > eps)

            {
                Console.WriteLine("Suma dla x = 0 jest rowna: 0");
                return;
            }

            do
            {
                skladnik = Math.Pow(X, k) / k;
                suma += skladnik;
                ++k;
            }
            while (Math.Abs(skladnik) > eps); 
            //std::cout << std::setprecision(2) << std::fixed;
            Console.WriteLine("Suma dla x = ", X);
            Console.WriteLine("Jest rowna", suma);

        }


    }
}

kalwi
Użytkownik
Użytkownik
Posty: 1931
Rejestracja: 29 maja 2009, o 11:58
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 145 razy
Pomógł: 320 razy

[C#] Wyznaczanie sumy szeregu

Post autor: kalwi »

To setprecision u mnie w kodzie to jest po prostu wyświetlenie dwóch miejsc po przecinku w konsoli
Co robię źle?
Porównaj sobie

Kod: Zaznacz cały

       void obliczSume(double Xd, double Xg, double X, double h, out double suma)
        {
            double eps = 0.000001;
            double skladnik = 0;
            double suma = 0;
            int k = 1;
            if (Math.Abs(suma) > eps)

            {
                Console.WriteLine("Suma dla x = 0 jest rowna: 0");
                return;
            }

            do
            {
                skladnik = Math.Pow(X, k) / k;
                suma += skladnik;
                ++k;
            }
            while (Math.Abs(skladnik) > eps); 
            //std::cout << std::setprecision(2) << std::fixed;
            Console.WriteLine("Suma dla x = ", X);
            Console.WriteLine("Jest rowna", suma);

        }
z

Kod: Zaznacz cały

 void obliczSume(double x)
{
   double eps = 0.000001;      // ustawiam na sztywno
   double skladnik;
   double suma = 0;
   unsigned k = 1;
   if(std::abs(x) < eps)
   {
      std::cout << "Suma dla x = 0 jest rowna: 0" << std::endl;
      return;
   }

   do
   {
      skladnik = pow(x, k) / k;
      suma += skladnik; 
      ++k;
   }
   while(std::abs(skladnik) > eps);
   std::cout << std::setprecision(2) << std::fixed;
   std::cout << "Suma dla x = " << x << " jest rowna: " << suma << std::endl;
}
Szczególnie chodzi mi o przyjmowane argumenty funkcji...
zangiev79
Użytkownik
Użytkownik
Posty: 19
Rejestracja: 13 lis 2016, o 22:35
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 1 raz

[C#] Wyznaczanie sumy szeregu

Post autor: zangiev79 »

Kalwi, na to wpadłem już w międzyczasie, skróciłem ilość parametrów, ale czy w metodzie void nie musi być oznaczony parametr, który zostanie zwrócony przez out? Kod mam taki jak poniżej, ale przy metodzie pojawia się błąd: an object reference is required for the nonstatic field method or property.

Kod: Zaznacz cały

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace tmp_doprojektu_3
{
    class Program
    {
        static void Main(string[] args)
        {
            double Xd = -0.33;
            double Xg = 0.77;
            double X = 0.11;
            double h = 0.07;
            double suma = 0.0f;
            Console.WriteLine ("wartość sumy dla X = ");
            obliczSume(X);
            Console.WriteLine("Wartosc sumy w otoczeniu X = ", X);

            for (double i = Xd; i < Xg; i += h)
                //obliczSume(double Xd, double Xg, double X, double h, out double i);
                obliczSume(X); 

            return;
        }

        void obliczSume(double X)
        {
            double eps = 0.000001;
            double skladnik = 0;
            double suma = 0;
            int k = 1;
            if (Math.Abs(suma) > eps)

            {
                Console.WriteLine("Suma dla x = 0 jest rowna: 0");
                return;
            }
            do
            {
                skladnik = Math.Pow(X, k) / k;
                suma += skladnik;
                ++k;
            }
            while (Math.Abs(skladnik) > eps); 
            //std::cout << std::setprecision(2) << std::fixed;
            Console.WriteLine("Suma dla x = ", X);
            Console.WriteLine("Jest rowna", suma);
        }
    }
}

kalwi
Użytkownik
Użytkownik
Posty: 1931
Rejestracja: 29 maja 2009, o 11:58
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 145 razy
Pomógł: 320 razy

[C#] Wyznaczanie sumy szeregu

Post autor: kalwi »

ale czy w metodzie void nie musi być oznaczony parametr, który zostanie zwrócony przez out?
Cały myk polega na tym, że zwracany jest typ void. out nie zwraca, tylko jest referencją, a to co innego.
ale przy metodzie pojawia się błąd: an object reference is required for the nonstatic field method or property
Bo nie wiesz jak działają metody w C#. Dodaj słowo "static" przed void obliczSume(...).
Tak czy siak nadal jest parę błędów
ODPOWIEDZ