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

2020-08-16 01:03:28 +08:00
 Hlianbobo
以下用 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 这个不定积分。没有解析解?怎么给这么一个结果?
2468 次点击
所在节点    Python
10 条回复
Junzhou
2020-08-16 01:23:50 +08:00
发帖的时候支持 markdown 语法,使用 markdown 就能看图和使用代码块了。
thedrwu
2020-08-16 02:58:10 +08:00
sympy 比较烂而已。买个 Mathematica 吧。
Tony042
2020-08-16 03:45:19 +08:00
完成作业的话 wolframalpha 求积分会把每一部都列出来,简单的积分手算即可,复杂的数值积分 matlab 比 sympy 强多了,符号积分找 mathematica
Hlianbobo
2020-08-16 07:37:28 +08:00
@thedrwu 可以确定是 sympy 比较烂。而代码没有问题对么?这个积分 MMA 一定可以解出来么?
Hlianbobo
2020-08-16 07:41:48 +08:00
@Tony042 python 的符号计算库就没有比 sympy 更强的么?
Tony042
2020-08-16 07:50:00 +08:00
@Hlianbobo Python 符号库好像出名的只有 sympy,我觉得符号计算还是 Mathematica 吧
Tony042
2020-08-16 07:51:33 +08:00
@Hlianbobo 真的,商业软件还是香,我之前一直用 Python 做科学计算,scipy 用着很别扭,现在代码一半 Python 一半 Matlab 好多了,现成的函数比自己写效率高多了
Hlianbobo
2020-08-16 08:58:29 +08:00
@Tony042 谢谢回复。我是小白,scipy 有哪些坑,求指路。既然数值运算不如 matlab,符号运算不如 MMA 。那么你还留一半 python 是为什么?很想听听你的经验分享。
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
2020-08-16 09:27:52 +08:00
@Tony042 学习了。多谢!

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

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

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

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

© 2021 V2EX