MES w C++ kwadratury Newtona

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

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

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 ?

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