V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
Hlianbobo
V2EX  ›  Python

下面这个代码求不定积分为什么结果不正确?

  •  
  •   Hlianbobo · 2020-08-16 01:03:28 +08:00 · 2379 次点击
    这是一个创建于 1350 天前的主题,其中的信息可能已经有所发展或是发生改变。
    以下用 sympy 库求定积分和不定积分
    我刚发现这个论坛没法发图片也没法注释代码。被积分函数是 sqrt ( 1+cos ( x )) 积分上下限是 pi/2 , 0
    为了避免改动,#注释行都没删掉。各位老师可以自行删除或忽略。


    先求定积分,代码:

    import sympy as sym
    from sympy import sin,cos,sec,exp,asin,sqrt,pi #必须将特殊的函数和常数导入程序才能运行
    x = sym.symbols('x') #定义符号变量
    y = sym.symbols('y')
    # z = sym.symbols('z')
    a = sym.Integral(x**2*cos(x**3)) #求不定积分
    #b = sym.Integral(exp(2*y)*(sec(exp(2*y))**2))
    #c = sym.Integral((3*x**2+7)/(x**3+7*x-9))
    d = sym.Integral(sqrt(1-cos(2*x)),(x,0,pi/2))
    #a.doit()
    #b.doit() #显示不定积分表达式
    #c.doit()
    #sqrt(4).evalf()
    d.doit()
    -------------------------------------------------------输出结果--------------------------------------------------------------------
    Integral(sqrt(-cos(2*x) + 1), (x, 0, pi/2))


    显示数值结果
    import sympy as sym
    from sympy import sin,cos,sec,exp,asin,sqrt,pi #必须将特殊的函数和常数导入程序才能运行
    x = sym.symbols('x') #定义符号变量
    y = sym.symbols('y')
    # z = sym.symbols('z')
    a = sym.Integral(x**2*cos(x**3)) #求不定积分
    #b = sym.Integral(exp(2*y)*(sec(exp(2*y))**2))
    #c = sym.Integral((3*x**2+7)/(x**3+7*x-9))
    d = sym.Integral(sqrt(1-cos(2*x)),(x,0,pi/2))
    #a.doit()
    #b.doit() #显示不定积分表达式
    #c.doit()
    #sqrt(4).evalf()
    d.evalf()
    -------------------------------------------------------输出结果--------------------------------------------------------------------
    1.41421356237310

    我查过.doit 代表输出解析解。那么为什么第一次用.doit 没有输出 sqrt(2)呢?



    求不定积分
    import sympy as sym
    from sympy import sin,cos,sec,exp,asin,sqrt,pi #必须将特殊的函数和常数导入程序才能运行
    x = sym.symbols('x') #定义符号变量
    y = sym.symbols('y')
    # z = sym.symbols('z')
    a = sym.Integral(x**2*cos(x**3)) #求不定积分
    #b = sym.Integral(exp(2*y)*(sec(exp(2*y))**2))
    #c = sym.Integral((3*x**2+7)/(x**3+7*x-9))
    d = sym.Integral(sqrt(1-cos(2*x)))
    #a.doit()
    #b.doit() #显示不定积分表达式
    #c.doit()
    #sqrt(4).evalf()
    d.doit()
    -------------------------------------------------------输出结果--------------------------------------------------------------------
    Integral(sqrt(-cos(2*x) + 1), x)

    难道 d 这个不定积分。没有解析解?怎么给这么一个结果?
    10 条回复    2020-08-16 09:27:52 +08:00
    Junzhou
        1
    Junzhou  
       2020-08-16 01:23:50 +08:00 via iPhone
    发帖的时候支持 markdown 语法,使用 markdown 就能看图和使用代码块了。
    thedrwu
        2
    thedrwu  
       2020-08-16 02:58:10 +08:00 via Android
    sympy 比较烂而已。买个 Mathematica 吧。
    Tony042
        3
    Tony042  
       2020-08-16 03:45:19 +08:00
    完成作业的话 wolframalpha 求积分会把每一部都列出来,简单的积分手算即可,复杂的数值积分 matlab 比 sympy 强多了,符号积分找 mathematica
    Hlianbobo
        4
    Hlianbobo  
    OP
       2020-08-16 07:37:28 +08:00
    @thedrwu 可以确定是 sympy 比较烂。而代码没有问题对么?这个积分 MMA 一定可以解出来么?
    Hlianbobo
        5
    Hlianbobo  
    OP
       2020-08-16 07:41:48 +08:00
    @Tony042 python 的符号计算库就没有比 sympy 更强的么?
    Tony042
        6
    Tony042  
       2020-08-16 07:50:00 +08:00
    @Hlianbobo Python 符号库好像出名的只有 sympy,我觉得符号计算还是 Mathematica 吧
    Tony042
        7
    Tony042  
       2020-08-16 07:51:33 +08:00
    @Hlianbobo 真的,商业软件还是香,我之前一直用 Python 做科学计算,scipy 用着很别扭,现在代码一半 Python 一半 Matlab 好多了,现成的函数比自己写效率高多了
    Hlianbobo
        8
    Hlianbobo  
    OP
       2020-08-16 08:58:29 +08:00
    @Tony042 谢谢回复。我是小白,scipy 有哪些坑,求指路。既然数值运算不如 matlab,符号运算不如 MMA 。那么你还留一半 python 是为什么?很想听听你的经验分享。
    Tony042
        9
    Tony042  
       2020-08-16 09:17:37 +08:00
    @Hlianbobo 这样子的,我做科学计算( LAMMPS)出来的一堆数据先要用另外一个专用软件的 Python 接口读取,然后做一些预处理,变成类似于表格的形式方便 Matlab 读取,然后具体的科学计算过程用 Matlab 进行计算,Python 主要负责文本字符串处理,当作胶水来用。Scipy 的问题主要有两点,一个是文档写的没有 Matlab 详细,Matlab 有的连 Ref 都给列出来了,另一个是 Matlab 接口比 Scipy 要统一很多,比如说我有个模型之前用 PatternSearch 搜索全局极值,之后改成 GA 或者 fmin 等算法,Matlab 基本上只要改个函数名字就好,参数类型,接口大致统一,太方便调试了,我用了之后就回不去了,但是 Matlab 有一个问题是,代码很容易写的很脏,不够简洁...
    Hlianbobo
        10
    Hlianbobo  
    OP
       2020-08-16 09:27:52 +08:00
    @Tony042 学习了。多谢!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1154 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 18:25 · PVG 02:25 · LAX 11:25 · JFK 14:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.