没有合适的资源?快使用搜索试试~ 我知道了~
使用Sage进行数值计算(润色版本一)1
需积分: 0 2 下载量 70 浏览量
2022-08-03
20:43:42
上传
评论
收藏 1.31MB PDF 举报
温馨提示
试读
41页
The Sage Development TeamThematic Tutorials, Release 7.1数值工具 3交互式的使用编译代码 12与 f2p
资源详情
资源评论
资源推荐
Thematic Tutorials
Release 7.1
The Sage Development Team
译者:姚振 (HITwh)
March 20, 2016
Thematic Tutorials, Release 7.1
2
Chapter 10: 使用 Sage 进行数值计算 __________________________________________ 3
数值工具 _______________________________________________________________________ 3
NumPy _______________________________________________________________________ 3
SciPy _________________________________________________________________________ 8
Cvxopt ______________________________________________________________________ 10
交互式的使用编译代码 ______________________________________________________ 12
f2py __________________________________________________________________________ 12
与 f2py 有关的更多有趣的例子 ___________________________________________ 18
Weave _______________________________________________________________________ 21
Ctypes _______________________________________________________________________ 23
更加复杂的 ctypes 实例 ___________________________________________________ 27
比较 Cython 和 Pyrex _____________________________________________________ 31
并行计算 ______________________________________________________________________ 32
mpi4py ______________________________________________________________________ 32
并行 Laplace 求解程序 ____________________________________________________ 35
可视化 _________________________________________________________________________ 37
安装可视化工具 ____________________________________________________________ 38
绘图 _________________________________________________________________________ 39
注:译自
thematic_tutorials.pdf
的 P 314 - P 346
Thematic Tutorials, Release 7.1
3
Chapter TEN: 使用 Sage 进行数值计算
设计这篇文档的目的是给读者介绍在 Sage 上做数值计算时的工具。数值计算本质上意味
着机器浮点精度上的计算。我们假设阅读第一部分的读者已经熟悉 Python 和 Sage 了,特
别是对于如:最优化问题,数值化的线性代数,求解常微分方程或偏微分方程的数值解
等。第二部分是关于使用编译代码的这又增加了对预备知识的了解,我们假定阅读的读
者是熟悉 C 语言或者 Fortran 语言的。第三部分是关于 MPI和并行编程的,仅需要 Python
的相关知识就可以了,如果熟悉 MPI 应该会有帮助。最后一部分是关于如何在 Sage 实现
3D 可视化的。
在当前版本的文档中我们假定读者熟悉数值分析的相关技术。本章节的目的不是教授数值
分析的,二是解释如何使用 Python/Sage 实现你的想法。当然这篇文档并不是将所有都囊
括在内的。而他的目的是给以读者指引,使读者能定位于数值计算相关的包和在何处可
以获取等多的信息。
数值工具
Sage 有许多不同的组件可用于数值分析. 其中有三个包值得一提,他们分别是 NumPy,
SciPy,and Cvxopt。 Numpy 是一个十分优秀的包,它为 Python 提供了简单快捷的数组
操作。它包含许多基本的线性代数程序,矢量化数学程序,随机数生成器等。它支持的
编程风格类似于 Matlab,并且对于许多 Matlab 上的方法,在 NumPy 上都有类似的实现。
SciPy 是基于 NumPy 的,它为最优化问题,求根运算,统计学,线性代数,线性插值,
快速傅里叶变换,数字信号处理等提供了许多各不相同的包。最后,Cvxopt 是一个解决
最优化问题的包,它可以解决线性规划和二次规划问题,并且具有一个友好的线性代数
界面。现在我们将介绍一下每个包。
在开始之前,我们首先将注意力转向 NumPy 和 Matlab 的一个对比,它也包含 Matlab 命
令在 NumPy 上的等价命令 ,链接:http://www.scipy.org/NumPy_for_Matlab_Users。 如
果你不熟悉 Matlab,这很好,甚至更好,意味着你在考虑事情应如何完成时没有任何先
入为主的观念。 还有,这个链接有一个关于 SciPy 和 NumPy 的不错的教程,比我们的更
加综合。链接:
http://www.scipy.org/Wiki/Documentation?action=AttachFile&do=get&target=scipy_tutori
al.pdf
NumPy
NumPy 在默认情况下不会被 Sage 自动导入。 要使用 NumPy 我们首先要:
sage: import numpy
批注 [by1]: that provides fast array facilities to python.
Thematic Tutorials, Release 7.1
4
在 NumPy 中计算的基本对象是数组。创建一个数组是容易的。
sage: l=numpy.array([1,2,3])
sage: l
array([1, 2, 3])
NumPy 的数组可以存储 Python 的任意对象。 然而,从速度方面考虑,数值类型将自动
在可能的情况下转换为本机硬件类型 (如 int、float、等)。 如果一个变量或数值的精度
无法转换成本机硬件类型,这时将创建一个 Sage 的数组对象。你可以在这些数组上面进
行任何运算,但是它们可能比原生类型慢一些。当 NumPy 的数组包含 Sage 或 Python 对
象时,数据类型是被显式的表示为 object。当 NumPy 打印数组时,如果没有数据类型被
显式的表示,那这种类型不是 float 就是 int。
sage: l=numpy.array([2**40, 3**40, 4**40])
sage: l
array([1099511627776, 12157665459056928801,
1208925819614629174706176], dtype=object)
sage: a=2.0000000000000000001
sage: a.prec() #
精度高于硬件浮点数
67
sage: numpy.array([a,2*a,3*a])
array([2.000000000000000000, 4.000000000000000000,
6.000000000000000000], dtype=object)
一个数组的 dtype 属性表明这个数组的类型。为了更快的进行数值计算,希望它是某种形
式的 float。如果数据类型是 float 类型,那么数组将被存储为机器 float 类型,这将占用更
小的存储空间,获取更高的操作速度。
sage: l=numpy.array([1.0, 2.0, 3.0])
sage: l.dtype
dtype('float64')
你可以通过指定 dtype 参数创建指定的数据类型的数组。如果你要确保通过机器 float 类
型计算,一个好方法是指定 dtype=float 创建数组。
sage: l=numpy.array([1,2,3], dtype=float)
sage: l.dtype
dtype('float64')
你可以像 list 类型一样访问数组内的元素,也就是切片操作。
sage: l=numpy.array(range(10),dtype=float)
sage: l[3]
3.0
sage: l[3:6]
array([ 3., 4., 5.])
你可以做基本的算术运算。
sage: l+l
批注 [by2]: When the numpy array contains Sage or
python objects, then the data type is explicitly(明确
地) printed as object.
Thematic Tutorials, Release 7.1
5
array([ 0., 2., 4., 6., 8.,10.,12.,14.,16.,18.])
sage: 2.5*l
array([ 0. ,2.5,5. ,7.5,10. ,12.5,15. ,17.5,20. ,22.5])
注意: 将会使用 l 与 l 的各对应分量分别相乘。为了得到点积,需要使用。
sage: l*l
array([ 0., 1., 4., 9., 16., 25., 36., 49., 64.,
81.])
sage: numpy.dot(l,l)
285.0
我们也可以创建二维的数组:
sage: m = numpy.array([[1,2],[3,4]])
sage: m
array([[1, 2],
[3, 4]])
sage: m[1,1]
4
这基本上等价于如下:
sage: m=numpy.matrix([[1,2],[3,4]])
sage: m
matrix([[1, 2],
[3, 4]])
sage: m[0,1]
2
不同之处在于,使用时 m 仅仅被视为数组。特别的 是各分量相乘;然
而,使用时将做矩阵乘法。我们也可以做矩阵向量乘法和矩阵加法:
sage: n = numpy.matrix([[1,2],[3,4]],dtype=float)
sage: v = numpy.array([[1],[2]],dtype=float)
sage: n*v
matrix([[ 5.],
[ 11.]])
sage: n+n
matrix([[ 2., 4.],
[ 6., 8.]])
如果 n 是通过 创建的,然后想做矩阵向量乘法,用。
所有的 NumPy 数组都有一个 shape 属性。对操作而言,这是一个很有用的属性:
sage: n = numpy.array(range(25),dtype=float)
sage: n
array([ 0., 1., 2., 3., 4., 5., 6., 7., 8.,
9., 10.,
剩余40页未读,继续阅读
李多田
- 粉丝: 67
- 资源: 334
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0