日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

sympy科学计算器

發(fā)布時間:2023/12/13 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 sympy科学计算器 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

SymPy庫常用函數(shù)

簡介

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

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

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

Sympy安裝方法

安裝命令:pip install sympy

基本數(shù)值類型

實數(shù),有理數(shù)和整數(shù)

SymPy有三個內(nèi)建的數(shù)值類型:實數(shù),有理數(shù)和整數(shù)。有理數(shù)類用兩個整數(shù)來表示一個有理數(shù)。分子與分母,所以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的整數(shù)計算時要注意一下,Python只會截取除法的整數(shù)部分:

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

然而你可以:

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

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

特殊的常數(shù)

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

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

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

正如你看到的,evalf()函數(shù)可以用求出表達式的浮點數(shù)。
有一個無窮大的類型,被成為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函數(shù)

對比與其他的計算機代數(shù)系統(tǒng),在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函數(shù)

>>> 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

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

代數(shù)

局部的代數(shù)式展開,使用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

代數(shù)式的合并

(相當于展開的逆運算),使用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)

級數(shù)展開

函數(shù) 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支持不定積分,超越函數(shù)與特殊函數(shù)的定積分。SymPy有力的擴展Risch-Norman 算法和模型匹配算法。

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

初等函數(shù):

>>>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

特殊函數(shù):

>>>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

復數(shù)

>>>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)

函數(shù)

三角函數(shù)::

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

球諧函數(shù):

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*╲╱ π

階乘和伽瑪函數(shù):

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函數(shù):

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)

代數(shù)方程

在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}

線性代數(shù)

矩陣

矩陣由矩陣類創(chuàng)立建:

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

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

>>>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]

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

系數(shù)匹配

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

>>>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’參數(shù)(排除參數(shù)),排除不需要和無意義的匹配結果,來保證結論中的顯示是唯一的:

>>>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函數(shù)可以輸出不錯的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默認調(diào)用pprint,所以這就是為什么看到pretty printing為默認的。

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

  • 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程序是必須的。

相關鏈接

  • 本文轉(zhuǎn)載自于: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/

轉(zhuǎn)載于:https://www.cnblogs.com/3daytears/p/9236175.html

總結

以上是生活随笔為你收集整理的sympy科学计算器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。