sympy科學計算器

SymPy庫常用函數

簡介

本文抄于https://www.cnblogs.com/baby123/p/6296629.html

SymPy是一個符號計算的Python庫。它的目標是成為一個全功能的計算機代數系統,同時保持代碼簡 潔、易于理解和擴展。它完全由Python寫成,不依賴于外部庫。SymPy支持符號計算、高精度計算、模式匹配、繪圖、解方程、微積分、組合數學、離散 數學、幾何學、概率與統計、物理學等方面的功能。(來自維基百科的描述)

更多內容請查看本人個人博客:https://huiyang865.github.io/2016/08/27/sympy/

Sympy安裝方法

安裝命令:pip install sympy

基本數值類型

實數,有理數和整數

SymPy有三個內建的數值類型:實數,有理數和整數。有理數類用兩個整數來表示一個有理數。分子與分母,所以Rational(1,2)代表1/2,Rational(5,2)代表5/2,等等。

>>>from sympy import *
>>>a = Rational(1,2)
>>>a
1/2
>>>a*2
1
>>>Rational(2)**50/Rational(10)**50
1/88817841970012523233890533447265625

當利用Python的整數計算時要注意一下,Python只會截取除法的整數部分:

>>>1/2
0
>>>1.0/2
0.5

然而你可以:

>>>from __future__ import division
>>>1/2 #doctest: +SKIP
0.5

正確的除法在python3k和isympy中這樣做,是標準的。

特殊的常數

我們也可以有一些特殊的常數,像e和pi,它們會被當作符號去對待。(1+pi不會求得值,反而它會保持為1+pi),例如:

>>>pi**2
pi**2
>>>pi.evalf()
3.14159265358979
>>>(pi+exp(1)).evalf()
5.85987448204884

求表達式的浮點數-evalf()函數

正如你看到的,evalf()函數可以用求出表達式的浮點數。
有一個無窮大的類型,被成為oo:

>>>oo > 99999
True
>>>oo + 1
oo
If the substitution will be followed by numerical evaluation, it is better to pass the substitution to evalf as
>>> (1/x).evalf(subs={x: 3.0}, n=21)
0.333333333333333333333
rather than
>>> (1/x).subs({x: 3.0}).evalf(21)
0.333333333333333314830

Sympy基本使用

定義變量-Symbols函數

對比與其他的計算機代數系統,在SymPy中要明確聲明符號變量:

>>> x = symbols('x')
>>> x + 1
x + 1
>>>x,y,z=symbols('x y z')
>>> crazy = symbols('unrelated')
>>> crazy + 1
unrelated + 1
>>> x = symbols('x')
>>> expr = x + 1
>>> x = 2
>>> print(expr)
x + 1
Changing x to 2 had no effect on expr. This is because x = 2 changes the Python variable x to 2, but has no effect on the SymPy Symbol x, which was what we used in creating expr.

變量替換subs函數

>>> x = symbols('x')
>>> expr = x + 1
>>> expr.subs(x, 2)
3
>>> from sympy import pi, exp, limit, oo
>>> from sympy.abc import x, y
>>> (1 + x*y).subs(x, pi)
pi*y + 1
>>> (1 + x*y).subs({x:pi, y:2})
1 + 2*pi
>>> (1 + x*y).subs([(x, pi), (y, 2)])
1 + 2*pi
>>> reps = [(y, x**2), (x, 2)]
>>> (x + y).subs(reps)
6
>>> (x + y).subs(reversed(reps))
x**2 + 2
>>> (x**2 + x**4).subs(x**2, y)
y**2 + y
>>> (x**2 + x**4).xreplace({x**2: y})
x**4 + y
>>> (x/y).subs([(x, 0), (y, 0)])
0
>>> (x/y).subs([(x, 0), (y, 0)], simultaneous=True)
nan
>>> ((x + y)/y).subs({x + y: y, y: x + y})
1
>>> ((x + y)/y).subs({x + y: y, y: x + y}, simultaneous=True)
y/(x + y)
>>> limit(x**3 - 3*x, x, oo)
oo

