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

Całkowanie numeryczne

Loch_Ness 03 Paź 2008 16:47 3090 5
REKLAMA
  • #1 5594955
    Loch_Ness
    Poziom 17  
    Witam, potrzebuje scalkowac funkcje numerycznie

    Mam zbior punktow [x,y] .... przypomina sinusoide, ale nia nie jest.
    Wykonalem przyblizenie calki szeregiem w postaci

    y1, y1+y2, y1+y2+y3 + ...yn-1+yn

    Wykres przypomina cosinusoide ale nie jest symetryczne wzgl. osi ox.
    Szukalem na google jednak nic ine znalazlem.

    Blad jest pewnie w przyblizeniu.
  • REKLAMA
  • #2 5595018
    marihires
    Poziom 30  
    Tu masz przykład całkowania numerycznego funkcji kwadratowej,być może natchnie Cię:
    
    #include<stdio.h>
    #include<conio.h>
    #include<math.h>
    #pragma argsused
    float funkcja(float a,float b,float c,float x);
    float calka(float xp,float xk, int n, float a, float b, float c);
    int main()
    {
     float xp,xk,a,b,c; int n;
     printf("\t\tPROGRAM OBLICZA CALKE Z FUNKCJI KWADRATOWEJ\n\n");
     printf("Podaj a\n");
     scanf("%f",&a);
     printf("Podaj b\n");
     scanf("%f",&b);
     printf("Podaj c\n");
     scanf("%f",&c);
     printf("\n");
     printf("Funkcja ma postac:  %2.1fx*x + %2.1fx + %2.1f\n\n",a,b,c);
     printf("Podaj poczatek przedzialu\n");
     scanf("%f",&xp);
     printf("Podaj koniec przedzialu\n");
     scanf("%f",&xk);
     printf("\n");
     printf("Podaj na ile czesci dzielic\n");
     scanf("%d",&n);
     printf("\n\n");
     printf("Calka wynosi %f",calka(xp,xk,n,a,b,c));
    
    
            getch();
            return 0;
    }
    
    float funkcja (float a,float b,float c,float x)
    {float y ;
     y=a*x*x+b*x+c ;
     return y;
             }
    
     float calka (float xp,float xk,int n, float a,float b,float c)
     {float y1,y2,dx,suma,x; int i;
     suma=0;
     dx=(xk-xp)/n;
     for (i=0;i<n;i++)
     {x=xp+i*dx;
     y1=funkcja(a,b,c,x);
     y2=funkcja(a,b,c,x+dx);
     suma=suma+((y1+y2)/2)*dx;
     }
     return suma;
     }
    

    Pozdrawiam
  • REKLAMA
  • #3 5595044
    Loch_Ness
    Poziom 17  
    Problem w tym że ja potrzebuje mieć jako wynik przebieg, a nie 1 wartość
  • REKLAMA
  • Pomocny post
    #4 5595099
    marihires
    Poziom 30  
    Może zamieścisz Twój kod programu i zobaczy się w czym jest błąd?

    Im mniejsza średnica podziału (wyższa częstotliwość próbkowania), tym wynik dokładniejszy.
    Po scałkowaniu amplituda przebiegu wzrasta, tym bardziej, im mniejsza średnica podziału.
    Dzieląc przedział całkowania na więcej fragmentów można uzyskać lepsze przybliżenie.
    Cytat:
    Wykres przypomina cosinusoide ale nie jest symetryczne wzgl. osi ox
    widocznie problem tkwi w granicach całkowania
  • REKLAMA
  • #5 5595178
    Loch_Ness
    Poziom 17  
    ok, dzieki
  • #6 5596475
    __Grzegorz__
    Poziom 30  
    Koledzy zapomnieli o podstawowym fakcie:
    Wynik całkowania numerycznego ZAWSZE będzie zawierał stałą C.

    W końcu w drugą stronę dC/dx = 0 ...

    Pozostaje z przebiegu zcałkowanym policzyć średnią i odjąć ją póżniej od przebiegu...

    Albo dać najprostszy filtr IIR o charakterystyce przykładowo:

    y/x = (1-z^-1)/(1-0,999999z^-1) i stała C odpłynie w niebyt...
REKLAMA