1. 程式人生 > 實用技巧 >Sympy解方程-求極限-微分-積分-矩陣運算

Sympy解方程-求極限-微分-積分-矩陣運算

簡介

Sympy是一個Python的科學計算庫,用一套強大的符號計算體系完成諸如多項式求值、求極限、解方程、求積分、微分方程、級數展開、矩陣運算等等計算問題。雖然Matlab的類似科學計算能力也很強大,但是Python以其語法簡單、易上手、異常豐富的三方庫生態,個人認為可以更優雅地解決日常遇到的各種計算問題。

目錄

1.解方程組solve()
2.求極限limit()
3.微分(導數)diff()
4.積分
4-1.定積分integrate()
4-2.求不定積分integrate(),dsolve()
5.序列sequence()
6.矩陣Matrix()
7.其他

0.準備工作

from sympy import *

1.解方程組solve()

# 申明未知數變數
x,y = symbols('x y')
# 定義方程組和要求解的未知數,並求解
# 傳入: [函式表示式1,函式表示式12,...],[變數1,變數2,...]
result = solve([Eq(y,1-x),Eq(3*x+2*y,5)],[x,y])
print(result)
{x: 3, y: -2}

2.求極限limit()

n = Symbol('n')
print(limit(((n+3)/(n+2))**n, n, oo))
E

3.微分(導數)diff()

x = symbols('x')
f = x**2 + 2*x + 1 # 定義函式f(x)
f

diff(f,x,1)  # 函式f(x)對x求1次導

4.積分

4-1.定積分integrate()

x,t = symbols('x t')
# 傳入: 函式表示式,(積分變數,積分下限,上限)
fx = integrate(sin(t)/(pi-t),(t,0,x))
s = integrate(fx,(x,0,pi))
print(s)
fx
2

4-2.求不定積分integrate(),dsolve()

x = Symbol('x')
# 傳入: 函式表示式,積分變數
s = integrate(E**x + 2*x,x)
s

f = Function('f')
eq1 = Eq(Derivative(f(x),x),x*cos(x))
pprint(eq1)
y = dsolve(eq1,f(x))
pprint(y)
integrate(eq1)
d                  
──(f(x)) = x⋅cos(x)
dx                 
f(x) = C₁ + x⋅sin(x) + cos(x)

5.序列sequence()

s = sequence(x, (x, 1, 10))
print(list(s))
print(summation(s.formula, (x, s.start, s.stop)))
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
55

6.矩陣Matrix()

M = Matrix([[1, 2], [3, 4], [0, 3]])
N = Matrix([2, 2])
M*N

7.雜項

'''1.常用的sympy內建符號'''
I   # 1-1.虛數單位i
E   # 1-2.自然對數的底e
oo  # 1-3.無窮大oo
pi  # 1-4.圓周率pi
'''2.sympy的初等運算:加+減-乘*除/,次方開方,對數,階乘,三角函式,表示式求值'''
# 2-1.次方開方
2**3      # eg:2的3次方
8**(1/3)  # eg:8開3次方
# 2-2.求對數log()
log(1000,10)  # eg:以10為底1000的對數
log(E)  # eg:自然對數
# 2-3.階乘
factorial(4)
# 2-4.三角函式
sin(pi)  # 以sin函式為例
# 2-5.表示式與表示式求值
x,y = symbols('x y')
f = 2*x + y
f.evalf(subs={x:1,y:2})
f.subs({x:1,y:2})
# 2-6計算求和式summation()
n = Symbol('n',integer = True)
summation(2 * n,(n,1,100))
# 2-7.表示式等於
Eq(3*x+2*y,5)
# 2-8.處理有理數的Rational
r1 = Rational(1/10)
r2 = Rational(1/10)
r3 = Rational(1/10)
val = (r1 + r2 + r3) * 3
print(val.evalf())
print((1/10 + 1/10 + 1/10) * 3)  # 沒有有理化會存在小錯誤
# 級數展開
cos(x).series(x, 0, 10)
'''3.其他'''
# 列印美化pprint()
pprint(E**x + 2*x)
# 轉換位Latex公式
x,y,z = symbols('x y z')
print(latex(x**2+y/1+z))
# 擴充套件代數表示式
expand((x + 1) ** 2)
#  簡化表示式
simplify((x**2-x-6)/(x**2-3*x))
# 比較表示式
a = cos(x)**2 - sin(x)**2
b = cos(2*x)
a.equals(b)
0.900000000000000
0.9000000000000001
       x
2⋅x + ℯ 
x^{2} + y + z
True

[參考]

1.更多例項:https://github.com/sympy/sympy/wiki/Quick-examples
2.官方github:https://github.com/sympy
3.官網:https://www.sympy.org/en/index.html

[至此完結] Andy:2020-09-10 Q597966823