Answer to problem 6.1
Below is the program and the output of the Gauss-Laguerre approximation for the integral of Plank's black body radiation equation. This program verified that as n grows, the integral from zero to infinity of x^3/(e^x-1) = (p^4)/15. Given the total power radiated from a black body for all frequencies.
we can substitute v=kTx/h to achieve an integral equivalent to the one evaluated times a factor 2ph*(kT/h)^3*(kT/h). Plugging our approximation into the equation we achieve
Rt = (2ph/c^2)*(kT/h)^3*(kT/h)*(p^4/15) = (2(k^4)(p^5) / 15c^2) T^4 = sT^4
#include <functional> #include <iostream> #include <math.h> #include <vector> using namespace std;
const double pi = acos(-1);
double xm2[2] = {5.857864376269050e-1, 3.414213562373095}; double wm2[2] = {8.535533905932738e-1,1.464466094067262e-1}; double xm4[4] = {3.225476896193923e-1,1.745761101158347, 4.536620296921128, 9.395070912301133}; double wm4[4] = {6.031541043416336e-1, 3.574186924377997e-1, 3.888790851500538e-2, 5.392947055613275e-4 }; double xm6[6] = {2.228466041792607e-1 , 1.188932101672623 , 2.992736326059314 , 5.775143569104511 , 9.837467418382590 , 1.598287398060170e-1}; double wm6[6] = {4.589646739499636e-1 , 4.170008307721210e-1 , 1.133733820740450e-1 , 1.039919745314907e-2 , 2.610172028149321e-4 , 8.985479064296212e-7}; double xmwm8[8][3] = { 0.170279632305, 0.369188589342, 0.437723410493 , 0.903701776799, 0.418786780814, 1.03386934767 , 2.25108662987, 0.175794986637 ,1.66970976566 , 4.26670017029, 0.0333434922612 ,2.37692470176, 7.04590540239, 0.00279453623523 ,3.20854091335 , 10.7585160102, 9.07650877338E-005, 4.26857551083 , 15.7406786413, 8.48574671626E-007 ,5.81808336867 , 22.8631317369, 1.04800117487E-009 ,8.90622621529 };
class Function : public unary_function<double,double> { public: Function() {}; virtual result_type operator()(argument_type x){return x;}; };
class BlackBody : public Function { public: BlackBody() {}; double operator()(double x) { return x*x*x/(1-exp(-x)); } };
class Approximation { public: Approximation(double lowerBound, double upperBound, Function* function) :a(lowerBound), b(upperBound), f(function) {};
virtual double calculate(double precision=0, int maxTries = 3000) { cerr << "Default approximation not implemented" << endl; return -1; } protected: double a; double b; Function* f; //TBD: set precision & maxTries? };
class GaussLaguerre : public Approximation { public: GaussLaguerre(int numberOfPoints, Function* f) :Approximation(1, numberOfPoints, f), weights(8), abscissas(8) { int i; switch(numberOfPoints) { case 2: for (i=0;i<2;i++) { weights[i] = wm2[i]; abscissas[i] = xm2[i]; } break; case 4: for (i=0;i<4;i++) { weights[i] = wm4[i]; abscissas[i] = xm4[i]; } break; case 6: for (i=0;i<6;i++) { weights[i] = wm6[i]; abscissas[i] = xm6[i]; } break; case 8: for (i=0;i<8;i++) { weights[i] = xmwm8[i][1]; abscissas[i] = xmwm8[i][0]; //cout << abscissas[i] << "\t" << weights[i] << endl; } break; }; }
virtual double calculate() { double sum=0; for (int i =a;i<=b;i++) sum += (*f)(abscissas[i-1])*weights[i-1]; return sum; }
protected: vector<double> weights; vector<double> abscissas;
};
int main(int argc, char* argv) { cout.precision(15); cout << "Here are the Gauss Laguerre Approximations of Plank's Black Body equation where pi = " << pi << endl; cout << "N\tvalue\terror" << endl; BlackBody bb; for (int i =2;i<=8;i+=2) { GaussLaguerre gl(i,&bb); cout << i << "\t" << gl.calculate() << "\t" << fabs(gl.calculate() - pi*pi*pi*pi/15) <<endl;; } return 0; }
Here are the Gauss Laguerre Approximations of Plank's Black Body equation where pi = 3.14159265358979
N value
error
2 6.41372746951758 0.080211932749247
4 6.49453563980263 0.000596237535802402
6 6.49027279227319 0.00366660999364132
8 6.49393566536404 3.73690278987482e-006