# *Tutorial Sympy - Python para Circuitos Elétricos I*

Este notebook contém um guia resumo de como utilizar o pacote **SymPy** do Python para implementar a maior parte das ferramentas matemáticas básicas utilizadas na disciplina de Circuitos Elétricos I.

<h1>Sumário<span class="tocSkip"></span></h1>
<div class="toc"><ul class="toc-item"><li><span><a href="#Definindo-expressões-matemáticas" data-toc-modified-id="Definindo-expressões-matemáticas-1"><span class="toc-item-num">1&nbsp;&nbsp;</span>Definindo expressões matemáticas</a></span></li><li><span><a href="#Calculando-valores-numéricos-de-funções" data-toc-modified-id="Calculando-valores-numéricos-de-funções-2"><span class="toc-item-num">2&nbsp;&nbsp;</span>Calculando valores numéricos de funções</a></span></li><li><span><a href="#Arrendondamento-de-valores-numéricos-com-round" data-toc-modified-id="Arrendondamento-de-valores-numéricos-com-round-3"><span class="toc-item-num">3&nbsp;&nbsp;</span>Arrendondamento de valores numéricos com <em>round</em></a></span></li><li><span><a href="#Derivadas-utilizando-sp.diff" data-toc-modified-id="Derivadas-utilizando-sp.diff-4"><span class="toc-item-num">4&nbsp;&nbsp;</span>Derivadas utilizando <em>sp.diff</em></a></span></li><li><span><a href="#Integrais-definidas-utilizando-sp.integrate" data-toc-modified-id="Integrais-definidas-utilizando-sp.integrate-5"><span class="toc-item-num">5&nbsp;&nbsp;</span>Integrais definidas utilizando <em>sp.integrate</em></a></span></li><li><span><a href="#Plotando-gráficos-com-symplot" data-toc-modified-id="Plotando-gráficos-com-symplot-6"><span class="toc-item-num">6&nbsp;&nbsp;</span>Plotando gráficos com <em>symplot</em></a></span></li><li><span><a href="#Encontrando-numericamente-um-ponto-de-extremo-(máximo-ou-mínimo)-de-uma-função-com-sp.nsolve" data-toc-modified-id="Encontrando-numericamente-um-ponto-de-extremo-(máximo-ou-mínimo)-de-uma-função-com-sp.nsolve-7"><span class="toc-item-num">7&nbsp;&nbsp;</span>Encontrando numericamente um ponto de extremo (máximo ou mínimo) de uma função com <em>sp.nsolve</em></a></span></li><li><span><a href="#Resolvendo-um-sistema-de-equações-lineares-com-sp.solve" data-toc-modified-id="Resolvendo-um-sistema-de-equações-lineares-com-sp.solve-8"><span class="toc-item-num">8&nbsp;&nbsp;</span>Resolvendo um sistema de equações lineares com <em>sp.solve</em></a></span></li></ul></div>


```python
import sympy as sp
import numpy as np
from utils import symdisp, symplot
from IPython.display import Math, Latex, display
```

### Definindo expressões matemáticas


```python
# definindo variável tempo
t = sp.symbols('t', real=True)
```


```python
i = sp.exp(-t)
v = t*sp.exp(-t)*sp.cos(t)
p = v*i

symdisp('i(t) = ', i, 'A')
symdisp('v(t) = ', v, 'V')
symdisp('p(t) = ', p, 'W')
```


$\displaystyle i(t) = e^{- t}\;A$



$\displaystyle v(t) = t e^{- t} \cos{\left(t \right)}\;V$



$\displaystyle p(t) = t e^{- 2 t} \cos{\left(t \right)}\;W$


```symdisp``` é uma função customizada (disponível no arquivo ```utils.py``` presente no repositório) para mostrar expressões definidas simbolicamente com SymPy. Para utilizar esta função num notebooks qualquer, faz-se necessário que o arquivo ```utils.py``` esteja no mesmo diretório em que o notebook está salvo.


```python
help(symdisp)
```

    Help on function symdisp in module utils:
    
    symdisp(expr, var, unit=' ')
        Latex style display of sympy expressions
        
        :param expr: expression in latex [string]
        :param var: sympy variable, function, expression.
        :param unit: string indicating unit of var [string]
    


### Calculando valores numéricos de funções


```python
symdisp('i(2) = ',  i.evalf(subs={t:2}), 'A')
symdisp('v(2) = ',  v.evalf(subs={t:2}), 'V')
symdisp('p(2) = ',  p.evalf(subs={t:2}), 'W')
```


$\displaystyle i(2) = 0.135335283236613\;A$



$\displaystyle v(2) = -0.112638699984256\;V$



$\displaystyle p(2) = -0.0152439903657731\;W$


###  Arrendondamento de valores numéricos com *round*


