import sympy as sy
x=sy.Symbol('x')
y=sy.Symbol('y')
x, y, z = sy.symbols('x y z') # 符号对象, 可限定 real = True , positive = True, complex = True , integer = True ...
f = sy.Function("f")
f, g = sy.symbols('f g', cls=sy.Function)
sy.integrate(6*x**5, x)
x**6
sy.integrate(x**3, (x, 0, 10)) #定积分
2500
sy.integrate(6*x**5+y, x,y) #双重不定积分
x**6*y + x*y**2/2
sy.integrate(x**3+y, (x, -1, 1),(y,1,3) ) #双重定积分
8
print f(x).diff(x)
Derivative(f(x), x)
sy.diff(sy.sin(x), x) # 解析微分
cos(x)
sy.diff(sy.sin(2*x), x, 2) # 高阶微分 diff(func, var, n)
-4*sin(2*x)
sy.diff(sy.sin(x*y),x,2,y,3) # 对表达式进行x的2阶求导,对y进行3阶求导
x*(x**2*y**2*cos(x*y) + 6*x*y*sin(x*y) - 6*cos(x*y))
sy.diff(sy.sin(2*x),x)
2*cos(2*x)
sy.sin(2*x).diff(x,1)
2*cos(2*x)
t=sy.Derivative(sy.sin(x),x)
# Derivative是表示导函数的类,它的第一个参数是需要进行求导的数学函数,第二个参数是求导的自变量,
# 注意:Derivative所得到的是一个导函数,它不会进行求导运算。
sy.limit(sy.sin(x)/x, x, 0) # 极限
1
sy.summation(2*x - 1, (x, 1, y)) # 连加求和
y**2
expression.subs(x, y) # 将算式中的x替换成y 替换
(1 + x*y).subs(x, sy.pi)
pi*y + 1
expression.subs({x:y,u:v}) 使用字典进行多次替换
expression.subs([(x,y),(u,v)]) 使用列表进行多次替换
(1 + x*y).subs([(x, sy.pi), (y, 2)])
1 + 2*pi
方程构建: 任何表达式都可以直接表示值为0的方程,即表达式 expr 也是方程 expr=0
# 用sy.Eq构建方程
u_max, rho_max, A, B = sy.symbols('u_max rho_max A B') # 符号对象, 可限定 real = True , positive = True, complex = True , integer = True ...
eq1 = sy.Eq( 0, u_max*rho_max*(1 - A*rho_max-B*rho_max**2) ) # 一般方程
eq1 = sy.Eq(f(x).diff(x)+f(x)+f(x)**2,0) # 微分方程
print eq1
Eq(f(x)**2 + f(x) + Derivative(f(x), x), 0)
sy.solve(方程,未知数) # 方程求解 ,返回值为list 方程求解
它的第一个参数是表示方程的表达式,其后的参数是表示方程中未知量的符号。
sy.solve(eq1,x)
--------------------------------------------------------------------------- NotImplementedError Traceback (most recent call last) <ipython-input-53-3a39fcc28893> in <module>() ----> 1 sy.solve(eq1,x) /Users/chengjun/anaconda/lib/python2.7/site-packages/sympy/solvers/solvers.pyc in solve(f, *symbols, **flags) 1051 ########################################################################### 1052 if bare_f: -> 1053 solution = _solve(f[0], *symbols, **flags) 1054 else: 1055 solution = _solve_system(f, symbols, **flags) /Users/chengjun/anaconda/lib/python2.7/site-packages/sympy/solvers/solvers.pyc in _solve(f, *symbols, **flags) 1617 1618 if result is False: -> 1619 raise NotImplementedError('\n'.join([msg, not_impl_msg % f])) 1620 1621 if flags.get('simplify', True): NotImplementedError: No algorithms are implemented to solve equation _Dummy_172 + f(x)**2 + f(x)
sy.solveset(sy.sin(x)+x,x) # 即对 sy.sin(x)+x=0 求解
ConditionSet(x, Eq(x + sin(x), 0), Complexes((-oo, oo) x (-oo, oo), False))
sy.roots(expr) # 计算单变量方程expr=0的根 方程求解
sy.dsolve(eq1,f(x)) # 微分方程求解 微分方程求解
Eq(f(x), -C1/(C1 - exp(x)))
可以对微分方程进行符号求解,它的第一个参数是一个带未知函数的表达式,第二个参数是需要进行求解的未知函数。
它在解微分方程中可以传递hint参数,指定微分方程的解法,若设置为“best”则放dsolve()尝试所有的方法并返回最简单的解。
from sympy.utilities.lambdify import lambdify
lambdify([x],f(x),modules="numpy") # 第一个参数为自变量列表
<function numpy.<lambda>>
sy.N(sy.pi,20)
3.1415926535897932385
sy.pi.evalf(n=50)
3.1415926535897932384626433832795028841971693993751
i=sy.Symbol('i')
f = sy.Sum(sy.Indexed('x',i)*sy.cos(i*sy.pi),(i,1,10))
f
Sum(cos(pi*i)*x[i], (i, 1, 10))
func = lambdify(x, f, 'numpy') # returns a numpy-ready function
print func
<function <lambda> at 0x108494b90>
numpy_array_of_results = func(y)
numpy_array_of_results
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-68-adb2d1657b9e> in <module>() ----> 1 numpy_array_of_results = func(y) 2 numpy_array_of_results /Users/chengjun/anaconda/lib/python2.7/site-packages/numpy/__init__.pyc in <lambda>(_Dummy_204) /Users/chengjun/anaconda/lib/python2.7/site-packages/numpy/__init__.pyc in <genexpr>((i,)) TypeError: 'Symbol' object does not support indexing