C++自适应辛普森积分,精度效率都不高,想参考 Python 底层库调用的 dqagse.f,请教怎样反编译查看源码?

2018-01-17 21:04:10 +08:00
 zhouzhou113
从问题“ Python 中的科学计算模块 SciPy 里的积分函数效率如何?用这个是否比自己用 Fortran 或 C 写积分程序然后用 python 调用要快?”过来。其中提到模块 scipy 积分函数的实现,调用了 dqagse.f 文件,去 python 库里面找了一下,发现该文件封装在 pyd 库中,请教具体的查看方法?或者有能够提供该源码的吗?@justou

使用 C++语言编写模型预测过程,涉及大量定积分运算,目前在考虑参考 dqagse.f 然后用 C+重写,使满足精度效率的同时可返回该定积分是否可解;或者直接在 C+程序中链接调用 python 积分模块并传递 python 返回结果及异常。请教上述两种方法哪一种效果更好?
2252 次点击
所在节点    问与答
3 条回复
justou
2018-01-17 22:11:52 +08:00
github 上有 scipy 源码;

不必重新造轮子, GSL 很好用 https://www.gnu.org/software/gsl/doc/html/integration.html ;

C++调 Python 模块太慢, 且受制于 gil, 通常都是用 C/C++来加速 Python
zhouzhou113
2018-01-19 11:27:34 +08:00
@justou
尝试调用了 gsl 库 gsl/gsl_integration.h,函数是正弦函数,类似 “ f = pow(x, 4)*sin(a*x + b*pow(x, 2) + c*pow(x, 3) + d*pow(x, 4))” ,因为参数的原因,函数很有可能不收敛,gsl 库会报错如下并终止程序:

gsl: ../../integration/qags.c:563: ERROR: integral is divergent, or slowly convergent
Default GSL error handler invoked.

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.


我的期望是即使函数发散也能返回一个标志不影响程序继续,而不是直接终止报错。想请教一下这种情况可以考虑怎样解决,或者有什么方法可以找到 gsl 的源码自己修改?比较小白,灰常感谢~
justou
2018-01-19 12:43:45 +08:00
调用 gsl_set_error_handler_off()关闭默认的错误处理, 自己处理返回值, 这儿有个例子 https://www.gnu.org/software/gsl/doc/html/err.html#examples, 先仔细研究下文档

gsl 源码 github 上有

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/423747

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX