logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[c] C: Program do obliczania i rysowania wykresu całki dowolnego wielomianu z wejścia

słomka 19 Kwi 2010 21:24 5555 7
REKLAMA
  • #1 7980865
    słomka
    Poziom 2  
    Posty: 3
    Witam!
    Potrzebuje pomocy w napisaniu programu który bedzie obliczał całkę dowolnego wielomianu wczytanego z klawiatury i na koniec jeszcze ma rysować jego wykres. Nie potrafie programować, i bardzo przydała by mi się pomoc nie oczekuję gotowego programu ale jakieś naprowadzenie, odpowiedz na ewentualne pytania. Bardzo mi na tym zależy.

    A więc tak:
    Napisałam już część w której program sie pyta o stopień wielomianu, a następnie o współczynniki przy każdym wyrazie:
    
    #include <stdio.h>
    #include <math.h>
    float mfun(float x);
    int main ()
    {
    const int NMAX=100;
    int st, i;
    float a, b, N, abc[NMAX];
    
    printf("Podaj stopień wielomianu:\n", NMAX );
    scanf ("%d", &st);
    
    for (i=0; i<stopien; i++)
    {
    printf("Podaj współczynnik przy %d wyrazie (od wyrazu z największym wspilczynnikiem do najmniejszego)", i);
    scanf("%f", &abc[i]);
    }
    return 0;
    }


    mógł by mnie ktoś naprowadzić, pomóc co mam zrobić żeby ten program mi najpierw pokazywał tą całkę a później ją liczył. Ja nie mam pomysłu co tu użyć. BBardzo proszę o pomoc. Pozdrawiam
  • REKLAMA
  • Pomocny post
    #2 7981579
    GSM
    Poziom 25  
    Posty: 543
    Pomógł: 72
    Ocena: 16
    Witam,

    a całkować umiemy?
    Całkę nieoznaczoną z wielomianu możemy rozbić na sumę całek jednomianów.
    A jednomian umiemy przecież całkować:
    $$\int a_nx^n = \frac{a_n}{n+1}x^{n+1} + C$$
    Stąd też znając (podane przez użytkownika) współczynniki wszystkich jednomianów możemy każdy po kolei (w pętli) w ten sposób scałkować, wynik zapisać do nowej (lub tej samej tablicy nawet) a potem wyświetlić.
    Obliczanie wartości (w celu narysowania później) też wykonujemy w pętli.

    Pozdrawiam,
    GSM
  • REKLAMA
  • #3 7981702
    słomka
    Poziom 2  
    Posty: 3
    całkować umiemy :)) dzięki za pomoc ale ja nadal nie za bardzo wiem jak to zapisać żeby program wiedział że pierwszy wyraz ma potęgę p. 3 itd. Naisałam dalej coś takiego.

    #include <stdio.h>
    #include <math.h>
    int main ()
    {
        const int NMAX=100;
        int stopien, i, x;
        float a, b, N, abc[NMAX], calka[NMAX], pot[NMAX], wolny, znak[NMAX];
        
        printf("Podaj ilość wyrazów wielomianu:\n", NMAX );
        scanf ("%d", &stopien);
              
        for (i=0; i<stopien; i++)
        {
            printf("Podaj potege %d wyrazu", i);
            scanf("%f", &pot[i]);
                    
            printf("Podaj współczynnik przy %d wyrazie", i);
            scanf("%f", &abc[i]);
                           
            printf("Podaj znak przy %d wyrazie:", i);
            scanf("%f", &znak[i]);
        }
        
        printf("Podaj gorna granice funkcji:");
        scanf("%f", &a);
        
        printf("Podaj dolna granice funkcji:");
        scanf("%f", &b);
                
        for (i=0; i<stopien; i++)
        {
            calka[i]+=(abc[i]/(pot[i]+1))*pow(a, (pot[i]+1))+(abc[i]/(pot[i]+1))*pow(b, (pot[i]+1));
        }
        for (i=0; i<stopien; i++)
        {
            printf("calka z %d jednomianu wynosi: %f", i);
            scanf("%f", &calka[i]);
        }
            
               
             return 0;
    }


    tylko że to nie działa i jak byś mógł mi to poprawić i wytłumaczyć była bym wdzięczna :))

    Proszę pamiętać o znacznikach [code] - dodałem.
    [Dr.Vee]
  • #4 7981742
    GSM
    Poziom 25  
    Posty: 543
    Pomógł: 72
    Ocena: 16
    Program dokonuje niejako symbolicznych obliczeń, stąd też takie podejście nie wiem do czego miało doprowadzić:
    słomka napisał:
    calka[i]+=(abc[i]/(pot[i]+1))*pow(a, (pot[i]+1))+(abc[i]/(pot[i]+1))*pow(b, (pot[i]+1));

    Operujemy tylko na współczynnikach i wartościach wykładnika przy zmiennej jednomianów, a funkcja pow() oblicza potęgę jakiejś liczby - my działamy na liczbach ogólnych.


    
    #include <stdio.h>
    #include <math.h>
    
    #define NMAX 100  // maxymalna ilosc jednomianow
    
    int main ()
    {
      // deklaracja zmiennych
      float wej_wspolczynniki[NMAX], wej_wykladniki[NMAX]; // tablice do przechowywania zadanego wielomianu
      float wyj_wspolczynniki[NMAX], wyj_wykladniki[NMAX]; // tablice do przechowywania calki zadanego wielomianu
      unsigned int ilosc_jednomianow;
      int n;
    
      // wprowadzanie danych
      printf("Podaj ilość wyrazów wielomianu: ");
      scanf ("%d", &ilosc_jednomianow);
    
      for(n=0; n<ilosc_jednomianow; n++)
      {
        printf("Podaj współczynnik przy %d wyrazie: ", i);
        scanf("%f", &wej_wspolczynniki[i]);
    
        printf("Podaj potege %d wyrazu: ", i);
        scanf("%f", &wej_wykladniki[i]);
      }
    
      // wyswietlenie wprowadzonego wielomianu
      printf("Wprowadzony wielomian to:\nf(x) = ");
      for(n=0; n<ilosc_jednomianow; n++)
      {
        printf("%+5.2f*x^%5.2f ",wej_wspolczynniki[i], wej_wykladniki[i]);
      }
      purchar("\n");
    
      // calkowanie
      for(n=0; n<ilosc_jednomianow; n++)
      {
        wyj_wspolczynniki[i] = wej_wspolczynniki[i]/(n+1); // wspolcyznnik bez zmian
        wyj_wykladniki[i] = wej_wykladniki[i]+1;
      }
    
      // wyswietlenie calki wprowadzonego wielomianu
      printf("Calka wprowadzonego wielomianu to:\nF(x) = ");
      for(n=0; n<ilosc_jednomianow; n++)
      {
        printf("%+5.2f*x^%5.2f ",wyj_wspolczynniki[i], wyj_wykladniki[i]);
      }
      printf(" +C\n");
    
      return 0;
    }
    


    Samo obliczanie wartości tak zapisanego w pamięci wielomianu dla jakiejś wartości zmiennej wyglądałoby mniej więcej tak:
    
    // obliczanie wartosci 
    float x = 7.2f; // wartosc zmiennej dla ktorej obliczamy wartosc wielomianu
    float y = 0.0f; // zmienna do rpzechowywania wyniku
    for(n=0; n<ilosc_jednomianow; n++)
    {
      y += wspolczynniki[i] * pow(x, wykladniki[i]);
    }
    printf("Wartosc wielomianu dla x='%5.2f' jest rowna: %5.2f\n", x, y);
    


    Dobrą praktyką jest częste stosowanie komentarzy, pomaga to potem w czytaniu kodu. Warto także stosować wcięcia (kolejne bloki w sobie zagnieżdżone są coraz bardziej wcięte), rozjaśnia to bardzo kod dzięki czemu jest czytelniejszy.
    Co do samego całkowania, to korzystamy dokładnie ze wzoru na całkę jednomianu.
    Nie jestem też pewien co chce koleżanka policzyć w końcu, całkę nieoznaczoną czy oznaczoną. Oznaczoną można by liczyć metodami numerycznymi, lub pierw (tak jak w tym przypadku) obliczyć całkę nieoznaczoną, a następnie różnicę wartości funkcji pierwotnej dla określonych granic całkowania.

    Pozdrawiam,
    GSM

    P.S. kod jest poprawiony jedynie i trochę zmieniony dla ułatwienia jego zrozumienia, nie był testowany.
  • REKLAMA
  • #5 7981743
    Dr.Vee
    VIP Zasłużony dla elektroda
    Posty: 1784
    Pomógł: 307
    Ocena: 76
    1) Z tego co pamiętam, to wartość całki oznaczonej się liczy inaczej:$$\int_a^b{x^n} = \frac{b^{n+1} - a^{n+1}}{n+1}$$
    2) Nie pytaj o ilość wyrazów, tylko o stopień K wielomianu. Wtedy możesz pytać o kolejne współczynniki przy wyrazach od x^K do x^0.
    3) Po co Ci tablica calka[]? Wystarczy jedna zmienna do sumowania. No i musisz ją zainicjalizować na 0 przed rozpoczęciem sumowania (a Ty nie inicjalizujesz wartości w tablicy calka[]).
    4) Po co pytasz o ZNAK - przecież użytkownik może podać współczynnik ujemny. I tak tego znaku nie używasz.

    Pozdrawiam,
    Dr.Vee
  • REKLAMA
  • #6 7981749
    Xitami
    Poziom 29  
    Posty: 1130
    Pomógł: 118
    Ocena: 31
    #include <stdio.h> 
    #include <math.h> 
    
    float wartosc(float x, int stopien, float a[]){ // przyda się do rysowania
    	float result=a[stopien]; int i;
    	for(i=stopien-1; i>=0; i--) 
    		result = result * x + a[i];
    	return result;
    }
    
    float calka(float x, int stopien, float a[]){
    	float result=0; int i;
    	for(i=stopien; i>=0; i--) 
    		result = result * x + a[i]/(i+1);
    	return result;
    }
    
    int main () { 
    	const int NMAX=100; 
    	int stopien, i; 
    	float a, b, abc[NMAX];
    	
    	printf("Podaj ilość wyrazów wielomianu:\n", NMAX ); 
    	scanf ("%d", &stopien);                         // wyrazów jest stopień+1
    
    	for (i=0; i<=stopien; i++) { 
    		printf(" x^%2d > ",i);		scanf("%f", &abc[i]); 
    	} 
    
    	printf("Podaj gorna granice funkcji:"); 	scanf("%f", &a); 
    	printf("Podaj dolna granice funkcji:"); 	scanf("%f", &b); 
    
    	for(i=stopien;i>=0;i--)
    		printf("%0.3fx^%d + ",abc[i], i);
    	printf("\b\n");
    	printf("%0.3f <= x <= %0.3f\n", a, b);
    	
    	for(i=stopien;i>=0;i--)
    		printf("%0.3fx^%d + ", abc[i]/(i+1), i+1);
    	printf("\b + C\n");
    	
    	printf("%f\n", calka(b, stopien, abc[]) - calka(a, stopien, abc[])
    	
    	while(1); 
    } 
    

    nie testowane
  • #7 7983345
    wrych
    Poziom 20  
    Posty: 279
    Pomógł: 37
    Ocena: 22
    Według słownika matematycznego (stara dobra książka):
    Między całką oznaczoną funkcji ciągłej f(x) a jej funkcją pierwotną F(x) (-> całka nieoznaczona) zachodzi zależność:
    [c] C: Program do obliczania i rysowania wykresu całki dowolnego wielomianu z wejścia

    Wielomian jest funkcją ciągłą. Jeśli f(x) jest wielomianem stopnia n o współczynnikach a[0], a[1], a[2], ..., a[n], to funkcja pierwotna F(x) jest wielomianem stopnia n+1 o współczynnikach b[0]=c (dowolna stała), b[1]=a[0]/1, b[2]=a[1]/2, b[3]=a[2]/3, ..., b[n]=a[n-1]/n, b[n+1]=a[n]/(n+1).
    Należy zatem wczytać współczynniki a[i] dla i=0 do n, obliczyć współczynniki b[i] dla i=0 do n+1, zastosować schemat Hornera (to może się przydać!) do oblicznia wartości wielomianu F(x), a policzenie całki oznaczonej równej F(b) - F(a) to już "Pan Pikuś"...
  • #8 7987958
    słomka
    Poziom 2  
    Posty: 3
    Niestety wykładowca kazał obliczyć całkę za pomocą metod numerycznych, ale dzięki za pomoc, już sobie z tym poradziłam, jeszcze raz wielkie dzięki za chęci i cierpliwość do moich zdolności.
    Pozdrawiam, słomka

Podsumowanie tematu

✨ Użytkownik poszukuje pomocy w napisaniu programu do obliczania całki dowolnego wielomianu oraz rysowania jego wykresu. Wstępnie zaimplementował część kodu, która pyta o stopień wielomianu i współczynniki. Odpowiedzi sugerują, że całkę można obliczyć, rozkładając ją na sumę całek jednomianów, a także podkreślają znaczenie poprawnego wczytywania potęg i współczynników. Wskazówki dotyczą również użycia schematu Hornera do obliczeń oraz metod numerycznych, które są wymagane przez wykładowcę. Użytkownik dziękuje za pomoc i informuje, że poradził sobie z problemem.
Wygenerowane przez model językowy.
REKLAMA