# Project 3 - Promoter Regions

Etudiants:
- ORTIZ Angelo
- HANOUTI Célina

```python
# Les imports nécessaires pour ce mini-projet
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

%load_ext autoreload
%autoreload 2
import utils
import project
```

## 2 Préliminaires : données et lecture des fichiers

```python
cerevisae, chromos_flattened, counts, freqs = \
    utils.read_file("sequences/yeast_s_cerevisae_genomic_chr1-4.fna")
print("S. cerevisae contient", len(cerevisae), "chromosones et", \
      len(chromos_flattened), "nucléotides")
print("Voici les nombres d'occurrence et les fréquences d'apparition de chaque nucléotide :")
pd.DataFrame({'Occurrences': counts, 'Fréquence': freqs}, index=utils.nucleotide.keys())
```

    S. cerevisae contient 4 chromosones et 2515853 nucléotides
    Voici les nombres d'occurrence et les fréquences d'apparition de chaque nucléotide :

      Occurrences
      Fréquence

      A
      754342
      0.299835

      C
      505943
      0.201102

      G
      503163
      0.199997

      T
      752405
      0.299066

## 3.1 Description empirique

Q2) D'après l'hypothèse d'indépendance des occurrences des lettres dans le génome, pour un mot $w = w_1.w_2\dots w_k$ de longueur $k$ donné, on connaît les fréquences des lettres $w_i$ le composant.
Donc, la probabilité de trouver ce mot est donnée par
$$P(w) = \prod_{i=1}^{k} P(w_i).$$

On peut alors calculer le nombre d'occurrences du mot $w$ dans une séquence de longueur $l$ :
$$\text{comptage_attendu} = (l - k + 1)\cdot P(w),$$
où $l-k+1$ est le nombre de positions des occurrences du mot $w$.

Q3) Dans les histogrammes ci-dessous, les écarts entre les nombres d’occurrences attendus et ceux observés sont repérés avec la droite $\mathcal{L}: y = x$.
En effet,  plus la distance entre un point et cette droite est grande, plus l'écart est important.

On remarque dans les histogrammes obtenus la présence de mots qui détiennent une fonction spéciale, étant donné que l'écart entre le comptage observé et le comptage attendu augmente avec la taille des n-grammes, notamment pour les longueurs 6 et 8.

Ceci correspond bien à l'hypothèse sur la taille des région promoteurs, qui comptent souvent entre 6 et 10 nucléobases.
On trouve ainsi 3 mots pour la séquence MET, 1 mot pour PHO, et 1 mot pour GAL, qui sont susceptibles d'appartenir à une région promoteur.

```python
files = ["sequences/regulatory_seqs_MET.fasta", "sequences/regulatory_seq_PHO.fasta", \
         "sequences/regulatory_seqs_GAL.fasta"]
ks = [2, 4, 6, 8]

 # la séquence de nucléotides des séquences de contrôle
chromos_list = project.plot_scatter(files, ks)

# la distribution de probabilité des nucléotides sur la concaténation des 3 fichiers
probas = utils.nucleotide_frequency(chromos_list)
```

## 3.2 Simulation de séquences aléatoires

Q3) On estime la probabilité d'observer un mot un certain nombre $n$ de fois par le proportion de séquences simulées où le mot est apparu au moins $n$ fois, c'est-à-dire
$$P(N \geq n) \approx P_{emp}(N \geq n) = \frac{1}{S}\cdot \sum_{i=1}^{S} \unicode{x1D7D9}_{N \geq n},$$
où $S$ est le nombre de simulations effectuées.

Q4) Vous trouverez dans la cellule ci-dessous les histogrammes des distributions du comptage d'occurrences $P_{emp}(N \geq n)$ pour les mots **ATCTGC**, **ATATAT**, **TTTAAA** et **AAAAAA**.

