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 ?