Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[c] Obliczanie całki zadanego wielomianu

słomka 19 Kwi 2010 21:24 4586 7
  • #1 19 Kwi 2010 21:24
    słomka
    Poziom 2  

    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:

    Code:

    #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

    0 7
  • Pomocny post
    #2 19 Kwi 2010 23:27
    GSM
    Poziom 25  

    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

    0
  • #3 20 Kwi 2010 00:28
    słomka
    Poziom 2  

    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.

    Code:
    #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]

    0
  • #4 20 Kwi 2010 01:12
    GSM
    Poziom 25  

    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.


    Code:

    #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:
    Code:

    // 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.

    0
  • #5 20 Kwi 2010 01:14
    Dr.Vee
    VIP Zasłużony dla elektroda

    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

    1
  • #6 20 Kwi 2010 01:31
    Xitami
    Poziom 29  

    Code:
    #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

    0
  • #7 20 Kwi 2010 16:04
    wrych
    Poziom 20  

    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] Obliczanie całki zadanego wielomianu

    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ś"...

    0
  • #8 21 Kwi 2010 19:00
    słomka
    Poziom 2  

    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

    0