On remarque que les mots ATATAT et TTTAAA ont la même probabilité d'apparaître, puisque la probabilité empirique d'un nombre d'occurrences nul est zéro.
Cependant, leurs distributions de comptage d'occurrences est différente.
En effet, la distribution du mot TTTAAA decroît légèrement plus vite que celle du mot ATATAT.
Ceci peut s'expliquer par le fait que le mot ATATAT chevauche avec lui-même, ce qui donne lieu a plus d'occurrences.
Pour observer ce comportement, il suffit de regarder le nombre d'occurrences maximal des deux mots, et leur comportement entre 15 et 20 occurrences.

```python
project.plot_histogram(chromos_list, probas, 1000)
```

Q5) On peut calculer un intervalle de confiance pour la probabilité d'observer un mot avec sa probabilité empirique :
$$p_{emp} \sim \mathcal{N}\left(p, \sqrt \frac{p\cdot (1-p)}{n}\right),$$
où $n$ est le nombre (suffisamment grand) de simulations effectuées.

Pour un risque de 5 % ($z_{2.5\%} = 1.96$), on obtient l'intervalle
$$\left[p_{emp} - 1.96 \cdot \sqrt \frac{p_{emp}\cdot (1-p_{emp})}{n},
p_{emp} - 1.96 \cdot \sqrt \frac{p_{emp}\cdot (1-p_{emp})}{n} \right]$$

## 3.3 Modèles de dinucléotides et trinucléotides

Q1) On prend $\mathcal{X} = \{A, C, G, T\}$. Le modèle décrit correspond à une chaîne de Markov homogène d'ordre 1 car il remplit les 3 conditions :
- c'est un processus stochastique à temps discret avec les v.a. $X_i$ correpondant à la nucléobase à la position $i$ dans un génome ;
- l'ensemble des états $\mathcal{X}$ est fini ;
- la propriété de markov d'ordre 1 est vérifiée : $\forall i \geq 0, P(X_{i+1}|X_0,\dots, X_i) = P(X_{i+1}|X_i)$. Autrement dit, la loi du prochain nucléotide de la séquence ne dépend que du nucléotide précédent.

De plus, cette chaîne de Markov est homogène car les probabilités de transition ne dépendent pas d'une variable temporelle.

Par ailleurs, la probabilité stationnaire de cette chaîne correspond aux proportions des nucléobases dans un génome auxquelles on s'attend.

Q5) De la même manière que dans la question 3.1.2), le nombre d'occurrences attendu est
$$\text{comptage_attendu} = (l - k + 1)\cdot P(w),$$
sauf que, dans ce cas, la probabilité d'apparition du mot est calculée différemment. En effet, on utilise la propriété de Markov d'ordre 1 pour obtenir le résultat suivant :
$$
\begin{align}
    P(w) &= P(w_1)\cdot \prod_{i=2}^{k} P(w_i|w_1, \dots, w_{i-1}) \\
    P(w) &= P(w_1)\cdot \prod_{i=2}^{k} P(w_i|w_{i-1}).
\end{align}
$$

Pour la probabilité du premier nucléotide, à savoir $P(w_1)$, on a utilisé $\pi^\ast$, i.e. la distribution stationnaire de la chaîne de Markov, pour le calcul de la probabilité ci-dessus.
On a néanmoins remarqué lors du calcul de cette distribution que les $\pi^{(n)}$ convergent très rapidement.
C'est pourquoi il aurait été aussi sensé d'utiliser $\pi^{(0)}$.

Q6) Dans la cellule ci-dessous, on s'aperçoit que le modèle des dinucléotides est plus représentatif des séquences de génome utilisées que le modèle des nucléotides.

Cependant, cet effet s'attenue au fur et à mesure que la longueur des n-grammes augmente.

On pourra donc dire que le modèle des **nucléotides** reste utile pour la recherche des mots promoteurs, puisque leur longueur varie entre 6 et 10.

```python
project.plot_counts(chromos_list, probas)
```

## 3.4 Probabilité de mots

Q1) En faisant l'hypothèse d'indépendance des positions d'occurrences d'un mot **non chevauchant** $w$, on peut approcher le comptage du nombre d'occurrences dans une séquence de longueur $l$ avec la loi $Bin(P(w),\ l-k+1)$, où $P(w)$ sera calculée au moyen des modèles de nucléotides et de dinucléotides.

