>>> from env_helper import info; info()
页面更新时间: 2023-06-23 09:36:20
运行环境:
    Linux发行版本: Debian GNU/Linux 12 (bookworm)
    操作系统内核: Linux-6.1.0-9-amd64-x86_64-with-glibc2.36
    Python版本: 3.11.2

3.2. 球体体积

在用SciPy数值积分一节我们介绍了如何使用数值定积分计算球体的体积,而SymPy的符号积分函数 integrate则可以帮助我们进行符号积分。integrate可以进行不定积分:

>>> from sympy import  integrate ,cos,sin
>>> from sympy.abc import  a,x,y
>>> import numpy as np
>>> integrate(x*sin(x), x)
\[\displaystyle - x \cos{\left(x \right)} + \sin{\left(x \right)}\]

如果指定x的取值范围的话,integrate则进行定积分运算:

>>> import math
>>> from sympy import *
>>> integrate(x*sin(x), (x, 0, 2*pi))
\[\displaystyle - 2 \pi\]

为了计算球体体积,首先让我们来看看如何计算圆形面积,假设圆形的半径为r,则圆上任意一点的Y 坐标函数为: y(x) = √ r 2 − x 2 因此我们可以直接对上述函数在-r到r区间上进行积分得到半圆面积,注意这里我们使用symbols函数 一次创建多个符号:

>>> x, y, r = symbols('x,y,r')
>>> 2 * integrate(sqrt(r*r-x**2), (x, -r, r))
\[\begin{split}\displaystyle 2 \left(\begin{cases} \int\limits_{- r}^{r} \begin{cases} - \frac{i r}{2 \sqrt{-1 + \frac{x}{r}} \sqrt{1 + \frac{x}{r}}} - \frac{i r}{2 \sqrt{-1 + \frac{x^{2}}{r^{2}}}} + \frac{3 i x^{2}}{2 r \sqrt{-1 + \frac{x^{2}}{r^{2}}}} + \frac{i x^{2}}{2 r \left(-1 + \frac{x^{2}}{r^{2}}\right)^{\frac{3}{2}}} - \frac{i x^{4}}{2 r^{3} \left(-1 + \frac{x^{2}}{r^{2}}\right)^{\frac{3}{2}}} & \text{for}\: \left|{\frac{x^{2}}{r^{2}}}\right| > 1 \\\frac{r \sqrt{1 - \frac{x^{2}}{r^{2}}}}{2} + \frac{r}{2 \sqrt{1 - \frac{x^{2}}{r^{2}}}} - \frac{x^{2}}{2 r \sqrt{1 - \frac{x^{2}}{r^{2}}}} & \text{otherwise} \end{cases}\, dx & \text{for}\: r > - r \\- \int\limits_{r}^{- r} \begin{cases} - \frac{i r}{2 \sqrt{-1 + \frac{x}{r}} \sqrt{1 + \frac{x}{r}}} - \frac{i r}{2 \sqrt{-1 + \frac{x^{2}}{r^{2}}}} + \frac{3 i x^{2}}{2 r \sqrt{-1 + \frac{x^{2}}{r^{2}}}} + \frac{i x^{2}}{2 r \left(-1 + \frac{x^{2}}{r^{2}}\right)^{\frac{3}{2}}} - \frac{i x^{4}}{2 r^{3} \left(-1 + \frac{x^{2}}{r^{2}}\right)^{\frac{3}{2}}} & \text{for}\: \left|{\frac{x^{2}}{r^{2}}}\right| > 1 \\\frac{r \sqrt{1 - \frac{x^{2}}{r^{2}}}}{2} + \frac{r}{2 \sqrt{1 - \frac{x^{2}}{r^{2}}}} - \frac{x^{2}}{2 r \sqrt{1 - \frac{x^{2}}{r^{2}}}} & \text{otherwise} \end{cases}\, dx & \text{otherwise} \end{cases}\right)\end{split}\]

很遗憾,integrate函数没有计算出结果,而是直接返回了我们输入的算式。 这是因为 SymPy 不知道 r 是大于 0 的,如下重新定义 r ,就可以得到正确答案了:

>>> r = symbols('r', positive=True)
>>> circle_area = 2 * integrate(sqrt(r**2-x**2), (x, -r, r))
>>> circle_area
\[\displaystyle \pi r^{2}\]

接下来对此面积公式进行定积分,就可以得到球体的体积,但是随着X轴坐标的变化,对应的切面的的 半径会发生变化,现在假设X轴的坐标为x,球体的半径为r,则x处的切面的半径为可以使用前面的公 式y(x)计算出。 图 4.1 - 球体体积的双重定积分示意图 因此我们需要对circle_area中的变量r进行替代:

>>> circle_area = circle_area.subs(r, sqrt(r**2-x**2))
>>> circle_area
\[\displaystyle \pi \left(r^{2} - x^{2}\right)\]

3.2.1. 用subs进行算式替换

subs函数可以将算式中的符号进行替换,它有3种调用方式:

  • expression.subs(x, y) : 将算式中的x替换成y

  • expression.subs({x:y,u:v}) : 使用字典进行多次替换

  • expression.subs([(x,y),(u,v)]) : 使用列表进行多次替换

请注意多次替换是顺序执行的,因此:

expression.sub([(x,y),(y,x)])

并不能对两个符号 x , y 进行交换。

然后对 circle_area 中的变量 x 在区间 -rr 上进行定积分,得到球体的体积公式:

>>> integrate(circle_area, (x, -r, r))
\[\displaystyle \frac{4 \pi r^{3}}{3}\]