SymPy-符号运算好帮手

2024-02-15 01:50
文章标签 运算 符号 好帮手 sympy

本文主要是介绍SymPy-符号运算好帮手,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

SymPy-符号运算好帮手

SymPy是Python的数学符号计算库,用它可以进行数学公式的符号推导。为了调用方便,下面所有的实例程序都假设事先从sympy库导入了所有内容:

>>> from sympy import *

4.1 封面上的经典公式

本书的封面上的公式:

e^{\mathrm{i} \pi} + 1 = 0

叫做欧拉恒等式,其中e是自然指数的底,i是虚数单位, \pi 是圆周率。此公式被誉为数学最奇妙的公式,它将5个基本数学常数用加法、乘法和幂运算联系起来。下面用SymPy验证一下这个公式。

载入的符号中,E表示自然指数的底,I表示虚数单位,pi表示圆周率,因此上述的公式可以直接如下计算:

>>> E**(I*pi)+1 0 

欧拉恒等式可以下面的公式进行计算,

e^{​{\mathrm{i}}x}=\cos x+ {\mathrm{i}} \sin x

为了用SymPy求证上面的公式,我们需要引入变量x。在SymPy中,数学符号是Symbol类的对象,因此必须先创建之后才能使用:

>>> x = Symbol('x') 

expand函数可以将公式展开,我们用它来展开E**(I*pi)试试看:

>>> expand( E**(I*x) ) exp(I*x) 

没有成功,只是换了一种写法而已。这里的exp不是math.exp或者numpy.exp,而是sympy.exp,它是一个类,用来表述自然指数函数。

expand函数有关键字参数complex,当它为True时,expand将把公式分为实数和虚数两个部分:

>>> expand(exp(I*x), complex=True) I*exp(-im(x))*sin(re(x)) + cos(re(x))*exp(-im(x)) 

这次得到的结果相当复杂,其中sin, cos, re, im都是sympy定义的类,re表示取实数部分,im表示取虚数部分。显然这里的运算将符号x当作复数了。为了指定符号x必须是实数,我们需要如下重新定义符号x:

>>> x = Symbol("x", real=True) >>> expand(exp(I*x), complex=True) I*sin(x) + cos(x) 

终于得到了我们需要的公式。那么如何证明它呢。我们可以用泰勒多项式展开:

>>> tmp = series(exp(I*x), x, 0, 10) >>> pprint(tmp)  2 3 4 5 6 7 8 9  x I*x x I*x x I*x x I*x 1 + I*x - -- - ---- + -- + ---- - --- - ---- + ----- + ------ + O(x**10)  2 6 24 120 720 5040 40320 362880 

series是泰勒展开函数,pprint将公式用更好看的格式打印出来。下面分别获得tmp的实部和虚部,分别和cos(x)和sin(x)的展开公式进行比较:

>>> pprint(re(tmp))  2 4 6 8  x x x x 1 + re(O(x**10)) - -- + -- - --- + -----  2 24 720 40320 
>>> pprint( series( cos(x), x, 0, 10) )  2 4 6 8  x x x x 1 - -- + -- - --- + ----- + O(x**10)  2 24 720 40320 
>>> pprint(im(tmp))  3 5 7 9  x x x x x + im(O(x**10)) - -- + --- - ---- + ------  6 120 5040 362880 
>>> pprint(series(sin(x), x, 0, 10))  3 5 7 9  x x x x x - -- + --- - ---- + ------ + O(x**10)  6 120 5040 362880 

4.2 球体体积

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

>>> integrate(x*sin(x), x) -x*cos(x) + sin(x) 

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

>>> integrate(x*sin(x), (x, 0, 2*pi)) -2*pi 

为了计算球体体积,首先让我们来看看如何计算圆形面积,假设圆形的半径为r,则圆上任意一点的Y坐标函数为:

y(x) = \sqrt{r^2 - x^2}

因此我们可以直接对上述函数在-r到r区间上进行积分得到半圆面积,注意这里我们使用symbols函数一次创建多个符号:

>>> x, y, r = symbols('x,y,r') >>> 2 * integrate(sqrt(r*r-x**2), (x, -r, r)) 2*Integral((r**2 - x**2)**(1/2), (x, -r, r)) 

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

>>> r = symbols('r', positive=True) >>> circle_area = 2 * integrate(sqrt(r**2-x**2), (x, -r, r)) >>> circle_area pi*r**2 

接下来对此面积公式进行定积分,就可以得到球体的体积,但是随着X轴坐标的变化,对应的切面的的半径会发生变化,现在假设X轴的坐标为x,球体的半径为r,则x处的切面的半径为可以使用前面的公式y(x)计算出。

_images/mayavi2_sphere.png

图4.1 球体体积的双重定积分示意图

因此我们需要对circle_area中的变量r进行替代:

