scipy 1.16.2__cp313-cp313t-win_arm64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1530) hide show
  1. scipy/__config__.py +161 -0
  2. scipy/__init__.py +150 -0
  3. scipy/_cyutility.cp313t-win_arm64.lib +0 -0
  4. scipy/_cyutility.cp313t-win_arm64.pyd +0 -0
  5. scipy/_distributor_init.py +18 -0
  6. scipy/_lib/__init__.py +14 -0
  7. scipy/_lib/_array_api.py +931 -0
  8. scipy/_lib/_array_api_compat_vendor.py +9 -0
  9. scipy/_lib/_array_api_no_0d.py +103 -0
  10. scipy/_lib/_bunch.py +229 -0
  11. scipy/_lib/_ccallback.py +251 -0
  12. scipy/_lib/_ccallback_c.cp313t-win_arm64.lib +0 -0
  13. scipy/_lib/_ccallback_c.cp313t-win_arm64.pyd +0 -0
  14. scipy/_lib/_disjoint_set.py +254 -0
  15. scipy/_lib/_docscrape.py +761 -0
  16. scipy/_lib/_elementwise_iterative_method.py +346 -0
  17. scipy/_lib/_fpumode.cp313t-win_arm64.lib +0 -0
  18. scipy/_lib/_fpumode.cp313t-win_arm64.pyd +0 -0
  19. scipy/_lib/_gcutils.py +105 -0
  20. scipy/_lib/_pep440.py +487 -0
  21. scipy/_lib/_sparse.py +41 -0
  22. scipy/_lib/_test_ccallback.cp313t-win_arm64.lib +0 -0
  23. scipy/_lib/_test_ccallback.cp313t-win_arm64.pyd +0 -0
  24. scipy/_lib/_test_deprecation_call.cp313t-win_arm64.lib +0 -0
  25. scipy/_lib/_test_deprecation_call.cp313t-win_arm64.pyd +0 -0
  26. scipy/_lib/_test_deprecation_def.cp313t-win_arm64.lib +0 -0
  27. scipy/_lib/_test_deprecation_def.cp313t-win_arm64.pyd +0 -0
  28. scipy/_lib/_testutils.py +373 -0
  29. scipy/_lib/_threadsafety.py +58 -0
  30. scipy/_lib/_tmpdirs.py +86 -0
  31. scipy/_lib/_uarray/LICENSE +29 -0
  32. scipy/_lib/_uarray/__init__.py +116 -0
  33. scipy/_lib/_uarray/_backend.py +707 -0
  34. scipy/_lib/_uarray/_uarray.cp313t-win_arm64.lib +0 -0
  35. scipy/_lib/_uarray/_uarray.cp313t-win_arm64.pyd +0 -0
  36. scipy/_lib/_util.py +1283 -0
  37. scipy/_lib/array_api_compat/__init__.py +22 -0
  38. scipy/_lib/array_api_compat/_internal.py +59 -0
  39. scipy/_lib/array_api_compat/common/__init__.py +1 -0
  40. scipy/_lib/array_api_compat/common/_aliases.py +727 -0
  41. scipy/_lib/array_api_compat/common/_fft.py +213 -0
  42. scipy/_lib/array_api_compat/common/_helpers.py +1058 -0
  43. scipy/_lib/array_api_compat/common/_linalg.py +232 -0
  44. scipy/_lib/array_api_compat/common/_typing.py +192 -0
  45. scipy/_lib/array_api_compat/cupy/__init__.py +13 -0
  46. scipy/_lib/array_api_compat/cupy/_aliases.py +156 -0
  47. scipy/_lib/array_api_compat/cupy/_info.py +336 -0
  48. scipy/_lib/array_api_compat/cupy/_typing.py +31 -0
  49. scipy/_lib/array_api_compat/cupy/fft.py +36 -0
  50. scipy/_lib/array_api_compat/cupy/linalg.py +49 -0
  51. scipy/_lib/array_api_compat/dask/__init__.py +0 -0
  52. scipy/_lib/array_api_compat/dask/array/__init__.py +12 -0
  53. scipy/_lib/array_api_compat/dask/array/_aliases.py +376 -0
  54. scipy/_lib/array_api_compat/dask/array/_info.py +416 -0
  55. scipy/_lib/array_api_compat/dask/array/fft.py +21 -0
  56. scipy/_lib/array_api_compat/dask/array/linalg.py +72 -0
  57. scipy/_lib/array_api_compat/numpy/__init__.py +28 -0
  58. scipy/_lib/array_api_compat/numpy/_aliases.py +190 -0
  59. scipy/_lib/array_api_compat/numpy/_info.py +366 -0
  60. scipy/_lib/array_api_compat/numpy/_typing.py +30 -0
  61. scipy/_lib/array_api_compat/numpy/fft.py +35 -0
  62. scipy/_lib/array_api_compat/numpy/linalg.py +143 -0
  63. scipy/_lib/array_api_compat/torch/__init__.py +22 -0
  64. scipy/_lib/array_api_compat/torch/_aliases.py +855 -0
  65. scipy/_lib/array_api_compat/torch/_info.py +369 -0
  66. scipy/_lib/array_api_compat/torch/_typing.py +3 -0
  67. scipy/_lib/array_api_compat/torch/fft.py +85 -0
  68. scipy/_lib/array_api_compat/torch/linalg.py +121 -0
  69. scipy/_lib/array_api_extra/__init__.py +38 -0
  70. scipy/_lib/array_api_extra/_delegation.py +171 -0
  71. scipy/_lib/array_api_extra/_lib/__init__.py +1 -0
  72. scipy/_lib/array_api_extra/_lib/_at.py +463 -0
  73. scipy/_lib/array_api_extra/_lib/_backends.py +46 -0
  74. scipy/_lib/array_api_extra/_lib/_funcs.py +937 -0
  75. scipy/_lib/array_api_extra/_lib/_lazy.py +357 -0
  76. scipy/_lib/array_api_extra/_lib/_testing.py +278 -0
  77. scipy/_lib/array_api_extra/_lib/_utils/__init__.py +1 -0
  78. scipy/_lib/array_api_extra/_lib/_utils/_compat.py +74 -0
  79. scipy/_lib/array_api_extra/_lib/_utils/_compat.pyi +45 -0
  80. scipy/_lib/array_api_extra/_lib/_utils/_helpers.py +559 -0
  81. scipy/_lib/array_api_extra/_lib/_utils/_typing.py +10 -0
  82. scipy/_lib/array_api_extra/_lib/_utils/_typing.pyi +105 -0
  83. scipy/_lib/array_api_extra/testing.py +359 -0
  84. scipy/_lib/cobyqa/__init__.py +20 -0
  85. scipy/_lib/cobyqa/framework.py +1240 -0
  86. scipy/_lib/cobyqa/main.py +1506 -0
  87. scipy/_lib/cobyqa/models.py +1529 -0
  88. scipy/_lib/cobyqa/problem.py +1296 -0
  89. scipy/_lib/cobyqa/settings.py +132 -0
  90. scipy/_lib/cobyqa/subsolvers/__init__.py +14 -0
  91. scipy/_lib/cobyqa/subsolvers/geometry.py +387 -0
  92. scipy/_lib/cobyqa/subsolvers/optim.py +1203 -0
  93. scipy/_lib/cobyqa/utils/__init__.py +18 -0
  94. scipy/_lib/cobyqa/utils/exceptions.py +22 -0
  95. scipy/_lib/cobyqa/utils/math.py +77 -0
  96. scipy/_lib/cobyqa/utils/versions.py +67 -0
  97. scipy/_lib/decorator.py +399 -0
  98. scipy/_lib/deprecation.py +274 -0
  99. scipy/_lib/doccer.py +366 -0
  100. scipy/_lib/messagestream.cp313t-win_arm64.lib +0 -0
  101. scipy/_lib/messagestream.cp313t-win_arm64.pyd +0 -0
  102. scipy/_lib/pyprima/__init__.py +212 -0
  103. scipy/_lib/pyprima/cobyla/__init__.py +0 -0
  104. scipy/_lib/pyprima/cobyla/cobyla.py +559 -0
  105. scipy/_lib/pyprima/cobyla/cobylb.py +714 -0
  106. scipy/_lib/pyprima/cobyla/geometry.py +226 -0
  107. scipy/_lib/pyprima/cobyla/initialize.py +215 -0
  108. scipy/_lib/pyprima/cobyla/trustregion.py +492 -0
  109. scipy/_lib/pyprima/cobyla/update.py +289 -0
  110. scipy/_lib/pyprima/common/__init__.py +0 -0
  111. scipy/_lib/pyprima/common/_bounds.py +34 -0
  112. scipy/_lib/pyprima/common/_linear_constraints.py +46 -0
  113. scipy/_lib/pyprima/common/_nonlinear_constraints.py +54 -0
  114. scipy/_lib/pyprima/common/_project.py +173 -0
  115. scipy/_lib/pyprima/common/checkbreak.py +93 -0
  116. scipy/_lib/pyprima/common/consts.py +47 -0
  117. scipy/_lib/pyprima/common/evaluate.py +99 -0
  118. scipy/_lib/pyprima/common/history.py +38 -0
  119. scipy/_lib/pyprima/common/infos.py +30 -0
  120. scipy/_lib/pyprima/common/linalg.py +435 -0
  121. scipy/_lib/pyprima/common/message.py +290 -0
  122. scipy/_lib/pyprima/common/powalg.py +131 -0
  123. scipy/_lib/pyprima/common/preproc.py +277 -0
  124. scipy/_lib/pyprima/common/present.py +5 -0
  125. scipy/_lib/pyprima/common/ratio.py +54 -0
  126. scipy/_lib/pyprima/common/redrho.py +47 -0
  127. scipy/_lib/pyprima/common/selectx.py +296 -0
  128. scipy/_lib/tests/__init__.py +0 -0
  129. scipy/_lib/tests/test__gcutils.py +110 -0
  130. scipy/_lib/tests/test__pep440.py +67 -0
  131. scipy/_lib/tests/test__testutils.py +32 -0
  132. scipy/_lib/tests/test__threadsafety.py +51 -0
  133. scipy/_lib/tests/test__util.py +641 -0
  134. scipy/_lib/tests/test_array_api.py +322 -0
  135. scipy/_lib/tests/test_bunch.py +169 -0
  136. scipy/_lib/tests/test_ccallback.py +196 -0
  137. scipy/_lib/tests/test_config.py +45 -0
  138. scipy/_lib/tests/test_deprecation.py +10 -0
  139. scipy/_lib/tests/test_doccer.py +143 -0
  140. scipy/_lib/tests/test_import_cycles.py +18 -0
  141. scipy/_lib/tests/test_public_api.py +482 -0
  142. scipy/_lib/tests/test_scipy_version.py +28 -0
  143. scipy/_lib/tests/test_tmpdirs.py +48 -0
  144. scipy/_lib/tests/test_warnings.py +137 -0
  145. scipy/_lib/uarray.py +31 -0
  146. scipy/cluster/__init__.py +31 -0
  147. scipy/cluster/_hierarchy.cp313t-win_arm64.lib +0 -0
  148. scipy/cluster/_hierarchy.cp313t-win_arm64.pyd +0 -0
  149. scipy/cluster/_optimal_leaf_ordering.cp313t-win_arm64.lib +0 -0
  150. scipy/cluster/_optimal_leaf_ordering.cp313t-win_arm64.pyd +0 -0
  151. scipy/cluster/_vq.cp313t-win_arm64.lib +0 -0
  152. scipy/cluster/_vq.cp313t-win_arm64.pyd +0 -0
  153. scipy/cluster/hierarchy.py +4348 -0
  154. scipy/cluster/tests/__init__.py +0 -0
  155. scipy/cluster/tests/hierarchy_test_data.py +145 -0
  156. scipy/cluster/tests/test_disjoint_set.py +202 -0
  157. scipy/cluster/tests/test_hierarchy.py +1238 -0
  158. scipy/cluster/tests/test_vq.py +434 -0
  159. scipy/cluster/vq.py +832 -0
  160. scipy/conftest.py +683 -0
  161. scipy/constants/__init__.py +358 -0
  162. scipy/constants/_codata.py +2266 -0
  163. scipy/constants/_constants.py +369 -0
  164. scipy/constants/codata.py +21 -0
  165. scipy/constants/constants.py +53 -0
  166. scipy/constants/tests/__init__.py +0 -0
  167. scipy/constants/tests/test_codata.py +78 -0
  168. scipy/constants/tests/test_constants.py +83 -0
  169. scipy/datasets/__init__.py +90 -0
  170. scipy/datasets/_download_all.py +71 -0
  171. scipy/datasets/_fetchers.py +225 -0
  172. scipy/datasets/_registry.py +26 -0
  173. scipy/datasets/_utils.py +81 -0
  174. scipy/datasets/tests/__init__.py +0 -0
  175. scipy/datasets/tests/test_data.py +128 -0
  176. scipy/differentiate/__init__.py +27 -0
  177. scipy/differentiate/_differentiate.py +1129 -0
  178. scipy/differentiate/tests/__init__.py +0 -0
  179. scipy/differentiate/tests/test_differentiate.py +694 -0
  180. scipy/fft/__init__.py +114 -0
  181. scipy/fft/_backend.py +196 -0
  182. scipy/fft/_basic.py +1650 -0
  183. scipy/fft/_basic_backend.py +197 -0
  184. scipy/fft/_debug_backends.py +22 -0
  185. scipy/fft/_fftlog.py +223 -0
  186. scipy/fft/_fftlog_backend.py +200 -0
  187. scipy/fft/_helper.py +348 -0
  188. scipy/fft/_pocketfft/LICENSE.md +25 -0
  189. scipy/fft/_pocketfft/__init__.py +9 -0
  190. scipy/fft/_pocketfft/basic.py +251 -0
  191. scipy/fft/_pocketfft/helper.py +249 -0
  192. scipy/fft/_pocketfft/pypocketfft.cp313t-win_arm64.lib +0 -0
  193. scipy/fft/_pocketfft/pypocketfft.cp313t-win_arm64.pyd +0 -0
  194. scipy/fft/_pocketfft/realtransforms.py +109 -0
  195. scipy/fft/_pocketfft/tests/__init__.py +0 -0
  196. scipy/fft/_pocketfft/tests/test_basic.py +1011 -0
  197. scipy/fft/_pocketfft/tests/test_real_transforms.py +505 -0
  198. scipy/fft/_realtransforms.py +706 -0
  199. scipy/fft/_realtransforms_backend.py +63 -0
  200. scipy/fft/tests/__init__.py +0 -0
  201. scipy/fft/tests/mock_backend.py +96 -0
  202. scipy/fft/tests/test_backend.py +98 -0
  203. scipy/fft/tests/test_basic.py +504 -0
  204. scipy/fft/tests/test_fftlog.py +215 -0
  205. scipy/fft/tests/test_helper.py +558 -0
  206. scipy/fft/tests/test_multithreading.py +84 -0
  207. scipy/fft/tests/test_real_transforms.py +247 -0
  208. scipy/fftpack/__init__.py +103 -0
  209. scipy/fftpack/_basic.py +428 -0
  210. scipy/fftpack/_helper.py +115 -0
  211. scipy/fftpack/_pseudo_diffs.py +554 -0
  212. scipy/fftpack/_realtransforms.py +598 -0
  213. scipy/fftpack/basic.py +20 -0
  214. scipy/fftpack/convolve.cp313t-win_arm64.lib +0 -0
  215. scipy/fftpack/convolve.cp313t-win_arm64.pyd +0 -0
  216. scipy/fftpack/helper.py +19 -0
  217. scipy/fftpack/pseudo_diffs.py +22 -0
  218. scipy/fftpack/realtransforms.py +19 -0
  219. scipy/fftpack/tests/__init__.py +0 -0
  220. scipy/fftpack/tests/fftw_double_ref.npz +0 -0
  221. scipy/fftpack/tests/fftw_longdouble_ref.npz +0 -0
  222. scipy/fftpack/tests/fftw_single_ref.npz +0 -0
  223. scipy/fftpack/tests/test.npz +0 -0
  224. scipy/fftpack/tests/test_basic.py +877 -0
  225. scipy/fftpack/tests/test_helper.py +54 -0
  226. scipy/fftpack/tests/test_import.py +33 -0
  227. scipy/fftpack/tests/test_pseudo_diffs.py +388 -0
  228. scipy/fftpack/tests/test_real_transforms.py +836 -0
  229. scipy/integrate/__init__.py +122 -0
  230. scipy/integrate/_bvp.py +1160 -0
  231. scipy/integrate/_cubature.py +729 -0
  232. scipy/integrate/_dop.cp313t-win_arm64.lib +0 -0
  233. scipy/integrate/_dop.cp313t-win_arm64.pyd +0 -0
  234. scipy/integrate/_ivp/__init__.py +8 -0
  235. scipy/integrate/_ivp/base.py +290 -0
  236. scipy/integrate/_ivp/bdf.py +478 -0
  237. scipy/integrate/_ivp/common.py +451 -0
  238. scipy/integrate/_ivp/dop853_coefficients.py +193 -0
  239. scipy/integrate/_ivp/ivp.py +755 -0
  240. scipy/integrate/_ivp/lsoda.py +224 -0
  241. scipy/integrate/_ivp/radau.py +572 -0
  242. scipy/integrate/_ivp/rk.py +601 -0
  243. scipy/integrate/_ivp/tests/__init__.py +0 -0
  244. scipy/integrate/_ivp/tests/test_ivp.py +1287 -0
  245. scipy/integrate/_ivp/tests/test_rk.py +37 -0
  246. scipy/integrate/_lebedev.py +5450 -0
  247. scipy/integrate/_lsoda.cp313t-win_arm64.lib +0 -0
  248. scipy/integrate/_lsoda.cp313t-win_arm64.pyd +0 -0
  249. scipy/integrate/_ode.py +1395 -0
  250. scipy/integrate/_odepack.cp313t-win_arm64.lib +0 -0
  251. scipy/integrate/_odepack.cp313t-win_arm64.pyd +0 -0
  252. scipy/integrate/_odepack_py.py +273 -0
  253. scipy/integrate/_quad_vec.py +674 -0
  254. scipy/integrate/_quadpack.cp313t-win_arm64.lib +0 -0
  255. scipy/integrate/_quadpack.cp313t-win_arm64.pyd +0 -0
  256. scipy/integrate/_quadpack_py.py +1283 -0
  257. scipy/integrate/_quadrature.py +1336 -0
  258. scipy/integrate/_rules/__init__.py +12 -0
  259. scipy/integrate/_rules/_base.py +518 -0
  260. scipy/integrate/_rules/_gauss_kronrod.py +202 -0
  261. scipy/integrate/_rules/_gauss_legendre.py +62 -0
  262. scipy/integrate/_rules/_genz_malik.py +210 -0
  263. scipy/integrate/_tanhsinh.py +1385 -0
  264. scipy/integrate/_test_multivariate.cp313t-win_arm64.lib +0 -0
  265. scipy/integrate/_test_multivariate.cp313t-win_arm64.pyd +0 -0
  266. scipy/integrate/_test_odeint_banded.cp313t-win_arm64.lib +0 -0
  267. scipy/integrate/_test_odeint_banded.cp313t-win_arm64.pyd +0 -0
  268. scipy/integrate/_vode.cp313t-win_arm64.lib +0 -0
  269. scipy/integrate/_vode.cp313t-win_arm64.pyd +0 -0
  270. scipy/integrate/dop.py +15 -0
  271. scipy/integrate/lsoda.py +15 -0
  272. scipy/integrate/odepack.py +17 -0
  273. scipy/integrate/quadpack.py +23 -0
  274. scipy/integrate/tests/__init__.py +0 -0
  275. scipy/integrate/tests/test__quad_vec.py +211 -0
  276. scipy/integrate/tests/test_banded_ode_solvers.py +305 -0
  277. scipy/integrate/tests/test_bvp.py +714 -0
  278. scipy/integrate/tests/test_cubature.py +1375 -0
  279. scipy/integrate/tests/test_integrate.py +840 -0
  280. scipy/integrate/tests/test_odeint_jac.py +74 -0
  281. scipy/integrate/tests/test_quadpack.py +680 -0
  282. scipy/integrate/tests/test_quadrature.py +730 -0
  283. scipy/integrate/tests/test_tanhsinh.py +1171 -0
  284. scipy/integrate/vode.py +15 -0
  285. scipy/interpolate/__init__.py +228 -0
  286. scipy/interpolate/_bary_rational.py +715 -0
  287. scipy/interpolate/_bsplines.py +2469 -0
  288. scipy/interpolate/_cubic.py +973 -0
  289. scipy/interpolate/_dfitpack.cp313t-win_arm64.lib +0 -0
  290. scipy/interpolate/_dfitpack.cp313t-win_arm64.pyd +0 -0
  291. scipy/interpolate/_dierckx.cp313t-win_arm64.lib +0 -0
  292. scipy/interpolate/_dierckx.cp313t-win_arm64.pyd +0 -0
  293. scipy/interpolate/_fitpack.cp313t-win_arm64.lib +0 -0
  294. scipy/interpolate/_fitpack.cp313t-win_arm64.pyd +0 -0
  295. scipy/interpolate/_fitpack2.py +2397 -0
  296. scipy/interpolate/_fitpack_impl.py +811 -0
  297. scipy/interpolate/_fitpack_py.py +898 -0
  298. scipy/interpolate/_fitpack_repro.py +996 -0
  299. scipy/interpolate/_interpnd.cp313t-win_arm64.lib +0 -0
  300. scipy/interpolate/_interpnd.cp313t-win_arm64.pyd +0 -0
  301. scipy/interpolate/_interpolate.py +2266 -0
  302. scipy/interpolate/_ndbspline.py +415 -0
  303. scipy/interpolate/_ndgriddata.py +329 -0
  304. scipy/interpolate/_pade.py +67 -0
  305. scipy/interpolate/_polyint.py +1025 -0
  306. scipy/interpolate/_ppoly.cp313t-win_arm64.lib +0 -0
  307. scipy/interpolate/_ppoly.cp313t-win_arm64.pyd +0 -0
  308. scipy/interpolate/_rbf.py +290 -0
  309. scipy/interpolate/_rbfinterp.py +550 -0
  310. scipy/interpolate/_rbfinterp_pythran.cp313t-win_arm64.lib +0 -0
  311. scipy/interpolate/_rbfinterp_pythran.cp313t-win_arm64.pyd +0 -0
  312. scipy/interpolate/_rgi.py +764 -0
  313. scipy/interpolate/_rgi_cython.cp313t-win_arm64.lib +0 -0
  314. scipy/interpolate/_rgi_cython.cp313t-win_arm64.pyd +0 -0
  315. scipy/interpolate/dfitpack.py +24 -0
  316. scipy/interpolate/fitpack.py +31 -0
  317. scipy/interpolate/fitpack2.py +29 -0
  318. scipy/interpolate/interpnd.py +24 -0
  319. scipy/interpolate/interpolate.py +30 -0
  320. scipy/interpolate/ndgriddata.py +23 -0
  321. scipy/interpolate/polyint.py +24 -0
  322. scipy/interpolate/rbf.py +18 -0
  323. scipy/interpolate/tests/__init__.py +0 -0
  324. scipy/interpolate/tests/data/bug-1310.npz +0 -0
  325. scipy/interpolate/tests/data/estimate_gradients_hang.npy +0 -0
  326. scipy/interpolate/tests/data/gcvspl.npz +0 -0
  327. scipy/interpolate/tests/test_bary_rational.py +368 -0
  328. scipy/interpolate/tests/test_bsplines.py +3754 -0
  329. scipy/interpolate/tests/test_fitpack.py +519 -0
  330. scipy/interpolate/tests/test_fitpack2.py +1431 -0
  331. scipy/interpolate/tests/test_gil.py +64 -0
  332. scipy/interpolate/tests/test_interpnd.py +452 -0
  333. scipy/interpolate/tests/test_interpolate.py +2630 -0
  334. scipy/interpolate/tests/test_ndgriddata.py +308 -0
  335. scipy/interpolate/tests/test_pade.py +107 -0
  336. scipy/interpolate/tests/test_polyint.py +972 -0
  337. scipy/interpolate/tests/test_rbf.py +246 -0
  338. scipy/interpolate/tests/test_rbfinterp.py +534 -0
  339. scipy/interpolate/tests/test_rgi.py +1151 -0
  340. scipy/io/__init__.py +116 -0
  341. scipy/io/_fast_matrix_market/__init__.py +600 -0
  342. scipy/io/_fast_matrix_market/_fmm_core.cp313t-win_arm64.lib +0 -0
  343. scipy/io/_fast_matrix_market/_fmm_core.cp313t-win_arm64.pyd +0 -0
  344. scipy/io/_fortran.py +354 -0
  345. scipy/io/_harwell_boeing/__init__.py +7 -0
  346. scipy/io/_harwell_boeing/_fortran_format_parser.py +316 -0
  347. scipy/io/_harwell_boeing/hb.py +571 -0
  348. scipy/io/_harwell_boeing/tests/__init__.py +0 -0
  349. scipy/io/_harwell_boeing/tests/test_fortran_format.py +74 -0
  350. scipy/io/_harwell_boeing/tests/test_hb.py +70 -0
  351. scipy/io/_idl.py +917 -0
  352. scipy/io/_mmio.py +968 -0
  353. scipy/io/_netcdf.py +1104 -0
  354. scipy/io/_test_fortran.cp313t-win_arm64.lib +0 -0
  355. scipy/io/_test_fortran.cp313t-win_arm64.pyd +0 -0
  356. scipy/io/arff/__init__.py +28 -0
  357. scipy/io/arff/_arffread.py +873 -0
  358. scipy/io/arff/arffread.py +19 -0
  359. scipy/io/arff/tests/__init__.py +0 -0
  360. scipy/io/arff/tests/data/iris.arff +225 -0
  361. scipy/io/arff/tests/data/missing.arff +8 -0
  362. scipy/io/arff/tests/data/nodata.arff +11 -0
  363. scipy/io/arff/tests/data/quoted_nominal.arff +13 -0
  364. scipy/io/arff/tests/data/quoted_nominal_spaces.arff +13 -0
  365. scipy/io/arff/tests/data/test1.arff +10 -0
  366. scipy/io/arff/tests/data/test10.arff +8 -0
  367. scipy/io/arff/tests/data/test11.arff +11 -0
  368. scipy/io/arff/tests/data/test2.arff +15 -0
  369. scipy/io/arff/tests/data/test3.arff +6 -0
  370. scipy/io/arff/tests/data/test4.arff +11 -0
  371. scipy/io/arff/tests/data/test5.arff +26 -0
  372. scipy/io/arff/tests/data/test6.arff +12 -0
  373. scipy/io/arff/tests/data/test7.arff +15 -0
  374. scipy/io/arff/tests/data/test8.arff +12 -0
  375. scipy/io/arff/tests/data/test9.arff +14 -0
  376. scipy/io/arff/tests/test_arffread.py +421 -0
  377. scipy/io/harwell_boeing.py +17 -0
  378. scipy/io/idl.py +17 -0
  379. scipy/io/matlab/__init__.py +66 -0
  380. scipy/io/matlab/_byteordercodes.py +75 -0
  381. scipy/io/matlab/_mio.py +375 -0
  382. scipy/io/matlab/_mio4.py +632 -0
  383. scipy/io/matlab/_mio5.py +901 -0
  384. scipy/io/matlab/_mio5_params.py +281 -0
  385. scipy/io/matlab/_mio5_utils.cp313t-win_arm64.lib +0 -0
  386. scipy/io/matlab/_mio5_utils.cp313t-win_arm64.pyd +0 -0
  387. scipy/io/matlab/_mio_utils.cp313t-win_arm64.lib +0 -0
  388. scipy/io/matlab/_mio_utils.cp313t-win_arm64.pyd +0 -0
  389. scipy/io/matlab/_miobase.py +435 -0
  390. scipy/io/matlab/_streams.cp313t-win_arm64.lib +0 -0
  391. scipy/io/matlab/_streams.cp313t-win_arm64.pyd +0 -0
  392. scipy/io/matlab/byteordercodes.py +17 -0
  393. scipy/io/matlab/mio.py +16 -0
  394. scipy/io/matlab/mio4.py +17 -0
  395. scipy/io/matlab/mio5.py +19 -0
  396. scipy/io/matlab/mio5_params.py +18 -0
  397. scipy/io/matlab/mio5_utils.py +17 -0
  398. scipy/io/matlab/mio_utils.py +17 -0
  399. scipy/io/matlab/miobase.py +16 -0
  400. scipy/io/matlab/streams.py +16 -0
  401. scipy/io/matlab/tests/__init__.py +0 -0
  402. scipy/io/matlab/tests/data/bad_miuint32.mat +0 -0
  403. scipy/io/matlab/tests/data/bad_miutf8_array_name.mat +0 -0
  404. scipy/io/matlab/tests/data/big_endian.mat +0 -0
  405. scipy/io/matlab/tests/data/broken_utf8.mat +0 -0
  406. scipy/io/matlab/tests/data/corrupted_zlib_checksum.mat +0 -0
  407. scipy/io/matlab/tests/data/corrupted_zlib_data.mat +0 -0
  408. scipy/io/matlab/tests/data/debigged_m4.mat +0 -0
  409. scipy/io/matlab/tests/data/japanese_utf8.txt +5 -0
  410. scipy/io/matlab/tests/data/little_endian.mat +0 -0
  411. scipy/io/matlab/tests/data/logical_sparse.mat +0 -0
  412. scipy/io/matlab/tests/data/malformed1.mat +0 -0
  413. scipy/io/matlab/tests/data/miuint32_for_miint32.mat +0 -0
  414. scipy/io/matlab/tests/data/miutf8_array_name.mat +0 -0
  415. scipy/io/matlab/tests/data/nasty_duplicate_fieldnames.mat +0 -0
  416. scipy/io/matlab/tests/data/one_by_zero_char.mat +0 -0
  417. scipy/io/matlab/tests/data/parabola.mat +0 -0
  418. scipy/io/matlab/tests/data/single_empty_string.mat +0 -0
  419. scipy/io/matlab/tests/data/some_functions.mat +0 -0
  420. scipy/io/matlab/tests/data/sqr.mat +0 -0
  421. scipy/io/matlab/tests/data/test3dmatrix_6.1_SOL2.mat +0 -0
  422. scipy/io/matlab/tests/data/test3dmatrix_6.5.1_GLNX86.mat +0 -0
  423. scipy/io/matlab/tests/data/test3dmatrix_7.1_GLNX86.mat +0 -0
  424. scipy/io/matlab/tests/data/test3dmatrix_7.4_GLNX86.mat +0 -0
  425. scipy/io/matlab/tests/data/test_empty_struct.mat +0 -0
  426. scipy/io/matlab/tests/data/test_mat4_le_floats.mat +0 -0
  427. scipy/io/matlab/tests/data/test_skip_variable.mat +0 -0
  428. scipy/io/matlab/tests/data/testbool_8_WIN64.mat +0 -0
  429. scipy/io/matlab/tests/data/testcell_6.1_SOL2.mat +0 -0
  430. scipy/io/matlab/tests/data/testcell_6.5.1_GLNX86.mat +0 -0
  431. scipy/io/matlab/tests/data/testcell_7.1_GLNX86.mat +0 -0
  432. scipy/io/matlab/tests/data/testcell_7.4_GLNX86.mat +0 -0
  433. scipy/io/matlab/tests/data/testcellnest_6.1_SOL2.mat +0 -0
  434. scipy/io/matlab/tests/data/testcellnest_6.5.1_GLNX86.mat +0 -0
  435. scipy/io/matlab/tests/data/testcellnest_7.1_GLNX86.mat +0 -0
  436. scipy/io/matlab/tests/data/testcellnest_7.4_GLNX86.mat +0 -0
  437. scipy/io/matlab/tests/data/testcomplex_4.2c_SOL2.mat +0 -0
  438. scipy/io/matlab/tests/data/testcomplex_6.1_SOL2.mat +0 -0
  439. scipy/io/matlab/tests/data/testcomplex_6.5.1_GLNX86.mat +0 -0
  440. scipy/io/matlab/tests/data/testcomplex_7.1_GLNX86.mat +0 -0
  441. scipy/io/matlab/tests/data/testcomplex_7.4_GLNX86.mat +0 -0
  442. scipy/io/matlab/tests/data/testdouble_4.2c_SOL2.mat +0 -0
  443. scipy/io/matlab/tests/data/testdouble_6.1_SOL2.mat +0 -0
  444. scipy/io/matlab/tests/data/testdouble_6.5.1_GLNX86.mat +0 -0
  445. scipy/io/matlab/tests/data/testdouble_7.1_GLNX86.mat +0 -0
  446. scipy/io/matlab/tests/data/testdouble_7.4_GLNX86.mat +0 -0
  447. scipy/io/matlab/tests/data/testemptycell_5.3_SOL2.mat +0 -0
  448. scipy/io/matlab/tests/data/testemptycell_6.5.1_GLNX86.mat +0 -0
  449. scipy/io/matlab/tests/data/testemptycell_7.1_GLNX86.mat +0 -0
  450. scipy/io/matlab/tests/data/testemptycell_7.4_GLNX86.mat +0 -0
  451. scipy/io/matlab/tests/data/testfunc_7.4_GLNX86.mat +0 -0
  452. scipy/io/matlab/tests/data/testhdf5_7.4_GLNX86.mat +0 -0
  453. scipy/io/matlab/tests/data/testmatrix_4.2c_SOL2.mat +0 -0
  454. scipy/io/matlab/tests/data/testmatrix_6.1_SOL2.mat +0 -0
  455. scipy/io/matlab/tests/data/testmatrix_6.5.1_GLNX86.mat +0 -0
  456. scipy/io/matlab/tests/data/testmatrix_7.1_GLNX86.mat +0 -0
  457. scipy/io/matlab/tests/data/testmatrix_7.4_GLNX86.mat +0 -0
  458. scipy/io/matlab/tests/data/testminus_4.2c_SOL2.mat +0 -0
  459. scipy/io/matlab/tests/data/testminus_6.1_SOL2.mat +0 -0
  460. scipy/io/matlab/tests/data/testminus_6.5.1_GLNX86.mat +0 -0
  461. scipy/io/matlab/tests/data/testminus_7.1_GLNX86.mat +0 -0
  462. scipy/io/matlab/tests/data/testminus_7.4_GLNX86.mat +0 -0
  463. scipy/io/matlab/tests/data/testmulti_4.2c_SOL2.mat +0 -0
  464. scipy/io/matlab/tests/data/testmulti_7.1_GLNX86.mat +0 -0
  465. scipy/io/matlab/tests/data/testmulti_7.4_GLNX86.mat +0 -0
  466. scipy/io/matlab/tests/data/testobject_6.1_SOL2.mat +0 -0
  467. scipy/io/matlab/tests/data/testobject_6.5.1_GLNX86.mat +0 -0
  468. scipy/io/matlab/tests/data/testobject_7.1_GLNX86.mat +0 -0
  469. scipy/io/matlab/tests/data/testobject_7.4_GLNX86.mat +0 -0
  470. scipy/io/matlab/tests/data/testonechar_4.2c_SOL2.mat +0 -0
  471. scipy/io/matlab/tests/data/testonechar_6.1_SOL2.mat +0 -0
  472. scipy/io/matlab/tests/data/testonechar_6.5.1_GLNX86.mat +0 -0
  473. scipy/io/matlab/tests/data/testonechar_7.1_GLNX86.mat +0 -0
  474. scipy/io/matlab/tests/data/testonechar_7.4_GLNX86.mat +0 -0
  475. scipy/io/matlab/tests/data/testscalarcell_7.4_GLNX86.mat +0 -0
  476. scipy/io/matlab/tests/data/testsimplecell.mat +0 -0
  477. scipy/io/matlab/tests/data/testsparse_4.2c_SOL2.mat +0 -0
  478. scipy/io/matlab/tests/data/testsparse_6.1_SOL2.mat +0 -0
  479. scipy/io/matlab/tests/data/testsparse_6.5.1_GLNX86.mat +0 -0
  480. scipy/io/matlab/tests/data/testsparse_7.1_GLNX86.mat +0 -0
  481. scipy/io/matlab/tests/data/testsparse_7.4_GLNX86.mat +0 -0
  482. scipy/io/matlab/tests/data/testsparsecomplex_4.2c_SOL2.mat +0 -0
  483. scipy/io/matlab/tests/data/testsparsecomplex_6.1_SOL2.mat +0 -0
  484. scipy/io/matlab/tests/data/testsparsecomplex_6.5.1_GLNX86.mat +0 -0
  485. scipy/io/matlab/tests/data/testsparsecomplex_7.1_GLNX86.mat +0 -0
  486. scipy/io/matlab/tests/data/testsparsecomplex_7.4_GLNX86.mat +0 -0
  487. scipy/io/matlab/tests/data/testsparsefloat_7.4_GLNX86.mat +0 -0
  488. scipy/io/matlab/tests/data/teststring_4.2c_SOL2.mat +0 -0
  489. scipy/io/matlab/tests/data/teststring_6.1_SOL2.mat +0 -0
  490. scipy/io/matlab/tests/data/teststring_6.5.1_GLNX86.mat +0 -0
  491. scipy/io/matlab/tests/data/teststring_7.1_GLNX86.mat +0 -0
  492. scipy/io/matlab/tests/data/teststring_7.4_GLNX86.mat +0 -0
  493. scipy/io/matlab/tests/data/teststringarray_4.2c_SOL2.mat +0 -0
  494. scipy/io/matlab/tests/data/teststringarray_6.1_SOL2.mat +0 -0
  495. scipy/io/matlab/tests/data/teststringarray_6.5.1_GLNX86.mat +0 -0
  496. scipy/io/matlab/tests/data/teststringarray_7.1_GLNX86.mat +0 -0
  497. scipy/io/matlab/tests/data/teststringarray_7.4_GLNX86.mat +0 -0
  498. scipy/io/matlab/tests/data/teststruct_6.1_SOL2.mat +0 -0
  499. scipy/io/matlab/tests/data/teststruct_6.5.1_GLNX86.mat +0 -0
  500. scipy/io/matlab/tests/data/teststruct_7.1_GLNX86.mat +0 -0
  501. scipy/io/matlab/tests/data/teststruct_7.4_GLNX86.mat +0 -0
  502. scipy/io/matlab/tests/data/teststructarr_6.1_SOL2.mat +0 -0
  503. scipy/io/matlab/tests/data/teststructarr_6.5.1_GLNX86.mat +0 -0
  504. scipy/io/matlab/tests/data/teststructarr_7.1_GLNX86.mat +0 -0
  505. scipy/io/matlab/tests/data/teststructarr_7.4_GLNX86.mat +0 -0
  506. scipy/io/matlab/tests/data/teststructnest_6.1_SOL2.mat +0 -0
  507. scipy/io/matlab/tests/data/teststructnest_6.5.1_GLNX86.mat +0 -0
  508. scipy/io/matlab/tests/data/teststructnest_7.1_GLNX86.mat +0 -0
  509. scipy/io/matlab/tests/data/teststructnest_7.4_GLNX86.mat +0 -0
  510. scipy/io/matlab/tests/data/testunicode_7.1_GLNX86.mat +0 -0
  511. scipy/io/matlab/tests/data/testunicode_7.4_GLNX86.mat +0 -0
  512. scipy/io/matlab/tests/data/testvec_4_GLNX86.mat +0 -0
  513. scipy/io/matlab/tests/test_byteordercodes.py +29 -0
  514. scipy/io/matlab/tests/test_mio.py +1399 -0
  515. scipy/io/matlab/tests/test_mio5_utils.py +179 -0
  516. scipy/io/matlab/tests/test_mio_funcs.py +51 -0
  517. scipy/io/matlab/tests/test_mio_utils.py +45 -0
  518. scipy/io/matlab/tests/test_miobase.py +32 -0
  519. scipy/io/matlab/tests/test_pathological.py +33 -0
  520. scipy/io/matlab/tests/test_streams.py +241 -0
  521. scipy/io/mmio.py +17 -0
  522. scipy/io/netcdf.py +17 -0
  523. scipy/io/tests/__init__.py +0 -0
  524. scipy/io/tests/data/Transparent Busy.ani +0 -0
  525. scipy/io/tests/data/array_float32_1d.sav +0 -0
  526. scipy/io/tests/data/array_float32_2d.sav +0 -0
  527. scipy/io/tests/data/array_float32_3d.sav +0 -0
  528. scipy/io/tests/data/array_float32_4d.sav +0 -0
  529. scipy/io/tests/data/array_float32_5d.sav +0 -0
  530. scipy/io/tests/data/array_float32_6d.sav +0 -0
  531. scipy/io/tests/data/array_float32_7d.sav +0 -0
  532. scipy/io/tests/data/array_float32_8d.sav +0 -0
  533. scipy/io/tests/data/array_float32_pointer_1d.sav +0 -0
  534. scipy/io/tests/data/array_float32_pointer_2d.sav +0 -0
  535. scipy/io/tests/data/array_float32_pointer_3d.sav +0 -0
  536. scipy/io/tests/data/array_float32_pointer_4d.sav +0 -0
  537. scipy/io/tests/data/array_float32_pointer_5d.sav +0 -0
  538. scipy/io/tests/data/array_float32_pointer_6d.sav +0 -0
  539. scipy/io/tests/data/array_float32_pointer_7d.sav +0 -0
  540. scipy/io/tests/data/array_float32_pointer_8d.sav +0 -0
  541. scipy/io/tests/data/example_1.nc +0 -0
  542. scipy/io/tests/data/example_2.nc +0 -0
  543. scipy/io/tests/data/example_3_maskedvals.nc +0 -0
  544. scipy/io/tests/data/fortran-3x3d-2i.dat +0 -0
  545. scipy/io/tests/data/fortran-mixed.dat +0 -0
  546. scipy/io/tests/data/fortran-sf8-11x1x10.dat +0 -0
  547. scipy/io/tests/data/fortran-sf8-15x10x22.dat +0 -0
  548. scipy/io/tests/data/fortran-sf8-1x1x1.dat +0 -0
  549. scipy/io/tests/data/fortran-sf8-1x1x5.dat +0 -0
  550. scipy/io/tests/data/fortran-sf8-1x1x7.dat +0 -0
  551. scipy/io/tests/data/fortran-sf8-1x3x5.dat +0 -0
  552. scipy/io/tests/data/fortran-si4-11x1x10.dat +0 -0
  553. scipy/io/tests/data/fortran-si4-15x10x22.dat +0 -0
  554. scipy/io/tests/data/fortran-si4-1x1x1.dat +0 -0
  555. scipy/io/tests/data/fortran-si4-1x1x5.dat +0 -0
  556. scipy/io/tests/data/fortran-si4-1x1x7.dat +0 -0
  557. scipy/io/tests/data/fortran-si4-1x3x5.dat +0 -0
  558. scipy/io/tests/data/invalid_pointer.sav +0 -0
  559. scipy/io/tests/data/null_pointer.sav +0 -0
  560. scipy/io/tests/data/scalar_byte.sav +0 -0
  561. scipy/io/tests/data/scalar_byte_descr.sav +0 -0
  562. scipy/io/tests/data/scalar_complex32.sav +0 -0
  563. scipy/io/tests/data/scalar_complex64.sav +0 -0
  564. scipy/io/tests/data/scalar_float32.sav +0 -0
  565. scipy/io/tests/data/scalar_float64.sav +0 -0
  566. scipy/io/tests/data/scalar_heap_pointer.sav +0 -0
  567. scipy/io/tests/data/scalar_int16.sav +0 -0
  568. scipy/io/tests/data/scalar_int32.sav +0 -0
  569. scipy/io/tests/data/scalar_int64.sav +0 -0
  570. scipy/io/tests/data/scalar_string.sav +0 -0
  571. scipy/io/tests/data/scalar_uint16.sav +0 -0
  572. scipy/io/tests/data/scalar_uint32.sav +0 -0
  573. scipy/io/tests/data/scalar_uint64.sav +0 -0
  574. scipy/io/tests/data/struct_arrays.sav +0 -0
  575. scipy/io/tests/data/struct_arrays_byte_idl80.sav +0 -0
  576. scipy/io/tests/data/struct_arrays_replicated.sav +0 -0
  577. scipy/io/tests/data/struct_arrays_replicated_3d.sav +0 -0
  578. scipy/io/tests/data/struct_inherit.sav +0 -0
  579. scipy/io/tests/data/struct_pointer_arrays.sav +0 -0
  580. scipy/io/tests/data/struct_pointer_arrays_replicated.sav +0 -0
  581. scipy/io/tests/data/struct_pointer_arrays_replicated_3d.sav +0 -0
  582. scipy/io/tests/data/struct_pointers.sav +0 -0
  583. scipy/io/tests/data/struct_pointers_replicated.sav +0 -0
  584. scipy/io/tests/data/struct_pointers_replicated_3d.sav +0 -0
  585. scipy/io/tests/data/struct_scalars.sav +0 -0
  586. scipy/io/tests/data/struct_scalars_replicated.sav +0 -0
  587. scipy/io/tests/data/struct_scalars_replicated_3d.sav +0 -0
  588. scipy/io/tests/data/test-1234Hz-le-1ch-10S-20bit-extra.wav +0 -0
  589. scipy/io/tests/data/test-44100Hz-2ch-32bit-float-be.wav +0 -0
  590. scipy/io/tests/data/test-44100Hz-2ch-32bit-float-le.wav +0 -0
  591. scipy/io/tests/data/test-44100Hz-be-1ch-4bytes.wav +0 -0
  592. scipy/io/tests/data/test-44100Hz-le-1ch-4bytes-early-eof-no-data.wav +0 -0
  593. scipy/io/tests/data/test-44100Hz-le-1ch-4bytes-early-eof.wav +0 -0
  594. scipy/io/tests/data/test-44100Hz-le-1ch-4bytes-incomplete-chunk.wav +0 -0
  595. scipy/io/tests/data/test-44100Hz-le-1ch-4bytes-rf64.wav +0 -0
  596. scipy/io/tests/data/test-44100Hz-le-1ch-4bytes.wav +0 -0
  597. scipy/io/tests/data/test-48000Hz-2ch-64bit-float-le-wavex.wav +0 -0
  598. scipy/io/tests/data/test-8000Hz-be-3ch-5S-24bit.wav +0 -0
  599. scipy/io/tests/data/test-8000Hz-le-1ch-1byte-ulaw.wav +0 -0
  600. scipy/io/tests/data/test-8000Hz-le-2ch-1byteu.wav +0 -0
  601. scipy/io/tests/data/test-8000Hz-le-3ch-5S-24bit-inconsistent.wav +0 -0
  602. scipy/io/tests/data/test-8000Hz-le-3ch-5S-24bit-rf64.wav +0 -0
  603. scipy/io/tests/data/test-8000Hz-le-3ch-5S-24bit.wav +0 -0
  604. scipy/io/tests/data/test-8000Hz-le-3ch-5S-36bit.wav +0 -0
  605. scipy/io/tests/data/test-8000Hz-le-3ch-5S-45bit.wav +0 -0
  606. scipy/io/tests/data/test-8000Hz-le-3ch-5S-53bit.wav +0 -0
  607. scipy/io/tests/data/test-8000Hz-le-3ch-5S-64bit.wav +0 -0
  608. scipy/io/tests/data/test-8000Hz-le-4ch-9S-12bit.wav +0 -0
  609. scipy/io/tests/data/test-8000Hz-le-5ch-9S-5bit.wav +0 -0
  610. scipy/io/tests/data/various_compressed.sav +0 -0
  611. scipy/io/tests/test_fortran.py +264 -0
  612. scipy/io/tests/test_idl.py +483 -0
  613. scipy/io/tests/test_mmio.py +831 -0
  614. scipy/io/tests/test_netcdf.py +550 -0
  615. scipy/io/tests/test_paths.py +93 -0
  616. scipy/io/tests/test_wavfile.py +501 -0
  617. scipy/io/wavfile.py +938 -0
  618. scipy/linalg/__init__.pxd +1 -0
  619. scipy/linalg/__init__.py +236 -0
  620. scipy/linalg/_basic.py +2146 -0
  621. scipy/linalg/_blas_subroutines.h +164 -0
  622. scipy/linalg/_cythonized_array_utils.cp313t-win_arm64.lib +0 -0
  623. scipy/linalg/_cythonized_array_utils.cp313t-win_arm64.pyd +0 -0
  624. scipy/linalg/_cythonized_array_utils.pxd +40 -0
  625. scipy/linalg/_cythonized_array_utils.pyi +16 -0
  626. scipy/linalg/_decomp.py +1645 -0
  627. scipy/linalg/_decomp_cholesky.py +413 -0
  628. scipy/linalg/_decomp_cossin.py +236 -0
  629. scipy/linalg/_decomp_interpolative.cp313t-win_arm64.lib +0 -0
  630. scipy/linalg/_decomp_interpolative.cp313t-win_arm64.pyd +0 -0
  631. scipy/linalg/_decomp_ldl.py +356 -0
  632. scipy/linalg/_decomp_lu.py +401 -0
  633. scipy/linalg/_decomp_lu_cython.cp313t-win_arm64.lib +0 -0
  634. scipy/linalg/_decomp_lu_cython.cp313t-win_arm64.pyd +0 -0
  635. scipy/linalg/_decomp_lu_cython.pyi +6 -0
  636. scipy/linalg/_decomp_polar.py +113 -0
  637. scipy/linalg/_decomp_qr.py +494 -0
  638. scipy/linalg/_decomp_qz.py +452 -0
  639. scipy/linalg/_decomp_schur.py +336 -0
  640. scipy/linalg/_decomp_svd.py +545 -0
  641. scipy/linalg/_decomp_update.cp313t-win_arm64.lib +0 -0
  642. scipy/linalg/_decomp_update.cp313t-win_arm64.pyd +0 -0
  643. scipy/linalg/_expm_frechet.py +417 -0
  644. scipy/linalg/_fblas.cp313t-win_arm64.lib +0 -0
  645. scipy/linalg/_fblas.cp313t-win_arm64.pyd +0 -0
  646. scipy/linalg/_flapack.cp313t-win_arm64.lib +0 -0
  647. scipy/linalg/_flapack.cp313t-win_arm64.pyd +0 -0
  648. scipy/linalg/_lapack_subroutines.h +1521 -0
  649. scipy/linalg/_linalg_pythran.cp313t-win_arm64.lib +0 -0
  650. scipy/linalg/_linalg_pythran.cp313t-win_arm64.pyd +0 -0
  651. scipy/linalg/_matfuncs.py +1050 -0
  652. scipy/linalg/_matfuncs_expm.cp313t-win_arm64.lib +0 -0
  653. scipy/linalg/_matfuncs_expm.cp313t-win_arm64.pyd +0 -0
  654. scipy/linalg/_matfuncs_expm.pyi +6 -0
  655. scipy/linalg/_matfuncs_inv_ssq.py +886 -0
  656. scipy/linalg/_matfuncs_schur_sqrtm.cp313t-win_arm64.lib +0 -0
  657. scipy/linalg/_matfuncs_schur_sqrtm.cp313t-win_arm64.pyd +0 -0
  658. scipy/linalg/_matfuncs_sqrtm.py +107 -0
  659. scipy/linalg/_matfuncs_sqrtm_triu.cp313t-win_arm64.lib +0 -0
  660. scipy/linalg/_matfuncs_sqrtm_triu.cp313t-win_arm64.pyd +0 -0
  661. scipy/linalg/_misc.py +191 -0
  662. scipy/linalg/_procrustes.py +113 -0
  663. scipy/linalg/_sketches.py +189 -0
  664. scipy/linalg/_solve_toeplitz.cp313t-win_arm64.lib +0 -0
  665. scipy/linalg/_solve_toeplitz.cp313t-win_arm64.pyd +0 -0
  666. scipy/linalg/_solvers.py +862 -0
  667. scipy/linalg/_special_matrices.py +1322 -0
  668. scipy/linalg/_testutils.py +65 -0
  669. scipy/linalg/basic.py +23 -0
  670. scipy/linalg/blas.py +495 -0
  671. scipy/linalg/cython_blas.cp313t-win_arm64.lib +0 -0
  672. scipy/linalg/cython_blas.cp313t-win_arm64.pyd +0 -0
  673. scipy/linalg/cython_blas.pxd +169 -0
  674. scipy/linalg/cython_blas.pyx +1432 -0
  675. scipy/linalg/cython_lapack.cp313t-win_arm64.lib +0 -0
  676. scipy/linalg/cython_lapack.cp313t-win_arm64.pyd +0 -0
  677. scipy/linalg/cython_lapack.pxd +1528 -0
  678. scipy/linalg/cython_lapack.pyx +12045 -0
  679. scipy/linalg/decomp.py +23 -0
  680. scipy/linalg/decomp_cholesky.py +21 -0
  681. scipy/linalg/decomp_lu.py +21 -0
  682. scipy/linalg/decomp_qr.py +20 -0
  683. scipy/linalg/decomp_schur.py +21 -0
  684. scipy/linalg/decomp_svd.py +21 -0
  685. scipy/linalg/interpolative.py +989 -0
  686. scipy/linalg/lapack.py +1081 -0
  687. scipy/linalg/matfuncs.py +23 -0
  688. scipy/linalg/misc.py +21 -0
  689. scipy/linalg/special_matrices.py +22 -0
  690. scipy/linalg/tests/__init__.py +0 -0
  691. scipy/linalg/tests/_cython_examples/extending.pyx +23 -0
  692. scipy/linalg/tests/_cython_examples/meson.build +34 -0
  693. scipy/linalg/tests/data/carex_15_data.npz +0 -0
  694. scipy/linalg/tests/data/carex_18_data.npz +0 -0
  695. scipy/linalg/tests/data/carex_19_data.npz +0 -0
  696. scipy/linalg/tests/data/carex_20_data.npz +0 -0
  697. scipy/linalg/tests/data/carex_6_data.npz +0 -0
  698. scipy/linalg/tests/data/gendare_20170120_data.npz +0 -0
  699. scipy/linalg/tests/test_basic.py +2074 -0
  700. scipy/linalg/tests/test_batch.py +588 -0
  701. scipy/linalg/tests/test_blas.py +1127 -0
  702. scipy/linalg/tests/test_cython_blas.py +118 -0
  703. scipy/linalg/tests/test_cython_lapack.py +22 -0
  704. scipy/linalg/tests/test_cythonized_array_utils.py +130 -0
  705. scipy/linalg/tests/test_decomp.py +3189 -0
  706. scipy/linalg/tests/test_decomp_cholesky.py +268 -0
  707. scipy/linalg/tests/test_decomp_cossin.py +314 -0
  708. scipy/linalg/tests/test_decomp_ldl.py +137 -0
  709. scipy/linalg/tests/test_decomp_lu.py +308 -0
  710. scipy/linalg/tests/test_decomp_polar.py +110 -0
  711. scipy/linalg/tests/test_decomp_update.py +1701 -0
  712. scipy/linalg/tests/test_extending.py +46 -0
  713. scipy/linalg/tests/test_fblas.py +607 -0
  714. scipy/linalg/tests/test_interpolative.py +232 -0
  715. scipy/linalg/tests/test_lapack.py +3620 -0
  716. scipy/linalg/tests/test_matfuncs.py +1125 -0
  717. scipy/linalg/tests/test_matmul_toeplitz.py +136 -0
  718. scipy/linalg/tests/test_procrustes.py +214 -0
  719. scipy/linalg/tests/test_sketches.py +118 -0
  720. scipy/linalg/tests/test_solve_toeplitz.py +150 -0
  721. scipy/linalg/tests/test_solvers.py +844 -0
  722. scipy/linalg/tests/test_special_matrices.py +636 -0
  723. scipy/misc/__init__.py +6 -0
  724. scipy/misc/common.py +6 -0
  725. scipy/misc/doccer.py +6 -0
  726. scipy/ndimage/__init__.py +174 -0
  727. scipy/ndimage/_ctest.cp313t-win_arm64.lib +0 -0
  728. scipy/ndimage/_ctest.cp313t-win_arm64.pyd +0 -0
  729. scipy/ndimage/_cytest.cp313t-win_arm64.lib +0 -0
  730. scipy/ndimage/_cytest.cp313t-win_arm64.pyd +0 -0
  731. scipy/ndimage/_delegators.py +303 -0
  732. scipy/ndimage/_filters.py +2422 -0
  733. scipy/ndimage/_fourier.py +306 -0
  734. scipy/ndimage/_interpolation.py +1033 -0
  735. scipy/ndimage/_measurements.py +1689 -0
  736. scipy/ndimage/_morphology.py +2634 -0
  737. scipy/ndimage/_nd_image.cp313t-win_arm64.lib +0 -0
  738. scipy/ndimage/_nd_image.cp313t-win_arm64.pyd +0 -0
  739. scipy/ndimage/_ndimage_api.py +16 -0
  740. scipy/ndimage/_ni_docstrings.py +214 -0
  741. scipy/ndimage/_ni_label.cp313t-win_arm64.lib +0 -0
  742. scipy/ndimage/_ni_label.cp313t-win_arm64.pyd +0 -0
  743. scipy/ndimage/_ni_support.py +139 -0
  744. scipy/ndimage/_rank_filter_1d.cp313t-win_arm64.lib +0 -0
  745. scipy/ndimage/_rank_filter_1d.cp313t-win_arm64.pyd +0 -0
  746. scipy/ndimage/_support_alternative_backends.py +84 -0
  747. scipy/ndimage/filters.py +27 -0
  748. scipy/ndimage/fourier.py +21 -0
  749. scipy/ndimage/interpolation.py +22 -0
  750. scipy/ndimage/measurements.py +24 -0
  751. scipy/ndimage/morphology.py +27 -0
  752. scipy/ndimage/tests/__init__.py +12 -0
  753. scipy/ndimage/tests/data/label_inputs.txt +21 -0
  754. scipy/ndimage/tests/data/label_results.txt +294 -0
  755. scipy/ndimage/tests/data/label_strels.txt +42 -0
  756. scipy/ndimage/tests/dots.png +0 -0
  757. scipy/ndimage/tests/test_c_api.py +102 -0
  758. scipy/ndimage/tests/test_datatypes.py +67 -0
  759. scipy/ndimage/tests/test_filters.py +3083 -0
  760. scipy/ndimage/tests/test_fourier.py +187 -0
  761. scipy/ndimage/tests/test_interpolation.py +1491 -0
  762. scipy/ndimage/tests/test_measurements.py +1592 -0
  763. scipy/ndimage/tests/test_morphology.py +2950 -0
  764. scipy/ndimage/tests/test_ni_support.py +78 -0
  765. scipy/ndimage/tests/test_splines.py +70 -0
  766. scipy/odr/__init__.py +131 -0
  767. scipy/odr/__odrpack.cp313t-win_arm64.lib +0 -0
  768. scipy/odr/__odrpack.cp313t-win_arm64.pyd +0 -0
  769. scipy/odr/_add_newdocs.py +34 -0
  770. scipy/odr/_models.py +315 -0
  771. scipy/odr/_odrpack.py +1154 -0
  772. scipy/odr/models.py +20 -0
  773. scipy/odr/odrpack.py +21 -0
  774. scipy/odr/tests/__init__.py +0 -0
  775. scipy/odr/tests/test_odr.py +607 -0
  776. scipy/optimize/__init__.pxd +1 -0
  777. scipy/optimize/__init__.py +460 -0
  778. scipy/optimize/_basinhopping.py +741 -0
  779. scipy/optimize/_bglu_dense.cp313t-win_arm64.lib +0 -0
  780. scipy/optimize/_bglu_dense.cp313t-win_arm64.pyd +0 -0
  781. scipy/optimize/_bracket.py +706 -0
  782. scipy/optimize/_chandrupatla.py +551 -0
  783. scipy/optimize/_cobyla_py.py +297 -0
  784. scipy/optimize/_cobyqa_py.py +72 -0
  785. scipy/optimize/_constraints.py +598 -0
  786. scipy/optimize/_dcsrch.py +728 -0
  787. scipy/optimize/_differentiable_functions.py +835 -0
  788. scipy/optimize/_differentialevolution.py +1970 -0
  789. scipy/optimize/_direct.cp313t-win_arm64.lib +0 -0
  790. scipy/optimize/_direct.cp313t-win_arm64.pyd +0 -0
  791. scipy/optimize/_direct_py.py +280 -0
  792. scipy/optimize/_dual_annealing.py +732 -0
  793. scipy/optimize/_elementwise.py +798 -0
  794. scipy/optimize/_group_columns.cp313t-win_arm64.lib +0 -0
  795. scipy/optimize/_group_columns.cp313t-win_arm64.pyd +0 -0
  796. scipy/optimize/_hessian_update_strategy.py +479 -0
  797. scipy/optimize/_highspy/__init__.py +0 -0
  798. scipy/optimize/_highspy/_core.cp313t-win_arm64.lib +0 -0
  799. scipy/optimize/_highspy/_core.cp313t-win_arm64.pyd +0 -0
  800. scipy/optimize/_highspy/_highs_options.cp313t-win_arm64.lib +0 -0
  801. scipy/optimize/_highspy/_highs_options.cp313t-win_arm64.pyd +0 -0
  802. scipy/optimize/_highspy/_highs_wrapper.py +338 -0
  803. scipy/optimize/_isotonic.py +157 -0
  804. scipy/optimize/_lbfgsb.cp313t-win_arm64.lib +0 -0
  805. scipy/optimize/_lbfgsb.cp313t-win_arm64.pyd +0 -0
  806. scipy/optimize/_lbfgsb_py.py +634 -0
  807. scipy/optimize/_linesearch.py +896 -0
  808. scipy/optimize/_linprog.py +733 -0
  809. scipy/optimize/_linprog_doc.py +1434 -0
  810. scipy/optimize/_linprog_highs.py +422 -0
  811. scipy/optimize/_linprog_ip.py +1141 -0
  812. scipy/optimize/_linprog_rs.py +572 -0
  813. scipy/optimize/_linprog_simplex.py +663 -0
  814. scipy/optimize/_linprog_util.py +1521 -0
  815. scipy/optimize/_lsap.cp313t-win_arm64.lib +0 -0
  816. scipy/optimize/_lsap.cp313t-win_arm64.pyd +0 -0
  817. scipy/optimize/_lsq/__init__.py +5 -0
  818. scipy/optimize/_lsq/bvls.py +183 -0
  819. scipy/optimize/_lsq/common.py +731 -0
  820. scipy/optimize/_lsq/dogbox.py +345 -0
  821. scipy/optimize/_lsq/givens_elimination.cp313t-win_arm64.lib +0 -0
  822. scipy/optimize/_lsq/givens_elimination.cp313t-win_arm64.pyd +0 -0
  823. scipy/optimize/_lsq/least_squares.py +1044 -0
  824. scipy/optimize/_lsq/lsq_linear.py +361 -0
  825. scipy/optimize/_lsq/trf.py +587 -0
  826. scipy/optimize/_lsq/trf_linear.py +249 -0
  827. scipy/optimize/_milp.py +394 -0
  828. scipy/optimize/_minimize.py +1199 -0
  829. scipy/optimize/_minpack.cp313t-win_arm64.lib +0 -0
  830. scipy/optimize/_minpack.cp313t-win_arm64.pyd +0 -0
  831. scipy/optimize/_minpack_py.py +1178 -0
  832. scipy/optimize/_moduleTNC.cp313t-win_arm64.lib +0 -0
  833. scipy/optimize/_moduleTNC.cp313t-win_arm64.pyd +0 -0
  834. scipy/optimize/_nnls.py +96 -0
  835. scipy/optimize/_nonlin.py +1634 -0
  836. scipy/optimize/_numdiff.py +963 -0
  837. scipy/optimize/_optimize.py +4169 -0
  838. scipy/optimize/_pava_pybind.cp313t-win_arm64.lib +0 -0
  839. scipy/optimize/_pava_pybind.cp313t-win_arm64.pyd +0 -0
  840. scipy/optimize/_qap.py +760 -0
  841. scipy/optimize/_remove_redundancy.py +522 -0
  842. scipy/optimize/_root.py +732 -0
  843. scipy/optimize/_root_scalar.py +538 -0
  844. scipy/optimize/_shgo.py +1606 -0
  845. scipy/optimize/_shgo_lib/__init__.py +0 -0
  846. scipy/optimize/_shgo_lib/_complex.py +1225 -0
  847. scipy/optimize/_shgo_lib/_vertex.py +460 -0
  848. scipy/optimize/_slsqp_py.py +603 -0
  849. scipy/optimize/_slsqplib.cp313t-win_arm64.lib +0 -0
  850. scipy/optimize/_slsqplib.cp313t-win_arm64.pyd +0 -0
  851. scipy/optimize/_spectral.py +260 -0
  852. scipy/optimize/_tnc.py +438 -0
  853. scipy/optimize/_trlib/__init__.py +12 -0
  854. scipy/optimize/_trlib/_trlib.cp313t-win_arm64.lib +0 -0
  855. scipy/optimize/_trlib/_trlib.cp313t-win_arm64.pyd +0 -0
  856. scipy/optimize/_trustregion.py +318 -0
  857. scipy/optimize/_trustregion_constr/__init__.py +6 -0
  858. scipy/optimize/_trustregion_constr/canonical_constraint.py +390 -0
  859. scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +231 -0
  860. scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +584 -0
  861. scipy/optimize/_trustregion_constr/projections.py +411 -0
  862. scipy/optimize/_trustregion_constr/qp_subproblem.py +637 -0
  863. scipy/optimize/_trustregion_constr/report.py +49 -0
  864. scipy/optimize/_trustregion_constr/tests/__init__.py +0 -0
  865. scipy/optimize/_trustregion_constr/tests/test_canonical_constraint.py +296 -0
  866. scipy/optimize/_trustregion_constr/tests/test_nested_minimize.py +39 -0
  867. scipy/optimize/_trustregion_constr/tests/test_projections.py +214 -0
  868. scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +645 -0
  869. scipy/optimize/_trustregion_constr/tests/test_report.py +34 -0
  870. scipy/optimize/_trustregion_constr/tr_interior_point.py +361 -0
  871. scipy/optimize/_trustregion_dogleg.py +122 -0
  872. scipy/optimize/_trustregion_exact.py +437 -0
  873. scipy/optimize/_trustregion_krylov.py +65 -0
  874. scipy/optimize/_trustregion_ncg.py +126 -0
  875. scipy/optimize/_tstutils.py +972 -0
  876. scipy/optimize/_zeros.cp313t-win_arm64.lib +0 -0
  877. scipy/optimize/_zeros.cp313t-win_arm64.pyd +0 -0
  878. scipy/optimize/_zeros_py.py +1475 -0
  879. scipy/optimize/cobyla.py +19 -0
  880. scipy/optimize/cython_optimize/__init__.py +133 -0
  881. scipy/optimize/cython_optimize/_zeros.cp313t-win_arm64.lib +0 -0
  882. scipy/optimize/cython_optimize/_zeros.cp313t-win_arm64.pyd +0 -0
  883. scipy/optimize/cython_optimize/_zeros.pxd +33 -0
  884. scipy/optimize/cython_optimize/c_zeros.pxd +26 -0
  885. scipy/optimize/cython_optimize.pxd +11 -0
  886. scipy/optimize/elementwise.py +38 -0
  887. scipy/optimize/lbfgsb.py +23 -0
  888. scipy/optimize/linesearch.py +18 -0
  889. scipy/optimize/minpack.py +27 -0
  890. scipy/optimize/minpack2.py +17 -0
  891. scipy/optimize/moduleTNC.py +19 -0
  892. scipy/optimize/nonlin.py +29 -0
  893. scipy/optimize/optimize.py +40 -0
  894. scipy/optimize/slsqp.py +22 -0
  895. scipy/optimize/tests/__init__.py +0 -0
  896. scipy/optimize/tests/_cython_examples/extending.pyx +43 -0
  897. scipy/optimize/tests/_cython_examples/meson.build +32 -0
  898. scipy/optimize/tests/test__basinhopping.py +535 -0
  899. scipy/optimize/tests/test__differential_evolution.py +1703 -0
  900. scipy/optimize/tests/test__dual_annealing.py +416 -0
  901. scipy/optimize/tests/test__linprog_clean_inputs.py +312 -0
  902. scipy/optimize/tests/test__numdiff.py +885 -0
  903. scipy/optimize/tests/test__remove_redundancy.py +228 -0
  904. scipy/optimize/tests/test__root.py +124 -0
  905. scipy/optimize/tests/test__shgo.py +1164 -0
  906. scipy/optimize/tests/test__spectral.py +226 -0
  907. scipy/optimize/tests/test_bracket.py +896 -0
  908. scipy/optimize/tests/test_chandrupatla.py +982 -0
  909. scipy/optimize/tests/test_cobyla.py +195 -0
  910. scipy/optimize/tests/test_cobyqa.py +252 -0
  911. scipy/optimize/tests/test_constraint_conversion.py +286 -0
  912. scipy/optimize/tests/test_constraints.py +255 -0
  913. scipy/optimize/tests/test_cython_optimize.py +92 -0
  914. scipy/optimize/tests/test_differentiable_functions.py +1025 -0
  915. scipy/optimize/tests/test_direct.py +321 -0
  916. scipy/optimize/tests/test_extending.py +28 -0
  917. scipy/optimize/tests/test_hessian_update_strategy.py +300 -0
  918. scipy/optimize/tests/test_isotonic_regression.py +167 -0
  919. scipy/optimize/tests/test_lbfgsb_hessinv.py +65 -0
  920. scipy/optimize/tests/test_lbfgsb_setulb.py +122 -0
  921. scipy/optimize/tests/test_least_squares.py +986 -0
  922. scipy/optimize/tests/test_linear_assignment.py +116 -0
  923. scipy/optimize/tests/test_linesearch.py +328 -0
  924. scipy/optimize/tests/test_linprog.py +2577 -0
  925. scipy/optimize/tests/test_lsq_common.py +297 -0
  926. scipy/optimize/tests/test_lsq_linear.py +287 -0
  927. scipy/optimize/tests/test_milp.py +459 -0
  928. scipy/optimize/tests/test_minimize_constrained.py +845 -0
  929. scipy/optimize/tests/test_minpack.py +1194 -0
  930. scipy/optimize/tests/test_nnls.py +469 -0
  931. scipy/optimize/tests/test_nonlin.py +572 -0
  932. scipy/optimize/tests/test_optimize.py +3344 -0
  933. scipy/optimize/tests/test_quadratic_assignment.py +455 -0
  934. scipy/optimize/tests/test_regression.py +40 -0
  935. scipy/optimize/tests/test_slsqp.py +645 -0
  936. scipy/optimize/tests/test_tnc.py +345 -0
  937. scipy/optimize/tests/test_trustregion.py +110 -0
  938. scipy/optimize/tests/test_trustregion_exact.py +351 -0
  939. scipy/optimize/tests/test_trustregion_krylov.py +170 -0
  940. scipy/optimize/tests/test_zeros.py +998 -0
  941. scipy/optimize/tnc.py +22 -0
  942. scipy/optimize/zeros.py +26 -0
  943. scipy/signal/__init__.py +316 -0
  944. scipy/signal/_arraytools.py +264 -0
  945. scipy/signal/_czt.py +575 -0
  946. scipy/signal/_delegators.py +568 -0
  947. scipy/signal/_filter_design.py +5893 -0
  948. scipy/signal/_fir_filter_design.py +1458 -0
  949. scipy/signal/_lti_conversion.py +534 -0
  950. scipy/signal/_ltisys.py +3546 -0
  951. scipy/signal/_max_len_seq.py +139 -0
  952. scipy/signal/_max_len_seq_inner.cp313t-win_arm64.lib +0 -0
  953. scipy/signal/_max_len_seq_inner.cp313t-win_arm64.pyd +0 -0
  954. scipy/signal/_peak_finding.py +1310 -0
  955. scipy/signal/_peak_finding_utils.cp313t-win_arm64.lib +0 -0
  956. scipy/signal/_peak_finding_utils.cp313t-win_arm64.pyd +0 -0
  957. scipy/signal/_polyutils.py +172 -0
  958. scipy/signal/_savitzky_golay.py +357 -0
  959. scipy/signal/_short_time_fft.py +2228 -0
  960. scipy/signal/_signal_api.py +30 -0
  961. scipy/signal/_signaltools.py +5309 -0
  962. scipy/signal/_sigtools.cp313t-win_arm64.lib +0 -0
  963. scipy/signal/_sigtools.cp313t-win_arm64.pyd +0 -0
  964. scipy/signal/_sosfilt.cp313t-win_arm64.lib +0 -0
  965. scipy/signal/_sosfilt.cp313t-win_arm64.pyd +0 -0
  966. scipy/signal/_spectral_py.py +2471 -0
  967. scipy/signal/_spline.cp313t-win_arm64.lib +0 -0
  968. scipy/signal/_spline.cp313t-win_arm64.pyd +0 -0
  969. scipy/signal/_spline.pyi +34 -0
  970. scipy/signal/_spline_filters.py +848 -0
  971. scipy/signal/_support_alternative_backends.py +73 -0
  972. scipy/signal/_upfirdn.py +219 -0
  973. scipy/signal/_upfirdn_apply.cp313t-win_arm64.lib +0 -0
  974. scipy/signal/_upfirdn_apply.cp313t-win_arm64.pyd +0 -0
  975. scipy/signal/_waveforms.py +687 -0
  976. scipy/signal/_wavelets.py +29 -0
  977. scipy/signal/bsplines.py +21 -0
  978. scipy/signal/filter_design.py +28 -0
  979. scipy/signal/fir_filter_design.py +21 -0
  980. scipy/signal/lti_conversion.py +20 -0
  981. scipy/signal/ltisys.py +25 -0
  982. scipy/signal/signaltools.py +27 -0
  983. scipy/signal/spectral.py +21 -0
  984. scipy/signal/spline.py +18 -0
  985. scipy/signal/tests/__init__.py +0 -0
  986. scipy/signal/tests/_scipy_spectral_test_shim.py +311 -0
  987. scipy/signal/tests/mpsig.py +122 -0
  988. scipy/signal/tests/test_array_tools.py +111 -0
  989. scipy/signal/tests/test_bsplines.py +365 -0
  990. scipy/signal/tests/test_cont2discrete.py +424 -0
  991. scipy/signal/tests/test_czt.py +221 -0
  992. scipy/signal/tests/test_dltisys.py +599 -0
  993. scipy/signal/tests/test_filter_design.py +4744 -0
  994. scipy/signal/tests/test_fir_filter_design.py +851 -0
  995. scipy/signal/tests/test_ltisys.py +1225 -0
  996. scipy/signal/tests/test_max_len_seq.py +71 -0
  997. scipy/signal/tests/test_peak_finding.py +915 -0
  998. scipy/signal/tests/test_result_type.py +51 -0
  999. scipy/signal/tests/test_savitzky_golay.py +363 -0
  1000. scipy/signal/tests/test_short_time_fft.py +1107 -0
  1001. scipy/signal/tests/test_signaltools.py +4735 -0
  1002. scipy/signal/tests/test_spectral.py +2141 -0
  1003. scipy/signal/tests/test_splines.py +427 -0
  1004. scipy/signal/tests/test_upfirdn.py +322 -0
  1005. scipy/signal/tests/test_waveforms.py +400 -0
  1006. scipy/signal/tests/test_wavelets.py +59 -0
  1007. scipy/signal/tests/test_windows.py +987 -0
  1008. scipy/signal/waveforms.py +20 -0
  1009. scipy/signal/wavelets.py +17 -0
  1010. scipy/signal/windows/__init__.py +52 -0
  1011. scipy/signal/windows/_windows.py +2513 -0
  1012. scipy/signal/windows/windows.py +23 -0
  1013. scipy/sparse/__init__.py +350 -0
  1014. scipy/sparse/_base.py +1613 -0
  1015. scipy/sparse/_bsr.py +880 -0
  1016. scipy/sparse/_compressed.py +1328 -0
  1017. scipy/sparse/_construct.py +1454 -0
  1018. scipy/sparse/_coo.py +1581 -0
  1019. scipy/sparse/_csc.py +367 -0
  1020. scipy/sparse/_csparsetools.cp313t-win_arm64.lib +0 -0
  1021. scipy/sparse/_csparsetools.cp313t-win_arm64.pyd +0 -0
  1022. scipy/sparse/_csr.py +558 -0
  1023. scipy/sparse/_data.py +569 -0
  1024. scipy/sparse/_dia.py +677 -0
  1025. scipy/sparse/_dok.py +669 -0
  1026. scipy/sparse/_extract.py +178 -0
  1027. scipy/sparse/_index.py +444 -0
  1028. scipy/sparse/_lil.py +632 -0
  1029. scipy/sparse/_matrix.py +169 -0
  1030. scipy/sparse/_matrix_io.py +167 -0
  1031. scipy/sparse/_sparsetools.cp313t-win_arm64.lib +0 -0
  1032. scipy/sparse/_sparsetools.cp313t-win_arm64.pyd +0 -0
  1033. scipy/sparse/_spfuncs.py +76 -0
  1034. scipy/sparse/_sputils.py +632 -0
  1035. scipy/sparse/base.py +24 -0
  1036. scipy/sparse/bsr.py +22 -0
  1037. scipy/sparse/compressed.py +20 -0
  1038. scipy/sparse/construct.py +38 -0
  1039. scipy/sparse/coo.py +23 -0
  1040. scipy/sparse/csc.py +22 -0
  1041. scipy/sparse/csgraph/__init__.py +210 -0
  1042. scipy/sparse/csgraph/_flow.cp313t-win_arm64.lib +0 -0
  1043. scipy/sparse/csgraph/_flow.cp313t-win_arm64.pyd +0 -0
  1044. scipy/sparse/csgraph/_laplacian.py +563 -0
  1045. scipy/sparse/csgraph/_matching.cp313t-win_arm64.lib +0 -0
  1046. scipy/sparse/csgraph/_matching.cp313t-win_arm64.pyd +0 -0
  1047. scipy/sparse/csgraph/_min_spanning_tree.cp313t-win_arm64.lib +0 -0
  1048. scipy/sparse/csgraph/_min_spanning_tree.cp313t-win_arm64.pyd +0 -0
  1049. scipy/sparse/csgraph/_reordering.cp313t-win_arm64.lib +0 -0
  1050. scipy/sparse/csgraph/_reordering.cp313t-win_arm64.pyd +0 -0
  1051. scipy/sparse/csgraph/_shortest_path.cp313t-win_arm64.lib +0 -0
  1052. scipy/sparse/csgraph/_shortest_path.cp313t-win_arm64.pyd +0 -0
  1053. scipy/sparse/csgraph/_tools.cp313t-win_arm64.lib +0 -0
  1054. scipy/sparse/csgraph/_tools.cp313t-win_arm64.pyd +0 -0
  1055. scipy/sparse/csgraph/_traversal.cp313t-win_arm64.lib +0 -0
  1056. scipy/sparse/csgraph/_traversal.cp313t-win_arm64.pyd +0 -0
  1057. scipy/sparse/csgraph/_validation.py +66 -0
  1058. scipy/sparse/csgraph/tests/__init__.py +0 -0
  1059. scipy/sparse/csgraph/tests/test_connected_components.py +119 -0
  1060. scipy/sparse/csgraph/tests/test_conversions.py +61 -0
  1061. scipy/sparse/csgraph/tests/test_flow.py +209 -0
  1062. scipy/sparse/csgraph/tests/test_graph_laplacian.py +368 -0
  1063. scipy/sparse/csgraph/tests/test_matching.py +307 -0
  1064. scipy/sparse/csgraph/tests/test_pydata_sparse.py +197 -0
  1065. scipy/sparse/csgraph/tests/test_reordering.py +70 -0
  1066. scipy/sparse/csgraph/tests/test_shortest_path.py +540 -0
  1067. scipy/sparse/csgraph/tests/test_spanning_tree.py +66 -0
  1068. scipy/sparse/csgraph/tests/test_traversal.py +148 -0
  1069. scipy/sparse/csr.py +22 -0
  1070. scipy/sparse/data.py +18 -0
  1071. scipy/sparse/dia.py +22 -0
  1072. scipy/sparse/dok.py +22 -0
  1073. scipy/sparse/extract.py +23 -0
  1074. scipy/sparse/lil.py +22 -0
  1075. scipy/sparse/linalg/__init__.py +148 -0
  1076. scipy/sparse/linalg/_dsolve/__init__.py +71 -0
  1077. scipy/sparse/linalg/_dsolve/_add_newdocs.py +147 -0
  1078. scipy/sparse/linalg/_dsolve/_superlu.cp313t-win_arm64.lib +0 -0
  1079. scipy/sparse/linalg/_dsolve/_superlu.cp313t-win_arm64.pyd +0 -0
  1080. scipy/sparse/linalg/_dsolve/linsolve.py +882 -0
  1081. scipy/sparse/linalg/_dsolve/tests/__init__.py +0 -0
  1082. scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +928 -0
  1083. scipy/sparse/linalg/_eigen/__init__.py +22 -0
  1084. scipy/sparse/linalg/_eigen/_svds.py +540 -0
  1085. scipy/sparse/linalg/_eigen/_svds_doc.py +382 -0
  1086. scipy/sparse/linalg/_eigen/arpack/COPYING +45 -0
  1087. scipy/sparse/linalg/_eigen/arpack/__init__.py +20 -0
  1088. scipy/sparse/linalg/_eigen/arpack/_arpack.cp313t-win_arm64.lib +0 -0
  1089. scipy/sparse/linalg/_eigen/arpack/_arpack.cp313t-win_arm64.pyd +0 -0
  1090. scipy/sparse/linalg/_eigen/arpack/arpack.py +1706 -0
  1091. scipy/sparse/linalg/_eigen/arpack/tests/__init__.py +0 -0
  1092. scipy/sparse/linalg/_eigen/arpack/tests/test_arpack.py +717 -0
  1093. scipy/sparse/linalg/_eigen/lobpcg/__init__.py +16 -0
  1094. scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +1110 -0
  1095. scipy/sparse/linalg/_eigen/lobpcg/tests/__init__.py +0 -0
  1096. scipy/sparse/linalg/_eigen/lobpcg/tests/test_lobpcg.py +725 -0
  1097. scipy/sparse/linalg/_eigen/tests/__init__.py +0 -0
  1098. scipy/sparse/linalg/_eigen/tests/test_svds.py +886 -0
  1099. scipy/sparse/linalg/_expm_multiply.py +816 -0
  1100. scipy/sparse/linalg/_interface.py +920 -0
  1101. scipy/sparse/linalg/_isolve/__init__.py +20 -0
  1102. scipy/sparse/linalg/_isolve/_gcrotmk.py +503 -0
  1103. scipy/sparse/linalg/_isolve/iterative.py +1051 -0
  1104. scipy/sparse/linalg/_isolve/lgmres.py +230 -0
  1105. scipy/sparse/linalg/_isolve/lsmr.py +486 -0
  1106. scipy/sparse/linalg/_isolve/lsqr.py +589 -0
  1107. scipy/sparse/linalg/_isolve/minres.py +372 -0
  1108. scipy/sparse/linalg/_isolve/tests/__init__.py +0 -0
  1109. scipy/sparse/linalg/_isolve/tests/test_gcrotmk.py +183 -0
  1110. scipy/sparse/linalg/_isolve/tests/test_iterative.py +809 -0
  1111. scipy/sparse/linalg/_isolve/tests/test_lgmres.py +225 -0
  1112. scipy/sparse/linalg/_isolve/tests/test_lsmr.py +185 -0
  1113. scipy/sparse/linalg/_isolve/tests/test_lsqr.py +120 -0
  1114. scipy/sparse/linalg/_isolve/tests/test_minres.py +97 -0
  1115. scipy/sparse/linalg/_isolve/tests/test_utils.py +9 -0
  1116. scipy/sparse/linalg/_isolve/tfqmr.py +179 -0
  1117. scipy/sparse/linalg/_isolve/utils.py +121 -0
  1118. scipy/sparse/linalg/_matfuncs.py +940 -0
  1119. scipy/sparse/linalg/_norm.py +195 -0
  1120. scipy/sparse/linalg/_onenormest.py +467 -0
  1121. scipy/sparse/linalg/_propack/_cpropack.cp313t-win_arm64.lib +0 -0
  1122. scipy/sparse/linalg/_propack/_cpropack.cp313t-win_arm64.pyd +0 -0
  1123. scipy/sparse/linalg/_propack/_dpropack.cp313t-win_arm64.lib +0 -0
  1124. scipy/sparse/linalg/_propack/_dpropack.cp313t-win_arm64.pyd +0 -0
  1125. scipy/sparse/linalg/_propack/_spropack.cp313t-win_arm64.lib +0 -0
  1126. scipy/sparse/linalg/_propack/_spropack.cp313t-win_arm64.pyd +0 -0
  1127. scipy/sparse/linalg/_propack/_zpropack.cp313t-win_arm64.lib +0 -0
  1128. scipy/sparse/linalg/_propack/_zpropack.cp313t-win_arm64.pyd +0 -0
  1129. scipy/sparse/linalg/_special_sparse_arrays.py +949 -0
  1130. scipy/sparse/linalg/_svdp.py +309 -0
  1131. scipy/sparse/linalg/dsolve.py +22 -0
  1132. scipy/sparse/linalg/eigen.py +21 -0
  1133. scipy/sparse/linalg/interface.py +20 -0
  1134. scipy/sparse/linalg/isolve.py +22 -0
  1135. scipy/sparse/linalg/matfuncs.py +18 -0
  1136. scipy/sparse/linalg/tests/__init__.py +0 -0
  1137. scipy/sparse/linalg/tests/propack_test_data.npz +0 -0
  1138. scipy/sparse/linalg/tests/test_expm_multiply.py +367 -0
  1139. scipy/sparse/linalg/tests/test_interface.py +561 -0
  1140. scipy/sparse/linalg/tests/test_matfuncs.py +592 -0
  1141. scipy/sparse/linalg/tests/test_norm.py +154 -0
  1142. scipy/sparse/linalg/tests/test_onenormest.py +252 -0
  1143. scipy/sparse/linalg/tests/test_propack.py +165 -0
  1144. scipy/sparse/linalg/tests/test_pydata_sparse.py +272 -0
  1145. scipy/sparse/linalg/tests/test_special_sparse_arrays.py +337 -0
  1146. scipy/sparse/sparsetools.py +17 -0
  1147. scipy/sparse/spfuncs.py +17 -0
  1148. scipy/sparse/sputils.py +17 -0
  1149. scipy/sparse/tests/__init__.py +0 -0
  1150. scipy/sparse/tests/data/csc_py2.npz +0 -0
  1151. scipy/sparse/tests/data/csc_py3.npz +0 -0
  1152. scipy/sparse/tests/test_arithmetic1d.py +341 -0
  1153. scipy/sparse/tests/test_array_api.py +561 -0
  1154. scipy/sparse/tests/test_base.py +5870 -0
  1155. scipy/sparse/tests/test_common1d.py +447 -0
  1156. scipy/sparse/tests/test_construct.py +872 -0
  1157. scipy/sparse/tests/test_coo.py +1119 -0
  1158. scipy/sparse/tests/test_csc.py +98 -0
  1159. scipy/sparse/tests/test_csr.py +214 -0
  1160. scipy/sparse/tests/test_dok.py +209 -0
  1161. scipy/sparse/tests/test_extract.py +51 -0
  1162. scipy/sparse/tests/test_indexing1d.py +603 -0
  1163. scipy/sparse/tests/test_matrix_io.py +109 -0
  1164. scipy/sparse/tests/test_minmax1d.py +128 -0
  1165. scipy/sparse/tests/test_sparsetools.py +344 -0
  1166. scipy/sparse/tests/test_spfuncs.py +97 -0
  1167. scipy/sparse/tests/test_sputils.py +424 -0
  1168. scipy/spatial/__init__.py +129 -0
  1169. scipy/spatial/_ckdtree.cp313t-win_arm64.lib +0 -0
  1170. scipy/spatial/_ckdtree.cp313t-win_arm64.pyd +0 -0
  1171. scipy/spatial/_distance_pybind.cp313t-win_arm64.lib +0 -0
  1172. scipy/spatial/_distance_pybind.cp313t-win_arm64.pyd +0 -0
  1173. scipy/spatial/_distance_wrap.cp313t-win_arm64.lib +0 -0
  1174. scipy/spatial/_distance_wrap.cp313t-win_arm64.pyd +0 -0
  1175. scipy/spatial/_geometric_slerp.py +238 -0
  1176. scipy/spatial/_hausdorff.cp313t-win_arm64.lib +0 -0
  1177. scipy/spatial/_hausdorff.cp313t-win_arm64.pyd +0 -0
  1178. scipy/spatial/_kdtree.py +920 -0
  1179. scipy/spatial/_plotutils.py +274 -0
  1180. scipy/spatial/_procrustes.py +132 -0
  1181. scipy/spatial/_qhull.cp313t-win_arm64.lib +0 -0
  1182. scipy/spatial/_qhull.cp313t-win_arm64.pyd +0 -0
  1183. scipy/spatial/_qhull.pyi +213 -0
  1184. scipy/spatial/_spherical_voronoi.py +341 -0
  1185. scipy/spatial/_voronoi.cp313t-win_arm64.lib +0 -0
  1186. scipy/spatial/_voronoi.cp313t-win_arm64.pyd +0 -0
  1187. scipy/spatial/_voronoi.pyi +4 -0
  1188. scipy/spatial/ckdtree.py +18 -0
  1189. scipy/spatial/distance.py +3147 -0
  1190. scipy/spatial/distance.pyi +210 -0
  1191. scipy/spatial/kdtree.py +25 -0
  1192. scipy/spatial/qhull.py +25 -0
  1193. scipy/spatial/qhull_src/COPYING_QHULL.txt +39 -0
  1194. scipy/spatial/tests/__init__.py +0 -0
  1195. scipy/spatial/tests/data/cdist-X1.txt +10 -0
  1196. scipy/spatial/tests/data/cdist-X2.txt +20 -0
  1197. scipy/spatial/tests/data/degenerate_pointset.npz +0 -0
  1198. scipy/spatial/tests/data/iris.txt +150 -0
  1199. scipy/spatial/tests/data/pdist-boolean-inp.txt +20 -0
  1200. scipy/spatial/tests/data/pdist-chebyshev-ml-iris.txt +1 -0
  1201. scipy/spatial/tests/data/pdist-chebyshev-ml.txt +1 -0
  1202. scipy/spatial/tests/data/pdist-cityblock-ml-iris.txt +1 -0
  1203. scipy/spatial/tests/data/pdist-cityblock-ml.txt +1 -0
  1204. scipy/spatial/tests/data/pdist-correlation-ml-iris.txt +1 -0
  1205. scipy/spatial/tests/data/pdist-correlation-ml.txt +1 -0
  1206. scipy/spatial/tests/data/pdist-cosine-ml-iris.txt +1 -0
  1207. scipy/spatial/tests/data/pdist-cosine-ml.txt +1 -0
  1208. scipy/spatial/tests/data/pdist-double-inp.txt +20 -0
  1209. scipy/spatial/tests/data/pdist-euclidean-ml-iris.txt +1 -0
  1210. scipy/spatial/tests/data/pdist-euclidean-ml.txt +1 -0
  1211. scipy/spatial/tests/data/pdist-hamming-ml.txt +1 -0
  1212. scipy/spatial/tests/data/pdist-jaccard-ml.txt +1 -0
  1213. scipy/spatial/tests/data/pdist-jensenshannon-ml-iris.txt +1 -0
  1214. scipy/spatial/tests/data/pdist-jensenshannon-ml.txt +1 -0
  1215. scipy/spatial/tests/data/pdist-minkowski-3.2-ml-iris.txt +1 -0
  1216. scipy/spatial/tests/data/pdist-minkowski-3.2-ml.txt +1 -0
  1217. scipy/spatial/tests/data/pdist-minkowski-5.8-ml-iris.txt +1 -0
  1218. scipy/spatial/tests/data/pdist-seuclidean-ml-iris.txt +1 -0
  1219. scipy/spatial/tests/data/pdist-seuclidean-ml.txt +1 -0
  1220. scipy/spatial/tests/data/pdist-spearman-ml.txt +1 -0
  1221. scipy/spatial/tests/data/random-bool-data.txt +100 -0
  1222. scipy/spatial/tests/data/random-double-data.txt +100 -0
  1223. scipy/spatial/tests/data/random-int-data.txt +100 -0
  1224. scipy/spatial/tests/data/random-uint-data.txt +100 -0
  1225. scipy/spatial/tests/data/selfdual-4d-polytope.txt +27 -0
  1226. scipy/spatial/tests/test__plotutils.py +91 -0
  1227. scipy/spatial/tests/test__procrustes.py +116 -0
  1228. scipy/spatial/tests/test_distance.py +2389 -0
  1229. scipy/spatial/tests/test_hausdorff.py +199 -0
  1230. scipy/spatial/tests/test_kdtree.py +1536 -0
  1231. scipy/spatial/tests/test_qhull.py +1313 -0
  1232. scipy/spatial/tests/test_slerp.py +417 -0
  1233. scipy/spatial/tests/test_spherical_voronoi.py +358 -0
  1234. scipy/spatial/transform/__init__.py +31 -0
  1235. scipy/spatial/transform/_rigid_transform.cp313t-win_arm64.lib +0 -0
  1236. scipy/spatial/transform/_rigid_transform.cp313t-win_arm64.pyd +0 -0
  1237. scipy/spatial/transform/_rotation.cp313t-win_arm64.lib +0 -0
  1238. scipy/spatial/transform/_rotation.cp313t-win_arm64.pyd +0 -0
  1239. scipy/spatial/transform/_rotation_groups.py +140 -0
  1240. scipy/spatial/transform/_rotation_spline.py +460 -0
  1241. scipy/spatial/transform/rotation.py +21 -0
  1242. scipy/spatial/transform/tests/__init__.py +0 -0
  1243. scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
  1244. scipy/spatial/transform/tests/test_rotation.py +2569 -0
  1245. scipy/spatial/transform/tests/test_rotation_groups.py +169 -0
  1246. scipy/spatial/transform/tests/test_rotation_spline.py +183 -0
  1247. scipy/special/__init__.pxd +1 -0
  1248. scipy/special/__init__.py +841 -0
  1249. scipy/special/_add_newdocs.py +9961 -0
  1250. scipy/special/_basic.py +3576 -0
  1251. scipy/special/_comb.cp313t-win_arm64.lib +0 -0
  1252. scipy/special/_comb.cp313t-win_arm64.pyd +0 -0
  1253. scipy/special/_ellip_harm.py +214 -0
  1254. scipy/special/_ellip_harm_2.cp313t-win_arm64.lib +0 -0
  1255. scipy/special/_ellip_harm_2.cp313t-win_arm64.pyd +0 -0
  1256. scipy/special/_gufuncs.cp313t-win_arm64.lib +0 -0
  1257. scipy/special/_gufuncs.cp313t-win_arm64.pyd +0 -0
  1258. scipy/special/_input_validation.py +17 -0
  1259. scipy/special/_lambertw.py +149 -0
  1260. scipy/special/_logsumexp.py +426 -0
  1261. scipy/special/_mptestutils.py +453 -0
  1262. scipy/special/_multiufuncs.py +610 -0
  1263. scipy/special/_orthogonal.py +2592 -0
  1264. scipy/special/_orthogonal.pyi +330 -0
  1265. scipy/special/_precompute/__init__.py +0 -0
  1266. scipy/special/_precompute/cosine_cdf.py +17 -0
  1267. scipy/special/_precompute/expn_asy.py +54 -0
  1268. scipy/special/_precompute/gammainc_asy.py +116 -0
  1269. scipy/special/_precompute/gammainc_data.py +124 -0
  1270. scipy/special/_precompute/hyp2f1_data.py +484 -0
  1271. scipy/special/_precompute/lambertw.py +68 -0
  1272. scipy/special/_precompute/loggamma.py +43 -0
  1273. scipy/special/_precompute/struve_convergence.py +131 -0
  1274. scipy/special/_precompute/utils.py +38 -0
  1275. scipy/special/_precompute/wright_bessel.py +342 -0
  1276. scipy/special/_precompute/wright_bessel_data.py +152 -0
  1277. scipy/special/_precompute/wrightomega.py +41 -0
  1278. scipy/special/_precompute/zetac.py +27 -0
  1279. scipy/special/_sf_error.py +15 -0
  1280. scipy/special/_specfun.cp313t-win_arm64.lib +0 -0
  1281. scipy/special/_specfun.cp313t-win_arm64.pyd +0 -0
  1282. scipy/special/_special_ufuncs.cp313t-win_arm64.lib +0 -0
  1283. scipy/special/_special_ufuncs.cp313t-win_arm64.pyd +0 -0
  1284. scipy/special/_spfun_stats.py +106 -0
  1285. scipy/special/_spherical_bessel.py +397 -0
  1286. scipy/special/_support_alternative_backends.py +295 -0
  1287. scipy/special/_test_internal.cp313t-win_arm64.lib +0 -0
  1288. scipy/special/_test_internal.cp313t-win_arm64.pyd +0 -0
  1289. scipy/special/_test_internal.pyi +9 -0
  1290. scipy/special/_testutils.py +321 -0
  1291. scipy/special/_ufuncs.cp313t-win_arm64.lib +0 -0
  1292. scipy/special/_ufuncs.cp313t-win_arm64.pyd +0 -0
  1293. scipy/special/_ufuncs.pyi +522 -0
  1294. scipy/special/_ufuncs.pyx +13173 -0
  1295. scipy/special/_ufuncs_cxx.cp313t-win_arm64.lib +0 -0
  1296. scipy/special/_ufuncs_cxx.cp313t-win_arm64.pyd +0 -0
  1297. scipy/special/_ufuncs_cxx.pxd +142 -0
  1298. scipy/special/_ufuncs_cxx.pyx +427 -0
  1299. scipy/special/_ufuncs_cxx_defs.h +147 -0
  1300. scipy/special/_ufuncs_defs.h +57 -0
  1301. scipy/special/add_newdocs.py +15 -0
  1302. scipy/special/basic.py +87 -0
  1303. scipy/special/cython_special.cp313t-win_arm64.lib +0 -0
  1304. scipy/special/cython_special.cp313t-win_arm64.pyd +0 -0
  1305. scipy/special/cython_special.pxd +259 -0
  1306. scipy/special/cython_special.pyi +3 -0
  1307. scipy/special/orthogonal.py +45 -0
  1308. scipy/special/sf_error.py +20 -0
  1309. scipy/special/specfun.py +24 -0
  1310. scipy/special/spfun_stats.py +17 -0
  1311. scipy/special/tests/__init__.py +0 -0
  1312. scipy/special/tests/_cython_examples/extending.pyx +12 -0
  1313. scipy/special/tests/_cython_examples/meson.build +34 -0
  1314. scipy/special/tests/data/__init__.py +0 -0
  1315. scipy/special/tests/data/boost.npz +0 -0
  1316. scipy/special/tests/data/gsl.npz +0 -0
  1317. scipy/special/tests/data/local.npz +0 -0
  1318. scipy/special/tests/test_basic.py +4815 -0
  1319. scipy/special/tests/test_bdtr.py +112 -0
  1320. scipy/special/tests/test_boost_ufuncs.py +64 -0
  1321. scipy/special/tests/test_boxcox.py +125 -0
  1322. scipy/special/tests/test_cdflib.py +712 -0
  1323. scipy/special/tests/test_cdft_asymptotic.py +49 -0
  1324. scipy/special/tests/test_cephes_intp_cast.py +29 -0
  1325. scipy/special/tests/test_cosine_distr.py +83 -0
  1326. scipy/special/tests/test_cython_special.py +363 -0
  1327. scipy/special/tests/test_data.py +719 -0
  1328. scipy/special/tests/test_dd.py +42 -0
  1329. scipy/special/tests/test_digamma.py +45 -0
  1330. scipy/special/tests/test_ellip_harm.py +278 -0
  1331. scipy/special/tests/test_erfinv.py +89 -0
  1332. scipy/special/tests/test_exponential_integrals.py +118 -0
  1333. scipy/special/tests/test_extending.py +28 -0
  1334. scipy/special/tests/test_faddeeva.py +85 -0
  1335. scipy/special/tests/test_gamma.py +12 -0
  1336. scipy/special/tests/test_gammainc.py +152 -0
  1337. scipy/special/tests/test_hyp2f1.py +2566 -0
  1338. scipy/special/tests/test_hypergeometric.py +234 -0
  1339. scipy/special/tests/test_iv_ratio.py +249 -0
  1340. scipy/special/tests/test_kolmogorov.py +491 -0
  1341. scipy/special/tests/test_lambertw.py +109 -0
  1342. scipy/special/tests/test_legendre.py +1518 -0
  1343. scipy/special/tests/test_log1mexp.py +85 -0
  1344. scipy/special/tests/test_loggamma.py +70 -0
  1345. scipy/special/tests/test_logit.py +162 -0
  1346. scipy/special/tests/test_logsumexp.py +469 -0
  1347. scipy/special/tests/test_mpmath.py +2293 -0
  1348. scipy/special/tests/test_nan_inputs.py +65 -0
  1349. scipy/special/tests/test_ndtr.py +77 -0
  1350. scipy/special/tests/test_ndtri_exp.py +94 -0
  1351. scipy/special/tests/test_orthogonal.py +821 -0
  1352. scipy/special/tests/test_orthogonal_eval.py +275 -0
  1353. scipy/special/tests/test_owens_t.py +53 -0
  1354. scipy/special/tests/test_pcf.py +24 -0
  1355. scipy/special/tests/test_pdtr.py +48 -0
  1356. scipy/special/tests/test_powm1.py +65 -0
  1357. scipy/special/tests/test_precompute_expn_asy.py +24 -0
  1358. scipy/special/tests/test_precompute_gammainc.py +108 -0
  1359. scipy/special/tests/test_precompute_utils.py +36 -0
  1360. scipy/special/tests/test_round.py +18 -0
  1361. scipy/special/tests/test_sf_error.py +146 -0
  1362. scipy/special/tests/test_sici.py +36 -0
  1363. scipy/special/tests/test_specfun.py +48 -0
  1364. scipy/special/tests/test_spence.py +32 -0
  1365. scipy/special/tests/test_spfun_stats.py +61 -0
  1366. scipy/special/tests/test_sph_harm.py +85 -0
  1367. scipy/special/tests/test_spherical_bessel.py +400 -0
  1368. scipy/special/tests/test_support_alternative_backends.py +248 -0
  1369. scipy/special/tests/test_trig.py +72 -0
  1370. scipy/special/tests/test_ufunc_signatures.py +46 -0
  1371. scipy/special/tests/test_wright_bessel.py +205 -0
  1372. scipy/special/tests/test_wrightomega.py +117 -0
  1373. scipy/special/tests/test_zeta.py +301 -0
  1374. scipy/stats/__init__.py +670 -0
  1375. scipy/stats/_ansari_swilk_statistics.cp313t-win_arm64.lib +0 -0
  1376. scipy/stats/_ansari_swilk_statistics.cp313t-win_arm64.pyd +0 -0
  1377. scipy/stats/_axis_nan_policy.py +692 -0
  1378. scipy/stats/_biasedurn.cp313t-win_arm64.lib +0 -0
  1379. scipy/stats/_biasedurn.cp313t-win_arm64.pyd +0 -0
  1380. scipy/stats/_biasedurn.pxd +27 -0
  1381. scipy/stats/_binned_statistic.py +795 -0
  1382. scipy/stats/_binomtest.py +375 -0
  1383. scipy/stats/_bws_test.py +177 -0
  1384. scipy/stats/_censored_data.py +459 -0
  1385. scipy/stats/_common.py +5 -0
  1386. scipy/stats/_constants.py +42 -0
  1387. scipy/stats/_continued_fraction.py +387 -0
  1388. scipy/stats/_continuous_distns.py +12486 -0
  1389. scipy/stats/_correlation.py +210 -0
  1390. scipy/stats/_covariance.py +636 -0
  1391. scipy/stats/_crosstab.py +204 -0
  1392. scipy/stats/_discrete_distns.py +2098 -0
  1393. scipy/stats/_distn_infrastructure.py +4201 -0
  1394. scipy/stats/_distr_params.py +299 -0
  1395. scipy/stats/_distribution_infrastructure.py +5750 -0
  1396. scipy/stats/_entropy.py +428 -0
  1397. scipy/stats/_finite_differences.py +145 -0
  1398. scipy/stats/_fit.py +1351 -0
  1399. scipy/stats/_hypotests.py +2060 -0
  1400. scipy/stats/_kde.py +732 -0
  1401. scipy/stats/_ksstats.py +600 -0
  1402. scipy/stats/_levy_stable/__init__.py +1231 -0
  1403. scipy/stats/_levy_stable/levyst.cp313t-win_arm64.lib +0 -0
  1404. scipy/stats/_levy_stable/levyst.cp313t-win_arm64.pyd +0 -0
  1405. scipy/stats/_mannwhitneyu.py +492 -0
  1406. scipy/stats/_mgc.py +550 -0
  1407. scipy/stats/_morestats.py +4626 -0
  1408. scipy/stats/_mstats_basic.py +3658 -0
  1409. scipy/stats/_mstats_extras.py +521 -0
  1410. scipy/stats/_multicomp.py +449 -0
  1411. scipy/stats/_multivariate.py +7281 -0
  1412. scipy/stats/_new_distributions.py +452 -0
  1413. scipy/stats/_odds_ratio.py +466 -0
  1414. scipy/stats/_page_trend_test.py +486 -0
  1415. scipy/stats/_probability_distribution.py +1964 -0
  1416. scipy/stats/_qmc.py +2956 -0
  1417. scipy/stats/_qmc_cy.cp313t-win_arm64.lib +0 -0
  1418. scipy/stats/_qmc_cy.cp313t-win_arm64.pyd +0 -0
  1419. scipy/stats/_qmc_cy.pyi +54 -0
  1420. scipy/stats/_qmvnt.py +454 -0
  1421. scipy/stats/_qmvnt_cy.cp313t-win_arm64.lib +0 -0
  1422. scipy/stats/_qmvnt_cy.cp313t-win_arm64.pyd +0 -0
  1423. scipy/stats/_quantile.py +335 -0
  1424. scipy/stats/_rcont/__init__.py +4 -0
  1425. scipy/stats/_rcont/rcont.cp313t-win_arm64.lib +0 -0
  1426. scipy/stats/_rcont/rcont.cp313t-win_arm64.pyd +0 -0
  1427. scipy/stats/_relative_risk.py +263 -0
  1428. scipy/stats/_resampling.py +2352 -0
  1429. scipy/stats/_result_classes.py +40 -0
  1430. scipy/stats/_sampling.py +1314 -0
  1431. scipy/stats/_sensitivity_analysis.py +713 -0
  1432. scipy/stats/_sobol.cp313t-win_arm64.lib +0 -0
  1433. scipy/stats/_sobol.cp313t-win_arm64.pyd +0 -0
  1434. scipy/stats/_sobol.pyi +54 -0
  1435. scipy/stats/_sobol_direction_numbers.npz +0 -0
  1436. scipy/stats/_stats.cp313t-win_arm64.lib +0 -0
  1437. scipy/stats/_stats.cp313t-win_arm64.pyd +0 -0
  1438. scipy/stats/_stats.pxd +10 -0
  1439. scipy/stats/_stats_mstats_common.py +322 -0
  1440. scipy/stats/_stats_py.py +11089 -0
  1441. scipy/stats/_stats_pythran.cp313t-win_arm64.lib +0 -0
  1442. scipy/stats/_stats_pythran.cp313t-win_arm64.pyd +0 -0
  1443. scipy/stats/_survival.py +683 -0
  1444. scipy/stats/_tukeylambda_stats.py +199 -0
  1445. scipy/stats/_unuran/__init__.py +0 -0
  1446. scipy/stats/_unuran/unuran_wrapper.cp313t-win_arm64.lib +0 -0
  1447. scipy/stats/_unuran/unuran_wrapper.cp313t-win_arm64.pyd +0 -0
  1448. scipy/stats/_unuran/unuran_wrapper.pyi +179 -0
  1449. scipy/stats/_variation.py +126 -0
  1450. scipy/stats/_warnings_errors.py +38 -0
  1451. scipy/stats/_wilcoxon.py +265 -0
  1452. scipy/stats/biasedurn.py +16 -0
  1453. scipy/stats/contingency.py +521 -0
  1454. scipy/stats/distributions.py +24 -0
  1455. scipy/stats/kde.py +18 -0
  1456. scipy/stats/morestats.py +27 -0
  1457. scipy/stats/mstats.py +140 -0
  1458. scipy/stats/mstats_basic.py +42 -0
  1459. scipy/stats/mstats_extras.py +25 -0
  1460. scipy/stats/mvn.py +17 -0
  1461. scipy/stats/qmc.py +236 -0
  1462. scipy/stats/sampling.py +73 -0
  1463. scipy/stats/stats.py +41 -0
  1464. scipy/stats/tests/__init__.py +0 -0
  1465. scipy/stats/tests/common_tests.py +356 -0
  1466. scipy/stats/tests/data/_mvt.py +171 -0
  1467. scipy/stats/tests/data/fisher_exact_results_from_r.py +607 -0
  1468. scipy/stats/tests/data/jf_skew_t_gamlss_pdf_data.npy +0 -0
  1469. scipy/stats/tests/data/levy_stable/stable-Z1-cdf-sample-data.npy +0 -0
  1470. scipy/stats/tests/data/levy_stable/stable-Z1-pdf-sample-data.npy +0 -0
  1471. scipy/stats/tests/data/levy_stable/stable-loc-scale-sample-data.npy +0 -0
  1472. scipy/stats/tests/data/nist_anova/AtmWtAg.dat +108 -0
  1473. scipy/stats/tests/data/nist_anova/SiRstv.dat +85 -0
  1474. scipy/stats/tests/data/nist_anova/SmLs01.dat +249 -0
  1475. scipy/stats/tests/data/nist_anova/SmLs02.dat +1869 -0
  1476. scipy/stats/tests/data/nist_anova/SmLs03.dat +18069 -0
  1477. scipy/stats/tests/data/nist_anova/SmLs04.dat +249 -0
  1478. scipy/stats/tests/data/nist_anova/SmLs05.dat +1869 -0
  1479. scipy/stats/tests/data/nist_anova/SmLs06.dat +18069 -0
  1480. scipy/stats/tests/data/nist_anova/SmLs07.dat +249 -0
  1481. scipy/stats/tests/data/nist_anova/SmLs08.dat +1869 -0
  1482. scipy/stats/tests/data/nist_anova/SmLs09.dat +18069 -0
  1483. scipy/stats/tests/data/nist_linregress/Norris.dat +97 -0
  1484. scipy/stats/tests/data/rel_breitwigner_pdf_sample_data_ROOT.npy +0 -0
  1485. scipy/stats/tests/data/studentized_range_mpmath_ref.json +1499 -0
  1486. scipy/stats/tests/test_axis_nan_policy.py +1388 -0
  1487. scipy/stats/tests/test_binned_statistic.py +568 -0
  1488. scipy/stats/tests/test_censored_data.py +152 -0
  1489. scipy/stats/tests/test_contingency.py +294 -0
  1490. scipy/stats/tests/test_continued_fraction.py +173 -0
  1491. scipy/stats/tests/test_continuous.py +2198 -0
  1492. scipy/stats/tests/test_continuous_basic.py +1053 -0
  1493. scipy/stats/tests/test_continuous_fit_censored.py +683 -0
  1494. scipy/stats/tests/test_correlation.py +80 -0
  1495. scipy/stats/tests/test_crosstab.py +115 -0
  1496. scipy/stats/tests/test_discrete_basic.py +580 -0
  1497. scipy/stats/tests/test_discrete_distns.py +700 -0
  1498. scipy/stats/tests/test_distributions.py +10413 -0
  1499. scipy/stats/tests/test_entropy.py +322 -0
  1500. scipy/stats/tests/test_fast_gen_inversion.py +435 -0
  1501. scipy/stats/tests/test_fit.py +1090 -0
  1502. scipy/stats/tests/test_hypotests.py +1991 -0
  1503. scipy/stats/tests/test_kdeoth.py +676 -0
  1504. scipy/stats/tests/test_marray.py +289 -0
  1505. scipy/stats/tests/test_mgc.py +217 -0
  1506. scipy/stats/tests/test_morestats.py +3259 -0
  1507. scipy/stats/tests/test_mstats_basic.py +2071 -0
  1508. scipy/stats/tests/test_mstats_extras.py +172 -0
  1509. scipy/stats/tests/test_multicomp.py +405 -0
  1510. scipy/stats/tests/test_multivariate.py +4381 -0
  1511. scipy/stats/tests/test_odds_ratio.py +148 -0
  1512. scipy/stats/tests/test_qmc.py +1492 -0
  1513. scipy/stats/tests/test_quantile.py +199 -0
  1514. scipy/stats/tests/test_rank.py +345 -0
  1515. scipy/stats/tests/test_relative_risk.py +95 -0
  1516. scipy/stats/tests/test_resampling.py +2000 -0
  1517. scipy/stats/tests/test_sampling.py +1450 -0
  1518. scipy/stats/tests/test_sensitivity_analysis.py +310 -0
  1519. scipy/stats/tests/test_stats.py +9707 -0
  1520. scipy/stats/tests/test_survival.py +466 -0
  1521. scipy/stats/tests/test_tukeylambda_stats.py +85 -0
  1522. scipy/stats/tests/test_variation.py +216 -0
  1523. scipy/version.py +12 -0
  1524. scipy-1.16.2.dist-info/DELVEWHEEL +2 -0
  1525. scipy-1.16.2.dist-info/LICENSE.txt +912 -0
  1526. scipy-1.16.2.dist-info/METADATA +1061 -0
  1527. scipy-1.16.2.dist-info/RECORD +1530 -0
  1528. scipy-1.16.2.dist-info/WHEEL +4 -0
  1529. scipy.libs/msvcp140-5f1c5dd31916990d94181e07bc3afb32.dll +0 -0
  1530. scipy.libs/scipy_openblas-f3ac85b1f412f7e86514c923dc4058d1.dll +0 -0
