MES w C++ kwadratury Newtona

Odpowiedz Nowy wątek
2011-10-17 14:09
wisnia20031988
0

Witam, na zaliczenie mam napisać program w C++ aczkolwiek programowanie nie jest moją najmocniejszą stroną;) Jeżeli ktoś by wiedział jak zacząć ;) albo chociaż czego i gdzie mam szukać byłbym wdzięczny za informacje. Treść projektu:

Kwadratury Newtona zamknięte parabolicznie
W ilu przedziałach mależy całkować funkcje sin^2(x) w przedziale (0, Pi) aby błąd był mniejszy niż 1e-6

Pozostało 580 znaków

2011-10-17 14:27
0

http://pl.wikipedia.org/wiki/Metody_Newtona-Cotesa
Ja mogę zrobić, ale ile płacisz? Co znaczy "zamknięte parabolicznie" bo ani Wiki (PL i EN ani Google o tym nic nie wie).


Pozostało 580 znaków

2011-10-17 20:51
wisnia20031988
0

znalazłem taki kod w necie:


#include <iostream.h>
#include <math.h>

#define PI 3.14159265
#define eps 0.000001
#define Calka_dokladna 1.5707963267948966192

using namespace std;

//funkcja sin^2(x)
inline long double f(long double x){
     return  pow(sin(x), 2);
  }

int silnia(int n){
        if (n<0)
          return 0;
        if (n==0 || n==1)
          return 1;

          return silnia(n-1)*n;
  }

// dziala, nie ruszac!                                                                                                                                        
long double mul(int x, int st, int sp, int i){ // x, start, stop, ktora iteracja

        long double w = 1;  //wynik

          for(int j=0; j<=sp; j++){
                if(j == i) continue;

                 w = w * (x - j);
            }

          return w;
  }

//suma
inline long double add(long double y[], long double c[], int n){

        long double w = 0;

          for(int i=0; i<n; i++){
               w=w+y[i]*c[i];      
            }

        return w;
  }

//funkcja liczaca calke metoda trapezow
long double calka(int a, int n, int l){

        long double dx = (n-a)/n;
        long double suma = (mul(a, 0, n, l)*mul(n, 0, n, l))/2;

          for(int i=1; i<=n; i++){
              suma = suma + mul(a+i*dx,0,n,l);              
            }    

       return suma*dx;            
   }

int main(){

      int n;
      char k;
      int a = 0;

      cout.precision(20); // 20 cyfr po przecinku

    do{
      cout << "na ile przedzialwo chcesz podzielisc funkcje sin^2(x)? (0, Pi) ";
      cin >>  n;

      long double przedzialy[n];
      long double wartosci[n];

      long double h = PI/n;             //dlugość przedziałów na jakie dzielimy (0,Pi)

    // obliczenie wartosci x
         for(int i=0; i<n; i++){
             przedzialy[i] = a+h*i;  //a + id?
          }      

    //obliczenie wart sin^(x) dla kazdego x z przedzialy[j]

         for(int j=0; j<n; j++){
            wartosci[j] = f(przedzialy[j]);
          }

    //kwadratura Newtona-Cotesa
      long double C[n];

        for(int i=0; i<=n; i++){
            C[i]=static_cast<long double>( pow(-1, n-i)*h/(silnia(i)*silnia(n-i))*calka(0,n,i) );

          }

      long double wynik = fabs(add(wartosci, C, n));
      cout << "Przyblizona wartosc calki: \n" << wynik << "\n\n";

      if( (fabs(Calka_dokladna - wynik)) < eps) cout << "Blad przyblizenia mniejszy niz 1e-6\n";

      cout << "Czy chcesz zakonczyc program y/n?";  
      cin >> k;
    }while(k != 'y');  

        return 0;    
 }

Co o tym sądzicie ?

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0