#include #include using namespace std; //use units #include #include #include #include using namespace boost::units; using namespace boost::units::si; //use units end double integral( const quantity x // x - pozycja dla ktorej licze jasnosc , const quantity R // R - odleglosc szczeliny od ekranu , const quantity D // D - szerokosc szczeliny , const quantity lambda // lambda - dlugosc fali , double steps // steps - ilosc krokow calkowania == ilosc podzialow szer. D ) { complex i(0,1); complex a(0); static const double pi = 3.14159265358979323846; quantity > k=2*pi/lambda; quantity d=-0.5*D; // d - pozycja na szczelinie quantity dd=D/steps; // dd - krok calkowy // integrate from -d to d: exp(i*k*r)/r for( ; d<= 0.5*D ; d+=dd ) { quantity r=sqrt(pow<2>(R)+pow<2>(x-d)); a += (dd*exp(i*k*r)/r).value(); } return pow<2>(abs(a)); } int main() { quantity rozmiar_ekranu ( 2048*7.4*micro*meters); quantity odleglosc_do_ekranu ( 86.5 *centi*meters); quantity rozmiar_szczeliny ( 0.515 *milli*meters); //quantity dlugosc_fali ( 543.0 *nano*meters); // 0.53mm quantity dlugosc_fali ( 632.8 *nano*meters); // 0.49mm /* quantity rozmiar_ekranu ( 27.8528*milli*meters); quantity odleglosc_do_ekranu ( 86.5 *centi*meters); quantity rozmiar_szczeliny ( 0.265 *milli*meters); //quantity dlugosc_fali ( 543.0 *nano*meters); // 0.29mm quantity dlugosc_fali ( 501.0 *nano*meters); //quantity dlugosc_fali ( 632.8 *nano*meters); // 0.27mm */ quantity s(rozmiar_ekranu*0.5); quantity ds(0.01*milli*meter); for(quantity x=-s ; x<=s ; x+=ds) { cout << x << " " << integral(x,odleglosc_do_ekranu,rozmiar_szczeliny,dlugosc_fali,1000) << "\n"; } return false; }