@@ -0,0 +1,2592 @@
1
+ """
2
+ A collection of functions to find the weights and abscissas for
3
+ Gaussian Quadrature.
4
+
5
+ These calculations are done by finding the eigenvalues of a
6
+ tridiagonal matrix whose entries are dependent on the coefficients
7
+ in the recursion formula for the orthogonal polynomials with the
8
+ corresponding weighting function over the interval.
9
+
10
+ Many recursion relations for orthogonal polynomials are given:
11
+
12
+ .. math::
13
+
14
+ a1n f_{n+1} (x) = (a2n + a3n x ) f_n (x) - a4n f_{n-1} (x)
15
+
16
+ The recursion relation of interest is
17
+
18
+ .. math::
19
+
20
+ P_{n+1} (x) = (x - A_n) P_n (x) - B_n P_{n-1} (x)
21
+
22
+ where :math:`P` has a different normalization than :math:`f`.
23
+
24
+ The coefficients can be found as:
25
+
26
+ .. math::
27
+
28
+ A_n = -a2n / a3n
29
+ \\qquad
30
+ B_n = ( a4n / a3n \\sqrt{h_n-1 / h_n})^2
31
+
32
+ where
33
+
34
+ .. math::
35
+
36
+ h_n = \\int_a^b w(x) f_n(x)^2
37
+
38
+ assume:
39
+
40
+ .. math::
41
+
42
+ P_0 (x) = 1
43
+ \\qquad
44
+ P_{-1} (x) == 0
45
+
46
+ For the mathematical background, see [golub.welsch-1969-mathcomp]_ and
47
+ [abramowitz.stegun-1965]_.
48
+
49
+ References
50
+ ----------
51
+ .. [golub.welsch-1969-mathcomp]
52
+ Golub, Gene H, and John H Welsch. 1969. Calculation of Gauss
53
+ Quadrature Rules. *Mathematics of Computation* 23, 221-230+s1--s10.
54
+
55
+ .. [abramowitz.stegun-1965]
56
+ Abramowitz, Milton, and Irene A Stegun. (1965) *Handbook of
57
+ Mathematical Functions: with Formulas, Graphs, and Mathematical
58
+ Tables*. Gaithersburg, MD: National Bureau of Standards.
59
+ http://www.math.sfu.ca/~cbm/aands/
60
+
61
+ .. [townsend.trogdon.olver-2014]
62
+ Townsend, A. and Trogdon, T. and Olver, S. (2014)
63
+ *Fast computation of Gauss quadrature nodes and
64
+ weights on the whole real line*. :arXiv:`1410.5286`.
65
+
66
+ .. [townsend.trogdon.olver-2015]
67
+ Townsend, A. and Trogdon, T. and Olver, S. (2015)
68
+ *Fast computation of Gauss quadrature nodes and
69
+ weights on the whole real line*.
70
+ IMA Journal of Numerical Analysis
71
+ :doi:`10.1093/imanum/drv002`.
72
+ """
73
+ #
74
+ # Author: Travis Oliphant 2000
75
+ # Updated Sep. 2003 (fixed bugs --- tested to be accurate)
76
+
77
+ # SciPy imports.
78
+ import numpy as np
79
+ from numpy import (exp, inf, pi, sqrt, floor, sin, cos, around,
80
+ hstack, arccos, arange)
81
+ from scipy import linalg
82
+ from scipy.special import airy
83
+
84
+ # Local imports.
85
+ # There is no .pyi file for _specfun
86
+ from . import _specfun # type: ignore
87
+ from . import _ufuncs
88
+ _gam = _ufuncs.gamma
89
+
90
+ _polyfuns = ['legendre', 'chebyt', 'chebyu', 'chebyc', 'chebys',
91
+ 'jacobi', 'laguerre', 'genlaguerre', 'hermite',
92
+ 'hermitenorm', 'gegenbauer', 'sh_legendre', 'sh_chebyt',
93
+ 'sh_chebyu', 'sh_jacobi']
94
+
95
+ # Correspondence between new and old names of root functions
96
+ _rootfuns_map = {'roots_legendre': 'p_roots',
97
+ 'roots_chebyt': 't_roots',
98
+ 'roots_chebyu': 'u_roots',
99
+ 'roots_chebyc': 'c_roots',
100
+ 'roots_chebys': 's_roots',
101
+ 'roots_jacobi': 'j_roots',
102
+ 'roots_laguerre': 'l_roots',
103
+ 'roots_genlaguerre': 'la_roots',
104
+ 'roots_hermite': 'h_roots',
105
+ 'roots_hermitenorm': 'he_roots',
106
+ 'roots_gegenbauer': 'cg_roots',
107
+ 'roots_sh_legendre': 'ps_roots',
108
+ 'roots_sh_chebyt': 'ts_roots',
109
+ 'roots_sh_chebyu': 'us_roots',
110
+ 'roots_sh_jacobi': 'js_roots'}
111
+
112
+ __all__ = _polyfuns + list(_rootfuns_map.keys())
113
+
114
+
115
+ class orthopoly1d(np.poly1d):
116
+
117
+ def __init__(self, roots, weights=None, hn=1.0, kn=1.0, wfunc=None,
118
+ limits=None, monic=False, eval_func=None):
119
+ equiv_weights = [weights[k] / wfunc(roots[k]) for
120
+ k in range(len(roots))]
121
+ mu = sqrt(hn)
122
+ if monic:
123
+ evf = eval_func
124
+ if evf:
125
+ knn = kn
126
+ def eval_func(x):
127
+ return evf(x) / knn
128
+ mu = mu / abs(kn)
129
+ kn = 1.0
130
+
131
+ # compute coefficients from roots, then scale
132
+ poly = np.poly1d(roots, r=True)
133
+ np.poly1d.__init__(self, poly.coeffs * float(kn))
134
+
135
+ self.weights = np.array(list(zip(roots, weights, equiv_weights)))
136
+ self.weight_func = wfunc
137
+ self.limits = limits
138
+ self.normcoef = mu
139
+
140
+ # Note: eval_func will be discarded on arithmetic
141
+ self._eval_func = eval_func
142
+
143
+ def __call__(self, v):
144
+ if self._eval_func and not isinstance(v, np.poly1d):
145
+ return self._eval_func(v)
146
+ else:
147
+ return np.poly1d.__call__(self, v)
148
+
149
+ def _scale(self, p):
150
+ if p == 1.0:
151
+ return
152
+ self._coeffs *= p
153
+
154
+ evf = self._eval_func
155
+ if evf:
156
+ self._eval_func = lambda x: evf(x) * p
157
+ self.normcoef *= p
158
+
159
+
160
+ def _gen_roots_and_weights(n, mu0, an_func, bn_func, f, df, symmetrize, mu):
161
+ """[x,w] = gen_roots_and_weights(n,an_func,sqrt_bn_func,mu)
162
+
163
+ Returns the roots (x) of an nth order orthogonal polynomial,
164
+ and weights (w) to use in appropriate Gaussian quadrature with that
165
+ orthogonal polynomial.
166
+
167
+ The polynomials have the recurrence relation
168
+ P_n+1(x) = (x - A_n) P_n(x) - B_n P_n-1(x)
169
+
170
+ an_func(n) should return A_n
171
+ sqrt_bn_func(n) should return sqrt(B_n)
172
+ mu ( = h_0 ) is the integral of the weight over the orthogonal
173
+ interval
174
+ """
175
+ k = np.arange(n, dtype='d')
176
+ c = np.zeros((2, n))
177
+ c[0,1:] = bn_func(k[1:])
178
+ c[1,:] = an_func(k)
179
+ x = linalg.eigvals_banded(c, overwrite_a_band=True)
180
+
181
+ # improve roots by one application of Newton's method
182
+ y = f(n, x)
183
+ dy = df(n, x)
184
+ x -= y/dy
185
+
186
+ # fm and dy may contain very large/small values, so we
187
+ # log-normalize them to maintain precision in the product fm*dy
188
+ fm = f(n-1, x)
189
+ log_fm = np.log(np.abs(fm))
190
+ log_dy = np.log(np.abs(dy))
191
+ fm /= np.exp((log_fm.max() + log_fm.min()) / 2.)
192
+ dy /= np.exp((log_dy.max() + log_dy.min()) / 2.)
193
+ w = 1.0 / (fm * dy)
194
+
195
+ if symmetrize:
196
+ w = (w + w[::-1]) / 2
197
+ x = (x - x[::-1]) / 2
198
+
199
+ w *= mu0 / w.sum()
200
+
201
+ if mu:
202
+ return x, w, mu0
203
+ else:
204
+ return x, w
205
+
206
+ # Jacobi Polynomials 1 P^(alpha,beta)_n(x)
207
+
208
+
209
+ def roots_jacobi(n, alpha, beta, mu=False):
210
+ r"""Gauss-Jacobi quadrature.
211
+
212
+ Compute the sample points and weights for Gauss-Jacobi
213
+ quadrature. The sample points are the roots of the nth degree
214
+ Jacobi polynomial, :math:`P^{\alpha, \beta}_n(x)`. These sample
215
+ points and weights correctly integrate polynomials of degree
216
+ :math:`2n - 1` or less over the interval :math:`[-1, 1]` with
217
+ weight function :math:`w(x) = (1 - x)^{\alpha} (1 +
218
+ x)^{\beta}`. See 22.2.1 in [AS]_ for details.
219
+
220
+ Parameters
221
+ ----------
222
+ n : int
223
+ quadrature order
224
+ alpha : float
225
+ alpha must be > -1
226
+ beta : float
227
+ beta must be > -1
228
+ mu : bool, optional
229
+ If True, return the sum of the weights, optional.
230
+
231
+ Returns
232
+ -------
233
+ x : ndarray
234
+ Sample points
235
+ w : ndarray
236
+ Weights
237
+ mu : float
238
+ Sum of the weights
239
+
240
+ See Also
241
+ --------
242
+ scipy.integrate.fixed_quad
243
+
244
+ References
245
+ ----------
246
+ .. [AS] Milton Abramowitz and Irene A. Stegun, eds.
247
+ Handbook of Mathematical Functions with Formulas,
248
+ Graphs, and Mathematical Tables. New York: Dover, 1972.
249
+
250
+ """
251
+ m = int(n)
252
+ if n < 1 or n != m:
253
+ raise ValueError("n must be a positive integer.")
254
+ if alpha <= -1 or beta <= -1:
255
+ raise ValueError("alpha and beta must be greater than -1.")
256
+
257
+ if alpha == 0.0 and beta == 0.0:
258
+ return roots_legendre(m, mu)
259
+ if alpha == beta:
260
+ return roots_gegenbauer(m, alpha+0.5, mu)
261
+
262
+ if (alpha + beta) <= 1000:
263
+ mu0 = 2.0**(alpha+beta+1) * _ufuncs.beta(alpha+1, beta+1)
264
+ else:
265
+ # Avoid overflows in pow and beta for very large parameters
266
+ mu0 = np.exp((alpha + beta + 1) * np.log(2.0)
267
+ + _ufuncs.betaln(alpha+1, beta+1))
268
+ a = alpha
269
+ b = beta
270
+ if a + b == 0.0:
271
+ def an_func(k):
272
+ return np.where(k == 0, (b - a) / (2 + a + b), 0.0)
273
+ else:
274
+ def an_func(k):
275
+ return np.where(
276
+ k == 0,
277
+ (b - a) / (2 + a + b),
278
+ (b * b - a * a) / ((2.0 * k + a + b) * (2.0 * k + a + b + 2))
279
+ )
280
+
281
+ def bn_func(k):
282
+ return (
283
+ 2.0 / (2.0 * k + a + b)
284
+ * np.sqrt((k + a) * (k + b) / (2 * k + a + b + 1))
285
+ * np.where(k == 1, 1.0, np.sqrt(k * (k + a + b) / (2.0 * k + a + b - 1)))
286
+ )
287
+
288
+ def f(n, x):
289
+ return _ufuncs.eval_jacobi(n, a, b, x)
290
+ def df(n, x):
291
+ return 0.5 * (n + a + b + 1) * _ufuncs.eval_jacobi(n - 1, a + 1, b + 1, x)
292
+ return _gen_roots_and_weights(m, mu0, an_func, bn_func, f, df, False, mu)
293
+
294
+
295
+ def jacobi(n, alpha, beta, monic=False):
296
+ r"""Jacobi polynomial.
297
+
298
+ Defined to be the solution of
299
+
300
+ .. math::
301
+ (1 - x^2)\frac{d^2}{dx^2}P_n^{(\alpha, \beta)}
302
+ + (\beta - \alpha - (\alpha + \beta + 2)x)
303
+ \frac{d}{dx}P_n^{(\alpha, \beta)}
304
+ + n(n + \alpha + \beta + 1)P_n^{(\alpha, \beta)} = 0
305
+
306
+ for :math:`\alpha, \beta > -1`; :math:`P_n^{(\alpha, \beta)}` is a
307
+ polynomial of degree :math:`n`.
308
+
309
+ Parameters
310
+ ----------
311
+ n : int
312
+ Degree of the polynomial.
313
+ alpha : float
314
+ Parameter, must be greater than -1.
315
+ beta : float
316
+ Parameter, must be greater than -1.
317
+ monic : bool, optional
318
+ If `True`, scale the leading coefficient to be 1. Default is
319
+ `False`.
320
+
321
+ Returns
322
+ -------
323
+ P : orthopoly1d
324
+ Jacobi polynomial.
325
+
326
+ Notes
327
+ -----
328
+ For fixed :math:`\alpha, \beta`, the polynomials
329
+ :math:`P_n^{(\alpha, \beta)}` are orthogonal over :math:`[-1, 1]`
330
+ with weight function :math:`(1 - x)^\alpha(1 + x)^\beta`.
331
+
332
+ References
333
+ ----------
334
+ .. [AS] Milton Abramowitz and Irene A. Stegun, eds.
335
+ Handbook of Mathematical Functions with Formulas,
336
+ Graphs, and Mathematical Tables. New York: Dover, 1972.
337
+
338
+ Examples
339
+ --------
340
+ The Jacobi polynomials satisfy the recurrence relation:
341
+
342
+ .. math::
343
+ P_n^{(\alpha, \beta-1)}(x) - P_n^{(\alpha-1, \beta)}(x)
344
+ = P_{n-1}^{(\alpha, \beta)}(x)
345
+
346
+ This can be verified, for example, for :math:`\alpha = \beta = 2`
347
+ and :math:`n = 1` over the interval :math:`[-1, 1]`:
348
+
349
+ >>> import numpy as np
350
+ >>> from scipy.special import jacobi
351
+ >>> x = np.arange(-1.0, 1.0, 0.01)
352
+ >>> np.allclose(jacobi(0, 2, 2)(x),
353
+ ... jacobi(1, 2, 1)(x) - jacobi(1, 1, 2)(x))
354
+ True
355
+
356
+ Plot of the Jacobi polynomial :math:`P_5^{(\alpha, -0.5)}` for
357
+ different values of :math:`\alpha`:
358
+
359
+ >>> import matplotlib.pyplot as plt
360
+ >>> x = np.arange(-1.0, 1.0, 0.01)
361
+ >>> fig, ax = plt.subplots()
362
+ >>> ax.set_ylim(-2.0, 2.0)
363
+ >>> ax.set_title(r'Jacobi polynomials $P_5^{(\alpha, -0.5)}$')
364
+ >>> for alpha in np.arange(0, 4, 1):
365
+ ... ax.plot(x, jacobi(5, alpha, -0.5)(x), label=rf'$\alpha={alpha}$')
366
+ >>> plt.legend(loc='best')
367
+ >>> plt.show()
368
+
369
+ """
370
+ if n < 0:
371
+ raise ValueError("n must be nonnegative.")
372
+
373
+ def wfunc(x):
374
+ return (1 - x) ** alpha * (1 + x) ** beta
375
+ if n == 0:
376
+ return orthopoly1d([], [], 1.0, 1.0, wfunc, (-1, 1), monic,
377
+ eval_func=np.ones_like)
378
+ x, w, mu = roots_jacobi(n, alpha, beta, mu=True)
379
+ ab1 = alpha + beta + 1.0
380
+ hn = 2**ab1 / (2 * n + ab1) * _gam(n + alpha + 1)
381
+ hn *= _gam(n + beta + 1.0) / _gam(n + 1) / _gam(n + ab1)
382
+ kn = _gam(2 * n + ab1) / 2.0**n / _gam(n + 1) / _gam(n + ab1)
383
+ # here kn = coefficient on x^n term
384
+ p = orthopoly1d(x, w, hn, kn, wfunc, (-1, 1), monic,
385
+ lambda x: _ufuncs.eval_jacobi(n, alpha, beta, x))
386
+ return p
387
+
388
+ # Jacobi Polynomials shifted G_n(p,q,x)
389
+
390
+
391
+ def roots_sh_jacobi(n, p1, q1, mu=False):
392
+ """Gauss-Jacobi (shifted) quadrature.
393
+
394
+ Compute the sample points and weights for Gauss-Jacobi (shifted)
395
+ quadrature. The sample points are the roots of the nth degree
396
+ shifted Jacobi polynomial, :math:`G^{p,q}_n(x)`. These sample
397
+ points and weights correctly integrate polynomials of degree
398
+ :math:`2n - 1` or less over the interval :math:`[0, 1]` with
399
+ weight function :math:`w(x) = (1 - x)^{p-q} x^{q-1}`. See 22.2.2
400
+ in [AS]_ for details.
401
+
402
+ Parameters
403
+ ----------
404
+ n : int
405
+ quadrature order
406
+ p1 : float
407
+ (p1 - q1) must be > -1
408
+ q1 : float
409
+ q1 must be > 0
410
+ mu : bool, optional
411
+ If True, return the sum of the weights, optional.
412
+
413
+ Returns
414
+ -------
415
+ x : ndarray
416
+ Sample points
417
+ w : ndarray
418
+ Weights
419
+ mu : float
420
+ Sum of the weights
421
+
422
+ See Also
423
+ --------
424
+ scipy.integrate.fixed_quad
425
+
426
+ References
427
+ ----------
428
+ .. [AS] Milton Abramowitz and Irene A. Stegun, eds.
429
+ Handbook of Mathematical Functions with Formulas,
430
+ Graphs, and Mathematical Tables. New York: Dover, 1972.
431
+
432
+ """
433
+ if (p1-q1) <= -1 or q1 <= 0:
434
+ message = "(p - q) must be greater than -1, and q must be greater than 0."
435
+ raise ValueError(message)
436
+ x, w, m = roots_jacobi(n, p1-q1, q1-1, True)
437
+ x = (x + 1) / 2
438
+ scale = 2.0**p1
439
+ w /= scale
440
+ m /= scale
441
+ if mu:
442
+ return x, w, m
443
+ else:
444
+ return x, w
445
+
446
+
447
+ def sh_jacobi(n, p, q, monic=False):
448
+ r"""Shifted Jacobi polynomial.
449
+
450
+ Defined by
451
+
452
+ .. math::
453
+
454
+ G_n^{(p, q)}(x)
455
+ = \binom{2n + p - 1}{n}^{-1}P_n^{(p - q, q - 1)}(2x - 1),
456
+
457
+ where :math:`P_n^{(\cdot, \cdot)}` is the nth Jacobi polynomial.
458
+
459
+ Parameters
460
+ ----------
461
+ n : int
462
+ Degree of the polynomial.
463
+ p : float
464
+ Parameter, must have :math:`p > q - 1`.
465
+ q : float
466
+ Parameter, must be greater than 0.
467
+ monic : bool, optional
468
+ If `True`, scale the leading coefficient to be 1. Default is
469
+ `False`.
470
+
471
+ Returns
472
+ -------
473
+ G : orthopoly1d
474
+ Shifted Jacobi polynomial.
475
+
476
+ Notes
477
+ -----
478
+ For fixed :math:`p, q`, the polynomials :math:`G_n^{(p, q)}` are
479
+ orthogonal over :math:`[0, 1]` with weight function :math:`(1 -
480
+ x)^{p - q}x^{q - 1}`.
481
+
482
+ """
483
+ if n < 0:
484
+ raise ValueError("n must be nonnegative.")
485
+
486
+ def wfunc(x):
487
+ return (1.0 - x) ** (p - q) * x ** (q - 1.0)
488
+ if n == 0:
489
+ return orthopoly1d([], [], 1.0, 1.0, wfunc, (-1, 1), monic,
490
+ eval_func=np.ones_like)
491
+ n1 = n
492
+ x, w = roots_sh_jacobi(n1, p, q)
493
+ hn = _gam(n + 1) * _gam(n + q) * _gam(n + p) * _gam(n + p - q + 1)
494
+ hn /= (2 * n + p) * (_gam(2 * n + p)**2)
495
+ # kn = 1.0 in standard form so monic is redundant. Kept for compatibility.
496
+ kn = 1.0
497
+ pp = orthopoly1d(x, w, hn, kn, wfunc=wfunc, limits=(0, 1), monic=monic,
498
+ eval_func=lambda x: _ufuncs.eval_sh_jacobi(n, p, q, x))
499
+ return pp
500
+
501
+ # Generalized Laguerre L^(alpha)_n(x)
502
+
503
+
504
+ def roots_genlaguerre(n, alpha, mu=False):
505
+ r"""Gauss-generalized Laguerre quadrature.
506
+
507
+ Compute the sample points and weights for Gauss-generalized
508
+ Laguerre quadrature. The sample points are the roots of the nth
509
+ degree generalized Laguerre polynomial, :math:`L^{\alpha}_n(x)`.
510
+ These sample points and weights correctly integrate polynomials of
511
+ degree :math:`2n - 1` or less over the interval :math:`[0,
512
+ \infty]` with weight function :math:`w(x) = x^{\alpha}
513
+ e^{-x}`. See 22.3.9 in [AS]_ for details.
514
+
515
+ Parameters
516
+ ----------
517
+ n : int
518
+ quadrature order
519
+ alpha : float
520
+ alpha must be > -1
521
+ mu : bool, optional
522
+ If True, return the sum of the weights, optional.
523
+
524
+ Returns
525
+ -------
526
+ x : ndarray
527
+ Sample points
528
+ w : ndarray
529
+ Weights
530
+ mu : float
531
+ Sum of the weights
532
+
533
+ See Also
534
+ --------
535
+ scipy.integrate.fixed_quad
536
+
537
+ References
538
+ ----------
539
+ .. [AS] Milton Abramowitz and Irene A. Stegun, eds.
540
+ Handbook of Mathematical Functions with Formulas,
541
+ Graphs, and Mathematical Tables. New York: Dover, 1972.
542
+
543
+ """
544
+ m = int(n)
545
+ if n < 1 or n != m:
546
+ raise ValueError("n must be a positive integer.")
547
+ if alpha < -1:
548
+ raise ValueError("alpha must be greater than -1.")
549
+
550
+ mu0 = _ufuncs.gamma(alpha + 1)
551
+
552
+ if m == 1:
553
+ x = np.array([alpha+1.0], 'd')
554
+ w = np.array([mu0], 'd')
555
+ if mu:
556
+ return x, w, mu0
557
+ else:
558
+ return x, w
559
+
560
+ def an_func(k):
561
+ return 2 * k + alpha + 1
562
+ def bn_func(k):
563
+ return -np.sqrt(k * (k + alpha))
564
+ def f(n, x):
565
+ return _ufuncs.eval_genlaguerre(n, alpha, x)
566
+ def df(n, x):
567
+ return (n * _ufuncs.eval_genlaguerre(n, alpha, x)
568
+ - (n + alpha) * _ufuncs.eval_genlaguerre(n - 1, alpha, x)) / x
569
+ return _gen_roots_and_weights(m, mu0, an_func, bn_func, f, df, False, mu)
570
+
571
+
572
+ def genlaguerre(n, alpha, monic=False):
573
+ r"""Generalized (associated) Laguerre polynomial.
574
+
575
+ Defined to be the solution of
576
+
577
+ .. math::
578
+ x\frac{d^2}{dx^2}L_n^{(\alpha)}
579
+ + (\alpha + 1 - x)\frac{d}{dx}L_n^{(\alpha)}
580
+ + nL_n^{(\alpha)} = 0,
581
+
582
+ where :math:`\alpha > -1`; :math:`L_n^{(\alpha)}` is a polynomial
583
+ of degree :math:`n`.
584
+
585
+ Parameters
586
+ ----------
587
+ n : int
588
+ Degree of the polynomial.
589
+ alpha : float
590
+ Parameter, must be greater than -1.
591
+ monic : bool, optional
592
+ If `True`, scale the leading coefficient to be 1. Default is
593
+ `False`.
594
+
595
+ Returns
596
+ -------
597
+ L : orthopoly1d
598
+ Generalized Laguerre polynomial.
599
+
600
+ See Also
601
+ --------
602
+ laguerre : Laguerre polynomial.
603
+ hyp1f1 : confluent hypergeometric function
604
+
605
+ Notes
606
+ -----
607
+ For fixed :math:`\alpha`, the polynomials :math:`L_n^{(\alpha)}`
608
+ are orthogonal over :math:`[0, \infty)` with weight function
609
+ :math:`e^{-x}x^\alpha`.
610
+
611
+ The Laguerre polynomials are the special case where :math:`\alpha
612
+ = 0`.
613
+
614
+ References
615
+ ----------
616
+ .. [AS] Milton Abramowitz and Irene A. Stegun, eds.
617
+ Handbook of Mathematical Functions with Formulas,
618
+ Graphs, and Mathematical Tables. New York: Dover, 1972.
619
+
620
+ Examples
621
+ --------
622
+ The generalized Laguerre polynomials are closely related to the confluent
623
+ hypergeometric function :math:`{}_1F_1`:
624
+
625
+ .. math::
626
+ L_n^{(\alpha)} = \binom{n + \alpha}{n} {}_1F_1(-n, \alpha +1, x)
627
+
628
+ This can be verified, for example, for :math:`n = \alpha = 3` over the
629
+ interval :math:`[-1, 1]`:
630
+
631
+ >>> import numpy as np
632
+ >>> from scipy.special import binom
633
+ >>> from scipy.special import genlaguerre
634
+ >>> from scipy.special import hyp1f1
635
+ >>> x = np.arange(-1.0, 1.0, 0.01)
636
+ >>> np.allclose(genlaguerre(3, 3)(x), binom(6, 3) * hyp1f1(-3, 4, x))
637
+ True
638
+
639
+ This is the plot of the generalized Laguerre polynomials
640
+ :math:`L_3^{(\alpha)}` for some values of :math:`\alpha`:
641
+
642
+ >>> import matplotlib.pyplot as plt
643
+ >>> x = np.arange(-4.0, 12.0, 0.01)
644
+ >>> fig, ax = plt.subplots()
645
+ >>> ax.set_ylim(-5.0, 10.0)
646
+ >>> ax.set_title(r'Generalized Laguerre polynomials $L_3^{\alpha}$')
647
+ >>> for alpha in np.arange(0, 5):
648
+ ... ax.plot(x, genlaguerre(3, alpha)(x), label=rf'$L_3^{(alpha)}$')
649
+ >>> plt.legend(loc='best')
650
+ >>> plt.show()
651
+
652
+ """
653
+ if alpha <= -1:
654
+ raise ValueError("alpha must be > -1")
655
+ if n < 0:
656
+ raise ValueError("n must be nonnegative.")
657
+
658
+ if n == 0:
659
+ n1 = n + 1
660
+ else:
661
+ n1 = n
662
+ x, w = roots_genlaguerre(n1, alpha)
663
+ def wfunc(x):
664
+ return exp(-x) * x ** alpha
665
+ if n == 0:
666
+ x, w = [], []
667
+ hn = _gam(n + alpha + 1) / _gam(n + 1)
668
+ kn = (-1)**n / _gam(n + 1)
669
+ p = orthopoly1d(x, w, hn, kn, wfunc, (0, inf), monic,
670
+ lambda x: _ufuncs.eval_genlaguerre(n, alpha, x))
671
+ return p
672
+
673
+ # Laguerre L_n(x)
674
+
675
+
676
+ def roots_laguerre(n, mu=False):
677
+ r"""Gauss-Laguerre quadrature.
678
+
679
+ Compute the sample points and weights for Gauss-Laguerre
680
+ quadrature. The sample points are the roots of the nth degree
681
+ Laguerre polynomial, :math:`L_n(x)`. These sample points and
682
+ weights correctly integrate polynomials of degree :math:`2n - 1`
683
+ or less over the interval :math:`[0, \infty]` with weight function
684
+ :math:`w(x) = e^{-x}`. See 22.2.13 in [AS]_ for details.
685
+
686
+ Parameters
687
+ ----------
688
+ n : int
689
+ quadrature order
690
+ mu : bool, optional
691
+ If True, return the sum of the weights, optional.
692
+
693
+ Returns
694
+ -------
695
+ x : ndarray
696
+ Sample points
697
+ w : ndarray
698
+ Weights
699
+ mu : float
700
+ Sum of the weights
701
+
702
+ See Also
703
+ --------
704
+ scipy.integrate.fixed_quad
705
+ numpy.polynomial.laguerre.laggauss
706
+
707
+ References
708
+ ----------
709
+ .. [AS] Milton Abramowitz and Irene A. Stegun, eds.
710
+ Handbook of Mathematical Functions with Formulas,
711
+ Graphs, and Mathematical Tables. New York: Dover, 1972.
712
+
713
+ """
714
+ return roots_genlaguerre(n, 0.0, mu=mu)
715
+
716
+
717
+ def laguerre(n, monic=False):
718
+ r"""Laguerre polynomial.
719
+
720
+ Defined to be the solution of
721
+
722
+ .. math::
723
+ x\frac{d^2}{dx^2}L_n + (1 - x)\frac{d}{dx}L_n + nL_n = 0;
724
+
725
+ :math:`L_n` is a polynomial of degree :math:`n`.
726
+
727
+ Parameters
728
+ ----------
729
+ n : int
730
+ Degree of the polynomial.
731
+ monic : bool, optional
732
+ If `True`, scale the leading coefficient to be 1. Default is
733
+ `False`.
734
+
735
+ Returns
736
+ -------
737
+ L : orthopoly1d
738
+ Laguerre Polynomial.
739
+
740
+ See Also
741
+ --------
742
+ genlaguerre : Generalized (associated) Laguerre polynomial.
743
+
744
+ Notes
745
+ -----
746
+ The polynomials :math:`L_n` are orthogonal over :math:`[0,
747
+ \infty)` with weight function :math:`e^{-x}`.
748
+
749
+ References
750
+ ----------
751
+ .. [AS] Milton Abramowitz and Irene A. Stegun, eds.
752
+ Handbook of Mathematical Functions with Formulas,
753
+ Graphs, and Mathematical Tables. New York: Dover, 1972.
754
+
755
+ Examples
756
+ --------
757
+ The Laguerre polynomials :math:`L_n` are the special case
758
+ :math:`\alpha = 0` of the generalized Laguerre polynomials
759
+ :math:`L_n^{(\alpha)}`.
760
+ Let's verify it on the interval :math:`[-1, 1]`:
761
+
762
+ >>> import numpy as np
763
+ >>> from scipy.special import genlaguerre
764
+ >>> from scipy.special import laguerre
765
+ >>> x = np.arange(-1.0, 1.0, 0.01)
766
+ >>> np.allclose(genlaguerre(3, 0)(x), laguerre(3)(x))
767
+ True
768
+
769
+ The polynomials :math:`L_n` also satisfy the recurrence relation:
770
+
771
+ .. math::
772
+ (n + 1)L_{n+1}(x) = (2n +1 -x)L_n(x) - nL_{n-1}(x)
773
+
774
+ This can be easily checked on :math:`[0, 1]` for :math:`n = 3`:
775
+
776
+ >>> x = np.arange(0.0, 1.0, 0.01)
777
+ >>> np.allclose(4 * laguerre(4)(x),
778
+ ... (7 - x) * laguerre(3)(x) - 3 * laguerre(2)(x))
779
+ True
780
+
781
+ This is the plot of the first few Laguerre polynomials :math:`L_n`:
782
+
783
+ >>> import matplotlib.pyplot as plt
784
+ >>> x = np.arange(-1.0, 5.0, 0.01)
785
+ >>> fig, ax = plt.subplots()
786
+ >>> ax.set_ylim(-5.0, 5.0)
787
+ >>> ax.set_title(r'Laguerre polynomials $L_n$')
788
+ >>> for n in np.arange(0, 5):
789
+ ... ax.plot(x, laguerre(n)(x), label=rf'$L_{n}$')
790
+ >>> plt.legend(loc='best')
791
+ >>> plt.show()
792
+
793
+ """
794
+ if n < 0:
795
+ raise ValueError("n must be nonnegative.")
796
+
797
+ if n == 0:
798
+ n1 = n + 1
799
+ else:
800
+ n1 = n
801
+ x, w = roots_laguerre(n1)
802
+ if n == 0:
803
+ x, w = [], []
804
+ hn = 1.0
805
+ kn = (-1)**n / _gam(n + 1)
806
+ p = orthopoly1d(x, w, hn, kn, lambda x: exp(-x), (0, inf), monic,
807
+ lambda x: _ufuncs.eval_laguerre(n, x))
808
+ return p
809
+
810
+ # Hermite 1 H_n(x)
811
+
812
+
813
+ def roots_hermite(n, mu=False):
814
+ r"""Gauss-Hermite (physicist's) quadrature.
815
+
816
+ Compute the sample points and weights for Gauss-Hermite
817
+ quadrature. The sample points are the roots of the nth degree
818
+ Hermite polynomial, :math:`H_n(x)`. These sample points and
819
+ weights correctly integrate polynomials of degree :math:`2n - 1`
820
+ or less over the interval :math:`[-\infty, \infty]` with weight
821
+ function :math:`w(x) = e^{-x^2}`. See 22.2.14 in [AS]_ for
822
+ details.
823
+
824
+ Parameters
825
+ ----------
826
+ n : int
827
+ quadrature order
828
+ mu : bool, optional
829
+ If True, return the sum of the weights, optional.
830
+
831
+ Returns
832
+ -------
833
+ x : ndarray
834
+ Sample points
835
+ w : ndarray
836
+ Weights
837
+ mu : float
838
+ Sum of the weights
839
+
840
+ See Also
841
+ --------
842
+ scipy.integrate.fixed_quad
843
+ numpy.polynomial.hermite.hermgauss
844
+ roots_hermitenorm
845
+
846
+ Notes
847
+ -----
848
+ For small n up to 150 a modified version of the Golub-Welsch
849
+ algorithm is used. Nodes are computed from the eigenvalue
850
+ problem and improved by one step of a Newton iteration.
851
+ The weights are computed from the well-known analytical formula.
852
+
853
+ For n larger than 150 an optimal asymptotic algorithm is applied
854
+ which computes nodes and weights in a numerically stable manner.
855
+ The algorithm has linear runtime making computation for very
856
+ large n (several thousand or more) feasible.
857
+
858
+ References
859
+ ----------
860
+ .. [townsend.trogdon.olver-2014]
861
+ Townsend, A. and Trogdon, T. and Olver, S. (2014)
862
+ *Fast computation of Gauss quadrature nodes and
863
+ weights on the whole real line*. :arXiv:`1410.5286`.
864
+ .. [townsend.trogdon.olver-2015]
865
+ Townsend, A. and Trogdon, T. and Olver, S. (2015)
866
+ *Fast computation of Gauss quadrature nodes and
867
+ weights on the whole real line*.
868
+ IMA Journal of Numerical Analysis
869
+ :doi:`10.1093/imanum/drv002`.
870
+ .. [AS] Milton Abramowitz and Irene A. Stegun, eds.
871
+ Handbook of Mathematical Functions with Formulas,
872
+ Graphs, and Mathematical Tables. New York: Dover, 1972.
873
+
874
+ """
875
+ m = int(n)
876
+ if n < 1 or n != m:
877
+ raise ValueError("n must be a positive integer.")
878
+
879
+ mu0 = np.sqrt(np.pi)
880
+ if n <= 150:
881
+ def an_func(k):
882
+ return 0.0 * k
883
+ def bn_func(k):
884
+ return np.sqrt(k / 2.0)
885
+ f = _ufuncs.eval_hermite
886
+ def df(n, x):
887
+ return 2.0 * n * _ufuncs.eval_hermite(n - 1, x)
888
+ return _gen_roots_and_weights(m, mu0, an_func, bn_func, f, df, True, mu)
889
+ else:
890
+ nodes, weights = _roots_hermite_asy(m)
891
+ if mu:
892
+ return nodes, weights, mu0
893
+ else:
894
+ return nodes, weights
895
+
896
+
897
+ def _compute_tauk(n, k, maxit=5):
898
+ """Helper function for Tricomi initial guesses
899
+
900
+ For details, see formula 3.1 in lemma 3.1 in the
901
+ original paper.
902
+
903
+ Parameters
904
+ ----------
905
+ n : int
906
+ Quadrature order
907
+ k : ndarray of type int
908
+ Index of roots :math:`\tau_k` to compute
909
+ maxit : int
910
+ Number of Newton maxit performed, the default
911
+ value of 5 is sufficient.
912
+
913
+ Returns
914
+ -------
915
+ tauk : ndarray
916
+ Roots of equation 3.1
917
+
918
+ See Also
919
+ --------
920
+ initial_nodes_a
921
+ roots_hermite_asy
922
+ """
923
+ a = n % 2 - 0.5
924
+ c = (4.0*floor(n/2.0) - 4.0*k + 3.0)*pi / (4.0*floor(n/2.0) + 2.0*a + 2.0)
925
+ def f(x):
926
+ return x - sin(x) - c
927
+ def df(x):
928
+ return 1.0 - cos(x)
929
+ xi = 0.5*pi
930
+ for i in range(maxit):
931
+ xi = xi - f(xi)/df(xi)
932
+ return xi
933
+
934
+
935
+ def _initial_nodes_a(n, k):
936
+ r"""Tricomi initial guesses
937
+
938
+ Computes an initial approximation to the square of the `k`-th
939
+ (positive) root :math:`x_k` of the Hermite polynomial :math:`H_n`
940
+ of order :math:`n`. The formula is the one from lemma 3.1 in the
941
+ original paper. The guesses are accurate except in the region
942
+ near :math:`\sqrt{2n + 1}`.
943
+
944
+ Parameters
945
+ ----------
946
+ n : int
947
+ Quadrature order
948
+ k : ndarray of type int
949
+ Index of roots to compute
950
+
951
+ Returns
952
+ -------
953
+ xksq : ndarray
954
+ Square of the approximate roots
955
+
956
+ See Also
957
+ --------
958
+ initial_nodes
959
+ roots_hermite_asy
960
+ """
961
+ tauk = _compute_tauk(n, k)
962
+ sigk = cos(0.5*tauk)**2
963
+ a = n % 2 - 0.5
964
+ nu = 4.0*floor(n/2.0) + 2.0*a + 2.0
965
+ # Initial approximation of Hermite roots (square)
966
+ xksq = nu*sigk - 1.0/(3.0*nu) * (5.0/(4.0*(1.0-sigk)**2) - 1.0/(1.0-sigk) - 0.25)
967
+ return xksq
968
+
969
+
970
+ def _initial_nodes_b(n, k):
971
+ r"""Gatteschi initial guesses
972
+
973
+ Computes an initial approximation to the square of the kth
974
+ (positive) root :math:`x_k` of the Hermite polynomial :math:`H_n`
975
+ of order :math:`n`. The formula is the one from lemma 3.2 in the
976
+ original paper. The guesses are accurate in the region just
977
+ below :math:`\sqrt{2n + 1}`.
978
+
979
+ Parameters
980
+ ----------
981
+ n : int
982
+ Quadrature order
983
+ k : ndarray of type int
984
+ Index of roots to compute
985
+
986
+ Returns
987
+ -------
988
+ xksq : ndarray
989
+ Square of the approximate root
990
+
991
+ See Also
992
+ --------
993
+ initial_nodes
994
+ roots_hermite_asy
995
+ """
996
+ a = n % 2 - 0.5
997
+ nu = 4.0*floor(n/2.0) + 2.0*a + 2.0
998
+ # Airy roots by approximation
999
+ ak = _specfun.airyzo(k.max(), 1)[0][::-1]
1000
+ # Initial approximation of Hermite roots (square)
1001
+ xksq = (nu
1002
+ + 2.0**(2.0/3.0) * ak * nu**(1.0/3.0)
1003
+ + 1.0/5.0 * 2.0**(4.0/3.0) * ak**2 * nu**(-1.0/3.0)
1004
+ + (9.0/140.0 - 12.0/175.0 * ak**3) * nu**(-1.0)
1005
+ + (16.0/1575.0 * ak + 92.0/7875.0 * ak**4) * 2.0**(2.0/3.0) * nu**(-5.0/3.0)
1006
+ - (15152.0/3031875.0 * ak**5 + 1088.0/121275.0 * ak**2)
1007
+ * 2.0**(1.0/3.0) * nu**(-7.0/3.0))
1008
+ return xksq
1009
+
1010
+
1011
+ def _initial_nodes(n):
1012
+ """Initial guesses for the Hermite roots
1013
+
1014
+ Computes an initial approximation to the non-negative
1015
+ roots :math:`x_k` of the Hermite polynomial :math:`H_n`
1016
+ of order :math:`n`. The Tricomi and Gatteschi initial
1017
+ guesses are used in the region where they are accurate.
1018
+
1019
+ Parameters
1020
+ ----------
1021
+ n : int
1022
+ Quadrature order
1023
+
1024
+ Returns
1025
+ -------
1026
+ xk : ndarray
1027
+ Approximate roots
1028
+
1029
+ See Also
1030
+ --------
1031
+ roots_hermite_asy
1032
+ """
1033
+ # Turnover point
1034
+ # linear polynomial fit to error of 10, 25, 40, ..., 1000 point rules
1035
+ fit = 0.49082003*n - 4.37859653
1036
+ turnover = around(fit).astype(int)
1037
+ # Compute all approximations
1038
+ ia = arange(1, int(floor(n*0.5)+1))
1039
+ ib = ia[::-1]
1040
+ xasq = _initial_nodes_a(n, ia[:turnover+1])
1041
+ xbsq = _initial_nodes_b(n, ib[turnover+1:])
1042
+ # Combine
1043
+ iv = sqrt(hstack([xasq, xbsq]))
1044
+ # Central node is always zero
1045
+ if n % 2 == 1:
1046
+ iv = hstack([0.0, iv])
1047
+ return iv
1048
+
1049
+
1050
+ def _pbcf(n, theta):
1051
+ r"""Asymptotic series expansion of parabolic cylinder function
1052
+
1053
+ The implementation is based on sections 3.2 and 3.3 from the
1054
+ original paper. Compared to the published version this code
1055
+ adds one more term to the asymptotic series. The detailed
1056
+ formulas can be found at [parabolic-asymptotics]_. The evaluation
1057
+ is done in a transformed variable :math:`\theta := \arccos(t)`
1058
+ where :math:`t := x / \mu` and :math:`\mu := \sqrt{2n + 1}`.
1059
+
1060
+ Parameters
1061
+ ----------
1062
+ n : int
1063
+ Quadrature order
1064
+ theta : ndarray
1065
+ Transformed position variable
1066
+
1067
+ Returns
1068
+ -------
1069
+ U : ndarray
1070
+ Value of the parabolic cylinder function :math:`U(a, \theta)`.
1071
+ Ud : ndarray
1072
+ Value of the derivative :math:`U^{\prime}(a, \theta)` of
1073
+ the parabolic cylinder function.
1074
+
1075
+ See Also
1076
+ --------
1077
+ roots_hermite_asy
1078
+
1079
+ References
1080
+ ----------
1081
+ .. [parabolic-asymptotics]
1082
+ https://dlmf.nist.gov/12.10#vii
1083
+ """
1084
+ st = sin(theta)
1085
+ ct = cos(theta)
1086
+ # https://dlmf.nist.gov/12.10#vii
1087
+ mu = 2.0*n + 1.0
1088
+ # https://dlmf.nist.gov/12.10#E23
1089
+ eta = 0.5*theta - 0.5*st*ct
1090
+ # https://dlmf.nist.gov/12.10#E39
1091
+ zeta = -(3.0*eta/2.0) ** (2.0/3.0)
1092
+ # https://dlmf.nist.gov/12.10#E40
1093
+ phi = (-zeta / st**2) ** (0.25)
1094
+ # Coefficients
1095
+ # https://dlmf.nist.gov/12.10#E43
1096
+ a0 = 1.0
1097
+ a1 = 0.10416666666666666667
1098
+ a2 = 0.08355034722222222222
1099
+ a3 = 0.12822657455632716049
1100
+ a4 = 0.29184902646414046425
1101
+ a5 = 0.88162726744375765242
1102
+ b0 = 1.0
1103
+ b1 = -0.14583333333333333333
1104
+ b2 = -0.09874131944444444444
1105
+ b3 = -0.14331205391589506173
1106
+ b4 = -0.31722720267841354810
1107
+ b5 = -0.94242914795712024914
1108
+ # Polynomials
1109
+ # https://dlmf.nist.gov/12.10#E9
1110
+ # https://dlmf.nist.gov/12.10#E10
1111
+ ctp = ct ** arange(16).reshape((-1,1))
1112
+ u0 = 1.0
1113
+ u1 = (1.0*ctp[3,:] - 6.0*ct) / 24.0
1114
+ u2 = (-9.0*ctp[4,:] + 249.0*ctp[2,:] + 145.0) / 1152.0
1115
+ u3 = (-4042.0*ctp[9,:] + 18189.0*ctp[7,:] - 28287.0*ctp[5,:]
1116
+ - 151995.0*ctp[3,:] - 259290.0*ct) / 414720.0
1117
+ u4 = (72756.0*ctp[10,:] - 321339.0*ctp[8,:] - 154982.0*ctp[6,:]
1118
+ + 50938215.0*ctp[4,:] + 122602962.0*ctp[2,:] + 12773113.0) / 39813120.0
1119
+ u5 = (82393456.0*ctp[15,:] - 617950920.0*ctp[13,:] + 1994971575.0*ctp[11,:]
1120
+ - 3630137104.0*ctp[9,:] + 4433574213.0*ctp[7,:] - 37370295816.0*ctp[5,:]
1121
+ - 119582875013.0*ctp[3,:] - 34009066266.0*ct) / 6688604160.0
1122
+ v0 = 1.0
1123
+ v1 = (1.0*ctp[3,:] + 6.0*ct) / 24.0
1124
+ v2 = (15.0*ctp[4,:] - 327.0*ctp[2,:] - 143.0) / 1152.0
1125
+ v3 = (-4042.0*ctp[9,:] + 18189.0*ctp[7,:] - 36387.0*ctp[5,:]
1126
+ + 238425.0*ctp[3,:] + 259290.0*ct) / 414720.0
1127
+ v4 = (-121260.0*ctp[10,:] + 551733.0*ctp[8,:] - 151958.0*ctp[6,:]
1128
+ - 57484425.0*ctp[4,:] - 132752238.0*ctp[2,:] - 12118727) / 39813120.0
1129
+ v5 = (82393456.0*ctp[15,:] - 617950920.0*ctp[13,:] + 2025529095.0*ctp[11,:]
1130
+ - 3750839308.0*ctp[9,:] + 3832454253.0*ctp[7,:] + 35213253348.0*ctp[5,:]
1131
+ + 130919230435.0*ctp[3,:] + 34009066266*ct) / 6688604160.0
1132
+ # Airy Evaluation (Bi and Bip unused)
1133
+ Ai, Aip, Bi, Bip = airy(mu**(4.0/6.0) * zeta)
1134
+ # Prefactor for U
1135
+ P = 2.0*sqrt(pi) * mu**(1.0/6.0) * phi
1136
+ # Terms for U
1137
+ # https://dlmf.nist.gov/12.10#E42
1138
+ phip = phi ** arange(6, 31, 6).reshape((-1,1))
1139
+ A0 = b0*u0
1140
+ A1 = (b2*u0 + phip[0,:]*b1*u1 + phip[1,:]*b0*u2) / zeta**3
1141
+ A2 = (b4*u0 + phip[0,:]*b3*u1 + phip[1,:]*b2*u2 + phip[2,:]*b1*u3
1142
+ + phip[3,:]*b0*u4) / zeta**6
1143
+ B0 = -(a1*u0 + phip[0,:]*a0*u1) / zeta**2
1144
+ B1 = -(a3*u0 + phip[0,:]*a2*u1 + phip[1,:]*a1*u2 + phip[2,:]*a0*u3) / zeta**5
1145
+ B2 = -(a5*u0 + phip[0,:]*a4*u1 + phip[1,:]*a3*u2 + phip[2,:]*a2*u3
1146
+ + phip[3,:]*a1*u4 + phip[4,:]*a0*u5) / zeta**8
1147
+ # U
1148
+ # https://dlmf.nist.gov/12.10#E35
1149
+ U = P * (Ai * (A0 + A1/mu**2.0 + A2/mu**4.0) +
1150
+ Aip * (B0 + B1/mu**2.0 + B2/mu**4.0) / mu**(8.0/6.0))
1151
+ # Prefactor for derivative of U
1152
+ Pd = sqrt(2.0*pi) * mu**(2.0/6.0) / phi
1153
+ # Terms for derivative of U
1154
+ # https://dlmf.nist.gov/12.10#E46
1155
+ C0 = -(b1*v0 + phip[0,:]*b0*v1) / zeta
1156
+ C1 = -(b3*v0 + phip[0,:]*b2*v1 + phip[1,:]*b1*v2 + phip[2,:]*b0*v3) / zeta**4
1157
+ C2 = -(b5*v0 + phip[0,:]*b4*v1 + phip[1,:]*b3*v2 + phip[2,:]*b2*v3
1158
+ + phip[3,:]*b1*v4 + phip[4,:]*b0*v5) / zeta**7
1159
+ D0 = a0*v0
1160
+ D1 = (a2*v0 + phip[0,:]*a1*v1 + phip[1,:]*a0*v2) / zeta**3
1161
+ D2 = (a4*v0 + phip[0,:]*a3*v1 + phip[1,:]*a2*v2 + phip[2,:]*a1*v3
1162
+ + phip[3,:]*a0*v4) / zeta**6
1163
+ # Derivative of U
1164
+ # https://dlmf.nist.gov/12.10#E36
1165
+ Ud = Pd * (Ai * (C0 + C1/mu**2.0 + C2/mu**4.0) / mu**(4.0/6.0) +
1166
+ Aip * (D0 + D1/mu**2.0 + D2/mu**4.0))
1167
+ return U, Ud
1168
+
1169
+
1170
+ def _newton(n, x_initial, maxit=5):
1171
+ """Newton iteration for polishing the asymptotic approximation
1172
+ to the zeros of the Hermite polynomials.
1173
+
1174
+ Parameters
1175
+ ----------
1176
+ n : int
1177
+ Quadrature order
1178
+ x_initial : ndarray
1179
+ Initial guesses for the roots
1180
+ maxit : int
1181
+ Maximal number of Newton iterations.
1182
+ The default 5 is sufficient, usually
1183
+ only one or two steps are needed.
1184
+
1185
+ Returns
1186
+ -------
1187
+ nodes : ndarray
1188
+ Quadrature nodes
1189
+ weights : ndarray
1190
+ Quadrature weights
1191
+
1192
+ See Also
1193
+ --------
1194
+ roots_hermite_asy
1195
+ """
1196
+ # Variable transformation
1197
+ mu = sqrt(2.0*n + 1.0)
1198
+ t = x_initial / mu
1199
+ theta = arccos(t)
1200
+ # Newton iteration
1201
+ for i in range(maxit):
1202
+ u, ud = _pbcf(n, theta)
1203
+ dtheta = u / (sqrt(2.0) * mu * sin(theta) * ud)
1204
+ theta = theta + dtheta
1205
+ if max(abs(dtheta)) < 1e-14:
1206
+ break
1207
+ # Undo variable transformation
1208
+ x = mu * cos(theta)
1209
+ # Central node is always zero
1210
+ if n % 2 == 1:
1211
+ x[0] = 0.0
1212
+ # Compute weights
1213
+ w = exp(-x**2) / (2.0*ud**2)
1214
+ return x, w
1215
+
1216
+
1217
+ def _roots_hermite_asy(n):
1218
+ r"""Gauss-Hermite (physicist's) quadrature for large n.
1219
+
1220
+ Computes the sample points and weights for Gauss-Hermite quadrature.
1221
+ The sample points are the roots of the nth degree Hermite polynomial,
1222
+ :math:`H_n(x)`. These sample points and weights correctly integrate
1223
+ polynomials of degree :math:`2n - 1` or less over the interval
1224
+ :math:`[-\infty, \infty]` with weight function :math:`f(x) = e^{-x^2}`.
1225
+
1226
+ This method relies on asymptotic expansions which work best for n > 150.
1227
+ The algorithm has linear runtime making computation for very large n
1228
+ feasible.
1229
+
1230
+ Parameters
1231
+ ----------
1232
+ n : int
1233
+ quadrature order
1234
+
1235
+ Returns
1236
+ -------
1237
+ nodes : ndarray
1238
+ Quadrature nodes
1239
+ weights : ndarray
1240
+ Quadrature weights
1241
+
1242
+ See Also
1243
+ --------
1244
+ roots_hermite
1245
+
1246
+ References
1247
+ ----------
1248
+ .. [townsend.trogdon.olver-2014]
1249
+ Townsend, A. and Trogdon, T. and Olver, S. (2014)
1250
+ *Fast computation of Gauss quadrature nodes and
1251
+ weights on the whole real line*. :arXiv:`1410.5286`.
1252
+
1253
+ .. [townsend.trogdon.olver-2015]
1254
+ Townsend, A. and Trogdon, T. and Olver, S. (2015)
1255
+ *Fast computation of Gauss quadrature nodes and
1256
+ weights on the whole real line*.
1257
+ IMA Journal of Numerical Analysis
1258
+ :doi:`10.1093/imanum/drv002`.
1259
+ """
1260
+ iv = _initial_nodes(n)
1261
+ nodes, weights = _newton(n, iv)
1262
+ # Combine with negative parts
1263
+ if n % 2 == 0:
1264
+ nodes = hstack([-nodes[::-1], nodes])
1265
+ weights = hstack([weights[::-1], weights])
1266
+ else:
1267
+ nodes = hstack([-nodes[-1:0:-1], nodes])
1268
+ weights = hstack([weights[-1:0:-1], weights])
1269
+ # Scale weights
1270
+ weights *= sqrt(pi) / sum(weights)
1271
+ return nodes, weights
1272
+
1273
+
1274
+ def hermite(n, monic=False):
1275
+ r"""Physicist's Hermite polynomial.
1276
+
1277
+ Defined by
1278
+
1279
+ .. math::
1280
+
1281
+ H_n(x) = (-1)^ne^{x^2}\frac{d^n}{dx^n}e^{-x^2};
1282
+
1283
+ :math:`H_n` is a polynomial of degree :math:`n`.
1284
+
1285
+ Parameters
1286
+ ----------
1287
+ n : int
1288
+ Degree of the polynomial.
1289
+ monic : bool, optional
1290
+ If `True`, scale the leading coefficient to be 1. Default is
1291
+ `False`.
1292
+
1293
+ Returns
1294
+ -------
1295
+ H : orthopoly1d
1296
+ Hermite polynomial.
1297
+
1298
+ Notes
1299
+ -----
1300
+ The polynomials :math:`H_n` are orthogonal over :math:`(-\infty,
1301
+ \infty)` with weight function :math:`e^{-x^2}`.
1302
+
1303
+ Examples
1304
+ --------
1305
+ >>> from scipy import special
1306
+ >>> import matplotlib.pyplot as plt
1307
+ >>> import numpy as np
1308
+
1309
+ >>> p_monic = special.hermite(3, monic=True)
1310
+ >>> p_monic
1311
+ poly1d([ 1. , 0. , -1.5, 0. ])
1312
+ >>> p_monic(1)
1313
+ -0.49999999999999983
1314
+ >>> x = np.linspace(-3, 3, 400)
1315
+ >>> y = p_monic(x)
1316
+ >>> plt.plot(x, y)
1317
+ >>> plt.title("Monic Hermite polynomial of degree 3")
1318
+ >>> plt.xlabel("x")
1319
+ >>> plt.ylabel("H_3(x)")
1320
+ >>> plt.show()
1321
+
1322
+ """
1323
+ if n < 0:
1324
+ raise ValueError("n must be nonnegative.")
1325
+
1326
+ if n == 0:
1327
+ n1 = n + 1
1328
+ else:
1329
+ n1 = n
1330
+ x, w = roots_hermite(n1)
1331
+ def wfunc(x):
1332
+ return exp(-x * x)
1333
+ if n == 0:
1334
+ x, w = [], []
1335
+ hn = 2**n * _gam(n + 1) * sqrt(pi)
1336
+ kn = 2**n
1337
+ p = orthopoly1d(x, w, hn, kn, wfunc, (-inf, inf), monic,
1338
+ lambda x: _ufuncs.eval_hermite(n, x))
1339
+ return p
1340
+
1341
+ # Hermite 2 He_n(x)
1342
+
1343
+
1344
+ def roots_hermitenorm(n, mu=False):
1345
+ r"""Gauss-Hermite (statistician's) quadrature.
1346
+
1347
+ Compute the sample points and weights for Gauss-Hermite
1348
+ quadrature. The sample points are the roots of the nth degree
1349
+ Hermite polynomial, :math:`He_n(x)`. These sample points and
1350
+ weights correctly integrate polynomials of degree :math:`2n - 1`
1351
+ or less over the interval :math:`[-\infty, \infty]` with weight
1352
+ function :math:`w(x) = e^{-x^2/2}`. See 22.2.15 in [AS]_ for more
1353
+ details.
1354
+
1355
+ Parameters
1356
+ ----------
1357
+ n : int
1358
+ quadrature order
1359
+ mu : bool, optional
1360
+ If True, return the sum of the weights, optional.
1361
+
1362
+ Returns
1363
+ -------
1364
+ x : ndarray
1365
+ Sample points
1366
+ w : ndarray
1367
+ Weights
1368
+ mu : float
1369
+ Sum of the weights
1370
+
1371
+ See Also
1372
+ --------
1373
+ scipy.integrate.fixed_quad
1374
+ numpy.polynomial.hermite_e.hermegauss
1375
+
1376
+ Notes
1377
+ -----
1378
+ For small n up to 150 a modified version of the Golub-Welsch
1379
+ algorithm is used. Nodes are computed from the eigenvalue
1380
+ problem and improved by one step of a Newton iteration.
1381
+ The weights are computed from the well-known analytical formula.
1382
+
1383
+ For n larger than 150 an optimal asymptotic algorithm is used
1384
+ which computes nodes and weights in a numerical stable manner.
1385
+ The algorithm has linear runtime making computation for very
1386
+ large n (several thousand or more) feasible.
1387
+
1388
+ References
1389
+ ----------
1390
+ .. [AS] Milton Abramowitz and Irene A. Stegun, eds.
1391
+ Handbook of Mathematical Functions with Formulas,
1392
+ Graphs, and Mathematical Tables. New York: Dover, 1972.
1393
+
1394
+ """
1395
+ m = int(n)
1396
+ if n < 1 or n != m:
1397
+ raise ValueError("n must be a positive integer.")
1398
+
1399
+ mu0 = np.sqrt(2.0*np.pi)
1400
+ if n <= 150:
1401
+ def an_func(k):
1402
+ return 0.0 * k
1403
+ def bn_func(k):
1404
+ return np.sqrt(k)
1405
+ f = _ufuncs.eval_hermitenorm
1406
+ def df(n, x):
1407
+ return n * _ufuncs.eval_hermitenorm(n - 1, x)
1408
+ return _gen_roots_and_weights(m, mu0, an_func, bn_func, f, df, True, mu)
1409
+ else:
1410
+ nodes, weights = _roots_hermite_asy(m)
1411
+ # Transform
1412
+ nodes *= sqrt(2)
1413
+ weights *= sqrt(2)
1414
+ if mu:
1415
+ return nodes, weights, mu0
1416
+ else:
1417
+ return nodes, weights
1418
+
1419
+
1420
+ def hermitenorm(n, monic=False):
1421
+ r"""Normalized (probabilist's) Hermite polynomial.
1422
+
1423
+ Defined by
1424
+
1425
+ .. math::
1426
+
1427
+ He_n(x) = (-1)^ne^{x^2/2}\frac{d^n}{dx^n}e^{-x^2/2};
1428
+
1429
+ :math:`He_n` is a polynomial of degree :math:`n`.
1430
+
1431
+ Parameters
1432
+ ----------
1433
+ n : int
1434
+ Degree of the polynomial.
1435
+ monic : bool, optional
1436
+ If `True`, scale the leading coefficient to be 1. Default is
1437
+ `False`.
1438
+
1439
+ Returns
1440
+ -------
1441
+ He : orthopoly1d
1442
+ Hermite polynomial.
1443
+
1444
+ Notes
1445
+ -----
1446
+
1447
+ The polynomials :math:`He_n` are orthogonal over :math:`(-\infty,
1448
+ \infty)` with weight function :math:`e^{-x^2/2}`.
1449
+
1450
+ """
1451
+ if n < 0:
1452
+ raise ValueError("n must be nonnegative.")
1453
+
1454
+ if n == 0:
1455
+ n1 = n + 1
1456
+ else:
1457
+ n1 = n
1458
+ x, w = roots_hermitenorm(n1)
1459
+ def wfunc(x):
1460
+ return exp(-x * x / 2.0)
1461
+ if n == 0:
1462
+ x, w = [], []
1463
+ hn = sqrt(2 * pi) * _gam(n + 1)
1464
+ kn = 1.0
1465
+ p = orthopoly1d(x, w, hn, kn, wfunc=wfunc, limits=(-inf, inf), monic=monic,
1466
+ eval_func=lambda x: _ufuncs.eval_hermitenorm(n, x))
1467
+ return p
1468
+
1469
+ # The remainder of the polynomials can be derived from the ones above.
1470
+
1471
+ # Ultraspherical (Gegenbauer) C^(alpha)_n(x)
1472
+
1473
+
1474
+ def roots_gegenbauer(n, alpha, mu=False):
1475
+ r"""Gauss-Gegenbauer quadrature.
1476
+
1477
+ Compute the sample points and weights for Gauss-Gegenbauer
1478
+ quadrature. The sample points are the roots of the nth degree
1479
+ Gegenbauer polynomial, :math:`C^{\alpha}_n(x)`. These sample
1480
+ points and weights correctly integrate polynomials of degree
1481
+ :math:`2n - 1` or less over the interval :math:`[-1, 1]` with
1482
+ weight function :math:`w(x) = (1 - x^2)^{\alpha - 1/2}`. See
1483
+ 22.2.3 in [AS]_ for more details.
1484
+
1485
+ Parameters
1486
+ ----------
1487
+ n : int
1488
+ quadrature order
1489
+ alpha : float
1490
+ alpha must be > -0.5
1491
+ mu : bool, optional
1492
+ If True, return the sum of the weights, optional.
1493
+
1494
+ Returns
1495
+ -------
1496
+ x : ndarray
1497
+ Sample points
1498
+ w : ndarray
1499
+ Weights
1500
+ mu : float
1501
+ Sum of the weights
1502
+
1503
+ See Also
1504
+ --------
1505
+ scipy.integrate.fixed_quad
1506
+
1507
+ References
1508
+ ----------
1509
+ .. [AS] Milton Abramowitz and Irene A. Stegun, eds.
1510
+ Handbook of Mathematical Functions with Formulas,
1511
+ Graphs, and Mathematical Tables. New York: Dover, 1972.
1512
+
1513
+ """
1514
+ m = int(n)
1515
+ if n < 1 or n != m:
1516
+ raise ValueError("n must be a positive integer.")
1517
+ if alpha < -0.5:
1518
+ raise ValueError("alpha must be greater than -0.5.")
1519
+ elif alpha == 0.0:
1520
+ # C(n,0,x) == 0 uniformly, however, as alpha->0, C(n,alpha,x)->T(n,x)
1521
+ # strictly, we should just error out here, since the roots are not
1522
+ # really defined, but we used to return something useful, so let's
1523
+ # keep doing so.
1524
+ return roots_chebyt(n, mu)
1525
+
1526
+ if alpha <= 170:
1527
+ mu0 = (np.sqrt(np.pi) * _ufuncs.gamma(alpha + 0.5)) \
1528
+ / _ufuncs.gamma(alpha + 1)
1529
+ else:
1530
+ # For large alpha we use a Taylor series expansion around inf,
1531
+ # expressed as a 6th order polynomial of a^-1 and using Horner's
1532
+ # method to minimize computation and maximize precision
1533
+ inv_alpha = 1. / alpha
1534
+ coeffs = np.array([0.000207186, -0.00152206, -0.000640869,
1535
+ 0.00488281, 0.0078125, -0.125, 1.])
1536
+ mu0 = coeffs[0]
1537
+ for term in range(1, len(coeffs)):
1538
+ mu0 = mu0 * inv_alpha + coeffs[term]
1539
+ mu0 = mu0 * np.sqrt(np.pi / alpha)
1540
+ def an_func(k):
1541
+ return 0.0 * k
1542
+ def bn_func(k):
1543
+ return np.sqrt(k * (k + 2 * alpha - 1) / (4 * (k + alpha) * (k + alpha - 1)))
1544
+ def f(n, x):
1545
+ return _ufuncs.eval_gegenbauer(n, alpha, x)
1546
+ def df(n, x):
1547
+ return (
1548
+ -n * x * _ufuncs.eval_gegenbauer(n, alpha, x)
1549
+ + (n + 2 * alpha - 1) * _ufuncs.eval_gegenbauer(n - 1, alpha, x)
1550
+ ) / (1 - x ** 2)
1551
+ return _gen_roots_and_weights(m, mu0, an_func, bn_func, f, df, True, mu)
1552
+
1553
+
1554
+ def gegenbauer(n, alpha, monic=False):
1555
+ r"""Gegenbauer (ultraspherical) polynomial.
1556
+
1557
+ Defined to be the solution of
1558
+
1559
+ .. math::
1560
+ (1 - x^2)\frac{d^2}{dx^2}C_n^{(\alpha)}
1561
+ - (2\alpha + 1)x\frac{d}{dx}C_n^{(\alpha)}
1562
+ + n(n + 2\alpha)C_n^{(\alpha)} = 0
1563
+
1564
+ for :math:`\alpha > -1/2`; :math:`C_n^{(\alpha)}` is a polynomial
1565
+ of degree :math:`n`.
1566
+
1567
+ Parameters
1568
+ ----------
1569
+ n : int
1570
+ Degree of the polynomial.
1571
+ alpha : float
1572
+ Parameter, must be greater than -0.5.
1573
+ monic : bool, optional
1574
+ If `True`, scale the leading coefficient to be 1. Default is
1575
+ `False`.
1576
+
1577
+ Returns
1578
+ -------
1579
+ C : orthopoly1d
1580
+ Gegenbauer polynomial.
1581
+
1582
+ Notes
1583
+ -----
1584
+ The polynomials :math:`C_n^{(\alpha)}` are orthogonal over
1585
+ :math:`[-1,1]` with weight function :math:`(1 - x^2)^{(\alpha -
1586
+ 1/2)}`.
1587
+
1588
+ Examples
1589
+ --------
1590
+ >>> import numpy as np
1591
+ >>> from scipy import special
1592
+ >>> import matplotlib.pyplot as plt
1593
+
1594
+ We can initialize a variable ``p`` as a Gegenbauer polynomial using the
1595
+ `gegenbauer` function and evaluate at a point ``x = 1``.
1596
+
1597
+ >>> p = special.gegenbauer(3, 0.5, monic=False)
1598
+ >>> p
1599
+ poly1d([ 2.5, 0. , -1.5, 0. ])
1600
+ >>> p(1)
1601
+ 1.0
1602
+
1603
+ To evaluate ``p`` at various points ``x`` in the interval ``(-3, 3)``,
1604
+ simply pass an array ``x`` to ``p`` as follows:
1605
+
1606
+ >>> x = np.linspace(-3, 3, 400)
1607
+ >>> y = p(x)
1608
+
1609
+ We can then visualize ``x, y`` using `matplotlib.pyplot`.
1610
+
1611
+ >>> fig, ax = plt.subplots()
1612
+ >>> ax.plot(x, y)
1613
+ >>> ax.set_title("Gegenbauer (ultraspherical) polynomial of degree 3")
1614
+ >>> ax.set_xlabel("x")
1615
+ >>> ax.set_ylabel("G_3(x)")
1616
+ >>> plt.show()
1617
+
1618
+ """
1619
+ if not np.isfinite(alpha) or alpha <= -0.5 :
1620
+ raise ValueError("`alpha` must be a finite number greater than -1/2")
1621
+ base = jacobi(n, alpha - 0.5, alpha - 0.5, monic=monic)
1622
+ if monic or n == 0:
1623
+ return base
1624
+ # Abrahmowitz and Stegan 22.5.20
1625
+ factor = (_gam(2*alpha + n) * _gam(alpha + 0.5) /
1626
+ _gam(2*alpha) / _gam(alpha + 0.5 + n))
1627
+ base._scale(factor)
1628
+ base.__dict__['_eval_func'] = lambda x: _ufuncs.eval_gegenbauer(float(n),
1629
+ alpha, x)
1630
+ return base
1631
+
1632
+ # Chebyshev of the first kind: T_n(x) =
1633
+ # n! sqrt(pi) / _gam(n+1./2)* P^(-1/2,-1/2)_n(x)
1634
+ # Computed anew.
1635
+
1636
+
1637
+ def roots_chebyt(n, mu=False):
1638
+ r"""Gauss-Chebyshev (first kind) quadrature.
1639
+
1640
+ Computes the sample points and weights for Gauss-Chebyshev
1641
+ quadrature. The sample points are the roots of the nth degree
1642
+ Chebyshev polynomial of the first kind, :math:`T_n(x)`. These
1643
+ sample points and weights correctly integrate polynomials of
1644
+ degree :math:`2n - 1` or less over the interval :math:`[-1, 1]`
1645
+ with weight function :math:`w(x) = 1/\sqrt{1 - x^2}`. See 22.2.4
1646
+ in [AS]_ for more details.
1647
+
1648
+ Parameters
1649
+ ----------
1650
+ n : int
1651
+ quadrature order
1652
+ mu : bool, optional
1653
+ If True, return the sum of the weights, optional.
1654
+
1655
+ Returns
1656
+ -------
1657
+ x : ndarray
1658
+ Sample points
1659
+ w : ndarray
1660
+ Weights
1661
+ mu : float
1662
+ Sum of the weights
1663
+
1664
+ See Also
1665
+ --------
1666
+ scipy.integrate.fixed_quad
1667
+ numpy.polynomial.chebyshev.chebgauss
1668
+
1669
+ References
1670
+ ----------
1671
+ .. [AS] Milton Abramowitz and Irene A. Stegun, eds.
1672
+ Handbook of Mathematical Functions with Formulas,
1673
+ Graphs, and Mathematical Tables. New York: Dover, 1972.
1674
+
1675
+ """
1676
+ m = int(n)
1677
+ if n < 1 or n != m:
1678
+ raise ValueError('n must be a positive integer.')
1679
+ x = _ufuncs._sinpi(np.arange(-m + 1, m, 2) / (2*m))
1680
+ w = np.full_like(x, pi/m)
1681
+ if mu:
1682
+ return x, w, pi
1683
+ else:
1684
+ return x, w
1685
+
1686
+
1687
+ def chebyt(n, monic=False):
1688
+ r"""Chebyshev polynomial of the first kind.
1689
+
1690
+ Defined to be the solution of
1691
+
1692
+ .. math::
1693
+ (1 - x^2)\frac{d^2}{dx^2}T_n - x\frac{d}{dx}T_n + n^2T_n = 0;
1694
+
1695
+ :math:`T_n` is a polynomial of degree :math:`n`.
1696
+
1697
+ Parameters
1698
+ ----------
1699
+ n : int
1700
+ Degree of the polynomial.
1701
+ monic : bool, optional
1702
+ If `True`, scale the leading coefficient to be 1. Default is
1703
+ `False`.
1704
+
1705
+ Returns
1706
+ -------
1707
+ T : orthopoly1d
1708
+ Chebyshev polynomial of the first kind.
1709
+
1710
+ See Also
1711
+ --------
1712
+ chebyu : Chebyshev polynomial of the second kind.
1713
+
1714
+ Notes
1715
+ -----
1716
+ The polynomials :math:`T_n` are orthogonal over :math:`[-1, 1]`
1717
+ with weight function :math:`(1 - x^2)^{-1/2}`.
1718
+
1719
+ References
1720
+ ----------
1721
+ .. [AS] Milton Abramowitz and Irene A. Stegun, eds.
1722
+ Handbook of Mathematical Functions with Formulas,
1723
+ Graphs, and Mathematical Tables. New York: Dover, 1972.
1724
+
1725
+ Examples
1726
+ --------
1727
+ Chebyshev polynomials of the first kind of order :math:`n` can
1728
+ be obtained as the determinant of specific :math:`n \times n`
1729
+ matrices. As an example we can check how the points obtained from
1730
+ the determinant of the following :math:`3 \times 3` matrix
1731
+ lay exactly on :math:`T_3`:
1732
+
1733
+ >>> import numpy as np
1734
+ >>> import matplotlib.pyplot as plt
1735
+ >>> from scipy.linalg import det
1736
+ >>> from scipy.special import chebyt
1737
+ >>> x = np.arange(-1.0, 1.0, 0.01)
1738
+ >>> fig, ax = plt.subplots()
1739
+ >>> ax.set_ylim(-2.0, 2.0)
1740
+ >>> ax.set_title(r'Chebyshev polynomial $T_3$')
1741
+ >>> ax.plot(x, chebyt(3)(x), label=rf'$T_3$')
1742
+ >>> for p in np.arange(-1.0, 1.0, 0.1):
1743
+ ... ax.plot(p,
1744
+ ... det(np.array([[p, 1, 0], [1, 2*p, 1], [0, 1, 2*p]])),
1745
+ ... 'rx')
1746
+ >>> plt.legend(loc='best')
1747
+ >>> plt.show()
1748
+
1749
+ They are also related to the Jacobi Polynomials
1750
+ :math:`P_n^{(-0.5, -0.5)}` through the relation:
1751
+
1752
+ .. math::
1753
+ P_n^{(-0.5, -0.5)}(x) = \frac{1}{4^n} \binom{2n}{n} T_n(x)
1754
+
1755
+ Let's verify it for :math:`n = 3`:
1756
+
1757
+ >>> from scipy.special import binom
1758
+ >>> from scipy.special import jacobi
1759
+ >>> x = np.arange(-1.0, 1.0, 0.01)
1760
+ >>> np.allclose(jacobi(3, -0.5, -0.5)(x),
1761
+ ... 1/64 * binom(6, 3) * chebyt(3)(x))
1762
+ True
1763
+
1764
+ We can plot the Chebyshev polynomials :math:`T_n` for some values
1765
+ of :math:`n`:
1766
+
1767
+ >>> x = np.arange(-1.5, 1.5, 0.01)
1768
+ >>> fig, ax = plt.subplots()
1769
+ >>> ax.set_ylim(-4.0, 4.0)
1770
+ >>> ax.set_title(r'Chebyshev polynomials $T_n$')
1771
+ >>> for n in np.arange(2,5):
1772
+ ... ax.plot(x, chebyt(n)(x), label=rf'$T_n={n}$')
1773
+ >>> plt.legend(loc='best')
1774
+ >>> plt.show()
1775
+
1776
+ """
1777
+ if n < 0:
1778
+ raise ValueError("n must be nonnegative.")
1779
+
1780
+ def wfunc(x):
1781
+ return 1.0 / sqrt(1 - x * x)
1782
+ if n == 0:
1783
+ return orthopoly1d([], [], pi, 1.0, wfunc, (-1, 1), monic,
1784
+ lambda x: _ufuncs.eval_chebyt(n, x))
1785
+ n1 = n
1786
+ x, w, mu = roots_chebyt(n1, mu=True)
1787
+ hn = pi / 2
1788
+ kn = 2**(n - 1)
1789
+ p = orthopoly1d(x, w, hn, kn, wfunc, (-1, 1), monic,
1790
+ lambda x: _ufuncs.eval_chebyt(n, x))
1791
+ return p
1792
+
1793
+ # Chebyshev of the second kind
1794
+ # U_n(x) = (n+1)! sqrt(pi) / (2*_gam(n+3./2)) * P^(1/2,1/2)_n(x)
1795
+
1796
+
1797
+ def roots_chebyu(n, mu=False):
1798
+ r"""Gauss-Chebyshev (second kind) quadrature.
1799
+
1800
+ Computes the sample points and weights for Gauss-Chebyshev
1801
+ quadrature. The sample points are the roots of the nth degree
1802
+ Chebyshev polynomial of the second kind, :math:`U_n(x)`. These
1803
+ sample points and weights correctly integrate polynomials of
1804
+ degree :math:`2n - 1` or less over the interval :math:`[-1, 1]`
1805
+ with weight function :math:`w(x) = \sqrt{1 - x^2}`. See 22.2.5 in
1806
+ [AS]_ for details.
1807
+
1808
+ Parameters
1809
+ ----------
1810
+ n : int
1811
+ quadrature order
1812
+ mu : bool, optional
1813
+ If True, return the sum of the weights, optional.
1814
+
1815
+ Returns
1816
+ -------
1817
+ x : ndarray
1818
+ Sample points
1819
+ w : ndarray
1820
+ Weights
1821
+ mu : float
1822
+ Sum of the weights
1823
+
1824
+ See Also
1825
+ --------
1826
+ scipy.integrate.fixed_quad
1827
+
1828
+ References
1829
+ ----------
1830
+ .. [AS] Milton Abramowitz and Irene A. Stegun, eds.
1831
+ Handbook of Mathematical Functions with Formulas,
1832
+ Graphs, and Mathematical Tables. New York: Dover, 1972.
1833
+
1834
+ """
1835
+ m = int(n)
1836
+ if n < 1 or n != m:
1837
+ raise ValueError('n must be a positive integer.')
1838
+ t = np.arange(m, 0, -1) * pi / (m + 1)
1839
+ x = np.cos(t)
1840
+ w = pi * np.sin(t)**2 / (m + 1)
1841
+ if mu:
1842
+ return x, w, pi / 2
1843
+ else:
1844
+ return x, w
1845
+
1846
+
1847
+ def chebyu(n, monic=False):
1848
+ r"""Chebyshev polynomial of the second kind.
1849
+
1850
+ Defined to be the solution of
1851
+
1852
+ .. math::
1853
+ (1 - x^2)\frac{d^2}{dx^2}U_n - 3x\frac{d}{dx}U_n
1854
+ + n(n + 2)U_n = 0;
1855
+
1856
+ :math:`U_n` is a polynomial of degree :math:`n`.
1857
+
1858
+ Parameters
1859
+ ----------
1860
+ n : int
1861
+ Degree of the polynomial.
1862
+ monic : bool, optional
1863
+ If `True`, scale the leading coefficient to be 1. Default is
1864
+ `False`.
1865
+
1866
+ Returns
1867
+ -------
1868
+ U : orthopoly1d
1869
+ Chebyshev polynomial of the second kind.
1870
+
1871
+ See Also
1872
+ --------
1873
+ chebyt : Chebyshev polynomial of the first kind.
1874
+
1875
+ Notes
1876
+ -----
1877
+ The polynomials :math:`U_n` are orthogonal over :math:`[-1, 1]`
1878
+ with weight function :math:`(1 - x^2)^{1/2}`.
1879
+
1880
+ References
1881
+ ----------
1882
+ .. [AS] Milton Abramowitz and Irene A. Stegun, eds.
1883
+ Handbook of Mathematical Functions with Formulas,
1884
+ Graphs, and Mathematical Tables. New York: Dover, 1972.
1885
+
1886
+ Examples
1887
+ --------
1888
+ Chebyshev polynomials of the second kind of order :math:`n` can
1889
+ be obtained as the determinant of specific :math:`n \times n`
1890
+ matrices. As an example we can check how the points obtained from
1891
+ the determinant of the following :math:`3 \times 3` matrix
1892
+ lay exactly on :math:`U_3`:
1893
+
1894
+ >>> import numpy as np
1895
+ >>> import matplotlib.pyplot as plt
1896
+ >>> from scipy.linalg import det
1897
+ >>> from scipy.special import chebyu
1898
+ >>> x = np.arange(-1.0, 1.0, 0.01)
1899
+ >>> fig, ax = plt.subplots()
1900
+ >>> ax.set_ylim(-2.0, 2.0)
1901
+ >>> ax.set_title(r'Chebyshev polynomial $U_3$')
1902
+ >>> ax.plot(x, chebyu(3)(x), label=rf'$U_3$')
1903
+ >>> for p in np.arange(-1.0, 1.0, 0.1):
1904
+ ... ax.plot(p,
1905
+ ... det(np.array([[2*p, 1, 0], [1, 2*p, 1], [0, 1, 2*p]])),
1906
+ ... 'rx')
1907
+ >>> plt.legend(loc='best')
1908
+ >>> plt.show()
1909
+
1910
+ They satisfy the recurrence relation:
1911
+
1912
+ .. math::
1913
+ U_{2n-1}(x) = 2 T_n(x)U_{n-1}(x)
1914
+
1915
+ where the :math:`T_n` are the Chebyshev polynomial of the first kind.
1916
+ Let's verify it for :math:`n = 2`:
1917
+
1918
+ >>> from scipy.special import chebyt
1919
+ >>> x = np.arange(-1.0, 1.0, 0.01)
1920
+ >>> np.allclose(chebyu(3)(x), 2 * chebyt(2)(x) * chebyu(1)(x))
1921
+ True
1922
+
1923
+ We can plot the Chebyshev polynomials :math:`U_n` for some values
1924
+ of :math:`n`:
1925
+
1926
+ >>> x = np.arange(-1.0, 1.0, 0.01)
1927
+ >>> fig, ax = plt.subplots()
1928
+ >>> ax.set_ylim(-1.5, 1.5)
1929
+ >>> ax.set_title(r'Chebyshev polynomials $U_n$')
1930
+ >>> for n in np.arange(1,5):
1931
+ ... ax.plot(x, chebyu(n)(x), label=rf'$U_n={n}$')
1932
+ >>> plt.legend(loc='best')
1933
+ >>> plt.show()
1934
+
1935
+ """
1936
+ base = jacobi(n, 0.5, 0.5, monic=monic)
1937
+ if monic:
1938
+ return base
1939
+ factor = sqrt(pi) / 2.0 * _gam(n + 2) / _gam(n + 1.5)
1940
+ base._scale(factor)
1941
+ return base
1942
+
1943
+ # Chebyshev of the first kind C_n(x)
1944
+
1945
+
1946
+ def roots_chebyc(n, mu=False):
1947
+ r"""Gauss-Chebyshev (first kind) quadrature.
1948
+
1949
+ Compute the sample points and weights for Gauss-Chebyshev
1950
+ quadrature. The sample points are the roots of the nth degree
1951
+ Chebyshev polynomial of the first kind, :math:`C_n(x)`. These
1952
+ sample points and weights correctly integrate polynomials of
1953
+ degree :math:`2n - 1` or less over the interval :math:`[-2, 2]`
1954
+ with weight function :math:`w(x) = 1 / \sqrt{1 - (x/2)^2}`. See
1955
+ 22.2.6 in [AS]_ for more details.
1956
+
1957
+ Parameters
1958
+ ----------
1959
+ n : int
1960
+ quadrature order
1961
+ mu : bool, optional
1962
+ If True, return the sum of the weights, optional.
1963
+
1964
+ Returns
1965
+ -------
1966
+ x : ndarray
1967
+ Sample points
1968
+ w : ndarray
1969
+ Weights
1970
+ mu : float
1971
+ Sum of the weights
1972
+
1973
+ See Also
1974
+ --------
1975
+ scipy.integrate.fixed_quad
1976
+
1977
+ References
1978
+ ----------
1979
+ .. [AS] Milton Abramowitz and Irene A. Stegun, eds.
1980
+ Handbook of Mathematical Functions with Formulas,
1981
+ Graphs, and Mathematical Tables. New York: Dover, 1972.
1982
+
1983
+ """
1984
+ x, w, m = roots_chebyt(n, True)
1985
+ x *= 2
1986
+ w *= 2
1987
+ m *= 2
1988
+ if mu:
1989
+ return x, w, m
1990
+ else:
1991
+ return x, w
1992
+
1993
+
1994
+ def chebyc(n, monic=False):
1995
+ r"""Chebyshev polynomial of the first kind on :math:`[-2, 2]`.
1996
+
1997
+ Defined as :math:`C_n(x) = 2T_n(x/2)`, where :math:`T_n` is the
1998
+ nth Chebychev polynomial of the first kind.
1999
+
2000
+ Parameters
2001
+ ----------
2002
+ n : int
2003
+ Degree of the polynomial.
2004
+ monic : bool, optional
2005
+ If `True`, scale the leading coefficient to be 1. Default is
2006
+ `False`.
2007
+
2008
+ Returns
2009
+ -------
2010
+ C : orthopoly1d
2011
+ Chebyshev polynomial of the first kind on :math:`[-2, 2]`.
2012
+
2013
+ See Also
2014
+ --------
2015
+ chebyt : Chebyshev polynomial of the first kind.
2016
+
2017
+ Notes
2018
+ -----
2019
+ The polynomials :math:`C_n(x)` are orthogonal over :math:`[-2, 2]`
2020
+ with weight function :math:`1/\sqrt{1 - (x/2)^2}`.
2021
+
2022
+ References
2023
+ ----------
2024
+ .. [1] Abramowitz and Stegun, "Handbook of Mathematical Functions"
2025
+ Section 22. National Bureau of Standards, 1972.
2026
+
2027
+ """
2028
+ if n < 0:
2029
+ raise ValueError("n must be nonnegative.")
2030
+
2031
+ if n == 0:
2032
+ n1 = n + 1
2033
+ else:
2034
+ n1 = n
2035
+ x, w = roots_chebyc(n1)
2036
+ if n == 0:
2037
+ x, w = [], []
2038
+ hn = 4 * pi * ((n == 0) + 1)
2039
+ kn = 1.0
2040
+ p = orthopoly1d(x, w, hn, kn,
2041
+ wfunc=lambda x: 1.0 / sqrt(1 - x * x / 4.0),
2042
+ limits=(-2, 2), monic=monic)
2043
+ if not monic:
2044
+ p._scale(2.0 / p(2))
2045
+ p.__dict__['_eval_func'] = lambda x: _ufuncs.eval_chebyc(n, x)
2046
+ return p
2047
+
2048
+ # Chebyshev of the second kind S_n(x)
2049
+
2050
+
2051
+ def roots_chebys(n, mu=False):
2052
+ r"""Gauss-Chebyshev (second kind) quadrature.
2053
+
2054
+ Compute the sample points and weights for Gauss-Chebyshev
2055
+ quadrature. The sample points are the roots of the nth degree
2056
+ Chebyshev polynomial of the second kind, :math:`S_n(x)`. These
2057
+ sample points and weights correctly integrate polynomials of
2058
+ degree :math:`2n - 1` or less over the interval :math:`[-2, 2]`
2059
+ with weight function :math:`w(x) = \sqrt{1 - (x/2)^2}`. See 22.2.7
2060
+ in [AS]_ for more details.
2061
+
2062
+ Parameters
2063
+ ----------
2064
+ n : int
2065
+ quadrature order
2066
+ mu : bool, optional
2067
+ If True, return the sum of the weights, optional.
2068
+
2069
+ Returns
2070
+ -------
2071
+ x : ndarray
2072
+ Sample points
2073
+ w : ndarray
2074
+ Weights
2075
+ mu : float
2076
+ Sum of the weights
2077
+
2078
+ See Also
2079
+ --------
2080
+ scipy.integrate.fixed_quad
2081
+
2082
+ References
2083
+ ----------
2084
+ .. [AS] Milton Abramowitz and Irene A. Stegun, eds.
2085
+ Handbook of Mathematical Functions with Formulas,
2086
+ Graphs, and Mathematical Tables. New York: Dover, 1972.
2087
+
2088
+ """
2089
+ x, w, m = roots_chebyu(n, True)
2090
+ x *= 2
2091
+ w *= 2
2092
+ m *= 2
2093
+ if mu:
2094
+ return x, w, m
2095
+ else:
2096
+ return x, w
2097
+
2098
+
2099
+ def chebys(n, monic=False):
2100
+ r"""Chebyshev polynomial of the second kind on :math:`[-2, 2]`.
2101
+
2102
+ Defined as :math:`S_n(x) = U_n(x/2)` where :math:`U_n` is the
2103
+ nth Chebychev polynomial of the second kind.
2104
+
2105
+ Parameters
2106
+ ----------
2107
+ n : int
2108
+ Degree of the polynomial.
2109
+ monic : bool, optional
2110
+ If `True`, scale the leading coefficient to be 1. Default is
2111
+ `False`.
2112
+
2113
+ Returns
2114
+ -------
2115
+ S : orthopoly1d
2116
+ Chebyshev polynomial of the second kind on :math:`[-2, 2]`.
2117
+
2118
+ See Also
2119
+ --------
2120
+ chebyu : Chebyshev polynomial of the second kind
2121
+
2122
+ Notes
2123
+ -----
2124
+ The polynomials :math:`S_n(x)` are orthogonal over :math:`[-2, 2]`
2125
+ with weight function :math:`\sqrt{1 - (x/2)}^2`.
2126
+
2127
+ References
2128
+ ----------
2129
+ .. [1] Abramowitz and Stegun, "Handbook of Mathematical Functions"
2130
+ Section 22. National Bureau of Standards, 1972.
2131
+
2132
+ """
2133
+ if n < 0:
2134
+ raise ValueError("n must be nonnegative.")
2135
+
2136
+ if n == 0:
2137
+ n1 = n + 1
2138
+ else:
2139
+ n1 = n
2140
+ x, w = roots_chebys(n1)
2141
+ if n == 0:
2142
+ x, w = [], []
2143
+ hn = pi
2144
+ kn = 1.0
2145
+ p = orthopoly1d(x, w, hn, kn,
2146
+ wfunc=lambda x: sqrt(1 - x * x / 4.0),
2147
+ limits=(-2, 2), monic=monic)
2148
+ if not monic:
2149
+ factor = (n + 1.0) / p(2)
2150
+ p._scale(factor)
2151
+ p.__dict__['_eval_func'] = lambda x: _ufuncs.eval_chebys(n, x)
2152
+ return p
2153
+
2154
+ # Shifted Chebyshev of the first kind T^*_n(x)
2155
+
2156
+
2157
+ def roots_sh_chebyt(n, mu=False):
2158
+ r"""Gauss-Chebyshev (first kind, shifted) quadrature.
2159
+
2160
+ Compute the sample points and weights for Gauss-Chebyshev
2161
+ quadrature. The sample points are the roots of the nth degree
2162
+ shifted Chebyshev polynomial of the first kind, :math:`T_n(x)`.
2163
+ These sample points and weights correctly integrate polynomials of
2164
+ degree :math:`2n - 1` or less over the interval :math:`[0, 1]`
2165
+ with weight function :math:`w(x) = 1/\sqrt{x - x^2}`. See 22.2.8
2166
+ in [AS]_ for more details.
2167
+
2168
+ Parameters
2169
+ ----------
2170
+ n : int
2171
+ quadrature order
2172
+ mu : bool, optional
2173
+ If True, return the sum of the weights, optional.
2174
+
2175
+ Returns
2176
+ -------
2177
+ x : ndarray
2178
+ Sample points
2179
+ w : ndarray
2180
+ Weights
2181
+ mu : float
2182
+ Sum of the weights
2183
+
2184
+ See Also
2185
+ --------
2186
+ scipy.integrate.fixed_quad
2187
+
2188
+ References
2189
+ ----------
2190
+ .. [AS] Milton Abramowitz and Irene A. Stegun, eds.
2191
+ Handbook of Mathematical Functions with Formulas,
2192
+ Graphs, and Mathematical Tables. New York: Dover, 1972.
2193
+
2194
+ """
2195
+ xw = roots_chebyt(n, mu)
2196
+ return ((xw[0] + 1) / 2,) + xw[1:]
2197
+
2198
+
2199
+ def sh_chebyt(n, monic=False):
2200
+ r"""Shifted Chebyshev polynomial of the first kind.
2201
+
2202
+ Defined as :math:`T^*_n(x) = T_n(2x - 1)` for :math:`T_n` the nth
2203
+ Chebyshev polynomial of the first kind.
2204
+
2205
+ Parameters
2206
+ ----------
2207
+ n : int
2208
+ Degree of the polynomial.
2209
+ monic : bool, optional
2210
+ If `True`, scale the leading coefficient to be 1. Default is
2211
+ `False`.
2212
+
2213
+ Returns
2214
+ -------
2215
+ T : orthopoly1d
2216
+ Shifted Chebyshev polynomial of the first kind.
2217
+
2218
+ Notes
2219
+ -----
2220
+ The polynomials :math:`T^*_n` are orthogonal over :math:`[0, 1]`
2221
+ with weight function :math:`(x - x^2)^{-1/2}`.
2222
+
2223
+ """
2224
+ base = sh_jacobi(n, 0.0, 0.5, monic=monic)
2225
+ if monic:
2226
+ return base
2227
+ if n > 0:
2228
+ factor = 4**n / 2.0
2229
+ else:
2230
+ factor = 1.0
2231
+ base._scale(factor)
2232
+ return base
2233
+
2234
+
2235
+ # Shifted Chebyshev of the second kind U^*_n(x)
2236
+ def roots_sh_chebyu(n, mu=False):
2237
+ r"""Gauss-Chebyshev (second kind, shifted) quadrature.
2238
+
2239
+ Computes the sample points and weights for Gauss-Chebyshev
2240
+ quadrature. The sample points are the roots of the nth degree
2241
+ shifted Chebyshev polynomial of the second kind, :math:`U_n(x)`.
2242
+ These sample points and weights correctly integrate polynomials of
2243
+ degree :math:`2n - 1` or less over the interval :math:`[0, 1]`
2244
+ with weight function :math:`w(x) = \sqrt{x - x^2}`. See 22.2.9 in
2245
+ [AS]_ for more details.
2246
+
2247
+ Parameters
2248
+ ----------
2249
+ n : int
2250
+ quadrature order
2251
+ mu : bool, optional
2252
+ If True, return the sum of the weights, optional.
2253
+
2254
+ Returns
2255
+ -------
2256
+ x : ndarray
2257
+ Sample points
2258
+ w : ndarray
2259
+ Weights
2260
+ mu : float
2261
+ Sum of the weights
2262
+
2263
+ See Also
2264
+ --------
2265
+ scipy.integrate.fixed_quad
2266
+
2267
+ References
2268
+ ----------
2269
+ .. [AS] Milton Abramowitz and Irene A. Stegun, eds.
2270
+ Handbook of Mathematical Functions with Formulas,
2271
+ Graphs, and Mathematical Tables. New York: Dover, 1972.
2272
+
2273
+ """
2274
+ x, w, m = roots_chebyu(n, True)
2275
+ x = (x + 1) / 2
2276
+ m_us = _ufuncs.beta(1.5, 1.5)
2277
+ w *= m_us / m
2278
+ if mu:
2279
+ return x, w, m_us
2280
+ else:
2281
+ return x, w
2282
+
2283
+
2284
+ def sh_chebyu(n, monic=False):
2285
+ r"""Shifted Chebyshev polynomial of the second kind.
2286
+
2287
+ Defined as :math:`U^*_n(x) = U_n(2x - 1)` for :math:`U_n` the nth
2288
+ Chebyshev polynomial of the second kind.
2289
+
2290
+ Parameters
2291
+ ----------
2292
+ n : int
2293
+ Degree of the polynomial.
2294
+ monic : bool, optional
2295
+ If `True`, scale the leading coefficient to be 1. Default is
2296
+ `False`.
2297
+
2298
+ Returns
2299
+ -------
2300
+ U : orthopoly1d
2301
+ Shifted Chebyshev polynomial of the second kind.
2302
+
2303
+ Notes
2304
+ -----
2305
+ The polynomials :math:`U^*_n` are orthogonal over :math:`[0, 1]`
2306
+ with weight function :math:`(x - x^2)^{1/2}`.
2307
+
2308
+ """
2309
+ base = sh_jacobi(n, 2.0, 1.5, monic=monic)
2310
+ if monic:
2311
+ return base
2312
+ factor = 4**n
2313
+ base._scale(factor)
2314
+ return base
2315
+
2316
+ # Legendre
2317
+
2318
+
2319
+ def roots_legendre(n, mu=False):
2320
+ r"""Gauss-Legendre quadrature.
2321
+
2322
+ Compute the sample points and weights for Gauss-Legendre
2323
+ quadrature [GL]_. The sample points are the roots of the nth degree
2324
+ Legendre polynomial :math:`P_n(x)`. These sample points and
2325
+ weights correctly integrate polynomials of degree :math:`2n - 1`
2326
+ or less over the interval :math:`[-1, 1]` with weight function
2327
+ :math:`w(x) = 1`. See 2.2.10 in [AS]_ for more details.
2328
+
2329
+ Parameters
2330
+ ----------
2331
+ n : int
2332
+ quadrature order
2333
+ mu : bool, optional
2334
+ If True, return the sum of the weights, optional.
2335
+
2336
+ Returns
2337
+ -------
2338
+ x : ndarray
2339
+ Sample points
2340
+ w : ndarray
2341
+ Weights
2342
+ mu : float
2343
+ Sum of the weights
2344
+
2345
+ See Also
2346
+ --------
2347
+ scipy.integrate.fixed_quad
2348
+ numpy.polynomial.legendre.leggauss
2349
+
2350
+ References
2351
+ ----------
2352
+ .. [AS] Milton Abramowitz and Irene A. Stegun, eds.
2353
+ Handbook of Mathematical Functions with Formulas,
2354
+ Graphs, and Mathematical Tables. New York: Dover, 1972.
2355
+ .. [GL] Gauss-Legendre quadrature, Wikipedia,
2356
+ https://en.wikipedia.org/wiki/Gauss%E2%80%93Legendre_quadrature
2357
+
2358
+ Examples
2359
+ --------
2360
+ >>> import numpy as np
2361
+ >>> from scipy.special import roots_legendre, eval_legendre
2362
+ >>> roots, weights = roots_legendre(9)
2363
+
2364
+ ``roots`` holds the roots, and ``weights`` holds the weights for
2365
+ Gauss-Legendre quadrature.
2366
+
2367
+ >>> roots
2368
+ array([-0.96816024, -0.83603111, -0.61337143, -0.32425342, 0. ,
2369
+ 0.32425342, 0.61337143, 0.83603111, 0.96816024])
2370
+ >>> weights
2371
+ array([0.08127439, 0.18064816, 0.2606107 , 0.31234708, 0.33023936,
2372
+ 0.31234708, 0.2606107 , 0.18064816, 0.08127439])
2373
+
2374
+ Verify that we have the roots by evaluating the degree 9 Legendre
2375
+ polynomial at ``roots``. All the values are approximately zero:
2376
+
2377
+ >>> eval_legendre(9, roots)
2378
+ array([-8.88178420e-16, -2.22044605e-16, 1.11022302e-16, 1.11022302e-16,
2379
+ 0.00000000e+00, -5.55111512e-17, -1.94289029e-16, 1.38777878e-16,
2380
+ -8.32667268e-17])
2381
+
2382
+ Here we'll show how the above values can be used to estimate the
2383
+ integral from 1 to 2 of f(t) = t + 1/t with Gauss-Legendre
2384
+ quadrature [GL]_. First define the function and the integration
2385
+ limits.
2386
+
2387
+ >>> def f(t):
2388
+ ... return t + 1/t
2389
+ ...
2390
+ >>> a = 1
2391
+ >>> b = 2
2392
+
2393
+ We'll use ``integral(f(t), t=a, t=b)`` to denote the definite integral
2394
+ of f from t=a to t=b. The sample points in ``roots`` are from the
2395
+ interval [-1, 1], so we'll rewrite the integral with the simple change
2396
+ of variable::
2397
+
2398
+ x = 2/(b - a) * t - (a + b)/(b - a)
2399
+
2400
+ with inverse::
2401
+
2402
+ t = (b - a)/2 * x + (a + b)/2
2403
+
2404
+ Then::
2405
+
2406
+ integral(f(t), a, b) =
2407
+ (b - a)/2 * integral(f((b-a)/2*x + (a+b)/2), x=-1, x=1)
2408
+
2409
+ We can approximate the latter integral with the values returned
2410
+ by `roots_legendre`.
2411
+
2412
+ Map the roots computed above from [-1, 1] to [a, b].
2413
+
2414
+ >>> t = (b - a)/2 * roots + (a + b)/2
2415
+
2416
+ Approximate the integral as the weighted sum of the function values.
2417
+
2418
+ >>> (b - a)/2 * f(t).dot(weights)
2419
+ 2.1931471805599276
2420
+
2421
+ Compare that to the exact result, which is 3/2 + log(2):
2422
+
2423
+ >>> 1.5 + np.log(2)
2424
+ 2.1931471805599454
2425
+
2426
+ """
2427
+ m = int(n)
2428
+ if n < 1 or n != m:
2429
+ raise ValueError("n must be a positive integer.")
2430
+
2431
+ mu0 = 2.0
2432
+ def an_func(k):
2433
+ return 0.0 * k
2434
+ def bn_func(k):
2435
+ return k * np.sqrt(1.0 / (4 * k * k - 1))
2436
+ f = _ufuncs.eval_legendre
2437
+ def df(n, x):
2438
+ return (-n * x * _ufuncs.eval_legendre(n, x)
2439
+ + n * _ufuncs.eval_legendre(n - 1, x)) / (1 - x ** 2)
2440
+ return _gen_roots_and_weights(m, mu0, an_func, bn_func, f, df, True, mu)
2441
+
2442
+
2443
+ def legendre(n, monic=False):
2444
+ r"""Legendre polynomial.
2445
+
2446
+ Defined to be the solution of
2447
+
2448
+ .. math::
2449
+ \frac{d}{dx}\left[(1 - x^2)\frac{d}{dx}P_n(x)\right]
2450
+ + n(n + 1)P_n(x) = 0;
2451
+
2452
+ :math:`P_n(x)` is a polynomial of degree :math:`n`.
2453
+
2454
+ Parameters
2455
+ ----------
2456
+ n : int
2457
+ Degree of the polynomial.
2458
+ monic : bool, optional
2459
+ If `True`, scale the leading coefficient to be 1. Default is
2460
+ `False`.
2461
+
2462
+ Returns
2463
+ -------
2464
+ P : orthopoly1d
2465
+ Legendre polynomial.
2466
+
2467
+ Notes
2468
+ -----
2469
+ The polynomials :math:`P_n` are orthogonal over :math:`[-1, 1]`
2470
+ with weight function 1.
2471
+
2472
+ Examples
2473
+ --------
2474
+ Generate the 3rd-order Legendre polynomial 1/2*(5x^3 + 0x^2 - 3x + 0):
2475
+
2476
+ >>> from scipy.special import legendre
2477
+ >>> legendre(3)
2478
+ poly1d([ 2.5, 0. , -1.5, 0. ])
2479
+
2480
+ """
2481
+ if n < 0:
2482
+ raise ValueError("n must be nonnegative.")
2483
+
2484
+ if n == 0:
2485
+ n1 = n + 1
2486
+ else:
2487
+ n1 = n
2488
+ x, w = roots_legendre(n1)
2489
+ if n == 0:
2490
+ x, w = [], []
2491
+ hn = 2.0 / (2 * n + 1)
2492
+ kn = _gam(2 * n + 1) / _gam(n + 1)**2 / 2.0**n
2493
+ p = orthopoly1d(x, w, hn, kn, wfunc=lambda x: 1.0, limits=(-1, 1),
2494
+ monic=monic,
2495
+ eval_func=lambda x: _ufuncs.eval_legendre(n, x))
2496
+ return p
2497
+
2498
+ # Shifted Legendre P^*_n(x)
2499
+
2500
+
2501
+ def roots_sh_legendre(n, mu=False):
2502
+ r"""Gauss-Legendre (shifted) quadrature.
2503
+
2504
+ Compute the sample points and weights for Gauss-Legendre
2505
+ quadrature. The sample points are the roots of the nth degree
2506
+ shifted Legendre polynomial :math:`P^*_n(x)`. These sample points
2507
+ and weights correctly integrate polynomials of degree :math:`2n -
2508
+ 1` or less over the interval :math:`[0, 1]` with weight function
2509
+ :math:`w(x) = 1.0`. See 2.2.11 in [AS]_ for details.
2510
+
2511
+ Parameters
2512
+ ----------
2513
+ n : int
2514
+ quadrature order
2515
+ mu : bool, optional
2516
+ If True, return the sum of the weights, optional.
2517
+
2518
+ Returns
2519
+ -------
2520
+ x : ndarray
2521
+ Sample points
2522
+ w : ndarray
2523
+ Weights
2524
+ mu : float
2525
+ Sum of the weights
2526
+
2527
+ See Also
2528
+ --------
2529
+ scipy.integrate.fixed_quad
2530
+
2531
+ References
2532
+ ----------
2533
+ .. [AS] Milton Abramowitz and Irene A. Stegun, eds.
2534
+ Handbook of Mathematical Functions with Formulas,
2535
+ Graphs, and Mathematical Tables. New York: Dover, 1972.
2536
+
2537
+ """
2538
+ x, w = roots_legendre(n)
2539
+ x = (x + 1) / 2
2540
+ w /= 2
2541
+ if mu:
2542
+ return x, w, 1.0
2543
+ else:
2544
+ return x, w
2545
+
2546
+
2547
+ def sh_legendre(n, monic=False):
2548
+ r"""Shifted Legendre polynomial.
2549
+
2550
+ Defined as :math:`P^*_n(x) = P_n(2x - 1)` for :math:`P_n` the nth
2551
+ Legendre polynomial.
2552
+
2553
+ Parameters
2554
+ ----------
2555
+ n : int
2556
+ Degree of the polynomial.
2557
+ monic : bool, optional
2558
+ If `True`, scale the leading coefficient to be 1. Default is
2559
+ `False`.
2560
+
2561
+ Returns
2562
+ -------
2563
+ P : orthopoly1d
2564
+ Shifted Legendre polynomial.
2565
+
2566
+ Notes
2567
+ -----
2568
+ The polynomials :math:`P^*_n` are orthogonal over :math:`[0, 1]`
2569
+ with weight function 1.
2570
+
2571
+ """
2572
+ if n < 0:
2573
+ raise ValueError("n must be nonnegative.")
2574
+
2575
+ def wfunc(x):
2576
+ return 0.0 * x + 1.0
2577
+ if n == 0:
2578
+ return orthopoly1d([], [], 1.0, 1.0, wfunc, (0, 1), monic,
2579
+ lambda x: _ufuncs.eval_sh_legendre(n, x))
2580
+ x, w = roots_sh_legendre(n)
2581
+ hn = 1.0 / (2 * n + 1.0)
2582
+ kn = _gam(2 * n + 1) / _gam(n + 1)**2
2583
+ p = orthopoly1d(x, w, hn, kn, wfunc, limits=(0, 1), monic=monic,
2584
+ eval_func=lambda x: _ufuncs.eval_sh_legendre(n, x))
2585
+ return p
2586
+
2587
+
2588
+ # Make the old root function names an alias for the new ones
2589
+ _modattrs = globals()
2590
+ for newfun, oldfun in _rootfuns_map.items():
2591
+ _modattrs[oldfun] = _modattrs[newfun]
2592
+ __all__.append(oldfun)