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)
我的问题:
sy.integrate花了这么长时间?差不多30分钟..这个函数很难计算吗?从终端来看,直到我在 SoF 提出这个问题之前,它甚至还没有完成积分计算:
这是来自 的答案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)
定积分计算错误?
我无法重现您所看到的行为。可能的差异是 SymPy 版本(您使用的是最新版本吗?)以及是否安装了 gmpy2。安装 gmpy2 可以大大加快 SymPy 中的某些操作速度。
\n而且你似乎将浮点数和麻木的东西混合在一起。您需要决定是否想要准确的结果。如果你想要一个精确的结果,那么使用 sympy 的 pi 而不是 numpy ,并且使用精确的有理数而不是 float 1/2。在集成之前调用简化,这将给出准确的结果:
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\nRun Code Online (Sandbox Code Playgroud)\n您使用浮点数的事实表明您对精确结果不感兴趣,在这种情况下,最好仅以数值方式计算积分:
\nIn [23]: %time vxi.evalf()\nCPU times: user 392 ms, sys: 0 ns, total: 392 ms\nWall time: 388 ms\nOut[23]: 326.919561445782\nRun Code Online (Sandbox Code Playgroud)\n