Q2) Etant donné que la longueur des séquences est au moins de l'ordre de 10 000, le deuxième paramètre de ladite loi binomiale est beaucoup plus grand que la probabilité $P(w)$.

De ce fait, on peut approcher cette loi avec la loi $Pois(P(w)\cdot (l-k+1))$.

Q3) Les figures ci-dessous montrent les distributions de probabilité empirique des mots ATCTGC, ATATAT, TTTAAA et AAAAAA obtenues en simulant 1000 séquences aléatoires avec le modèle des nucléotides.
Nous avons représenté également un nuage de points représentant le complémentaire de la répartition de la loi de Poisson avec $P(w)$ obtenu suivant les modèles de nucléotides et dinucléotides (par chaîne de Markov).

**N.B. On fera dans la suite une analyse par rapport à la courbe de la loi de Poisson utilisant le modèle des chaînes de Markov.**

On remarque que l'histogramme représentant la probabilité empirique du mot ATCTGC, qui ne se chevauche pas, est très proche de la loi de Poisson. Malgré le fait que le mot ATATAT n'est pas chevauchant avec lui même, L’histogramme de la probabilité empirique de ce mot est quelque peu eloigné de la loi de Poisson correspondante.

En revanche, étant chavauchant avec lui même, l’histogramme de la probabilité empirique du mot AAAAAA s’écarte beaucoup de la loi de Poisson.

De ces faits, l’hypothèse d'indépendance en les différentes positions d'occurrences d'un mot et l'utilisation de la loi binomiale pour le comptage ne sont pas pértinents pour les mots qui chevauchent avec eux-mêmes.

```python
project.plot_histogram(chromos_list, probas, 1000, expected=True)
```

Q5) Un mot qui  apparaît significativement plus qu'attendu est un mot dont la probabilité empirique de dépasser le comptage observé est faible. Pour cela, nous avons trié les mots par ordre croissant de cette probabilité. Puis, on a fixé un seuil de coupure $\epsilon$ tel que les mots les plus inattendus sont ceux dont la probabilité empirique est inférieure à ce seuil.
$$P(N_{w} \geq n_{w}) < \epsilon$$
On fixe $\epsilon$ à 0.02

### Modèle de nucléotides
Pour $k = 2$, les mots les plus inattendus sont :

'GC', 'TT'.

Pour $k = 4$, les mots les plus inattendus sont :

'AAAA', 'TTTT', 'CAGC'.

Pour $n = 6$, les mots les plus inattendus sont :

'AAAAAA', 'CACGTG', 'TCATCT', 'CAAGAA', 'GCAGCA', 'TGCCAA', 'TTTTTT', 'CGTGGG'.

#### Conclusion
Avec ce modèle, les séquences 'AAAAAA', 'TTTTTT', 'GCAGCA' se trouvent dans les sites de fixation.

### Modèle de dinucléotides

Pour $k = 2$, il n'y a pas de mot inattendu.

Pour $k = 4$, les mots les plus inattendus sont :

'ACGT', 'AAAA', 'CGTG'

Pour $n = 6$, les mots les plus inattendus sont :

'AAAAAA', 'TATATA', 'TCATCT', 'CACGTG', 'ACGTGG', 'CGTGGG', 'GAAGAA', 'CAAGAA', 'ACGTGC', 'TGCCAA'.

#### Conclusion
Avec ce modèle, les séquences 'AAAAAA', 'ACGTGG', 'ACGTGC', 'CACGTG' se trouvent dans les sites de fixation.
Mis à part la séquence 'AAAAAA' qui appartient forcément à un site de fixation, le modèle des dinucléotides ne permet pas de trouver les mots chevauchant avec eux-mêmes susceptibles de se trouver dans une région promoteur.

```python
_, chromos_PHO, counts_PHO, freqs_PHO = utils.read_file(files[1])
nt, dint = project.sort_unexpected_words(chromos_PHO, freqs_PHO, [2, 4, 6 ,8], 0.002)
```