>>> circle_area = circle_area.subs(r, sqrt(r**2-x**2)) >>> circle_area pi*(r**2 - x**2) 

用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)) 4*pi*r**3/3

这篇关于SymPy-符号运算好帮手的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/710157

相关文章

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

uva 575 Skew Binary(位运算)

求第一个以(2^(k+1)-1)为进制的数。 数据不大,可以直接搞。 代码: #include <stdio.h>#include <string.h>const int maxn = 100 + 5;int main(){char num[maxn];while (scanf("%s", num) == 1){if (num[0] == '0')break;int len =

【Java中的位运算和逻辑运算详解及其区别】

Java中的位运算和逻辑运算详解及其区别 在 Java 编程中,位运算和逻辑运算是常见的两种操作类型。位运算用于操作整数的二进制位,而逻辑运算则是处理布尔值 (boolean) 的运算。本文将详细讲解这两种运算及其主要区别,并给出相应示例。 应用场景了解 位运算和逻辑运算的设计初衷源自计算机底层硬件和逻辑运算的需求,它们分别针对不同的处理对象和场景。以下是它们设计的初始目的简介:

位运算:带带孩子吧,孩子很强的!

快速进制 在聊到位运算之前,不妨先简单过一遍二进制的东西。熟悉二进制和十进制的快速转换确实是掌握位运算的基础,因为位运算直接在二进制位上进行操作。如果不熟悉二进制表示,很难直观理解位运算的效果。 这里主要涉及二进制和十进制之间的互相转换。 十进制转二进制 十进制转二进制可以使用常见的 除2取余法 进行。每次将十进制除以2并记录所得余数,直到商为0,然后再将记录的余数 从下往上排列即

超级 密码加密 解密 源码,支持表情,符号,数字,字母,加密

超级 密码加密 解密 源码,支持表情,符号,数字,字母,加密 可以将表情,动物,水果,表情,手势,猫语,兽语,狗语,爱语,符号,数字,字母,加密和解密 可以将文字、字母、数字、代码、标点符号等内容转换成新的文字形式,通过简单的文字以不同的排列顺序来表达不同的内容 源码截图: https://www.httple.net/152649.html

快速幂运算的一些模板

这里用递归和循环两种做法来做。 简单来说,快速幂就是把底数扩大,指数缩小,比如2*2=4;计算2的幂时,就可以转换成4的幂来运算,这样可以避免在计算大的数据时爆int的现象  //递归int power(int a,int n){int ans;if(n==2) ans=1;else{ans=power(a*a,n/2);if(n%2==1) ans*=a;}return ans;}

高精度计算----减法运算(浮点型)

基于上一贴,修改减法运算适合于高精度浮点型计算。 因为减法比加法难度大一点,考虑的地方也要多一些,可能代码有欠缺,欢迎指出。 运算说明: 1、相减函数依旧没改变,包括上一贴的判断被减数与减数的大小函数也没变。 2、增加两个函数,取小数位数函数和结果处理(回归小数点)函数 3、与加法浮点高精度运算相比,这里改变较多的是结果处理函数,加法加完后,位数不减反增,而且最多增一位。减法会消失掉好多

高精度计算----减法运算

处理大数减法运算: 1、首先要判断被减数与减数哪个更大,再相应的带入减法函数去处理。具体的比较可以使用字符串的相关知识去比较。 2、相减要先对齐数组,依照减数的长度,执行相应的减法运算次数。 3、不需要借位相减的话,直接减去;需要的话,向前借一位,若前一位是0,则再前借(此时前一位的0变为10)。 测试程序效果如下:   以下代码包括相减函数,比较被减数减数函数,若有错误,请指出:

Python中的位运算-从入门到精通

你是否曾经好奇过计算机是如何在底层处理数据的?或者,你是否想知道为什么有些程序员总是津津乐道于位运算的强大?如果是,那么你来对地方了!今天,我们将深入探讨Python中的位运算,揭示它们的神奇之处,以及如何利用它们来优化你的代码。 目录 位运算:计算机的秘密语言为什么位运算重要? Python中的位运算操作符1. 按位与 (&)2. 按位或 (|)3. 按位异或 (^)4. 按位取反 (~

【OpenCV2.2】图像的算术与位运算(图像的加法运算、图像的减法运算、图像的融合)、OpenCV的位运算(非操作、与运算、或和异或)

1 图像的算术运算 1.1 图像的加法运算 1.2 图像的减法运算 1.3 图像的融合 2 OpenCV的位运算 2.1 非操作 2.2 与运算 2.3 或和异或 1 图像的算术运算 1.1 图像的加法运算 add opencv使用add来执行图像的加法运算 图片就是矩阵, 图片的加法运算就是矩阵的加法运算, 这就要求加法运算的两张图shape必须是相同的. # 图片加法imp