V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
zhouzhou113
V2EX  ›  问与答

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

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

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

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

    C++调 Python 模块太慢, 且受制于 gil, 通常都是用 C/C++来加速 Python
    zhouzhou113
        2
    zhouzhou113  
    OP
       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
        3
    justou  
       2018-01-19 12:43:45 +08:00   ❤️ 1
    调用 gsl_set_error_handler_off()关闭默认的错误处理, 自己处理返回值, 这儿有个例子 https://www.gnu.org/software/gsl/doc/html/err.html#examples, 先仔细研究下文档

    gsl 源码 github 上有
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   928 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 21:13 · PVG 05:13 · LAX 13:13 · JFK 16:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.