[C++] Metoda trapezów, dodanie epsilon

Serphis
Użytkownik
Użytkownik
Posty: 77
Rejestracja: 17 wrz 2009, o 20:54
Płeć: Mężczyzna
Lokalizacja: Piotrków
Podziękował: 4 razy
Pomógł: 2 razy

[C++] Metoda trapezów, dodanie epsilon

Post autor: Serphis »

Mam funkcję liczącą całkę za pomocą metody trapezów, jak rozwinąć program by liczył ją z dokładnością epsilon np. 0,001?

Kod: Zaznacz cały


double trapez(double a,double b,int n, double e){
// a,b- przedzialy
// n- podprzedzialy
//e- epsilon
    double c,dx,suma;
    int licznik=0;
     suma=0.0;



    dx = (b-a)/n;
      for(int i=1; i<n;i++)
      suma =suma+ funkcja(a + i * dx);

      suma = (suma + (funkcja(a) + funkcja(b)) / 2) * dx;

      
      return suma;
      }
Xitami

[C++] Metoda trapezów, dodanie epsilon

Post autor: Xitami »

jeżeli zwiększysz "n" wtedy "suma" się zmieni
a jeżeli zmieni się o mniej niż eps...
Serphis
Użytkownik
Użytkownik
Posty: 77
Rejestracja: 17 wrz 2009, o 20:54
Płeć: Mężczyzna
Lokalizacja: Piotrków
Podziękował: 4 razy
Pomógł: 2 razy

[C++] Metoda trapezów, dodanie epsilon

Post autor: Serphis »

ale n jest podane przez użytkownika i jest stałe to trzeba coś w rodzaju

tak wyglada ta funkcja w Pascalu

Kod: Zaznacz cały

function NR(a:longint):real;
var x:real;
xp:=real;
begin
x:=a;
repeat
xp:=x;
x:=(x+a/x)/2;
until abs(x-xp)<eps;
NR:=x;
end;
to przykład działania tego o co mi chodzi, jednak gdy próbowałem to porównać do swojego to dostaje zupełnie inny wynik
abc666

[C++] Metoda trapezów, dodanie epsilon

Post autor: abc666 »

Serphis, dokładność możesz zwiększyć tylko poprzez zwiększenie \(\displaystyle{ n}\).
Xitami

[C++] Metoda trapezów, dodanie epsilon

Post autor: Xitami »

zgrabnie jest prawie podwoić "n", tzn. dodać punkty między wcześniej policzonymi, wtedy połowa roboty już odwalona
Serphis
Użytkownik
Użytkownik
Posty: 77
Rejestracja: 17 wrz 2009, o 20:54
Płeć: Mężczyzna
Lokalizacja: Piotrków
Podziękował: 4 razy
Pomógł: 2 razy

[C++] Metoda trapezów, dodanie epsilon

Post autor: Serphis »

Ok mieliście racje tak można wyliczyć dokładność, dziękuje. Możecie mi jeszcze powiedzieć od czego zależy dokładność epsilon dla metody simpsona?
Xitami

[C++] Metoda trapezów, dodanie epsilon

Post autor: Xitami »

Kod: Zaznacz cały

#include <stdio.h>
#include <math.h>
 
double funkcja(double x){
        return 4*sqrt(1-x*x); }
        
double trapezik(double a, double b, int n, double e){
        double h, sum, calka, calka1, fab2, p;
        int i;
        
        sum= 0;
        h= (b-a)/n;
        fab2= (funkcja(a) + funkcja(b))/2;
        
        for( i=1; i<n; i++ )
                sum += funkcja(a + i*h);
        calka = h*(fab2 + sum);
        
        do{     p= h/2;
                for( i=0; i<n; i++ ) 
                        sum += funkcja(p + i*h);
                calka1=calka;
                n*=2; h=(b-a)/n;
                calka=h*(fab2 + sum);
        } while( fabs(calka1-calka) > e );
        return calka;}
        
int main(){
        return printf("%0.15f
", trapezik(0, 1, 2, 0.0000000001));}
ODPOWIEDZ