检查我的代码.. 为什么 Python 的 Sympy 集成需要这么长时间?

Fre*_*ess 0 python numpy sympy

我一直致力于绘制一个函数并朝 y 轴和 x 轴旋转。然后使用 SymPy 获取表面积。

我尝试从终端和运行.py文件,两者都花费太长时间来计算积分以获得表面积。

这是我的代码:

import numpy as np
import sympy as sy

x = sy.Symbol("x")

def f(x):
    return ((x**6) + 2)/ (8*x ** 2)

def fd(x):
    return sy.simplify(sy.diff(f(x), x))

def vx(x):
    return 2*np.pi*(f(x)*((1 + (fd(x) ** 2))**(1/2)))

vx = sy.integrate(vx(x), (x, 1, 3))
Run Code Online (Sandbox Code Playgroud)

我的问题:

  1. 为什么sy.integrate花了这么长时间?差不多30分钟..这个函数很难计算吗?

从终端来看,直到我在 SoF 提出这个问题之前,它甚至还没有完成积分计算:

1

  1. 我的代码中是否存在错误或改进我的代码的方法?
  1. [编辑]

这是来自 的答案sy.integrate

0.392699081698724*Integral(2*(x**2 + 1)**1.0*Abs(x**4 - x**2 + 1)**1.0/x**5.0, (x, 1, 3)) + 0.392699081698724*Integral(x**1.0*(x**2 + 1)**1.0*Abs(x**4 - x**2 + 1)**1.0, (x, 1, 3))
Run Code Online (Sandbox Code Playgroud)

为什么它不将这些x值代入定积分?

sy.integrate(vx(x), (x, 1, 3))
Run Code Online (Sandbox Code Playgroud)

定积分计算错误?

Osc*_*min 5

我无法重现您所看到的行为。可能的差异是 SymPy 版本(您使用的是最新版本吗?)以及是否安装了 gmpy2。安装 gmpy2 可以大大加快 SymPy 中的某些操作速度。

\n

而且你似乎将浮点数和麻木的东西混合在一起。您需要决定是否想要准确的结果。如果你想要一个精确的结果,那么使用 sympy 的 pi 而不是 numpy ,并且使用精确的有理数而不是 float 1/2。在集成之前调用简化,这将给出准确的结果:

\n
In [20]: import numpy as np\n    ...: import sympy as sy\n    ...: \n    ...: x = sy.Symbol("x")\n    ...: \n    ...: def f(x):\n    ...:     return ((x**6) + 2)/ (8*x ** 2)\n    ...: \n    ...: def fd(x):\n    ...:     return sy.simplify(sy.diff(f(x), x))\n    ...: \n    ...: def vx(x):\n    ...:     return 2*sy.pi*(f(x)*sy.sqrt(1 + (fd(x) ** 2)))\n    ...: \n    ...: vxi = sy.Integral(vx(x), (x, 1, 3))\n\nIn [21]: %time vxi.simplify().doit()\nCPU times: user 1.74 s, sys: 0 ns, total: 1.74 s\nWall time: 1.74 s\nOut[21]: \n8429\xe2\x8b\x85\xcf\x80\n\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n  81  \n\nIn [22]: _.evalf()\nOut[22]: 326.919561445782\n
Run Code Online (Sandbox Code Playgroud)\n

您使用浮点数的事实表明您对精确结果不感兴趣,在这种情况下,最好仅以数值方式计算积分:

\n
In [23]: %time vxi.evalf()\nCPU times: user 392 ms, sys: 0 ns, total: 392 ms\nWall time: 388 ms\nOut[23]: 326.919561445782\n
Run Code Online (Sandbox Code Playgroud)\n