Sympy简单教程(7)

SymPy – 作图

SymPy 使用 Matplotlib 库作为后端来渲染2维和3维数学函数图像. 要确保在当前安装的Python 中Matplotlib 库是可用的. 如果没有安装, 使用如下命令安装这个库 −

pip install matplotlib

支持的作图命令定义在模块 sympy.plotting 中. 如下的函数位于 plotting 模块 −

  • plot − 做2维曲(直)线图形
  • plot3d − 3维线型图
  • plot_parametric − 2维参数作图
  • plot3d_parametric − 3维参数作图

函数 plot() 返回一个 Plot 类的实例. 一个 plot 命令可以包含一个或多个 SymPy 表达式. 尽管可以在后端使用 Matplotlib, 其它的后端(诸如 texplot, pyglet 或者 Google charts API) 也可以使用.

plot(expr, range, kwargs)

其中 expr 是任何有效的 symPy 表达式. 如果没有提及, 默认使用的作图使用的范围是 (-10, 10).

下例中对于在范围(-10,10)中的每个值, 做出了 x^2 的值 −

>>> from sympy.plotting import plot
>>> from sympy import *
>>> x=Symbol('x')
>>> plot(x**2, line_color='red')

Sympy简单教程(7)

为了在相同范围内画出多个图像, 在范围之前给出多个表达式.

>>> plot( sin(x),cos(x), (x, -pi, pi))

Sympy简单教程(7)

你也可以对每个表达式指定专门的范围.

plot((expr1, range1), (expr2, range2))

下面的图形在不同的范围内做出了函数 sin(x) 和 cos(x) 的图形.

>>> plot( (sin(x),(x, -2*pi, 2*pi)),(cos(x), (x, -pi, pi)))

Sympy简单教程(7)

下面的关键词参数可以在plot() 函数中指定.

  • line_color − 指定绘图线的颜色.

  • title − 作为标题显示的字符串

  • xlabel − 作为x轴标签显示的字符串
  • ylabel − 作为y轴标签显示的字符串
>>> plot( (sin(x),(x, -2*pi, 2*pi)),(cos(x), (x, -pi, pi)), line_color='red', title='SymPy plot example')

Sympy简单教程(7)

函数 plot3d() 渲染一个三维作图.

plot3d(expr, xrange, yrange, kwargs)

下例画出了一个3维的曲面图形 −

>>> from sympy.plotting import plot3d
>>> x,y=symbols('x y')
>>> plot3d(x*y, (x, -10,10), (y, -10,10))

Sympy简单教程(7)

和2维作图类似, 三维图形命令plot3d也可以对多个函数在不同范围内分别作图.

>>> plot3d(x*y, x/y, (x, -5, 5), (y, -5, 5))

Sympy简单教程(7)

函数 plot3d_parametric_line() 渲染一个3维参数曲线图.

>>> from sympy.plotting import plot3d_parametric_line
>>> plot3d_parametric_line(cos(x), sin(x), x, (x, -5, 5))

Sympy简单教程(7)

为了做出参数曲面使用函数 plot3d_parametric_surface(). 其语法是:

plot3d_parametric_surface(xexpr, yexpr, zexpr, rangex, rangey, kwargs)

>>> from sympy.plotting import plot3d_parametric_surface
>>> plot3d_parametric_surface(cos(x+y), sin(x-y), x-y, (x, -5, 5), (y, -5, 5))

Sympy简单教程(7)

SymPy – 几何体

SymPy中的几何 geometry 模块允许构建2维的几何体, 例如点, 线, 圆等. 接着我们可以获得这些几何体的信息, 例如共线或者寻找交点等.

点Point

Point 类表示表示欧式空间中的一个点. 下面的例子检查点是否共线 −

>>> from sympy.geometry import Point
>>> from sympy import *
>>> x=Point(0,0)
>>> y=Point(2,2)
>>> z=Point(4,4)
>>> Point.is_collinear(x,y,z)

输出

True

>>> a=Point(2,3)
>>> Point.is_collinear(x,y,a)