調用方式:[subs(*args, **kwargs)]

代數

局部的代數式展開,使用apart(expr, x):

In [1]: 1/( (x+2)*(x+1) )
Out[1]:1
───────────────
(2 + x)*(1 + x)
In [2]: apart(1/( (x+2)*(x+1) ), x)
Out[2]:1       1
───── - ─────
1 + x   2 + x
In [3]: (x+1)/(x-1)
Out[3]:
-(1 + x)
────────1 - x
In [4]: apart((x+1)/(x-1), x)
Out[4]:2
1 - ─────1 - x

代數式的合并

(相當于展開的逆運算),使用together(expr, x):

In [7]: together(1/x + 1/y + 1/z)
Out[7]:
x*y + x*z + y*z
───────────────x*y*z
In [8]: together(apart((x+1)/(x-1), x), x)
Out[8]:
-1 - x
──────
1 - x
In [9]: together(apart(1/( (x+2)*(x+1) ), x), x)
Out[9]:1
───────────────
(2 + x)*(1 + x)

微積分

極限

在sympy中極限容易求出,它們遵循極限語法 limit(function, variable, point) ,所以計算x->0時f(x)的極限,即limit(f, x, 0):

>>>from sympy import *
>>>x=Symbol("x")
>>>limit(sin(x)/x, x, 0)
1
>>>limit(x, x, oo)
oo
>>>limit(1/x, x, oo)
0
>>>limit(x**x, x, 0)
1

有一些特殊的極限的例子,可以閱讀文件test_demidovich.py

微分

可以對任意SymPy表達式微分。diff(func, var)。例如:

>>>from sympy import *
>>>x = Symbol('x')
>>>diff(sin(x), x)
cos(x)
>>>diff(sin(2*x), x)
2*cos(2*x)
>>>diff(tan(x), x)
1 + tan(x)**2

可以通過以下驗證:

>>>limit((tan(x+y)-tan(x))/y, y, 0)
1 + tan(x)**2

計算高階微分 diff(func, var, n) :

>>>diff(sin(2*x), x, 1)
2*cos(2*x)
>>>diff(sin(2*x), x, 2)
-4*sin(2*x)
>>>diff(sin(2*x), x, 3)
-8*cos(2*x)

級數展開

函數 series(var, point, order):

>>>from sympy import *
>>>x = Symbol('x')
>>>cos(x).series(x, 0, 10)
1 - x**2/2 + x**4/24 - x**6/720 + x**8/40320 + O(x**10)
>>>(1/cos(x)).series(x, 0, 10)
1 + x**2/2 + 5*x**4/24 + 61*x**6/720 + 277*x**8/8064 + O(x**10)

積分

SymPy支持不定積分,超越函數與特殊函數的定積分。SymPy有力的擴展Risch-Norman 算法和模型匹配算法。

>>>from sympy import *
>>>x, y = symbols('xy')

初等函數:

>>>integrate(6*x**5, x)
x**6
>>>integrate(sin(x), x)
-cos(x)
>>>integrate(log(x), x)
-x + x*log(x)
>>>integrate(2*x + sinh(x), x)
cosh(x) + x**2

特殊函數:

>>>integrate(exp(-x**2)*erf(x), x)
pi**(1/2)*erf(x)**2/4

定積分:

>>>integrate(x**3, (x, -1, 1))
0
>>integrate(sin(x), (x, 0, pi/2))
1
>>>integrate(cos(x), (x, -pi/2, pi/2))
2

一些廣義積分也可以被支持:

>>>integrate(exp(-x), (x, 0, oo))
1
>>>integrate(log(x), (x, 0, 1))
-1

復數

>>>from sympy import Symbol, exp, I
>>>x = Symbol("x")
>>>exp(I*x).expand()
exp(I*x)
>>>exp(I*x).expand(complex=True)
I*exp(-im(x))*sin(re(x)) + cos(re(x))*exp(-im(x))
>>>x = Symbol("x", real=True)
>>>exp(I*x).expand(complex=True)
I*sin(x) + cos(x)

函數

三角函數::

