test_quadrature.py 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601
  1. from sympy.core import S, Rational
  2. from sympy.integrals.quadrature import (gauss_legendre, gauss_laguerre,
  3. gauss_hermite, gauss_gen_laguerre,
  4. gauss_chebyshev_t, gauss_chebyshev_u,
  5. gauss_jacobi, gauss_lobatto)
  6. def test_legendre():
  7. x, w = gauss_legendre(1, 17)
  8. assert [str(r) for r in x] == ['0']
  9. assert [str(r) for r in w] == ['2.0000000000000000']
  10. x, w = gauss_legendre(2, 17)
  11. assert [str(r) for r in x] == [
  12. '-0.57735026918962576',
  13. '0.57735026918962576']
  14. assert [str(r) for r in w] == [
  15. '1.0000000000000000',
  16. '1.0000000000000000']
  17. x, w = gauss_legendre(3, 17)
  18. assert [str(r) for r in x] == [
  19. '-0.77459666924148338',
  20. '0',
  21. '0.77459666924148338']
  22. assert [str(r) for r in w] == [
  23. '0.55555555555555556',
  24. '0.88888888888888889',
  25. '0.55555555555555556']
  26. x, w = gauss_legendre(4, 17)
  27. assert [str(r) for r in x] == [
  28. '-0.86113631159405258',
  29. '-0.33998104358485626',
  30. '0.33998104358485626',
  31. '0.86113631159405258']
  32. assert [str(r) for r in w] == [
  33. '0.34785484513745386',
  34. '0.65214515486254614',
  35. '0.65214515486254614',
  36. '0.34785484513745386']
  37. def test_legendre_precise():
  38. x, w = gauss_legendre(3, 40)
  39. assert [str(r) for r in x] == [
  40. '-0.7745966692414833770358530799564799221666',
  41. '0',
  42. '0.7745966692414833770358530799564799221666']
  43. assert [str(r) for r in w] == [
  44. '0.5555555555555555555555555555555555555556',
  45. '0.8888888888888888888888888888888888888889',
  46. '0.5555555555555555555555555555555555555556']
  47. def test_laguerre():
  48. x, w = gauss_laguerre(1, 17)
  49. assert [str(r) for r in x] == ['1.0000000000000000']
  50. assert [str(r) for r in w] == ['1.0000000000000000']
  51. x, w = gauss_laguerre(2, 17)
  52. assert [str(r) for r in x] == [
  53. '0.58578643762690495',
  54. '3.4142135623730950']
  55. assert [str(r) for r in w] == [
  56. '0.85355339059327376',
  57. '0.14644660940672624']
  58. x, w = gauss_laguerre(3, 17)
  59. assert [str(r) for r in x] == [
  60. '0.41577455678347908',
  61. '2.2942803602790417',
  62. '6.2899450829374792',
  63. ]
  64. assert [str(r) for r in w] == [
  65. '0.71109300992917302',
  66. '0.27851773356924085',
  67. '0.010389256501586136',
  68. ]
  69. x, w = gauss_laguerre(4, 17)
  70. assert [str(r) for r in x] == [
  71. '0.32254768961939231',
  72. '1.7457611011583466',
  73. '4.5366202969211280',
  74. '9.3950709123011331']
  75. assert [str(r) for r in w] == [
  76. '0.60315410434163360',
  77. '0.35741869243779969',
  78. '0.038887908515005384',
  79. '0.00053929470556132745']
  80. x, w = gauss_laguerre(5, 17)
  81. assert [str(r) for r in x] == [
  82. '0.26356031971814091',
  83. '1.4134030591065168',
  84. '3.5964257710407221',
  85. '7.0858100058588376',
  86. '12.640800844275783']
  87. assert [str(r) for r in w] == [
  88. '0.52175561058280865',
  89. '0.39866681108317593',
  90. '0.075942449681707595',
  91. '0.0036117586799220485',
  92. '2.3369972385776228e-5']
  93. def test_laguerre_precise():
  94. x, w = gauss_laguerre(3, 40)
  95. assert [str(r) for r in x] == [
  96. '0.4157745567834790833115338731282744735466',
  97. '2.294280360279041719822050361359593868960',
  98. '6.289945082937479196866415765512131657493']
  99. assert [str(r) for r in w] == [
  100. '0.7110930099291730154495901911425944313094',
  101. '0.2785177335692408488014448884567264810349',
  102. '0.01038925650158613574896492040067908765572']
  103. def test_hermite():
  104. x, w = gauss_hermite(1, 17)
  105. assert [str(r) for r in x] == ['0']
  106. assert [str(r) for r in w] == ['1.7724538509055160']
  107. x, w = gauss_hermite(2, 17)
  108. assert [str(r) for r in x] == [
  109. '-0.70710678118654752',
  110. '0.70710678118654752']
  111. assert [str(r) for r in w] == [
  112. '0.88622692545275801',
  113. '0.88622692545275801']
  114. x, w = gauss_hermite(3, 17)
  115. assert [str(r) for r in x] == [
  116. '-1.2247448713915890',
  117. '0',
  118. '1.2247448713915890']
  119. assert [str(r) for r in w] == [
  120. '0.29540897515091934',
  121. '1.1816359006036774',
  122. '0.29540897515091934']
  123. x, w = gauss_hermite(4, 17)
  124. assert [str(r) for r in x] == [
  125. '-1.6506801238857846',
  126. '-0.52464762327529032',
  127. '0.52464762327529032',
  128. '1.6506801238857846']
  129. assert [str(r) for r in w] == [
  130. '0.081312835447245177',
  131. '0.80491409000551284',
  132. '0.80491409000551284',
  133. '0.081312835447245177']
  134. x, w = gauss_hermite(5, 17)
  135. assert [str(r) for r in x] == [
  136. '-2.0201828704560856',
  137. '-0.95857246461381851',
  138. '0',
  139. '0.95857246461381851',
  140. '2.0201828704560856']
  141. assert [str(r) for r in w] == [
  142. '0.019953242059045913',
  143. '0.39361932315224116',
  144. '0.94530872048294188',
  145. '0.39361932315224116',
  146. '0.019953242059045913']
  147. def test_hermite_precise():
  148. x, w = gauss_hermite(3, 40)
  149. assert [str(r) for r in x] == [
  150. '-1.224744871391589049098642037352945695983',
  151. '0',
  152. '1.224744871391589049098642037352945695983']
  153. assert [str(r) for r in w] == [
  154. '0.2954089751509193378830279138901908637996',
  155. '1.181635900603677351532111655560763455198',
  156. '0.2954089751509193378830279138901908637996']
  157. def test_gen_laguerre():
  158. x, w = gauss_gen_laguerre(1, Rational(-1, 2), 17)
  159. assert [str(r) for r in x] == ['0.50000000000000000']
  160. assert [str(r) for r in w] == ['1.7724538509055160']
  161. x, w = gauss_gen_laguerre(2, Rational(-1, 2), 17)
  162. assert [str(r) for r in x] == [
  163. '0.27525512860841095',
  164. '2.7247448713915890']
  165. assert [str(r) for r in w] == [
  166. '1.6098281800110257',
  167. '0.16262567089449035']
  168. x, w = gauss_gen_laguerre(3, Rational(-1, 2), 17)
  169. assert [str(r) for r in x] == [
  170. '0.19016350919348813',
  171. '1.7844927485432516',
  172. '5.5253437422632603']
  173. assert [str(r) for r in w] == [
  174. '1.4492591904487850',
  175. '0.31413464064571329',
  176. '0.0090600198110176913']
  177. x, w = gauss_gen_laguerre(4, Rational(-1, 2), 17)
  178. assert [str(r) for r in x] == [
  179. '0.14530352150331709',
  180. '1.3390972881263614',
  181. '3.9269635013582872',
  182. '8.5886356890120343']
  183. assert [str(r) for r in w] == [
  184. '1.3222940251164826',
  185. '0.41560465162978376',
  186. '0.034155966014826951',
  187. '0.00039920814442273524']
  188. x, w = gauss_gen_laguerre(5, Rational(-1, 2), 17)
  189. assert [str(r) for r in x] == [
  190. '0.11758132021177814',
  191. '1.0745620124369040',
  192. '3.0859374437175500',
  193. '6.4147297336620305',
  194. '11.807189489971737']
  195. assert [str(r) for r in w] == [
  196. '1.2217252674706516',
  197. '0.48027722216462937',
  198. '0.067748788910962126',
  199. '0.0026872914935624654',
  200. '1.5280865710465241e-5']
  201. x, w = gauss_gen_laguerre(1, 2, 17)
  202. assert [str(r) for r in x] == ['3.0000000000000000']
  203. assert [str(r) for r in w] == ['2.0000000000000000']
  204. x, w = gauss_gen_laguerre(2, 2, 17)
  205. assert [str(r) for r in x] == [
  206. '2.0000000000000000',
  207. '6.0000000000000000']
  208. assert [str(r) for r in w] == [
  209. '1.5000000000000000',
  210. '0.50000000000000000']
  211. x, w = gauss_gen_laguerre(3, 2, 17)
  212. assert [str(r) for r in x] == [
  213. '1.5173870806774125',
  214. '4.3115831337195203',
  215. '9.1710297856030672']
  216. assert [str(r) for r in w] == [
  217. '1.0374949614904253',
  218. '0.90575000470306537',
  219. '0.056755033806509347']
  220. x, w = gauss_gen_laguerre(4, 2, 17)
  221. assert [str(r) for r in x] == [
  222. '1.2267632635003021',
  223. '3.4125073586969460',
  224. '6.9026926058516134',
  225. '12.458036771951139']
  226. assert [str(r) for r in w] == [
  227. '0.72552499769865438',
  228. '1.0634242919791946',
  229. '0.20669613102835355',
  230. '0.0043545792937974889']
  231. x, w = gauss_gen_laguerre(5, 2, 17)
  232. assert [str(r) for r in x] == [
  233. '1.0311091440933816',
  234. '2.8372128239538217',
  235. '5.6202942725987079',
  236. '9.6829098376640271',
  237. '15.828473921690062']
  238. assert [str(r) for r in w] == [
  239. '0.52091739683509184',
  240. '1.0667059331592211',
  241. '0.38354972366693113',
  242. '0.028564233532974658',
  243. '0.00026271280578124935']
  244. def test_gen_laguerre_precise():
  245. x, w = gauss_gen_laguerre(3, Rational(-1, 2), 40)
  246. assert [str(r) for r in x] == [
  247. '0.1901635091934881328718554276203028970878',
  248. '1.784492748543251591186722461957367638500',
  249. '5.525343742263260275941422110422329464413']
  250. assert [str(r) for r in w] == [
  251. '1.449259190448785048183829411195134343108',
  252. '0.3141346406457132878326231270167565378246',
  253. '0.009060019811017691281714945129254301865020']
  254. x, w = gauss_gen_laguerre(3, 2, 40)
  255. assert [str(r) for r in x] == [
  256. '1.517387080677412495020323111016672547482',
  257. '4.311583133719520302881184669723530562299',
  258. '9.171029785603067202098492219259796890218']
  259. assert [str(r) for r in w] == [
  260. '1.037494961490425285817554606541269153041',
  261. '0.9057500047030653669269785048806009945254',
  262. '0.05675503380650934725546688857812985243312']
  263. def test_chebyshev_t():
  264. x, w = gauss_chebyshev_t(1, 17)
  265. assert [str(r) for r in x] == ['0']
  266. assert [str(r) for r in w] == ['3.1415926535897932']
  267. x, w = gauss_chebyshev_t(2, 17)
  268. assert [str(r) for r in x] == [
  269. '0.70710678118654752',
  270. '-0.70710678118654752']
  271. assert [str(r) for r in w] == [
  272. '1.5707963267948966',
  273. '1.5707963267948966']
  274. x, w = gauss_chebyshev_t(3, 17)
  275. assert [str(r) for r in x] == [
  276. '0.86602540378443865',
  277. '0',
  278. '-0.86602540378443865']
  279. assert [str(r) for r in w] == [
  280. '1.0471975511965977',
  281. '1.0471975511965977',
  282. '1.0471975511965977']
  283. x, w = gauss_chebyshev_t(4, 17)
  284. assert [str(r) for r in x] == [
  285. '0.92387953251128676',
  286. '0.38268343236508977',
  287. '-0.38268343236508977',
  288. '-0.92387953251128676']
  289. assert [str(r) for r in w] == [
  290. '0.78539816339744831',
  291. '0.78539816339744831',
  292. '0.78539816339744831',
  293. '0.78539816339744831']
  294. x, w = gauss_chebyshev_t(5, 17)
  295. assert [str(r) for r in x] == [
  296. '0.95105651629515357',
  297. '0.58778525229247313',
  298. '0',
  299. '-0.58778525229247313',
  300. '-0.95105651629515357']
  301. assert [str(r) for r in w] == [
  302. '0.62831853071795865',
  303. '0.62831853071795865',
  304. '0.62831853071795865',
  305. '0.62831853071795865',
  306. '0.62831853071795865']
  307. def test_chebyshev_t_precise():
  308. x, w = gauss_chebyshev_t(3, 40)
  309. assert [str(r) for r in x] == [
  310. '0.8660254037844386467637231707529361834714',
  311. '0',
  312. '-0.8660254037844386467637231707529361834714']
  313. assert [str(r) for r in w] == [
  314. '1.047197551196597746154214461093167628066',
  315. '1.047197551196597746154214461093167628066',
  316. '1.047197551196597746154214461093167628066']
  317. def test_chebyshev_u():
  318. x, w = gauss_chebyshev_u(1, 17)
  319. assert [str(r) for r in x] == ['0']
  320. assert [str(r) for r in w] == ['1.5707963267948966']
  321. x, w = gauss_chebyshev_u(2, 17)
  322. assert [str(r) for r in x] == [
  323. '0.50000000000000000',
  324. '-0.50000000000000000']
  325. assert [str(r) for r in w] == [
  326. '0.78539816339744831',
  327. '0.78539816339744831']
  328. x, w = gauss_chebyshev_u(3, 17)
  329. assert [str(r) for r in x] == [
  330. '0.70710678118654752',
  331. '0',
  332. '-0.70710678118654752']
  333. assert [str(r) for r in w] == [
  334. '0.39269908169872415',
  335. '0.78539816339744831',
  336. '0.39269908169872415']
  337. x, w = gauss_chebyshev_u(4, 17)
  338. assert [str(r) for r in x] == [
  339. '0.80901699437494742',
  340. '0.30901699437494742',
  341. '-0.30901699437494742',
  342. '-0.80901699437494742']
  343. assert [str(r) for r in w] == [
  344. '0.21707871342270599',
  345. '0.56831944997474231',
  346. '0.56831944997474231',
  347. '0.21707871342270599']
  348. x, w = gauss_chebyshev_u(5, 17)
  349. assert [str(r) for r in x] == [
  350. '0.86602540378443865',
  351. '0.50000000000000000',
  352. '0',
  353. '-0.50000000000000000',
  354. '-0.86602540378443865']
  355. assert [str(r) for r in w] == [
  356. '0.13089969389957472',
  357. '0.39269908169872415',
  358. '0.52359877559829887',
  359. '0.39269908169872415',
  360. '0.13089969389957472']
  361. def test_chebyshev_u_precise():
  362. x, w = gauss_chebyshev_u(3, 40)
  363. assert [str(r) for r in x] == [
  364. '0.7071067811865475244008443621048490392848',
  365. '0',
  366. '-0.7071067811865475244008443621048490392848']
  367. assert [str(r) for r in w] == [
  368. '0.3926990816987241548078304229099378605246',
  369. '0.7853981633974483096156608458198757210493',
  370. '0.3926990816987241548078304229099378605246']
  371. def test_jacobi():
  372. x, w = gauss_jacobi(1, Rational(-1, 2), S.Half, 17)
  373. assert [str(r) for r in x] == ['0.50000000000000000']
  374. assert [str(r) for r in w] == ['3.1415926535897932']
  375. x, w = gauss_jacobi(2, Rational(-1, 2), S.Half, 17)
  376. assert [str(r) for r in x] == [
  377. '-0.30901699437494742',
  378. '0.80901699437494742']
  379. assert [str(r) for r in w] == [
  380. '0.86831485369082398',
  381. '2.2732777998989693']
  382. x, w = gauss_jacobi(3, Rational(-1, 2), S.Half, 17)
  383. assert [str(r) for r in x] == [
  384. '-0.62348980185873353',
  385. '0.22252093395631440',
  386. '0.90096886790241913']
  387. assert [str(r) for r in w] == [
  388. '0.33795476356635433',
  389. '1.0973322242791115',
  390. '1.7063056657443274']
  391. x, w = gauss_jacobi(4, Rational(-1, 2), S.Half, 17)
  392. assert [str(r) for r in x] == [
  393. '-0.76604444311897804',
  394. '-0.17364817766693035',
  395. '0.50000000000000000',
  396. '0.93969262078590838']
  397. assert [str(r) for r in w] == [
  398. '0.16333179083642836',
  399. '0.57690240318269103',
  400. '1.0471975511965977',
  401. '1.3541609083740761']
  402. x, w = gauss_jacobi(5, Rational(-1, 2), S.Half, 17)
  403. assert [str(r) for r in x] == [
  404. '-0.84125353283118117',
  405. '-0.41541501300188643',
  406. '0.14231483827328514',
  407. '0.65486073394528506',
  408. '0.95949297361449739']
  409. assert [str(r) for r in w] == [
  410. '0.090675770007435372',
  411. '0.33391416373675607',
  412. '0.65248870981926643',
  413. '0.94525424081394926',
  414. '1.1192597692123861']
  415. x, w = gauss_jacobi(1, 2, 3, 17)
  416. assert [str(r) for r in x] == ['0.14285714285714286']
  417. assert [str(r) for r in w] == ['1.0666666666666667']
  418. x, w = gauss_jacobi(2, 2, 3, 17)
  419. assert [str(r) for r in x] == [
  420. '-0.24025307335204215',
  421. '0.46247529557426437']
  422. assert [str(r) for r in w] == [
  423. '0.48514624517838660',
  424. '0.58152042148828007']
  425. x, w = gauss_jacobi(3, 2, 3, 17)
  426. assert [str(r) for r in x] == [
  427. '-0.46115870378089762',
  428. '0.10438533038323902',
  429. '0.62950064612493132']
  430. assert [str(r) for r in w] == [
  431. '0.17937613502213266',
  432. '0.61595640991147154',
  433. '0.27133412173306246']
  434. x, w = gauss_jacobi(4, 2, 3, 17)
  435. assert [str(r) for r in x] == [
  436. '-0.59903470850824782',
  437. '-0.14761105199952565',
  438. '0.32554377081188859',
  439. '0.72879429738819258']
  440. assert [str(r) for r in w] == [
  441. '0.067809641836772187',
  442. '0.38956404952032481',
  443. '0.47995970868024150',
  444. '0.12933326662932816']
  445. x, w = gauss_jacobi(5, 2, 3, 17)
  446. assert [str(r) for r in x] == [
  447. '-0.69045775012676106',
  448. '-0.32651993134900065',
  449. '0.082337849552034905',
  450. '0.47517887061283164',
  451. '0.79279429464422850']
  452. assert [str(r) for r in w] == [
  453. '0.027410178066337099',
  454. '0.21291786060364828',
  455. '0.43908437944395081',
  456. '0.32220656547221822',
  457. '0.065047683080512268']
  458. def test_jacobi_precise():
  459. x, w = gauss_jacobi(3, Rational(-1, 2), S.Half, 40)
  460. assert [str(r) for r in x] == [
  461. '-0.6234898018587335305250048840042398106323',
  462. '0.2225209339563144042889025644967947594664',
  463. '0.9009688679024191262361023195074450511659']
  464. assert [str(r) for r in w] == [
  465. '0.3379547635663543330553835737094171534907',
  466. '1.097332224279111467485302294320899710461',
  467. '1.706305665744327437921957515249186020246']
  468. x, w = gauss_jacobi(3, 2, 3, 40)
  469. assert [str(r) for r in x] == [
  470. '-0.4611587037808976179121958105554375981274',
  471. '0.1043853303832390210914918407615869143233',
  472. '0.6295006461249313240934312425211234110769']
  473. assert [str(r) for r in w] == [
  474. '0.1793761350221326596137764371503859752628',
  475. '0.6159564099114715430909548532229749439714',
  476. '0.2713341217330624639619353762933057474325']
  477. def test_lobatto():
  478. x, w = gauss_lobatto(2, 17)
  479. assert [str(r) for r in x] == [
  480. '-1',
  481. '1']
  482. assert [str(r) for r in w] == [
  483. '1.0000000000000000',
  484. '1.0000000000000000']
  485. x, w = gauss_lobatto(3, 17)
  486. assert [str(r) for r in x] == [
  487. '-1',
  488. '0',
  489. '1']
  490. assert [str(r) for r in w] == [
  491. '0.33333333333333333',
  492. '1.3333333333333333',
  493. '0.33333333333333333']
  494. x, w = gauss_lobatto(4, 17)
  495. assert [str(r) for r in x] == [
  496. '-1',
  497. '-0.44721359549995794',
  498. '0.44721359549995794',
  499. '1']
  500. assert [str(r) for r in w] == [
  501. '0.16666666666666667',
  502. '0.83333333333333333',
  503. '0.83333333333333333',
  504. '0.16666666666666667']
  505. x, w = gauss_lobatto(5, 17)
  506. assert [str(r) for r in x] == [
  507. '-1',
  508. '-0.65465367070797714',
  509. '0',
  510. '0.65465367070797714',
  511. '1']
  512. assert [str(r) for r in w] == [
  513. '0.10000000000000000',
  514. '0.54444444444444444',
  515. '0.71111111111111111',
  516. '0.54444444444444444',
  517. '0.10000000000000000']
  518. def test_lobatto_precise():
  519. x, w = gauss_lobatto(3, 40)
  520. assert [str(r) for r in x] == [
  521. '-1',
  522. '0',
  523. '1']
  524. assert [str(r) for r in w] == [
  525. '0.3333333333333333333333333333333333333333',
  526. '1.333333333333333333333333333333333333333',
  527. '0.3333333333333333333333333333333333333333']