```python
print("Nucléotides")
print("===========")
print("k = 2 :", nt[0])
print("k = 4 :", nt[1][:3])
print("k = 6 :", nt[2][:8])
```

    Nucléotides
    ===========
    k = 2 : [('GC', 7.69693389768289e-06), ('TT', 0.0002337053950783874)]
    k = 4 : [('AAAA', 2.5964341787698686e-11), ('TTTT', 1.0729857979896451e-07), ('CAGC', 6.06612669363793e-05)]
    k = 6 : [('AAAAAA', 0.0), ('CACGTG', 1.6920897301098137e-06), ('TCATCT', 2.195556734641002e-06), ('CAAGAA', 4.8302813431266856e-06), ('GCAGCA', 5.856189141728585e-06), ('TGCCAA', 6.05191253999493e-06), ('TTTTTT', 1.312040984391416e-05), ('CGTGGG', 1.8057310173680285e-05)]

```python
print("Dinucléotides")
print("=============")
print("k = 2 :", dint[0])
print("k = 4 :", dint[1][:3])
print("k = 6 :", dint[2][:10])
```

    Dinucléotides
    =============
    k = 2 : []
    k = 4 : [('ACGT', 1.378394142981243e-05), ('AAAA', 6.324769583387901e-05), ('CGTG', 7.843519915196051e-05)]
    k = 6 : [('AAAAAA', 2.220446049250313e-16), ('TATATA', 8.609168137274636e-07), ('TCATCT', 1.1803502472096383e-06), ('CACGTG', 1.4190981796335933e-06), ('ACGTGG', 5.357991372800797e-06), ('CGTGGG', 7.022354704400158e-06), ('GAAGAA', 2.4193239793968147e-05), ('CAAGAA', 4.516515199359805e-05), ('ACGTGC', 5.3097112990396766e-05), ('TGCCAA', 7.366812330045214e-05)]

```python
project.unexpected_words(chromos_PHO, freqs_PHO, 6, 0.002)
```

    Convergence after 3 iterations
    word: AAAAAA		Occurrences: 43		P(N >= 43) = 0.0000
    word: AAACGT		Occurrences: 7		P(N >= 7) = 0.0004
    word: AAGAAA		Occurrences: 11		P(N >= 11) = 0.0009
    word: AAGAAG		Occurrences: 8		P(N >= 8) = 0.0004
    word: ACCTTG		Occurrences: 4		P(N >= 4) = 0.0005
    word: ACGTAT		Occurrences: 5		P(N >= 5) = 0.0003
    word: ACGTGC		Occurrences: 5		P(N >= 5) = 0.0001
    word: ACGTGG		Occurrences: 5		P(N >= 5) = 0.0000
    word: ACTACT		Occurrences: 4		P(N >= 4) = 0.0011
    word: AGAAGA		Occurrences: 6		P(N >= 6) = 0.0019
    word: AGGGCA		Occurrences: 4		P(N >= 4) = 0.0020
    word: ATCTCT		Occurrences: 4		P(N >= 4) = 0.0015
    word: ATGCCA		Occurrences: 5		P(N >= 5) = 0.0009
    word: CAAGAA		Occurrences: 10		P(N >= 10) = 0.0000
    word: CACGTG		Occurrences: 6		P(N >= 6) = 0.0000
    word: CATCTC		Occurrences: 4		P(N >= 4) = 0.0009
    word: CCACGT		Occurrences: 3		P(N >= 3) = 0.0013
    word: CCCGTT		Occurrences: 3		P(N >= 3) = 0.0007
    word: CCGCAC		Occurrences: 3		P(N >= 3) = 0.0016
    word: CGTATA		Occurrences: 4		P(N >= 4) = 0.0017
    word: CGTGCG		Occurrences: 3		P(N >= 3) = 0.0011
    word: CGTGGG		Occurrences: 4		P(N >= 4) = 0.0000
    word: CTCATC		Occurrences: 5		P(N >= 5) = 0.0001
    word: CTCGTA		Occurrences: 4		P(N >= 4) = 0.0003
    word: CTCTAC		Occurrences: 3		P(N >= 3) = 0.0017
    word: CTGCAC		Occurrences: 4		P(N >= 4) = 0.0007
    word: GAAACG		Occurrences: 5		P(N >= 5) = 0.0011
    word: GAAGAA		Occurrences: 9		P(N >= 9) = 0.0000
    word: GAGATC		Occurrences: 4		P(N >= 4) = 0.0006
    word: GATAAG		Occurrences: 5		P(N >= 5) = 0.0015
    word: GCACGT		Occurrences: 5		P(N >= 5) = 0.0001
    word: GCAGCA		Occurrences: 6		P(N >= 6) = 0.0014
    word: GGAAGA		Occurrences: 5		P(N >= 5) = 0.0003
    word: GTATAT		Occurrences: 5		P(N >= 5) = 0.0006
    word: GTGCAG		Occurrences: 4		P(N >= 4) = 0.0012
    word: TATACG		Occurrences: 4		P(N >= 4) = 0.0014
    word: TATATA		Occurrences: 10		P(N >= 10) = 0.0000
    word: TCATCT		Occurrences: 8		P(N >= 8) = 0.0000
    word: TCCTCT		Occurrences: 3		P(N >= 3) = 0.0012
    word: TCTTTG		Occurrences: 5		P(N >= 5) = 0.0011
    word: TGAGCT		Occurrences: 4		P(N >= 4) = 0.0017
    word: TGATGT		Occurrences: 4		P(N >= 4) = 0.0011
    word: TGCCAA		Occurrences: 7		P(N >= 7) = 0.0001
    word: TGGCAC		Occurrences: 4		P(N >= 4) = 0.0007
    word: TGTGGC		Occurrences: 3		P(N >= 3) = 0.0017
    word: TTATCA		Occurrences: 7		P(N >= 7) = 0.0008
    word: TTGGCA		Occurrences: 5		P(N >= 5) = 0.0020
    word: TTTATC		Occurrences: 6		P(N >= 6) = 0.0017
    word: TTTCCT		Occurrences: 5		P(N >= 5) = 0.0006
    word: TTTTCG		Occurrences: 6		P(N >= 6) = 0.0013