In [1]: sin(x+y).expand(trig=True)
Out[1]: cos(x)*sin(y) + cos(y)*sin(x)
In [2]: cos(x+y).expand(trig=True)
Out[2]: cos(x)*cos(y) - sin(x)*sin(y)
In [3]: sin(I*x)
Out[3]: I*sinh(x)
In [4]: sinh(I*x)
Out[4]: I*sin(x)
In [5]: asinh(I)
Out[5]:
π*I
───2
In [6]: asinh(I*x)
Out[6]: I*asin(x)
In [15]: sin(x).series(x, 0, 10)
Out[15]:3     5     7       9x     x     x       x
x - ── + ─── - ──── + ────── + O(x**10)6    120   5040   362880
In [16]: sinh(x).series(x, 0, 10)
Out[16]:3     5     7       9x     x     x       x
x + ── + ─── + ──── + ────── + O(x**10)6    120   5040   362880
In [17]: asin(x).series(x, 0, 10)
Out[17]:3      5      7       9x    3*x    5*x    35*x
x + ── + ──── + ──── + ───── + O(x**10)6     40    112     1152
In [18]: asinh(x).series(x, 0, 10)
Out[18]:3      5      7       9x    3*x    5*x    35*x
x - ── + ──── - ──── + ───── + O(x**10)6     40    112     1152

球諧函數:

In [1]: from sympy.abc import theta, phi
In [2]: Ylm(1, 0, theta, phi)
Out[2]:————
╲╱ 3 *cos(θ)
────────────——2*╲╱ π
In [3]: Ylm(1, 1, theta, phi)
Out[3]:——            I*φ
-╲╱ 6   *│sin(θ)│*?
────────────────────——4*╲╱ π
In [4]: Ylm(2, 1, theta, phi)
Out[4]:———                  I*φ
-╲╱ 30  *│sin(θ)│*cos(θ)*?
────────────────────────────——4*╲╱ π

階乘和伽瑪函數:

In [1]: x = Symbol("x")
In [2]: y = Symbol("y", integer=True)
In [3]: factorial(x)
Out[3]: Γ(1 + x)
In [4]: factorial(y)
Out[4]: y!
In [5]: factorial(x).series(x, 0, 3)
Out[5]:2           2    2  2x *EulerGamma    π *x
1 - x*EulerGamma + ────────────── + ───── + O(x**3)2            12

Zeta函數:

In [18]: zeta(4, x)
Out[18]: ζ(4, x)
In [19]: zeta(4, 1)
Out[19]:4
π
──
90
In [20]: zeta(4, 2)
Out[20]:4π
-1 + ──90
In [21]: zeta(4, 3)
Out[21]:417   π
- ── + ──16   90

多項式

In [1]: chebyshevt(2, x)
Out[1]:2
-1 + 2*x
In [2]: chebyshevt(4, x)
Out[2]:2      4
1 - 8*x  + 8*x
In [3]: legendre(2, x)
Out[3]:23*x
-1/2 + ────2
In [4]: legendre(8, x)
Out[4]:2         4         6         8
35   315*x    3465*x    3003*x    6435*x
─── - ────── + ─────── - ─────── + ───────
128     32        64        32       128
In [5]: assoc_legendre(2, 1, x)
Out[5]:—————╱     2
-3*x*╲╱  1 - x
In [6]: assoc_legendre(2, 2, x)
Out[6]:2
3 - 3*x
In [7]: hermite(3, x)
Out[7]:3
-12*x + 8*x

微分方程

在isympy中:

In [4]: f(x).diff(x, x) + f(x)     #注意在使用輸入該命令之前,一定要聲明f=Function('f')
Out[4]:2d
─────(f(x)) + f(x)
dx dx
In [5]: dsolve(f(x).diff(x, x) + f(x), f(x))
Out[5]: C?*sin(x) + C?*cos(x)

代數方程

在isympy中:

In [7]: solve(x**4 - 1, x)
Out[7]: [i, 1, -1, -i]
In [8]: solve([x + 5*y - 2, -3*x + 6*y - 15], [x, y])
Out[8]: {y: 1, x: -3}

