sympy库的使用(一)定义和表达式简化等等
下一個學習對象
網址:https://docs.sympy.org/latest/tutorial/intro.html
1.導入sympy
from sympy import *
我大致看了下,這個屬性、類、方法太多了,就不一一鋪出來了
2.使用前先定義(symbols)
由于我們是應用,因此不糾結具體的細節
x = symbols('x')
x+1 #x + 1
#多變量時,記得使用空格隔開
x,y,z = symbols('x y z')
默認是變量,但是其實我們也可以定義函數
f, g = symbols('f g', cls=Function)
f(x)
3.怎么定義表達式
f = x+1 f1 = x+y+z
就是一個等號,和我們變量賦值是一樣的
當然里面的表達式你可以使用各種各樣的,比如三角函數,冪函數,指數等等
4.替換(subs)
替換有什么作用:
1.用數值替換變量,相當于將值代入變量里面去解題,類似于當x=1,y=2之類的
2.用變量替代變量,方便我們不用重復寫表達式,,比如說f=cos(x) ,f1=cos(y),直接替換可以節約時間
3.注意sympy表達式是不可變的,替換并不能改變它原值
from sympy import *
x,y,z = symbols('x y z')
expr = cos(x) + 1
expr.subs(x,y) #輸出 cos(y) + 1
expr # cos(x) + 1 說明這個替換并沒有改變原值
#數值替換變量
expr.subs(x,0) #輸出是2
#變量替換變量
expr = x**y
expr #x**y
expr = expr.subs(y,x**y)
expr #x**(x**y)
#可以多個變量同時進行替換
expr = x**3 + 4*x*y - z
expr.subs([(x,2),(y,4),(z,0)]) #65536
5.將字符串轉換為Smpy表達式(sympify)
字符串里面使用的變量要求是定義好的,不然雖然不報錯,但是使用么有定義的也沒有用處
str_expr = 'x**2+3*x-1/2' expr = sympify(str_expr) expr #輸出 x**2 + 3*x - 1/2 #試試如果變量沒有定義,能否使用 str_expr = 'x**2+3*x-g' expr = sympify(str_expr) expr #輸出 -g + x**2 + 3*x g #NameError: name 'g' is not defined
6.將無理數轉換為浮點型(求出近似值)(evalf)
作用:
1.如果表達式是數值,可將這表達式以浮點型輸出,一般默認精度是15位,用戶可以自己設置
2.如果表達式有變量,可以配合subs一起求值,subs以字典傳入
expr = sqrt(8)
expr #輸出2*sqrt(2)
expr.evalf() #2.82842712474619
#默認使用15位精度,也可以自己設置精度參數
pi.evalf(10) #3.141592654
#對于非數值表達式,可以配合和subs使用,但是subs要以字典傳入
expr = cos(2*x)
expr.evalf(subs={x:2.4}) #0.0874989834394464
7.類似于lambda的函數lambdify
看是官網不是很清楚,但是它于lambda使用方法差不多,那就是按照這個lambda去理解
import numpy
a = numpy.arange(10)
a #array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
expr = sin(x)
f = lambdify(x,expr,'numpy')
f(a)
'''
array([ 0. , 0.84147098, 0.90929743, 0.14112001, -0.7568025 ,
-0.95892427, -0.2794155 , 0.6569866 , 0.98935825, 0.41211849])
'''
#math
f = lambdify(x,expr,'math')
f(0.1) #0.09983341664682815
#自定義的函數,使用字典形式
def mysin(x):
return x
f = lambdify(x, expr,{'sin':mysin})
f(1) #1
8.簡化表達式simplify
通過只能方法,簡化數學表達式,但是不是所有的表達式可以簡化的,不能簡化的輸出原來的
from sympy import init_printing init_printing(use_unicode=True) #簡化表達式 simplify(sin(x)**2+cos(x)**2) #1 simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1)) #x - 1 simplify(gamma(x)/gamma(x - 2)) #(x - 2)?(x - 1) #不能簡化 simplify(x**2 + 2*x + 1)
9.多項式展開expand()
說是多項式的展開,比如說(x+y)*(x+y)展開,得到 x**2+y**2+2*x*y
expand((x+1)**2) expand((x+2)*(x-3)) expand((x + 1)*(x - 2) - (x - 1)*x) ''' x**2 + 2*x + 1 x**2 - x - 6 -2 '''
10.factor與expand相反的效果
factor(x**3 - x**2 + x - 1)
factor(x**2*z + 4*x*y*z + 4*y**2*z)
11.collect()
不知道怎么說這個,自己看效果吧
expr = x*y + x - 3 + 2*x**2 - z*x**2 + x**3 expr
collected_expr = collect(expr, x) collected_expr
collect()與該.coeff()方法結合使用時特別有用。給出x的系數:expr.coeff(x,n)x**nexpr
也就是多少次方對于的系數
collected_expr.coeff(x, 0) #-3 collected_expr.coeff(x, 1) #y+1 collected_expr.coeff(x, 2) #2-z collected_expr.coeff(x, 3) #1
12.cancel()弄成分數的形式
看例子比較好理解
注意這個最后結果是不可約了,最簡化的了
expr = 1/x + (3*x/2 - 2)/(x - 4) expr
cancel(expr)
13.aqart對有理函數執行部分分數分解
還是看圖吧,很多術語都忘記得差不多了
expr = (4*x**3 + 21*x**2 + 10*x + 12)/(x**4 + 5*x**3 + 5*x**2 + 4*x) expr
apart(expr)
總結
以上是生活随笔為你收集整理的sympy库的使用(一)定义和表达式简化等等的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c++面向对象高级编程 学习九 poin
- 下一篇: moment.js 常用(几天前、相差几