Simplification
print(“字符串”)橘荠,5/2和5//2的結(jié)果是不同的5/2為2.5,5//2為2.
python2需要導(dǎo)入from_future_import division執(zhí)行普通的除法宰翅。
1/2和1//2的結(jié)果0.5和0.
%號(hào)為取模運(yùn)算展哭。
乘方運(yùn)算為2**3辕坝,-2**3和-(2**3)是等價(jià)的纱耻。
from sympy import*導(dǎo)入庫
x,y,z=symbols('x y z'),定義變量
init_printing(use_unicode=True)設(shè)置打印方式。
python的內(nèi)部常量有pi茅坛,
simplify
函數(shù)simplify音半,simplify(sin(x)**2 + cos(x)**2)化簡(jiǎn)結(jié)果為1,
simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))化簡(jiǎn)結(jié)果為x-1贡蓖〔莛化簡(jiǎn)伽馬函數(shù)。simplify(gamma(x)/gamma(x - 2))得(x-2)(x-1)斥铺。
expand講括號(hào)展開
expand((x + 1)**2)展開多項(xiàng)式彻桃。
expand((x + 1)*(x - 2) - (x - 1)*x)
factor()因式分解,將多個(gè)式子整合為幾個(gè)因式的積
因式分解晾蜘。factor(x**2*z + 4*x*y*z + 4*y**2*z)得到z*(x + 2*y)**2
from_future_import division
x,y,z,t=symbols('x y z t')定義變量邻眷,
k, m, n = symbols('k m n', integer=True)定義三個(gè)整數(shù)變量眠屎。
f, g, h = symbols('f g h', cls=Function)定義的類型為函數(shù)。
factor_list
factor_list(x**2*z + 4*x*y*z + 4*y**2*z)得到一個(gè)列表肆饶,表示因式的冪改衩,(1, [(z, 1), (x + 2*y, 2)])
expand((cos(x) + sin(x))**2)展開多項(xiàng)式。
collect
expr = x*y + x - 3 + 2*x**2 - z*x**2 + x**3驯镊,collected_expr = collect(expr, x)將x合并葫督。將x元素按階次整合。
collected_expr.coeff()
collected_expr.coeff(x, 2)直接取出變量collected_expr的x的二次冪的系數(shù)板惑。
cancel化簡(jiǎn)
cancel()is more efficient thanfactor().
cancel((x**2 + 2*x + 1)/(x**2 + x))
橄镜,expr = (x*y**2 - 2*x*y*z + x*z**2 + y**2 - 2*y*z + z**2)/(x**2 - 1),cancel(expr)
factor因式分解
apart將分式展開為多個(gè)分式的和冯乘。
expr = (4*x**3 + 21*x**2 + 10*x + 12)/(x**4 + 5*x**3 + 5*x**2 + 4*x)洽胶,apart(expr)
三角函數(shù)化簡(jiǎn)trigsimp()
asin(1)
trigsimp(sin(x)**2 + cos(x)**2)三角函數(shù)表達(dá)式化簡(jiǎn),
trigsimp(sin(x)**4 - 2*cos(x)**2*sin(x)**2 + cos(x)**4)
trigsimp(sin(x)*tan(x)/sec(x))
trigsimp(cosh(x)**2 + sinh(x)**2)雙曲函數(shù)往湿。
expand_trig()
三角函數(shù)展開妖异,expand_trig(sin(x + y))惋戏,acos(x)领追,cos(acos(x)),expand_trig(tan(2*x))
powers
x, y = symbols('x y', positive=True)正數(shù)响逢,a, b = symbols('a b', real=True)實(shí)數(shù)绒窑,z, t, c = symbols('z t c')定義變量的方法。
sqrt(x) == x**Rational(1, 2)判斷是否相等舔亭。
powsimp()
powsimp(x**a*x**b)冪函數(shù)的乘法些膨,不同冪的乘法,必須先定義a和b钦铺。powsimp(x**a*y**a)相同冪的乘法订雾。
powsimp(t**c*z**c),注意矛洞,powsimp()refuses to do the simplification if it is not valid.
powsimp(t**c*z**c, force=True)這樣的話就可以得到化簡(jiǎn)過的式子洼哎。聲明強(qiáng)制進(jìn)行化簡(jiǎn)。
(z*t)**2沼本,sqrt(x*y)
expand_power_exp / expand_power_base
第一個(gè)展開expand_power_exp(x**(a + b))噩峦,expand_power_base((x*y)**a)展開,
expand_power_base((z*t)**c, force=True)強(qiáng)制展開抽兆。
powdenest
powdenest((x**a)**b)识补,powdenest((z**a)**b),powdenest((z**a)**b, force=True)
指數(shù)和對(duì)數(shù)辫红。
ln(x)凭涂,x, y ,z= symbols('x y z', positive=True)祝辣,n = symbols('n', real=True),
expand_log
expand_log(log(x*y))展開為log(x) + log(y)导盅,但是python3沒有较幌。這是因?yàn)樾枰獙定義為positive。這是必須的白翻,否則不會(huì)被展開乍炉。expand_log(log(x/y)),expand_log(log(x**n))
As withpowsimp()andpowdenest(),expand_log()has aforceoption that can be used to ignore assumptions。
expand_log(log(z**2), force=True),強(qiáng)制展開滤馍。
logcombine合并
logcombine(log(x) + log(y))岛琼,logcombine(n*log(x)),logcombine(n*log(z), force=True)巢株。
特殊功能槐瑞。
factorial(n)階乘,binomial(n, k)等于c(n阁苞,k)困檩,gamma(z)伽馬函數(shù)。
hyper([1, 2], [3], z)那槽,
重寫rewrite
tan(x).rewrite(sin)得到用正弦表示的正切悼沿。factorial(x).rewrite(gamma)用伽馬函數(shù)重寫階乘。
expand_func
expand_func(gamma(x + 3))得到骚灸,x*(x + 1)*(x + 2)*gamma(x)糟趾,
hyperexpand
hyperexpand(hyper([1, 1], [2], z)),
combsimp
combsimp(factorial(n)/factorial(n - 3))化簡(jiǎn)甚牲,combsimp(binomial(n+1, k+1)/binomial(n, k))化簡(jiǎn)义郑。combsimp(gamma(x)*gamma(1 - x))
Continued Fractions
自定義函數(shù)
def list_to_frac(l):
expr = Integer(0)
for i in reversed(l[1:]):
expr += i
expr = 1/expr
return l[0] + expr
list_to_frac([x, y, z])結(jié)果為x + 1/z,這個(gè)結(jié)果是錯(cuò)誤的丈钙。
syms = symbols('a0:5')非驮,定義syms,得到的結(jié)果為(a0, a1, a2, a3, a4)雏赦。
這樣也可以a0, a1, a2, a3, a4 = syms劫笙,可能是我的操作錯(cuò)誤。發(fā)現(xiàn)python和自動(dòng)縮進(jìn)有關(guān)喉誊,所以一定看好自動(dòng)縮進(jìn)的距離邀摆。list_to_frac([1, 2, 3, 4])結(jié)果為43/30。
使用cancel可以將生成的分式化簡(jiǎn)伍茄,frac = cancel(frac)化簡(jiǎn)為一個(gè)分?jǐn)?shù)線的分式栋盹。
(a0*a1*a2*a3*a4 + a0*a1*a2 + a0*a1*a4 + a0*a3*a4 + a0 + a2*a3*a4 + a2 + a4)/(a1*a2*a3*a4 + a1*a2 + a1*a4 + a3*a4 + 1)
a0, a1, a2, a3, a4 = syms定義a0到a4,frac = apart(frac, a0)可將a0提出來敷矫。frac=1/(frac-a0)將a0去掉取倒例获。frac = apart(frac, a1)提出a1汉额。
python中help的用法
help("modules"),模塊的含義,help("modules yourstr")模塊中包含的字符串的意思榨汤。蠕搜,
help("topics"),import os.path + help("os.path")收壕,help("list")妓灌,help("open")
# -*- coding: UTF-8 -*-聲明之后就可以在ide中使用中文注釋。
定義
l = list(symbols('a0:5'))定義列表得到[a0, a1, a2, a3, a4]
Calculus
fromsympyimport*
x,y,z=symbols('x y z')
init_printing(use_unicode=True)
Derivatives求偏導(dǎo)
diff(cos(x),x)求導(dǎo)蜜宪。diff(exp(x**2), x)虫埂,diff(x**4, x, x, x)和diff(x**4, x, 3)等價(jià)。
diff(expr, x, y, 2, z, 4)求出表達(dá)式的y的2階圃验,z的4階掉伏,x的1階導(dǎo)數(shù)。和diff(expr, x, y, y, z, 4)等價(jià)澳窑。expr.diff(x, y, y, z, 4)一步到位斧散。deriv = Derivative(expr, x, y, y, z, 4)求偏導(dǎo)。但是不顯示摊聋。之后用deriv.doit()即可顯示
Integrals積分
integrate(cos(x), x)積分鸡捐。定積分integrate(exp(-x), (x, 0, oo))無窮大用2個(gè)oo表示。integrate(exp(-x**2-y**2),(x,-oo,oo),(y,-oo,oo))二重積分栗精。print(expr)print的使用闯参。
expr = Integral(log(x)**2, x)瞻鹏,expr.doit()積分得到x*log(x)**2 - 2*x*log(x) + 2*x悲立。
? integ.doit()和integ = Integral((x**4 + x**2*exp(x) - x**2 - 2*x*exp(x) - 2*x -
exp(x))*exp(x)/((x - 1)**2*(x + 1)**2*(exp(x) + 1)), x)連用。
Limits極限
limit(sin(x)/x,x,0)新博,not-a-number表示nan算不出來薪夕,limit(expr, x, oo),赫悄,expr = Limit((cos(x) - 1)/x, x, 0)原献,expr.doit()連用。左右極限limit(1/x, x, 0, '+')埂淮,limit(1/x, x, 0, '-')姑隅。。
Series Expansion級(jí)數(shù)展開倔撞。expr = exp(sin(x))讲仰,expr.series(x, 0, 4)得到1 + x + x**2/2 + O(x**4),痪蝇,x*O(1)得到O(x)鄙陡,冕房,expr.series(x, 0, 4).removeO()將無窮小移除。exp(x-6).series(x,x0=6)趁矾,耙册,得到
-5 + (x - 6)**2/2 + (x - 6)**3/6 + (x - 6)**4/24 + (x - 6)**5/120 + x + O((x - 6)**6, (x, 6))最高到5階。
f=Function('f')定義函數(shù)變量和h=Symbol('h')和d2fdx2=f(x).diff(x,2)求2階毫捣,详拙,as_finite_diff(dfdx)函數(shù)和as_finite_diff(d2fdx2,[-3*h,-h,2*h]),蔓同,x_list=[-3,1,2]和y_list=symbols('a b c')和apply_finite_diff(1,x_list,y_list,0)溪厘。
Solvers
Eq(x, y),牌柄,solveset(Eq(x**2, 1), x)解出來x畸悬,當(dāng)二式相等。和solveset(Eq(x**2 - 1, 0), x)等價(jià)珊佣。solveset(x**2 - 1, x)
Solving Equations Algebraically
solveset(x**2 - x, x)解蹋宦,solveset(x - x, x, domain=S.Reals)解出來定義域。solveset(exp(x), x)? ? # No solution exists解出EmptySet()表示空集咒锻。
等式形式linsolve([x + y + z - 1, x + y + 2*z - 3 ], (x, y, z))和矩陣法linsolve(Matrix(([1, 1, 1, 1], [1, 1, 2, 3])), (x, y, z))得到{(-y - 1, y, 2)}
A*x = b 形式冷冗,M=Matrix(((1,1,1,1),(1,1,2,3))),system=A,b=M[:,:-1],M[:,-1]惑艇,linsolve(system,x,y,z)蒿辙,,solveset(x**3 - 6*x**2 + 9*x, x)解多項(xiàng)式滨巴。roots(x**3 - 6*x**2 + 9*x, x)思灌,得出,{3: 2, 0: 1}恭取,有2個(gè)3的重根泰偿,1個(gè)0根。solve([x*y - 1, x - 2], x, y)解出坐標(biāo)蜈垮。
Solving Differential Equations
f, g = symbols('f g', cls=Function)函數(shù)的定義耗跛,解微分方程diffeq = Eq(f(x).diff(x, x) - 2*f(x).diff(x) + f(x), sin(x))再和dsolve(diffeq,f(x))結(jié)合。得到Eq(f(x), (C1 + C2*x)*exp(x) + cos(x)/2)攒发,dsolve(f(x).diff(x)*(1 - sin(f(x))), f(x))解出來Eq(f(x) + cos(f(x)), C1)调塌,,
Matrices
Matrix([[1,-1],[3,4],[0,2]])惠猿,羔砾,Matrix([1, 2, 3])列表示。M=Matrix([[1,2,3],[3,2,1]])
N=Matrix([0,1,1])
M*N符合矩陣的乘法。M.shape顯示矩陣的行列數(shù)蜒茄。
Accessing Rows and Columns獲取行列
M.row(0)獲取M的第0行唉擂。M.col(-1)獲取倒數(shù)第一列。
Deleting and Inserting Rows and Columns刪除插入列
M.col_del(0)刪掉第1列檀葛。M.row_del(1)刪除第二行玩祟,序列是從0開始的。M = M.row_insert(1, Matrix([[0, 4]]))插入第二行屿聋,空扎,M = M.col_insert(0, Matrix([1, -2]))插入第一列。
Basic Methods
M+N矩陣相加润讥,M*N转锈,3*M,M**2楚殿,M**-1撮慨,N**-1表示求逆。M.T求轉(zhuǎn)置脆粥。
Matrix Constructors矩陣構(gòu)造
eye(3)單位砌溺。zeros(2, 3),0矩陣变隔,ones(3, 2)全1规伐,diag(1, 2, 3)對(duì)角矩陣。diag(-1, ones(2, 2), Matrix([5, 7, 5]))生成Matrix([
[-1, 0, 0, 0],
[ 0, 1, 1, 0],
[ 0, 1, 1, 0],
[ 0, 0, 0, 5],
[ 0, 0, 0, 7],
[ 0, 0, 0, 5]])矩陣匣缘。
Advanced Methods高級(jí)方法
Matrix([[1, 0, 1], [2, -1, 3], [4, 3, 2]])
一行一行顯示猖闪,,M.det()求行列式肌厨。M.rref()矩陣化簡(jiǎn)培慌。得到結(jié)果為Matrix([
[1, 0,? 1,? 3],
[0, 1, 2/3, 1/3],
[0, 0,? 0,? 0]]), [0, 1])。
M = Matrix([[1, 2, 3, 0, 0], [4, 10, 0, 0, 1]])夏哭,M.nullspace()
Columnspace
M.columnspace()和M = Matrix([[1, 2, 3, 0, 0], [4, 10, 0, 0, 1]])
Eigenvalues, Eigenvectors, and Diagonalization
M = Matrix([[3, -2,? 4, -2], [5,? 3, -3, -2], [5, -2,? 2, -2], [5, -2, -3,? 3]])和M.eigenvals()得到{3: 1, -2: 1, 5: 2}检柬,献联,This means thatMhas eigenvalues -2, 3, and 5, and that the eigenvalues -2 and 3 have algebraic multiplicity 1 and that the eigenvalue 5 has algebraic multiplicity 2.
P, D = M.diagonalize()竖配,P得Matrix([
[0, 1, 1,? 0],
[1, 1, 1, -1],
[1, 1, 1,? 0],
[1, 1, 0,? 1]]),里逆,D為Matrix([
[-2, 0, 0, 0],
[ 0, 3, 0, 0],
[ 0, 0, 5, 0],
[ 0, 0, 0, 5]])
P*D*P**-1 == M返回為True进胯。lamda = symbols('lamda')。
lamda = symbols('lamda')定義變量原押,p = M.charpoly(lamda)和factor(p)
Advanced Expression Manipulation
expr = x**2 + x*y胁镐,srepr(expr)可以將表達(dá)式說明計(jì)算法則,"Add(Pow(Symbol('x'), Integer(2)), Mul(Symbol('x'), Symbol('y')))"。盯漂。
x = symbols('x')和x = Symbol('x')是一樣的颇玷。srepr(x**2)得到"Pow(Symbol('x'), Integer(2))"。Pow(x, 2)和Mul(x, y)得到x**2就缆。x*y
type(2)得到<class 'int'>帖渠,type(sympify(2))得到<class 'sympy.core.numbers.Integer'>..srepr(x*y)得到"Mul(Symbol('x'), Symbol('y'))"。竭宰。空郊。
Add(Pow(x, 2), Mul(x, y))得到"Add(Mul(Integer(-1), Pow(Symbol('x'), Integer(2))), Mul(Rational(1, 2), sin(Mul(Symbol('x'), Symbol('y')))), Pow(Symbol('y'), Integer(-1)))"。切揭。Pow函數(shù)為冪次狞甚。
Recursing through an Expression Tree
expr = Add(x, x),expr.func廓旬。哼审。Integer(2).func,<class 'sympy.core.numbers.Integer'>,,Integer(0).func和Integer(-1).func孕豹,棺蛛,,expr = 3*y**2*x和expr.func得到<class 'sympy.core.mul.Mul'>,,expr.args將表達(dá)式分解為得到(3, x, y**2)巩步,旁赊,expr.func(*expr.args)合并。expr == expr.func(*expr.args)返回True椅野。expr.args[2]得到y(tǒng)**2终畅,expr.args[1]得到x,expr.args[0]得到3.竟闪。
expr.args[2].args得到(y, 2)离福。。y.args得到空括號(hào)炼蛤。Integer(2).args得到空括號(hào)妖爷。
科學(xué)計(jì)算
from sympy import *
E**(I*pi)+1,可以看出理朋,I和E絮识,pi已將在sympy內(nèi)已定義。
x=Symbol('x')嗽上,次舌,expand( E**(I*x) )不能展開,expand(exp(I*x),complex=True)可以展開兽愤,得到I*exp(-im(x))*sin(re(x)) + exp(-im(x))*cos(re(x))彼念,挪圾,x=Symbol("x",real=True)將x定義為實(shí)數(shù)。再展開expand(exp(I*x),complex=True)得到逐沙。I*sin(x) + cos(x)哲思。。
tmp = series(exp(I*x), x, 0, 10)和pprint(tmp)打印出來可讀性好吩案,print(tmp)可讀性不好也殖。。pprint將公式用更好看的格式打印出來务热,忆嗜,pprint( series( cos(x), x, 0, 10) )
積分
integrate(x*sin(x), x),崎岂,定積分integrate(x*sin(x), (x, 0, 2*pi))捆毫。。
用雙重積分求解球的體積冲甘。
x, y, r = symbols('x,y,r')和2 * integrate(sqrt(r*r-x**2), (x, -r, r))計(jì)算球的體積绩卤。計(jì)算不來,是因?yàn)閟ympy不知道r是大于0的江醇。r = symbols('r', positive=True)這樣定義r即可濒憋。circle_area=2*integrate(sqrt(r**2-x**2),(x,-r,r))得到。circle_area=circle_area.subs(r,sqrt(r**2-x**2))將r替換陶夜。
integrate(circle_area,(x,-r,r))再積分即可凛驮。
subs函數(shù)的使用
expression.sub([(x,y),(y,x)])又換到原來的狀況了。
expression.subs(x, y)条辟,黔夭,將算式中的x替換成y。羽嫡。
expression.subs({x:y,u:v}) : 使用字典進(jìn)行多次替換本姥。。
expression.subs([(x,y),(u,v)]) : 使用列表進(jìn)行多次替換杭棵。婚惫。