線性代數

矩陣

矩陣由矩陣類創立建:

>>>from sympy import Matrix
>>>Matrix([[1,0], [0,1]])
[1, 0]
[0, 1]

不只是數值矩陣,亦可為代數矩陣,即矩陣中存在符號:

>>>x = Symbol('x')
>>>y = Symbol('y')
>>>A = Matrix([[1,x], [y,1]])
>>>A
[1, x]
[y, 1]
>>>A**2
[1 + x*y,     2*x]
[    2*y, 1 + x*y]

關于矩陣更多的例子,請看線性代數教程。

系數匹配

使用 .match()方法,引用Wild類,來執行表達式的匹配。該方法會返回一個字典。

>>>from sympy import *
>>>x = Symbol('x')
>>>p = Wild('p')
>>>(5*x**2).match(p*x**2)
{p_: 5}
>>>q = Wild('q')
>>>(x**2).match(p*x**q)
{p_: 1, q_: 2}

如果匹配不成功,則返回None:

>>>print (x+1).match(p**x)
None

可以使用Wild類的‘exclude’參數(排除參數),排除不需要和無意義的匹配結果,來保證結論中的顯示是唯一的:

>>>x = Symbol('x')
>>>p = Wild('p', exclude=[1,x])
>>>print (x+1).match(x+p) # 1 is excluded
None
>>>print (x+1).match(p+1) # x is excluded
None
>>>print (x+1).match(x+2+p) # -1 is not excluded
{p_: -1}

打印輸出

標準

str(expression)返回如下:

>>>from sympy import Integral
>>>from sympy.abc import x
>>>print x**2
x**2
>>>print 1/x
1/x
>>>print Integral(x**2, x)
Integral(x**2, x)

Pretty Printing

用pprint函數可以輸出不錯的ascii藝術:

>>>from sympy import Integral, pprint
>>>from sympy.abc import x
>>>pprint(x**2) #doctest: +NORMALIZE_WHITESPACE
2
x
>>>pprint(1/x)
1
-
x
>>>pprint(Integral(x**2, x))/
|
|  2
| x  dx
|
/

[Pretty PrintingWiki]
提示:在python解釋器中,為使pretty printing為默認輸出,使用:

