[WikiDyd] [TitleIndex] [WordIndex

Języki i metodologia programowania I, laboratorium

Temat 2. Całkowanie numeryczne

Tematyka: Implementacja metod numerycznych

Wymagania wstępne: funkcje (K&R 4, 4.1, 4.2), make - podstawy

Teoria:

Uwaga: poniższy opis jest moze troszkę trudny, bo brak w nim rysunków. Zachęcamy do obejrzenia ich w dowolnej książce dotyczącej metod numerycznych, albo na stronie: http://pl.wikipedia.org/wiki/Ca%C5%82kowanie_numeryczne. Prosty i krótki opis alg. trapezów i Simpsona znajduje się także np. na stronie http://www.pckurier.pl/archiwum/art0.asp?ID=574

Całkowanie numeryczne (proste metody Newtona-Cotesa):

Zasada ogólna: Dana jest funkcja f(x) i przedział <a,b>. Przedział całkowania dzielimy równomiernie na n podprzedziałów o długości d każdy: d = (b-a) /n. Otrzymujemy ciąg punktów {x_0, x_1, .... x_n }, gdzie x_0 = a, x_1 = a+d, ... x_n = b.

Metoda prostokątów:

Całka oznaczona z f(x) w przedziale <a,b> obliczana jest w sposób przybliżony jako suma pól prostokątów o szerokości d każdy (poza pierwszym i ostatnim, które mają szerokość d/2) i wysokościach wyznaczanych przez kolejne wartości funkcji:

f(x_0)*d/2 + f(x_1)*d + f(x_2)*d + .... + f(x_(n-1))*d + f(x_n)*d/2

Błąd w tej metodzie szacuje się jako: |R| = | -(b-a)/24*d^2*f"(x) | gdzie f"(x) oznacza maksymalną wartość drugiej pochodnej funkcji podcałkowej f w przedziale <a,b>.

Metoda trapezów:

Całka obliczana jest w sposób przybliżony jako suma pól trapezów wyznaczanych przez kolejne pary punktów:

( f(x_0) + f(x_1) ) /2 * d + ( f(x_1) + f(x_2) ) /2 * d + .....

Błąd w tej metodzie szacuje się jako: |R| = | -(b-a)/12*d^2*f"(x) | gdzie f"(x) oznacza maksymalną wartość drugiej pochodnej funkcji podcałkowej f w przedziale <a,b>.

Metoda Simpsona (parabol):

Całka obliczana jest w sposób przybliżony jako suma pól pod parabolami określanymi przez kolejne trójki punktów:

( f(x_0) + 4*f(x_1) + f(x_2)) /3 * d + ( f(x_2) + 4*f(x_3) + f(x_4) ) /3 * d + .....

Błąd w tej metodzie szacuje się jako: |R| = | -(b-a)/180*d^4*f""(x) | gdzie f""(x) oznacza maksymalną wartość czwartej pochodnej funkcji podcałkowej f w przedziale <a,b>.

Program szczegółowy:

Oto program testujący napisaną funkcję:

   1 /** Program testujacy dla funkcji calkujacej met. trapezow
   2     jstar@iem.pw.edu.pl 15.02.2003
   3 */
   4 
   5 #include <stdio.h>
   6 #include <stdlib.h>
   7 #include <math.h>
   8 
   9 #include "calnum.h"   /* tu naglowek funkcji calkujacej */
  10 
  11 double f( double x ) {
  12   return x*sin(x);
  13 }
  14 
  15 main( int argc, char **argv ) {
  16   double a= argc > 1 ? atof( argv[1] ) : 0;    /* pocz. przedzialu calkowania */
  17   double b= argc > 2 ? atof( argv[2] ) : M_PI; /* koniec przedzialu calkowania */
  18   int n   = argc > 3 ? atoi( argv[3] ) : 1000; /* liczba krokow calkowania */
  19 
  20    printf( "Int <%g,%g>[%i] ( x*sin(x) ) = %g\n", a, b, n, calnum( f, a, b, n ) );
  21 
  22   return 0;
  23 }

Plik nagłówkowy z prototypem funkcji calnum:

   1 /** Prototyp funcji calkujacej numerycznie f. jednej zmiennej.
   2  *  f to funkcja podcalkowa
   3  *  <a,b> to przedzial calkowania
   4  *  n to liczba podprzedzialow (posrednio okresla dokladnosc) */
   5 double calnum ( double (*f)( double ), double a, double b, int n );

Celem będzie napisanie pliku calnum.c zawierającego funkcję calnum, a następnie przetestowanie programu na zadanej przez prowadzącego funkcji podcałkowej.


2015-09-23 06:43