输出

False

点Point类的方法 distance() 计算两个点之间的距离

>>> x.distance(y)

输出

这个距离也可以用符号表示.

直线Line

直线 Line 的几何体是通过两个点 Point 对象得到的. 方法 intersection() 返回交点坐标如果两条直线彼此相交的话.

>>> from sympy.geometry import Point, Line
>>> p1, p2=Point(0,5), Point(5,0)
>>> l1=Line(p1,p2)
>>> l2=Line(Point(0,0), Point(5,5))
>>> l1.intersection(l2)

输出

[Point2D(5/2, 5/2)]

>>> l1.intersection(Line(Point(0,0), Point(2,2)))

输出

[Point2D(5/2, 5/2)]

>>> x,y=symbols('x y')
>>> p=Point(x,y)
>>> p.distance(Point(0,0))

输出

三角形Triangle

这个函数从三个点Points对象构造一个三角形几何体 triangle.

Triangle(a,b,c)

>>> t=Triangle(Point(0,0),Point(0,5), Point(5,0))
>>> t.area

输出

椭圆Ellipse

椭圆几何体是通过传递一个点 Point 对象作为中心, 另外两个数分别表示水平和垂直半径来构造的.

语法: ellipse(中心坐标, 水平半径, 垂直半径)

>>> from sympy.geometry import Ellipse, Line
>>> e=Ellipse(Point(0,0),8,3)
>>> e.area

输出

这里的垂直半径可以间接通过离心率eccentricity参数来提供.

>>> e1=Ellipse(Point(2,2), hradius=5, eccentricity=Rational(3,4))
>>> e1.vradius

输出

椭圆的最远点 apoapsis 是焦点 focus 和轮廓线上点的最大距离.

>>> e1.apoapsis

输出

下述语句计算椭圆的周长circumference −

>>> e1.circumference

输出

椭圆的 equation 方法返回椭圆的直角坐标系下的方程.

>>> e1.equation(x,y)

输出

SymPy – 集合

在数学中, 集合是一些相异对象的全体, 这些对象可以是数字, 人, 字母, 甚至可以是其它集合. 集合 Set 也是Python 内建的一种类. SymPy 提供了 sets 模块. 它包含不同类型的集合并具有一些功能可以进行集合运算, 例如集合的交, 并, 等.

在SymPy中集合Set对于其它的集合类而言是一个基类. 注意到它和Python 的内建数据类型set是不一样的! 区间 Interval 这个类表示实数区间而且它的边界 boundary 属性返回一个 FiniteSet 对象.

>>> from sympy import Interval
>>> s=Interval(1,10).boundary
>>> type(s)

sympy.sets.sets.FiniteSet

有限集合 FiniteSet 是离散数字的一个全体. 它可以从任何序列 sequence 对象得到, 例如列表 list 或者字符串 string.

>>> from sympy import FiniteSet
>>> FiniteSet(range(5))

输出

{{0,1,…,4}}

>>> numbers=[1,3,5,2,8]
>>> FiniteSet(*numbers)

输出

{1,2,3,5,8}{1,2,3,5,8}

>>> s="HelloWorld"
>>> FiniteSet(*s)

输出

{H,W,d,e,l,o,r}

注意: 和内建集合set一样, SymPy的 Set 对象中也是元素各异的.

条件集合ConditionSet类 是一个满足特定条件的元素集合

>>> from sympy import ConditionSet, Eq, Symbol
>>> x=Symbol('x')
>>> s=ConditionSet(x, Eq(x**2-2*x,0), Interval(1,10))
>>> s

输出

集合的并Union 是一个复合集 compound set. 它包含两个集合的所有元素. 注意: 在两个集合的公共元素在并集 Union中只会出现一次.

>>> from sympy import Union
>>> l1=[3,1,5,7]
>>> l2=[9,7,2,1]
>>> a=FiniteSet(*l1)
>>> b=FiniteSet(*l2)
>>> Union(a,b)