$ python
Python 2.5.2 (r252:60911, Jun 25 2008, 17:58:32)
[GCC 4.3.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from sympy import *
>>> import sys
>>> sys.displayhook = pprint
>>> var("x")
x
>>> x**3/3
3
x
--
3
>>> Integral(x**2, x) #doctest: +NORMALIZE_WHITESPACE
/
|
|  2
| x  dx
|
/

Python printing

>>>from sympy.printing.python import python
>>>from sympy import Integral
>>>from sympy.abc import x
>>>print python(x**2)
x = Symbol('x')
e = x**2
>>>print python(1/x)
x = Symbol('x')
e = 1/x
>>>print python(Integral(x**2, x))
x = Symbol('x')
e = Integral(x**2, x)

LaTeX printing

>>>from sympy import Integral, latex
>>>from sympy.abc import x
>>>latex(x**2)
$x^{2}$
>>>latex(1/x)
$\frac{1}{x}$
>>>latex(Integral(x**2, x))
$\int x^{2}\,dx$

MathML

>>>from sympy.printing.mathml import mathml
>>>from sympy import Integral, latex
>>>from sympy.abc import x
>>>print mathml(x**2)
<apply><power/><ci>x</ci><cn>2</cn></apply>
>>>print mathml(1/x)
<apply><power/><ci>x</ci><cn>-1</cn></apply>

Pyglet

>>>from sympy import Integral, preview
>>>from sympy.abc import x
>>>preview(Integral(x**2, x)) #doctest:+SKIP
注解

Isympy默認調用pprint,所以這就是為什么看到pretty printing為默認的。

有一個打印的有效模塊,sympy.printing。用這個模塊實現其他的打印:

  • pretty(expr), pretty_print(expr), pprint(expr): 分別返回或者輸出,,表達式的漂亮描述。這是相同
  • latex(expr), print_latex(expr):分別返回或者輸出,LaTex描寫的表達式
  • mathml(expr), print_mathml(expr):分別返回或者輸出,MathML描寫的表達式
  • print_gtk(expr): 表達式打印到Gtkmathview , 這是一個GTK小配件顯示MathML代碼。Gtkmathview程序是必須的。

相關鏈接

  • 本文轉載自于:http://blog.csdn.net/pipisorry/article/details/39123247
  • Sympy源碼庫:https://github.com/sympy/sympy
  • SymPy’s documentation:http://docs.sympy.org/latest/index.html
  • SymPy-符號運算好幫手:http://hyry.dip.jp/tech/book/page/scipy/sympy.html
  • SymPy Tutorial(譯):http://reverland.org/python/2012/08/30/sympy-tutorial/

轉載于:https://www.cnblogs.com/3daytears/p/9236175.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/250035.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/250035.shtml
英文地址,請注明出處:http://en.pswp.cn/news/250035.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【異或運算】 - 交換2個數

1. 代碼 let a 3; let b 4; a a ^ b; b a ^ b; a a ^ b;2. 異或的性質 不同為1,相同為0(可以看做是無進制位的加法)交換律: a ^ b b ^ a;結合律: (a ^ b) ^ c a ^ (b ^ a);0 ^ x x;x ^ x 0; 3. 證明 下面證明1中的代碼 a 3 ^ 4;b (3 ^ 4) ^ 4 3 ^ 0 3;a (3…

Spring底層控制反轉解耦合(IOC)

簡單的例子解釋IOC控制反轉進行解耦合 一、相關概念 &#xff08;1&#xff09;解耦合 解耦合就是把程序中互相不相關或有限相關的模塊分割開來&#xff0c;把不同模塊互相之間的關系用接口進行準確定義&#xff0c;解耦前&#xff0c;兩個模塊之間共享所有信息&#xff1b; &…

Manacher算法學習筆記 | LeetCode#5

Manacher算法學習筆記 DECLARATION 引用來源&#xff1a;https://www.cnblogs.com/grandyang/p/4475985.html CONTENT 用途&#xff1a;尋找一個字符串的最長回文子串時間復雜度&#xff1a;O(N)算法步驟&#xff1a; 1.添加特殊字符 由于回文串的長度可奇可偶&#xff0c;比如…

content-type對照表

轉載于:https://www.cnblogs.com/mxyr/p/9238329.html

【算法小積累】 - 提取非0數最右側的1

參考 - 69:49 const getRightOne num > {return num & (~num 1); };

解耦合

廣大程序猿同胞&#xff0c;經常會看到“解耦合”&#xff0c;也有很多人&#xff0c;會用這個詞來裝X&#xff0c;但是&#xff0c;實際真正能理解的人&#xff0c;并不多。接下來&#xff0c;帶大家深入淺出的走一遍&#xff0c;如何解耦合。 首先&#xff0c;我們要知道&am…

CentOS安裝和配置Rsync進行文件同步

Liunx系統實現文件同步不需要搭建FTP這類的工具&#xff0c;只需要按照Rsync配置下文件就可以。 本文以Centos7.0為例。 1. 首先關閉SELINUX&#xff08;不關閉無法同步&#xff0c;權限太高了&#xff09; vi /etc/selinux/config #編輯防火墻配置文件 #SELINUXenforcing #注釋…

【linux】 -設備名稱與文件目錄

參考 - 鳥哥的linux私房菜基礎篇 在linux系統中,每個設備都被當成一個文件來對待幾乎所有的硬件設備文件都在/dev這個目錄內 下面給出,常見設備和文件路徑的對應關系 設備設備在Linux中的文件名SCSI、SATA、USB磁盤驅動器/dev/sd[a-p]U盤/dev/sd[a-p] (與SATA相同)Virtio接口/…

數據結構開發(7):典型問題分析(Bugfix)

0.目錄 1.創建異常對象時的空指針問題 2.LinkList 中的數據元素刪除 3.LinkList 中遍歷操作與刪除操作的混合使用 4.StaticLinkList 中數據元素刪除時的效率問題 5.StaticLinkList 是否需要提供析構函數&#xff1f; 6.StLib 是否有必要增加多維數組類&#xff1f; 1.創建異常對…

spring boot 使用視圖modelandview

1&#xff1a;springboot使用視圖解析器&#xff0c;添加依賴 <!-- freemarker模板引擎視圖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-freemarker</artifactId></dependency>&…

題解-BOI 2004 Sequence

Problem bzoj & Luogu 題目大意&#xff1a; 給定序列\(\{a_i\}\)&#xff0c;求一個嚴格遞增序列\(\{b_i\}\)&#xff0c;使得\(\sum \bigl |a_i-b_i\bigr|\)最小 Thought 正序&#xff1a;直接對應 逆序&#xff1a;取中位數&#xff08;證明&#xff1a;“醫院設置”&am…

【vscode】編譯java時報錯亂碼

報錯如下 解決方案 改變終端的編碼格式 chcp 946注意: chcp 65001 UTF-8編碼chcp 936 GBK2312代碼頁

搭建集群架構

環境搭建進行規劃(磨刀不誤砍柴工). 集群架構組成說明. 負載均衡服務器使用Nginx做搭建,(nginx反向代理軟件) Nginx01<-------->Nginx02 3臺Web網站服務器,Nginx網站web服務功能 2臺負載均衡服務器 (對網站的流量進行分流,減少流量對某臺服務器的壓力) 3臺web服務器, (處…

Model、ModelMap和ModelAndView的使用詳解

1.前言 最近SSM框架開發web項目&#xff0c;用得比較火熱。spring-MVC肯定用過&#xff0c;在請求處理方法可出現和返回的參數類型中&#xff0c;最重要就是Model和ModelAndView了&#xff0c;對于MVC框架&#xff0c;控制器Controller執行業務邏輯&#xff0c;用于產生模型數據…

【mysql】- 初始化

參考 1、寫配置文件 在mysql的根目錄下創建 my.ini&#xff0c;根目錄的截圖和輸入的內容如下所示。 my.ini的內容如下 [mysql] default-character-setutf8[mysqld] character-set-serverutf8 default-storage-engineINNODB sql_modeSTRICT_TRANS_TABLES,NO_ZERO_IN_DATE,…

【FBI WARNING】一些Noip的黑科技 持續整理!

有疑問或錯誤盡管評論&#xff01;&#xff01; 下面以C為準。 本文手&#xff08;粘&#xff09;打&#xff08;貼&#xff09;于各大博客之間 有問題。。。。。 我也不懂 max、min的優化 我們知道&#xff0c;打max、min時&#xff0c;要用分支&#xff08;if語句&#xff09…

@PathVariable注解使用

PathVariable是spring3.0的一個新功能&#xff1a;接收請求路徑中占位符的值 語法&#xff1a; PathVariable("xxx") 通過 PathVariable 可以將URL中占位符參數{xxx}綁定到處理器類的方法形參中PathVariable(“xxx“) RequestMapping(value”user/{id}/{name}”) 請…

【mysql】- 常用命令

DML - 操作表 SELECT * FROM stu;INSERT INTO stu ( id, NAME ) VALUES ( 1, 張三 );INSERT INTO stu ( id, NAME, sex, birthday, score, email, tel, STATUS ) VALUES( 2, 李四, 男, 1999-11-11, 88.888, lisiitcase.cn, 13812345678, 1 );update stu set sex 女 where nam…

JAVA 框架-Spring-AOP面向切面

AOP&#xff08;Aspect Orient Programming&#xff09;&#xff0c;我們一般稱為面向方面&#xff08;切面&#xff09;編程&#xff0c;作為面向對象的一種補充&#xff0c;用于處理系統中分布于各個模塊的橫切關注點&#xff0c;比如事務管理、日志、緩存等等。AOP實現的關鍵…

互相關和卷積的關系

轉載于:https://www.cnblogs.com/seisjun/p/10134021.html