```python
symdisp('i(2) = ',  round(i.evalf(subs={t:2}),3), 'A')
symdisp('v(2) = ',  round(v.evalf(subs={t:2}),3), 'V')
symdisp('p(2) = ',  round(p.evalf(subs={t:2}),3), 'W')
```


$\displaystyle i(2) = 0.135\;A$



$\displaystyle v(2) = -0.113\;V$



$\displaystyle p(2) = -0.015\;W$


### Derivadas utilizando *sp.diff*


```python
didt = sp.diff(i,t)
dvdt = sp.diff(v,t)
dpdt = sp.diff(p,t)

symdisp('\\frac{ d i(t) }{ dt } =', didt)
symdisp('\\frac{ d v(t) }{ dt } =', dvdt)
symdisp('\\frac{ d p(t) }{ dt } =', dpdt)
```


$\displaystyle \frac{ d i(t) }{ dt } =- e^{- t}\; $



$\displaystyle \frac{ d v(t) }{ dt } =- t e^{- t} \sin{\left(t \right)} - t e^{- t} \cos{\left(t \right)} + e^{- t} \cos{\left(t \right)}\; $



$\displaystyle \frac{ d p(t) }{ dt } =- t e^{- 2 t} \sin{\left(t \right)} - 2 t e^{- 2 t} \cos{\left(t \right)} + e^{- 2 t} \cos{\left(t \right)}\; $



```python
d2idt2 = sp.diff(i,t,t)
d2vdt2 = sp.diff(v,t,t)
d2pdt2 = sp.diff(p,t,t)

symdisp('\\frac{ d^2 i(t) }{ dt^2 } =', d2idt2)
symdisp('\\frac{ d^2 v(t) }{ dt^2 } =', d2vdt2)
symdisp('\\frac{ d^2 p(t) }{ dt^2 } =', d2pdt2)
```


$\displaystyle \frac{ d^2 i(t) }{ dt^2 } =e^{- t}\; $



$\displaystyle \frac{ d^2 v(t) }{ dt^2 } =2 \left(t \sin{\left(t \right)} - \sin{\left(t \right)} - \cos{\left(t \right)}\right) e^{- t}\; $



$\displaystyle \frac{ d^2 p(t) }{ dt^2 } =\left(4 t \sin{\left(t \right)} + 3 t \cos{\left(t \right)} - 2 \sin{\left(t \right)} - 4 \cos{\left(t \right)}\right) e^{- 2 t}\; $


### Integrais definidas utilizando *sp.integrate*


```python
int_i = sp.integrate(i, (t, 0, t))
int_v = sp.integrate(v, (t, 0, t))
int_p = sp.integrate(p, (t, 0, t))

symdisp('\int_{0}^{t} i(u)du =', int_i)
symdisp('\int_{0}^{t} v(u)du =', int_v)
symdisp('\int_{0}^{t} p(u)du =', int_p)
```


$\displaystyle \int_{0}^{t} i(u)du =1 - e^{- t}\; $



$\displaystyle \int_{0}^{t} v(u)du =\frac{t e^{- t} \sin{\left(t \right)}}{2} - \frac{t e^{- t} \cos{\left(t \right)}}{2} + \frac{e^{- t} \sin{\left(t \right)}}{2}\; $



$\displaystyle \int_{0}^{t} p(u)du =\frac{t e^{- 2 t} \sin{\left(t \right)}}{5} - \frac{2 t e^{- 2 t} \cos{\left(t \right)}}{5} + \frac{3}{25} + \frac{4 e^{- 2 t} \sin{\left(t \right)}}{25} - \frac{3 e^{- 2 t} \cos{\left(t \right)}}{25}\; $



```python
int_i = sp.integrate(i, (t, 0, 1))
int_v = sp.integrate(v, (t, 0, 1))
int_p = sp.integrate(p, (t, 0, 1))

symdisp('\int_{0}^{1} i(u)du =', int_i)
symdisp('\int_{0}^{1} v(u)du =', int_v)
symdisp('\int_{0}^{1} p(u)du =', int_p)
```


$\displaystyle \int_{0}^{1} i(u)du =1 - e^{-1}\; $



$\displaystyle \int_{0}^{1} v(u)du =- \frac{\cos{\left(1 \right)}}{2 e} + \frac{\sin{\left(1 \right)}}{e}\; $



$\displaystyle \int_{0}^{1} p(u)du =- \frac{13 \cos{\left(1 \right)}}{25 e^{2}} + \frac{9 \sin{\left(1 \right)}}{25 e^{2}} + \frac{3}{25}\; $



```python
symdisp('\int_{0}^{1} i(u)du =', sp.N(int_i, 2))
symdisp('\int_{0}^{1} v(u)du =', sp.N(int_v, 2))
symdisp('\int_{0}^{1} p(u)du =', sp.N(int_p, 2))
```