另一方面 交集Intersection 仅仅包含两个集合中的公共元素.

>>> from sympy import Intersection
>>> Intersection(a,b)

积集ProductSet 对象表示两个集合元素的 Cartesian 积.

>>> from sympy import ProductSet
>>> l1=[1,2]
>>> l2=[2,3]
>>> a=FiniteSet(*l1)
>>> b=FiniteSet(*l2)
>>> set(ProductSet(a,b))

补集Complement(a,b) 包含在集合a中但是不包含在b中的元素.

>>> from sympy import Complement
>>> l1=[3,1,5,7]
>>> l2=[9,7,2,1]
>>> a=FiniteSet(*l1)
>>> b=FiniteSet(*l2)
>>> Complement(a,b), Complement(b,a)

对称差SymmetricDifference 集合包含两个集合中只出现一次的元素, 即属于a但不属于b以及属于b但不属于a的元素.

>>> from sympy import SymmetricDifference
>>> l1=[3,1,5,7]
>>> l2=[9,7,2,1]
>>> a=FiniteSet(*l1)
>>> b=FiniteSet(*l2)
>>> SymmetricDifference(a,b)

输出

{2,3,5,9}

SymPy – 格式输出

SymPy 有几种可用的格式输出. 下面列表是其中的部分格式 −

  • 纯字符str
  • srepr
  • ASCII pretty printer
  • Unicode pretty printer
  • LaTeX
  • MathML
  • Dot

SymPy 对象也可以作为输出发为各种语言的代码, 例如 C, Fortran, Javascript, Theano, 和 Python.

SymPy 在pretty print模式下使用 Unicode 字符渲染输出. 如果你使用 Python 的控制台console 执行 SymPy 命令, 那么最佳的 pretty printing 环境通过调用函数 init_session() 被激活.

>>> from sympy import init_session
>>> init_session()

执行如下的命令 −

>>> from __future__ import division
>>> from sympy import *
>>> x, y, z, t = symbols('x y z t')
>>> k, m, n = symbols('k m n', integer=True)
>>> f, g, h = symbols('f g h', cls=Function)
>>> init_printing()

说明文档可以参考 Welcome to SymPy’s documentation! — SymPy 1.9 documentation

>>> Integral(sqrt(1/x),x)

如果机器中没有安装 LATEX 环境, 但是安装了 Matplotlib, 可以使用 Matplotlib 渲染输出. 如果没有安装 Matplotlib, 系统使用 Unicode pretty printer 格式输出. 然而, Jupyter notebook 使用 MathJax 来渲染 LATEX.

在一个不支持Unicode的终端中, 系统将使用 ASCII pretty printer格式输出结果.

Sympy简单教程(7)

要使用 ASCII printer你需要在函数 pprint() 中将 use_unicode 属性设置为 False

>>> pprint(Integral(sqrt(1/x),x),use_unicode=False)

Sympy简单教程(7)

Unicode pretty printer格式输出也可以从 pprint() 和 pretty()访问. 如果终端支持 Unicode, 它将被自动应用. 如果 pprint() 不能检测到终端支持 unicode, 你可以传递参数 use_unicode=True 强迫它使用 Unicode.

为了得到一个表达式的 LATEX 命令, 可以使用函数 latex().

>>> print(latex(Integral(sqrt(1/x),x)))

\int \sqrt{\frac{1}{x}}\, dx

你也可以使用 mathml 格式输出. 为实现这个目的, 导入 print_mathml 函数. 字符版本可以通过调用函数 mathml() 得到.

>>> from sympy.printing.mathml import print_mathml
>>> print_mathml(Integral(sqrt(1/x),x))



>>>mathml(Integral(sqrt(1/x),x))

‘ ‘

原文至此完结, 但是译者感觉明显未完待续的感觉, 因为就没有涉及到统计和概率部分.后续有机会再自己写博客完善吧.

Original: https://blog.csdn.net/weixin_45616112/article/details/122622793
Author: leotzf
Title: Sympy简单教程(7)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/767348/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球