# 声明符号和内置符号类型

sympy是符号运算,与一般情况下用python做数值计算的最大区别在于,在构建算式前需要先声明符号,这些符号当然可以是有多重含义的,sympy内置了几种数据类型来区别.


```python
import sympy as sp
```

## 符号类型

symbols定义了浮点数,整数,有理数,复数4种合法的数据类型,以及一些特殊的数值类型

+ 浮点数


```python
1/2
```




    0.5



+ 整数


```python
1
```




    1



+ 有理数Rational()


```python
sp.Rational(1,3)
```




$\displaystyle \frac{1}{3}$



+ 无理数 sqrt()

例如开根号,一个数如果是一个完全平方数,开根号后就是有理数；反之,是无理数.


```python
sp.sqrt(2)
```




$\displaystyle \sqrt{2}$



同时像一些常见的无理数常数比如$$e,\pi$$也都支持

也可以简单的用幂来表示


```python
2**(sp.Rational(1,2))
```




$\displaystyle \sqrt{2}$




```python
3**(sp.Rational(1,3))
```




$\displaystyle \sqrt[3]{3}$



+ 复数

除了复数单元I是虚数，符号可以被用属性创建(例如 real,positive,complex,等等)这将影响它们的表现：


```python
1+1j
```




    (1+1j)



## 内置符号声明

符号可以分为变量和常量,sympy中的常量可以直接引入,我们看一个典型的常数符号的等式,欧拉公式

$$e^{i\pi}+1=0$$

*ps:*欧拉恒等式是复分析中的欧拉公式的特例,欧拉公式如下:
$$e^{ix}=\cos x + i\sin x \\
 \text x为任意实数$$


```python
from sympy import E,I,pi#从包中导入所需常数符号
```


```python
E**(I*pi)+1
```




$\displaystyle 0$



## 自定义符号声明

声明符号使用函数`symbols(names, **args)`函数


```python
x = sp.symbols("x")
```

### 同时声明多个变量


```python
x,y,z = sp.symbols("x,y,z")
```

### 为符号指定类型


```python
x,y,z = sp.symbols("x,y,z",integer=True)
```

### 声明大量符号变量

如果用到大量的符号可以使用一些简便的方法定义有规律的符号


```python
sp.symbols('x:10')
```




    (x0, x1, x2, x3, x4, x5, x6, x7, x8, x9)




```python
sp.symbols('y5:10')
```




    (y5, y6, y7, y8, y9)




```python
sp.symbols('x(:c)')
```




    (xa, xb, xc)




```python
sp.symbols('a:z')
```




    (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z)




```python
sp.symbols('x:2(1:3)')
```




    (x01, x02, x11, x12)




```python
sp.symbols('f((a:b))')        
```




    (f(a), f(b))




```python
sp.symbols('x(:1\,:2)')  # or 'x((:1)\,(:2))'
```




    (x(0,0), x(0,1))



### 声明一个复数

复数的声明比较复杂,事实上复数是由实部虚部两部分组成的,因此必须要由两部分符号组成,而虚部的符号`i`或者`j`可以使用sympy自带的常量`I`表示,因此可以将复数作为一个算式来处理


```python
x = sp.symbols('x')
y = sp.symbols('y')
c = x+I*y
c
```




$\displaystyle x + i y$



### 声明一个函数符号

我们也可以指定符号为函数


```python
f = sp.symbols("f",cls=sp.Function)
```


```python
f = x+2*y+z
```


```python
f
```




$\displaystyle x + 2 y + z$



## 构建表达式

算式是由符号组成的运算过程,其构造过程可以有2种


### 使用符号构建表达式

符号间直接使用运算符或数学函数连接就可以构造表达式


```python
x+2*y+z
```




$\displaystyle x + 2 y + z$



### 使用字符串构建表达式


这种方式需要使用函数`sympify(exp_str,evaluate:bool)`其中`evaluate`这个参数决定是否进行化简


```python
sp.sympify("x+2*y+z")
```




$\displaystyle x + 2 y + z$




```python
exp1 = sp.sympify("x+y+z+y",evaluate=True)
exp1
```




$\displaystyle x + 2 y + z$




```python
exp2 = sp.sympify("x+y+z+y",evaluate=False)
exp2
```




$\displaystyle x + y + y + z$



### 一个例子: 推导欧拉公式

$$ e^{ix}=\cos x + i\sin x $$

这里用到了如下几个符号:
+ 运算符


```python
from sympy import cos,sin,exp
```

+ 常量


```python
from sympy import I,pi
```

+ 变量


```python
from sympy import symbols

x = symbols('x',real=False)
```

左边为:


```python
exp(I*x)
```




    exp(I*x)



右边算式为:


```python
right = cos(x)+I*sin(x)
```


```python
right
```




    I*sin(x) + cos(x)



我们用泰勒级数展开左边


```python
from sympy import series#泰勒展开函数
series(exp(I*x), x, 0, 10)#公式,变量
```




    1 + I*x - x**2/2 - I*x**3/6 + x**4/24 + I*x**5/120 - x**6/720 - I*x**7/5040 + x**8/40320 + I*x**9/362880 + O(x**10)



右边可以分为两部分,`I*sin(x)`和`cos(x)`


```python
p1 = series(I*sin(x), x, 0, 10)
p1
```




    I*x - I*x**3/6 + I*x**5/120 - I*x**7/5040 + I*x**9/362880 + O(x**10)




```python
p2 = series(cos(x), x, 0, 10)
p2
```




    1 - x**2/2 + x**4/24 - x**6/720 + x**8/40320 + O(x**10)



两部分的和为


```python
p1+p2
```




    1 + I*x - x**2/2 - I*x**3/6 + x**4/24 + I*x**5/120 - x**6/720 - I*x**7/5040 + x**8/40320 + I*x**9/362880 + O(x**10)



可见左右两边相同


```python
series(exp(I*x), x, 0, 10) == p1+p2
```




    True



24516feb0435102996000c3cb5c7042a9f7a3889
ipynb
Jupyter Notebook
src/数据分析篇/工具介绍/SymPy/声明符号和内置符号类型.ipynb
hsz1273327/TutorialForDataScience
1d8e72c033a264297e80f43612cd44765365b09e
MIT
src/数据分析篇/工具介绍/SymPy/声明符号和内置符号类型.ipynb
hsz1273327/TutorialForDataScience
1d8e72c033a264297e80f43612cd44765365b09e
MIT
2020-03-31T03:36:05.000Z
2020-03-31T03:36:21.000Z
src/数据分析篇/工具介绍/SymPy/声明符号和内置符号类型.ipynb
hsz1273327/TutorialForDataScience
1d8e72c033a264297e80f43612cd44765365b09e
MIT
Qwen/Qwen-72B
1. YES
2. YES