>>> 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
在区间 -r
到 r
上进行定积分,得到球体的体积公式:
>>> integrate(circle_area, (x, -r, r))
\[\displaystyle \frac{4 \pi r^{3}}{3}\]