Loading...
墨滴

handsome

2021/04/03  阅读:92  主题:全栈蓝

symbols快速查阅

sympy快速查阅指南

!!!以下操作在https://docs.sympy.org/latest/tutorial/index.html中都可找到,本文章内容主要是介绍工程科研中可用到的(比如CFD)。

在python中有类似MATLAB中的syms符号函数的使用方法,sympy

SymPy is a Python library for symbolic mathematics. It aims to become a full-featured computer algebra system (CAS) while keeping the code as simple as possible in order to be comprehensible and easily extensible. SymPy is written entirely in Python. It depends on mpmath, and other external libraries may be optionally for things like plotting support.

See the webpage for more information and documentation: https://sympy.org

from sympy import *

符号函数定义

symbols('x',integer=True##可以定义正数、实数、复数以及函数

#定义连续的符号
symbols('x:10',real=True)
(x0, x1, x2, x3, x4, x5, x6, x7, x8, x9)
#定义函数类
f=symbols('f',function=True)
pprint(oo)
pprint(I)
pprint(E)
pprint(pi)
∞
ⅈ
ℯ
π
#表达分数
Rational(1,4)

f='x+2*x+3'
f=sympify(f) #则会将字符串格式的表达式转变为符号表达式
f

符号函数操作

基本操作

x,y,z = symbols('x,y,z',integer=True)
z = x + y
#pprint(z)
#z = x - y
#pprint(z)
#z = x * y
#pprint(z)
#z = x / y
#pprint(z)
#z = x**y
pprint(z)
z.subs(x,3)##赋值x=3
pprint((z.subs(x,3)).subs(y,6))##在赋值x=3基础上,y=6
pprint(z.evalf(subs={x:3,y:6})) #赋值

pprint(x == y)##判断x是否等于y
#Eq(z,z.doit())

##多项式展开
f = x*(x+2)*(x-4)
pprint(expand(f))##展开
c = expand(f)
pprint(simplify(c))##简化
pprint(factor(c))##因式分解
x + y
9
9.00000000000000
False
 3      2      
x  - 2⋅x  - 8⋅x
  ⎛ 2          ⎞
x⋅⎝x  - 2⋅x - 8⎠
x⋅(x - 4)⋅(x + 2)

初等函数

pprint(log(x,y))
pprint(root(x,y))
pprint(factorial(x))
exp(x) #sin、cos、tan、cot
log(x)
──────
log(y)
y ___
╲╱ x 
x!

f = 1/x + 1/y
pprint(together(f))

f=(x**3 + x**2 - x - 1)/(x**2 + 2*x + 1)
pprint(simplify(f))

f = sin(x)/cos(x)
trigsimp(f)##三角函数简化
x + y
─────
 x⋅y 
x - 1

g = (1/2)**x
star,end = 2,6
pprint(summation(g,(x,star,end)))##表示对函数g从star累加到end

f = Function('f')
f = x**2 + 3*x + y**3 + y
a = Eq(f,6##列等式
(a)
0.484375000000000

微积分、泰勒展开以及欧拉恒等式

series(sin(x)+cos(x),x, pi, 10)#泰勒展开,表示在x在pi点处展开,精度取10e-10

求解微分方程

求解一般等式、不等式

f = x**2 + 5*x + 6
solve(f,x)##求解等式
[-3, -2]
f = x**2 + 5*x + 6 <= 10
solve(f,x)##求解不等式

f1 = x-y - 6
f2 = x+y
solve([f1,f2],[x,y])##求解方程组
{x: 3, y: -3}
f1=x**2-3*x<10
f2=x**3-2>20
solve([f1,f2],[x,y])##求解方程组

微积分

微分

f = sin(x*y)/x
limit(f,x,0#求极限
limit(f,x,0,dir='-'#求左侧极限
limit(f,x,0,dir='+'#求右侧极限

f = sin(x) + cos(x)
diff(f)

diff(x**2*y**3,x) ##求一阶级偏导数
diff(x**2*y**3,(y,2)) ##求y二阶级阶级偏导数

积分

integrate(x*sin(x), x)#x*sin(x)中对x不定积分
integrate(x*sin(x), (x, 02*pi))#x*sin(x)中对x的定积分

a = Integral(2*x+y,(x,2,4),(y,5,8))
Eq(a, a.doit())##表示按照数学公式推导等式

常微分方程

dsolve(

eq, #待解的微分方程,可传入一个或多个,如果是多个,则用

func=None, #待求解的函数(原函数),一般情况需不需要传入,会自动识别出来

hint='default',#设置求解微分方程的方法,一般无需特别指明,会尝试使用所有可用的方法

simplify=True, #将求解结果进行尽量简化,一般采用默认值即可

ics=None,#传入边界条件,求解特解,即initial_condition_set,类似:{f(a): b, f(x).diff(x).subs(x, c):d} 的形式

xi=None,#暂未接触到

eta=None,#暂未接触到

x0=0, #指定如果微分方程的解为级数序列时,在指定哪个位置进行展开

n=6,#指定如果微分方程的解为级数序列时,其最高的幂级数

)

t = symbols('t')
s = Function('s')
Eq(s(t).diff(t),2*t-s(t))

#则对应的微分方程为s'=2*t-s
#1、求通解

s=symbols('s',cls=Function)
eq=Eq(s(t).diff(t),2*t-s(t))
pprint(dsolve(eq,s(t))) #求出针对以上问题的通解

#2、求满足特定条件的特解
#针对以上问题,在t=0时,s=0,所以有s(0)=0,然后基于该条件,求出其中的常量具体值即可
#此时需将边界条件传入ics参数
pprint(dsolve(eq,s(t),ics={s(0):0}))
       ⎛                t⎞  -t
s(t) = ⎝C₁ + 2⋅(t - 1)⋅ℯ ⎠⋅ℯ  
       ⎛           t    ⎞  -t
s(t) = ⎝2⋅(t - 1)⋅ℯ  + 2⎠⋅ℯ  
Eq(s(t).diff(t,2),2*t-s(t))

eq = Eq(s(t).diff(t,2),2*t-s(t)) ##求解二阶方程
dsolve(eq,s(t))

x,y=symbols('x y',cls=Function)
t=symbols('t')
Eq(x(t).diff(t,1),3*x(t)-2*y(t))

Eq(y(t).diff(t,1),2*x(t)-y(t))

x,y=symbols('x y',cls=Function)
t=symbols('t')
eq1=Eq(x(t).diff(t,1),3*x(t)-2*y(t))
eq2=Eq(y(t).diff(t,1),2*x(t)-y(t))
dsolve((eq1,eq2),[x(t),y(t)]) #求解微分方程组
[Eq(x(t), 2*C1*t*exp(t) + (C1 + 2*C2)*exp(t)),
 Eq(y(t), 2*C1*t*exp(t) + 2*C2*exp(t))]

偏微分

t,x = symbols('t,x')
Eq(s(x,t).diff(t)+s(x,t).diff(x),0)

t,x = symbols('t,x')
f = Function('f')
F = f(x,t)
eq = F.diff(t) + F.diff(x)
(pdsolve(eq))

x1, x2 = symbols('x, t')
f = Function('f')
phi = f(x1, x2)
eq = phi.diff(x1) * cos(x2) + phi.diff(x2)
(pdsolve(eq)) # f(x1, x2) == F(-x1 + sin(x2))

绘图

sympy.plot(

*args, #指定需要绘图的一元表达式或函数,可以传入多个,传入多个则代表一次性绘制多个表达式或函数的图

show=True, #指定绘图后是否展示,默认展示,一般无需进行设置

**kwargs #指定变量的取值区间,是一个三元素元组,比如(x,-6,6),即指定x在-6到6区间内取值并绘图

) 函数范围一个sympy的Plot对象,类似matplotlib的Figure对象,可以使用该对象对绘图结果进行保存,或者进一步设置该图其他的属性

x=symbols('x')
f=x+sin(x)
plot(f,cos(x),(x,-5,5))#绘图结果如下
png
png
<sympy.plotting.plot.Plot at 0x7f2ee0a834f0>

handsome

2021/04/03  阅读:92  主题:全栈蓝

作者介绍

handsome