//http://www.timestocome.com //linda cobb //winter 98-99 //gaussian quadratures using legendre polynomials #include #include extern double function (double); //tables of weights and points double DATAP2[1] ={0.577350269189626}; double DATAW2[1] ={0.999999999999999}; double DATAP4[2]={ 0.861136311594052, 0.339981043584856}; double DATAW4[2]={ 0.347854845137454, 0.652145154862546}; double DATAP6[3]={ 0.932469514203152, 0.661209386466264, 0.238619186083197}; double DATAW6[3]={ 0.171324492379170, 0.360761573048139, 0.467913934572691}; double DATAP8[4]={ 0.960289856497536, 0.796666477413627, 0.525532409916329, 0.183434642495650}; double DATAW8[4]={ 0.101228536290376, 0.222381034453374, 0.313706645877887, 0.362683783378362}; double DATAP10[5]={ 0.973906528517172, 0.865063366688984, 0.679409568299024,0.433395394129247, 0.148874338981631}; double DATAW10[5]={ 0.066671344308688, 0.149451349150580, 0.219086362515982,0.269266719309996, 0.295524224714753}; double DATAP12[6]={ 0.981560634246719, 0.904117256370475, 0.769902674194305, 0.587317954286617, 0.367831498998180, 0.125233408511469}; double DATAW12[6]={ 0.047175336386512, 0.106939325995318, 0.160078328543346, 0.203167426723066, 0.233492536538355, 0.249147045813403}; double DATAP14[7]={ 0.986283808696812, 0.928434883663573, 0.827201315069765, 0.687292904811685, 0.515248636358154, 0.319112368927890, 0.108054948707344}; double DATAW14[7]={ 0.035119460331752, 0.080158087159760, 0.121518570687903, 0.157203167158193, 0.185538397477938, 0.205198463721296, 0.215263853463158}; double DATAP16[8]={ 0.989400934991650, 0.944575023073232, 0.865631202387832, 0.755404408355003, 0.617876244402644, 0.458016777657227, 0.281603550779259, 0.095012509837637}; double DATAW16[8]={ 0.027152459411754, 0.062253523938648, 0.095158511682493, 0.124628971255534, 0.149595988816577, 0.169156519395002, 0.182603415044923, 0.189450610455068}; double DATAP20[10]={ 0.993128599185095, 0.963971927277914, 0.912234428251326, 0.839116971822219, 0.746331906460151, 0.636053680726515, 0.510867001950827, 0.373706088715419, 0.227785851141645, 0.076526521133497}; double DATAW20[10]={ 0.017614007139152, 0.040601429800387, 0.062672048334109, 0.083276741576705, 0.101930119817240, 0.118194531961518, 0.131688638449177, 0.142096109318382, 0.149172986472604, 0.152753387130726}; double DATAP24[12]={ 0.995187219997021,0.974728555971309, 0.938274552002733, 0.886415527004401, 0.820001985973903, 0.740124191578554, 0.648093651936975, 0.545421471388839, 0.433793507626045, 0.315042679696163, 0.191118867473616, 0.064056892862606}; double DATAW24[12]={0.012341229799987, 0.028531388628934, 0.044277438817420, 0.059298584915437, 0.073346481411080, 0.086190161531953, 0.097618652104114, 0.107444270115966, 0.115505668053726, 0.121670472927803, 0.125837456346828, 0.127938195346752}; double DATAP28[14]={ 0.996442497573954, 0.981303165370873, 0.954259280628938, 0.915633026392132, 0.865892522574395, 0.805641370917179, 0.735610878013632, 0.656651094038865, 0.569720471811402, 0.475874224955118, 0.376251516089079, 0.272061627635178, 0.164569282133381, 0.055079289884034}; double DATAW28[14]={ 0.009124282593094, 0.021132112592771, 0.032901427782304, 0.044272934759004, 0.055107345675717, 0.065272923966999, 0.074646214234569, 0.083113417228901, 0.090571744393033, 0.096930657997930, 0.102112967578061, 0.106055765922846, 0.108711192258294, 0.110047013016475}; double DATAP32[16]={ 0.997263861849481, 0.985611511545268, 0.964762255587506, 0.934906075937740, 0.896321155766052, 0.849367613732570, 0.794483795967942, 0.732182118740290, 0.663044266930215, 0.587715757240762, 0.506899908932229, 0.421351276130635, 0.331868602282128, 0.239287362252137, 0.144471961582796, 0.048307665687738}; double DATAW32[16]={ 0.007018610009470, 0.016274394730906, 0.025392065309262, 0.034273862913021, 0.042835898022227, 0.050998059262376, 0.058684093478535, 0.065822222776362, 0.072345794108848, 0.078193895787070, 0.083311924226947, 0.087652093004404, 0.091173878695764, 0.093844399080804, 0.095638720079275, 0.096540088514728}; double DATAP40[20]={ 0.998237709710559, 0.990726238699457, 0.977259949983774, 0.957916819213792, 0.932812808278676, 0.902098806968874, 0.865959503212259, 0.824612230833312, 0.778305651426519, 0.727318255189927, 0.671956684614179, 0.612553889667980, 0.549467125095128, 0.483075801686179, 0.413779204371605, 0.341994090825758, 0.268152185007254, 0.192697580701371, 0.116084070675255, 0.038772417506051}; double DATAW40[20]={ 0.004521277098533, 0.010498284531153, 0.016421058381908, 0.022245849194167, 0.027937006980023, 0.033460195282548, 0.038782167974472, 0.043870908185673, 0.048695807635072, 0.053227846983937, 0.057439769099391, 0.061306242492929, 0.064804013456601, 0.067912045815234, 0.070611647391287, 0.072886582395804, 0.074723169057968, 0.076110361900626, 0.077039818164248, 0.077505947978425}; double DATAP48[24]={ 0.998771007252426, 0.993530172266351, 0.984124583722827, 0.970591592546247, 0.952987703160431, 0.931386690706554, 0.905879136715570, 0.876572020274248, 0.843588261624393, 0.807066204029443, 0.767159032515740, 0.724034130923815, 0.677872379632664, 0.628867396776514, 0.577224726083973, 0.523160974722233, 0.466902904750958, 0.408686481990717, 0.348755886292161, 0.287362487355455, 0.224763790394689, 0.161222356068892, 0.097004699209463, 0.032380170962869}; double DATAW48[24]={ 0.003153346052306, 0.007327553901276, 0.011477234579234, 0.015579315722944, 0.019616160457355, 0.023570760839324, 0.027426509708357, 0.031167227832798, 0.034777222564770, 0.038241351065831, 0.041545082943465, 0.044674560856694, 0.047616658492490, 0.050359035553854, 0.052890189485194, 0.055199503699984, 0.057277292100403, 0.059114839698396, 0.060704439165894, 0.062039423159893, 0.063114192286254, 0.063924238584648, 0.064466164435950, 0.064737696812684}; double DATAP64[32]={ 0.999305041735772, 0.996340116771955, 0.991013371476744, 0.983336253884626, 0.973326827789911, 0.961008799652054, 0.946411374858403, 0.929569172131939, 0.910522137078503, 0.889315445995114, 0.865999398154093, 0.840629296252580, 0.813265315122797, 0.783972358943341, 0.752819907260532, 0.719881850171611, 0.685236313054233, 0.648965471254657, 0.611155355172393, 0.571895646202634, 0.531279464019894, 0.489403145707053, 0.446366017253464, 0.402270157963992, 0.357220158337668, 0.311322871990211, 0.264687162208767, 0.217423643740007, 0.169644420423993, 0.121462819296120, 0.072993121787799, 0.024350292663424}; double DATAW64[32]={ 0.001783280721696, 0.004147033260562, 0.006504457968978, 0.008846759826364, 0.011168139460131, 0.013463047896719, 0.015726030476025, 0.017951715775697, 0.020134823153530, 0.022270173808383, 0.024352702568711, 0.026377469715055, 0.028339672614259, 0.030234657072402, 0.032057928354851, 0.033805161837142, 0.035472213256882, 0.037055128540240, 0.038550153178616, 0.039953741132720, 0.041262563242623, 0.042473515123653, 0.043583724529323, 0.044590558163756, 0.045491627927418, 0.046284796581314, 0.046968182816210, 0.047540165714830, 0.047999388596458, 0.048344762234803, 0.048575467441503, 0.048690957009140}; //send the lowest point, the highest point and the //number of points to calculate //assumes a function with the equation to //integrate is declared in main in the form //double function (double) void gauss (double a, double b, int points) { int i; //loop control double answer; //calculated value of integral //change variables... function must be btwn -1 and 1 //calculate value answer = 0; switch(points){ case 2: for(i=0; i < points/2; i++){ answer += DATAW2[i]* (function((b+a)/2.0 + (b-a)/2.0*DATAP2[i]) + function((b+a)/2.0 - (b-a)/2.0*DATAP2[i])); } break; case 4: for(i=0; i < points/2; i++){ answer += DATAW4[i]* (function((b+a)/2.0 + (b-a)/2.0*DATAP4[i]) + function((b+a)/2.0 - (b-a)/2.0*DATAP4[i])); } break; case 6: for(i=0; i < points/2; i++){ answer += DATAW6[i]* (function((b+a)/2.0 + (b-a)/2.0*DATAP6[i]) + function((b+a)/2.0 - (b-a)/2.0*DATAP6[i])); } break; case 8: for(i=0; i < points/2; i++){ answer += DATAW8[i]* (function((b+a)/2.0 + (b-a)/2.0*DATAP8[i]) + function((b+a)/2.0 - (b-a)/2.0*DATAP8[i])); } break; case 10: for(i=0; i < points/2; i++){ answer += DATAW10[i]* (function((b+a)/2.0 + (b-a)/2.0*DATAP10[i]) + function((b+a)/2.0 - (b-a)/2.0*DATAP10[i])); } break; case 14: for(i=0; i < points/2; i++){ answer += DATAW14[i]* (function((b+a)/2.0 + (b-a)/2.0*DATAP14[i]) + function((b+a)/2.0 - (b-a)/2.0*DATAP14[i])); } break; case 16: for(i=0; i < points/2; i++){ answer += DATAW16[i]* (function((b+a)/2.0 + (b-a)/2.0*DATAP16[i]) + function((b+a)/2.0 - (b-a)/2.0*DATAP16[i])); } break; case 20: for(i=0; i < points/2; i++){ answer += DATAW20[i]* (function((b+a)/2.0 + (b-a)/2.0*DATAP20[i]) + function((b+a)/2.0 - (b-a)/2.0*DATAP20[i])); } break; case 24: for(i=0; i < points/2; i++){ answer += DATAW24[i]* (function((b+a)/2.0 + (b-a)/2.0*DATAP24[i]) + function((b+a)/2.0 - (b-a)/2.0*DATAP24[i])); } break; case 28: for(i=0; i < points/2; i++){ answer += DATAW28[i]* (function((b+a)/2.0 + (b-a)/2.0*DATAP28[i]) + function((b+a)/2.0 - (b-a)/2.0*DATAP28[i])); } break; case 32: for(i=0; i < points/2; i++){ answer += DATAW32[i]* (function((b+a)/2.0 + (b-a)/2.0*DATAP32[i]) + function((b+a)/2.0 - (b-a)/2.0*DATAP32[i])); } break; case 40: for(i=0; i < points/2; i++){ answer += DATAW40[i]* (function((b+a)/2.0 + (b-a)/2.0*DATAP40[i]) + function((b+a)/2.0 - (b-a)/2.0*DATAP40[i])); } break; case 48: for(i=0; i < points/2; i++){ answer += DATAW48[i]* (function((b+a)/2.0 + (b-a)/2.0*DATAP48[i]) + function((b+a)/2.0 - (b-a)/2.0*DATAP48[i])); } break; case 64: for(i=0; i < points/2; i++){ answer += DATAW64[i] * (function((b+a)/2.0 + (b-a)/2.0*DATAP64[i]) + function((b+a)/2.0 - (b-a)/2.0*DATAP64[i])); } break; default: printf("\n not a valid choice "); break; }//end switch answer = answer * (b-a)/2.0; }