$\displaystyle \int_{0}^{1} i(u)du =0.63\; $



$\displaystyle \int_{0}^{1} v(u)du =0.21\; $



$\displaystyle \int_{0}^{1} p(u)du =0.12\; $


### Plotando gráficos com *symplot*

```symplot``` é uma função customizada (disponível no arquivo ```utils.py``` presente no repositório) para plotar gráficos de funções definidas simbolicamente com SymPy. Para utilizar esta função num notebooks qualquer, faz-se necessário que o arquivo ```utils.py``` esteja no mesmo diretório em que o notebook está salvo.


```python
help(symplot)
```

    Help on function symplot in module utils:
    
    symplot(t, F, interval, funLabel)
        Create plots of sympy symbolic functions
        
        :param t: sympy variable
        :param F: sympy function F(t)
        :param interval: array of values of t where F should be evaluated [np.array]
        :funLabel: curve label be displayed in the plot [string].
    


**Exemplos**:


```python
intervalo = np.arange(0, 5, 0.01)

symplot(t, p, intervalo, 'p(t)')
```


```python
symplot(t, [v, i, p], intervalo, ['v(t)','i(t)','p(t)'])
```

### Encontrando numericamente um ponto de extremo (máximo ou mínimo) de uma função com *sp.nsolve*


```python
# define a equação dp(t)/dt = 0
eq = sp.Eq(sp.diff(p, t), 0)   

# encontra numericamente o valor de t para o qual dp(t)/dt = 0, no intervalo (0 a 1)
text = sp.nsolve(eq, t, (0 , 1), solver='bisect') # método da bisseção

pext = p.evalf(subs={t:text})  # calcula o valor de p(t) para t=text

d2 = sp.diff(p, t, t)  # calcula derivada segunda de p(t)

sinal_d2 = sp.sign(d2.evalf(subs={t:text})) # verifica sinal da derivada segunda em t=text

if sinal_d2 > 0:
    print('sinal da derivada segunda: positivo (ponto de extremo é um mínimo)')
elif sinal_d2 < 0:
    print('sinal da derivada segunda: negativo (ponto de extremo é um máximo)')
    
symdisp('p(t) = ', p)
symdisp('t_{ext} =', round(text,3))    
symdisp('p_{ext} =', round(pext,3))
```

    sinal da derivada segunda: negativo (ponto de extremo é um máximo)



$\displaystyle p(t) = t e^{- 2 t} \cos{\left(t \right)}\; $



$\displaystyle t_{ext} =0.411\; $



$\displaystyle p_{ext} =0.166\; $


### Resolvendo um sistema de equações lineares com *sp.solve*


```python
# define as N variáveis desconhecidas
x, y, z = sp.symbols('x, y, z')

# define os sistema de N equações
eq1 = sp.Eq(x   + y + z, 10)             
eq2 = sp.Eq(2*x - y + z, 1)  
eq3 = sp.Eq(5*x - 2*y + 3*z, 5)  

print('Sistema de equações lineares:')
display(eq1, eq2, eq3) 

# resolve o sistema
soluc = sp.solve((eq1, eq2, eq3), dict=True)
soluc = soluc[0]

x = soluc[x]
y = soluc[y]
z = soluc[z]

print('Solução do sistema:')
symdisp('x =', x)
symdisp('y =', y)
symdisp('z =', z)
```

    Sistema de equações lineares:



$\displaystyle x + y + z = 10$



$\displaystyle 2 x - y + z = 1$



$\displaystyle 5 x - 2 y + 3 z = 5$


    Solução do sistema:



$\displaystyle x =5\; $



$\displaystyle y =7\; $



$\displaystyle z =-2\; $


f82740f8ef5a0f17f39928b7b98355d5888d5add
ipynb
Jupyter Notebook
Jupyter notebooks/Tutorial Sympy - Python para Circuitos Eletricos I .ipynb
Jefferson-Lopes/ElectricCircuits
bf2075dc0731cacece75f7b0b378c180630bdf85
MIT
2021-05-19T18:36:53.000Z
2022-01-18T16:30:17.000Z
Jupyter notebooks/Tutorial Sympy - Python para Circuitos Eletricos I .ipynb
Jefferson-Lopes/ElectricCircuits
bf2075dc0731cacece75f7b0b378c180630bdf85
MIT
Jupyter notebooks/Tutorial Sympy - Python para Circuitos Eletricos I .ipynb
Jefferson-Lopes/ElectricCircuits
bf2075dc0731cacece75f7b0b378c180630bdf85
MIT
2021-06-25T12:52:40.000Z
2022-03-11T14:25:48.000Z
Qwen/Qwen-72B
1. YES
2. YES