```python

```


# Transformação de Fontes

Jupyter Notebook desenvolvido por [Gustavo S.S.](https://github.com/GSimas)

**Transformação de fontes é o processo de substituir uma fonte de tensão
vs em série com um resistor R por uma fonte de corrente is em paralelo com
um resistor R, ou vice-versa.**

Assim como na transformação estrela-triângulo, uma
transformação de fontes não afeta a parte remanescente do circuito.

Portanto, a transformação de fontes requer que

\begin{align}
{\Large v_s = i_sR}
\\
\\{\Large i_s = \frac{v_s}{R}}
\end{align}

A transformação de fontes também se aplica a fontes dependentes, desde
que tratemos adequadamente a variável dependente.

**Exemplo 4.6**

Use transformação de fontes para determinar vo no circuito da Figura 4.17.

```python
print("Exemplo 4.6")
#trasforma fonte 1 (corrente -> tensao)
#vs1 = is*R = 12V

#Req em serie entre 4 e 2
#Req1 = 4 + 2 = 6

#transforma fonte 2 (tensao -> corrente)
#is2 = 12/3 = 4A

#transforma fonte 1 (tensao -> corrente)
#is1 = 12/6 = 2A

#Req paralelo entre 6 e 3
#Req2 = 6*3/(6 + 3) = 2

#fonte resultante
#ir = is2 - is1 = 4 - 2 = 2A

#transforma fonte 2 (corrente -> tensao)
#vs2 = Req2*ir = 2 * 2 = 4V

#divisor tensao
#v0 = vs2*8/(8 + Req2)
v0 = 4*8/(8 + 2)

print("Tensao v0",v0,"V")
```

    Exemplo 4.6
    Tensao v0 3.2 V

**Problema Prático 4.6**

Determine io no circuito da Figura 4.19 usando transformação de fontes.

```python
print("Problema Prático 4.6")
#Req serie 4 e 1 = 5
#Req paralelo 6 e 3 = 2

#transforma fonte 1 (corrente -> tensao)
#vs1 = R*is1 = 5*2 = 10V

#soma fonte 1 e 2 = 5 + 10 = 15V

#transforma fonte soma (tensao -> corrente)
#is = 15/2 = 7,5A

#Req paralelo 5 e 2 = 10/7

#soma fonte corrente = 7,5 + 3 = 10,5 A

#divisor corrente
i0 = 10.5*(10/7)/((10/7) + 7)

print("Corrente i0:",i0,"A")
```

    Problema Prático 4.6
    Corrente i0: 1.7796610169491525 A

**Exemplo 4.7**

Determine vx na Figura 4.20 usando transformação de fontes.

```python
print("Exemplo 4.7")

#transforma fonte 1 (tensao -> corrente)
#is1 = 6/2 = 3 A

#transforma fonte dep. (corrente -> tensao)
#vs_dep = 0.25Vx * 4 = Vx

#soma fonte dep. e fonte 2 = 18 + Vx

#Req paralelo 2 e 2 = 1

#transforma fontes soma (tensao -> corrente)
#is_soma = 18/4 + Vx/4

#soma fontes = 18/4 + Vx/4 + 3 = 30/4 + Vx/4 = (30 + Vx)/4

#transforma fontes soma (corrente -> tensao)
#fonte resultante = ((30 + Vx)/4)*4 = 30 + Vx

#LKT
#(30 + Vx) - 4*ix - Vx = 0
#ix = (30 + Vx)/5 = 6 + Vx/5
#30 - 24 - 4Vx/5 = 0
vx = 6*5/4
print("Tensão Vx",vx,"V")
```

    Exemplo 4.7
    Tensão Vx 7.5 V

**Problema Prático 4.7**

Use transformação de fontes para determinar ix no circuito exposto na Figura 4.22.

```python
print("Problema Prático 4.7")

#transforma fonte dep. (tensao -> corrente)
#is_dep = 2ix/5

#soma fontes = 0.024 - 2ix

#divisor corrente
#ix = (24m - 2ix)*5/(5 + 10)
    #ix = (0.12 - 10ix)/15
    #ix + 2ix/3 = 0.008
    #5ix/3 = 0.008
ix = 0.008*3/5
print("Corrente ix:",ix,"A")
```

    Problema Prático 4.7
    0.008

# Teorema de Thèvenin

**O teorema de Thévenin afirma que um circuito linear de dois terminais
pode ser substituído por um circuito equivalente formado por uma fonte
de tensão VTh em série com um resistor RTh, onde VTh é a tensão de circuito
aberto nos terminais e RTh, a resistência de entrada ou equivalente nos
terminais quando as fontes independentes forem desativadas.**

O teorema de Thévenin é muito importante na análise de circuitos, porque
ajuda a simplificar um circuito, e um circuito grande pode ser substituído por
uma única fonte de tensão independente e um único resistor.

Para tanto, suponha
que os dois circuitos da Figura 4.23 sejam equivalentes – dois circuitos são
ditos equivalentes se tiverem a mesma relação tensão-corrente em seus terminais. Se
os terminais a-b forem tornados um circuito aberto (eliminando-se a carga),
nenhuma corrente fluirá e, portanto, a tensão nos terminais a-b da Figura 4.23a
terá de ser igual à fonte de tensão VTh da Figura 4.23b, já que os dois circuitos
são equivalentes. Logo:

\begin{align}
{\Large V_{Th} = v_{oc}}
\end{align}

A resistência de entrada (ou
resistência equivalente) do circuito inativo nos terminais a-b da Figura 4.23a
deve ser igual a RTh da Figura 4.23b, pois os dois circuitos são equivalentes.
Portanto, RTh é a resistência de entrada nos terminais quando as fontes
independentes forem desligadas. Logo:

\begin{align}
{\Large R_{Th} = R_{oc}}
\end{align}

- **Caso 1:** Se a rede não tiver fontes dependentes, **desligamos todas as fontes independentes**. RTh é a resistência de entrada da rede, olhando-se entre os terminais a e b.
- **Caso 2:** Se a rede tiver fontes dependentes, **desligamos todas as fontes independentes**. As fontes dependentes não devem ser desligadas, pois elas são controladas por variáveis de circuito. Aplicamos uma tensão vo aos terminais a e b, e determinamos a corrente resultante io. Então, RTh = vo/io. De forma alternativa, poderíamos inserir uma fonte de corrente io nos terminais a e b, como na Figura 4.25b, e encontrar a tensão entre os terminais vo. Chegamos novamente a RTh = vo/io. Qualquer um dos dois métodos leva ao mesmo resultado. Em ambos os métodos, podemos supor qualquer valor de vo e io. Poderíamos usar, por exemplo, vo = 1 V ou io = 1 A, ou até mesmo valores não especificados de vo ou io.

Muitas vezes, pode ocorrer de RTh assumir um valor negativo; nesse caso,
a resistência negativa (v = –iR) implica o fato de o circuito estar **fornecendo
energia.**

**Exemplo 4.8**

Determine o circuito equivalente de Thévenin do circuito mostrado na Figura 4.27,
à esquerda dos terminais a-b. Em seguida, determine a corrente através de RL = 6 Ω,
16 Ω e 36 Ω.

```python
print("Exemplo 4.8")

#Req1 = 4*12/(4 + 12) = 48/16 = 3
#Rth = 3 + 1 = 4

#transforma fonte 1 (tensao -> corrente)
#is1 = 32/4 = 8 A

#soma fontes = 8 + 2 = 10 A

#ix = 10*4/(4 + 12) = 40/16 = 5/2
#Vab = 12*(5/2) = 30 = Vth

Vth = 30
Rth = 4

Rl = 6
Il = Vth/(Rl + Rth)
print("Para RL = 6, Corrente:",Il,"A")

Rl = 16
Il = Vth/(Rl + Rth)
print("Para RL = 6, Corrente:",Il,"A")

Rl = 36
Il = Vth/(Rl + Rth)
print("Para RL = 6, Corrente:",Il,"A")
```

    Exemplo 4.8
    Para RL = 6, Corrente: 3.0 A
    Para RL = 6, Corrente: 1.5 A
    Para RL = 6, Corrente: 0.75 A

**Problema Prático 4.8**

Usando o teorema de Thévenin, determine o circuito equivalente à esquerda dos terminais do circuito da Figura 4.30. Em seguida, determine I.

```python
print("Problema Prático 4.8")

#Req1 = 6 + 6 = 12
#Rth = Req1*4/(Req1 + 4) = 48/16 = 3
Rth = 3

#Superposicao Vsource
#Vab1 = Vs*4/(4 + 6 + 6) = 12*4/16 = 3V

#Superposicao Csource
#Iab = Is*6/(4 + 6 + 6) = 2*6/16 = 3/4
#Vab2 = Iab*4 = 3V

#Vth = Vab1 + Vab2
Vth = 6

I = Vth/(Rth + 1)
print("Tensao Vth:",Vth,"V")
print("Resistencia Rth:",Rth)
print("Corrente I:",I,"A")
```

    Problema Prático 4.8
    Tensao Vth: 6 V
    Resistencia Rth: 3
    Corrente I: 1.5 A

**Exemplo 4.9**

Determine o equivalente de Thévenin do circuito da Figura 4.31.

```python
print("Exemplo 4.9")

import numpy as np

#Descobrir Rth - desliga fontes indep., nao se alteram fontes dep.
#Aplicar tensao vo arbitraria entre terminais a b
#vo = 1 V
#Analise de malhas

#-2Vx + 2(i1 - i2) = 0
    #Vx = i1 - i2
    #Vx = -4i2
    #i1 + 3i2 = 0
#-Vx + 2(i2 - i1) + 6(i2 - i3) = 0
    #2i2 - 2i1 + 6i2 - 6i3 = Vx
    #-3i1 + 9i2 - 6i3 = 0
    #-i1 + 3i2 - 2i3 = 0
#Vo + 6(i3 - i2) + 2i3 = 0
    #6i3 - 6i2 + 2i3 = -1
    #-6i2 + 8i3 = -1

coef = np.matrix("1 3 0;-1 3 -2;0 -6 8")
res = np.matrix("0;0;-1")
I = np.linalg.inv(coef)*res

#i3 = -i0
io = -I[2]
#Rth = Vo/io
Rth = 1/io
print("Resistencia Rth:",float(Rth))

#Descobrir Vth
#Analise de tensao em terminais a b
#Analise de Malhas

#i1 = 5 A
#-2Vx + 2(i2 - i3) = 0
    #Vx = i2 - i3
    #Vx = 4(5 - i3) = 20 - 4i3
    #i2 + 3i3 = 20
#4(i3 - 5) + 2(i3 - i2) + 6i3 = 0
    #4i3 +2i3 - 2i2 + 6i3 = 20
    #-2i2 + 12i3 = 20
    #-i2 + 6i3 = 10

coef = np.matrix("1 3;-1 6")
res = np.matrix("20;10")
I = np.linalg.inv(coef)*res
Vth = 6*I[1]

print("Tensão Vth:",float(Vth),"V")
```

    Exemplo 4.9
    Resistencia Rth: 6.0
    Tensão Vth: 20.0 V

**Problema Prático 4.9**

Determine o equivalente de Thévenin do circuito da Figura 4.34 à esquerda dos terminais.

```python
print("Problema Prático 4.9")

#Descobrir Rth
#Vo = 1V
#Analise Nodal

#i1 - Ix/2 = 0
    #v1/5 - Ix/2 = 0
    #Ix = (v1 - 1)/3
    #v1/5 - (v1 - 1)/6 = 0
    #v1/5 - v1/6 = -1/6
    #v1/30 = -1/6
    #v1 = -5
#Ix = (v1 - 1)/3 = -6/3 = -2 A
#i2 = 1/4 A
#io = -Ix + i2 = 9/4 A

#Rth = 1/(9/4) = 4/9
Rth = 4/9
print("Resistencia Rth:",Rth)

#Descobrir Vth
#Analise de Malhas
#-6 + 5i1 + 3Ix + 4Ix = 0
    #5i1 + 7Ix = 6
#3Ix/2 + i1 = Ix
    #Ix/2 + i1 = 0
    #2i1 + Ix = 0

coef = np.matrix("5 7;2 1")
res = np.matrix("6;0")
I = np.linalg.inv(coef)*res
Ix = float(I[1])
Vth = 4*Ix
print("Tensão Vth:",Vth,"V")
```

    Problema Prático 4.9
    Resistencia Rth: 0.4444444444444444
    Tensão Vth: 5.333333333333333 V

**Exemplo 4.10**

Determine o equivalente de Thévenin do circuito da Figura 4.35a nos terminais a-b.

```python
print("Exemplo 4.10")
#vab = -vo = -1 V
#i1 = 1/4 A
#ix = 1/2 A
#i0 = 2ix - ix - i1 = 1 - 1/2 - 1/4 = 1/4 A
#Rth = -1/(1/4) = -4
Rth = -4
print("Resistencia Rth:", Rth)
print("Tensao Vth:",0,"V")
```

    Exemplo 4.10
    Resistencia Rth: -4
    Tensao Vth: 0 V

**Problema Prático 4.10**

Obtenha o equivalente de Thévenin do circuito da Figura 4.36.

```python
print("Problema Prático 4.10")
#iab = 1 A
#-vx + 10i1 + 4vx + 15(i1 - iab) = 0
    #3vx + 25i1 - 15iab = 0
    #vx = -5i1
    #-15i1 + 25i1 = 15
    #10i1 = 15
    #i1 = 1,5 A = 3/2 A
#vx = -5i1 = -7,5 V = -15/2 V
#vdep = 4*vx = -30V

#vab = vo = 15(i1 - iab) = 15/2 = 7,5V
#Rth = vo/(-iab) = -7,5
Rth = -7.5
print("Tensao Vth:",0,"V")
print("Resistencia Rth",Rth)
```

    Problema Prático 4.10
    Tensao Vth: 0 V
    Resistencia Rth -7.5