
Circuito RC com entrada senoidalProblemaResolvendo usando LaplaceExpansão em Frações ParciaisTransformada Inversa de LaplaceCalculando Resíduos Usando OctaveUsando pacote symbolic + ilaplace()Outra forma elegante usando symbolicResumo dos CálculosSimulando uma senoideAnálise frequêncial
Suponha o mesmo circuito analisando antes:

Mas agora vamor injetar uma onda senoidal na entrada deste circuito, o que acontece?
Resolvemos o mesmo problema, mas utilizando Laplace.
Antes em Resolvendo usando Laplace deduzimos que:
e agora:
A transformada de uma senóide é:
assim:
e então, podemos deduzir
Logo:
Expandindo a equação anterior em frações parciais:
Temos que agora determinar
Multiplicamos (1) por:
Resultando:
Agora expandimos:
Agrupando tudo temos:
Agrupando potências:
Comparando coeficientes com (1):
No lado esquerdo:
Não existem termos em:
Temos então o sistema de equações:
Agora resolvemos o sistema.
Resultado final:
Expressão antes da expansão:
A decomposição resultou na expressão analítica de
De uma Tabela de Transformadas de Laplace, sabemos que:
Substituindo:
O resultado da transformada inversa será:
Podemos converter a segunda parte para o formato amplitude/fase e obter:
Note, exatamente a mesma solução encontrada resolvendo usando equação diferencial, conferir [aqui] se desejado.
A função residue() realiza o cálculo associado com a expansão em frações parciais.
Por exemplo:
xxxxxxxxxxclear;clc;
R = 1e3;C = 1e-6;
Vm = 5;f = 100;
w = 2*pi*f;
num = Vm*w;
den = conv([R*C 1], [1 0 w^2]);
[r,p,k] = residue(num, den)
disp("Residuos:");disp(r);
disp("Polos:");disp(p);O Octave devolveria algo parecido com:
xxxxxxxxxxr = 0.3814 -0.1907 - 2.9510i -0.1907 + 2.9510i
p = -1000 0 + 628.3i 0 - 628.3iOs polos (raízes do denominador) serão:
O Octave está fazendo exatamente a decomposição:
usando polos complexos.
symbolic + ilaplace()Para isso é necessário:
xxxxxxxxxxpkg load symbolicInternamente ele usa o SymPy (biblioteca do Python).
Por exemplo:
xxxxxxxxxxpkg load symbolic
syms s t
R = 1000;C = 1e-6;
Vm = 5;w = 2*pi*100;
Vout_s = (Vm*w)/((R*C*s+1)*(s^2+w^2));
pretty(Vout_s)
vout_t = ilaplace(Vout_s)
pretty(simplify(vout_t))O resultado será algo próximo de:
xxxxxxxxxx5*sin(628*t)/(1+0.3948)-1.97*cos(628*t)+1.97*exp(-1000*t)ou alguma forma algébrica equivalente.
symbolicTambém é possível pedir explicitamente as frações parciais:
xxxxxxxxxxpkg load symbolic
syms s
F = (Vm*w)/((R*C*s+1)*(s^2+w^2));
partfrac(F)ou:
xxxxxxxxxxapart(F)O resultado será algo como:
Manualmente:
Octave numérico:
residue(): obtém os resíduos.
Octave simbólico:
xxxxxxxxxxapart()ilaplace()faz praticamente toda a álgebra automaticamente.
Ou seja, estamos usando o Octave (ou computador) para reproduzir a seguinte sequência de passos:
Alguns usuários consideram que o ilaplace() é uma “caixa preta”. Na verdade, ele está executando internamente exatamente as manipulações algébricas que acabamos de fazer à mão.
Agora podemos executar [circuito_RC_Laplace_seno1.m]:
xxxxxxxxxxclear;close all;
R = 1e3;C = 1e-6;
Vm = 5;f = 100;w = 2*pi*f;T = 1/f;t_fim = 2.5*T;t = 0:1e-5:t_fim;
Vin = Vm*sin(w*t);
% Solucao completa, considerando Vout(0) = 0A = Vm*R*C*w/(1+(R*C*w)^2);
V_trans = A*exp(-t/(R*C));
Vout = V_trans ... + Vm/sqrt(1+(R*C*w)^2) ... .* sin(w*t - atan(R*C*w));
plot(t, Vin, 'LineWidth', 1.5);hold on;plot(t, Vout, 'LineWidth', 1.5);plot(t, V_trans, 'r:', 'LineWidth', 1,2);
grid on;xlabel('Tempo (s)');ylabel('Tensão (V)');legend('V_{in}', 'V_{out}', 'location', 'southeast');title('Circuito RC - Senoidal, f = 100 Hz');Aqui aparece algo didaticamente muito importante:

No início existe um transitório (destacado na cor magenta pontilhado,
Depois de aproximadamente (
e sobra somente a expressão:
Você pode ainda:
Verificar atenuação e defasagem em outras frequências, e;
Ver uma animação mostrando como o sinal de saída

Podemos observar o que ocorre se a frequência de senoide de entrada variar.
Arquivo [resposta_mag_freq.m]:
xxxxxxxxxx% resposta_mag_freq.m% Traça gráfico da resposta de magnitude (ganho) vs frequencia% Fernando Passold, em 16/08/2026
clear;close all;
R = 1e3;C = 1e-6;
fc = 1/(2*pi*R*C);
Vm = 5;
f = logspace(0, 5, 500);
w = 2*pi*f;wc = 2*pi*fc;
H = 1 ./ (1 + 1i*w*R*C);Hc = 1 ./ (1 + 1i*wc*R*C); % H(f) na freq de corte
magnitude = abs(H);mag_c = abs(Hc);fase = angle(H)*180/pi;
figure;semilogx(f, 20*log10(magnitude), 'LineWidth', 1.5);hold on;plot(fc, 20*log10(mag_c), "om", 'LineWidth', 1.5); % exibe um marcador em fcstr = num2str(fc);str = ['f_c = ' str ' (Hz)'];text(fc*1.2, 20*log10(mag_c)*0.8, str);grid on;
xlabel('Frequência (Hz)');ylabel('|H(f)| (dB)');title('Magnitude da resposta em frequência do circuito RC');O código anterior gera o gráfico:
Onde aparece destacada a frequência de corte:
Neste caso:
O gráfico anterior é quase um Diagrama de Bode. Este ultimo tipo de diagrama mostra 2 gráficos separados: um mostrando como varia a magnitude (ganho) de saída do sistema e o outro mostra a defasagem introduzida no sinal de entrada. O Octave facilita a plotagem deste gráfico através do comando bode(H), mas neste caso o argumento de entrada H deve ser uma variável do tipo transfer function, que neste caso é igual à:
Esta expressão já foi deduzida em [Resolvendo usando Laplace] (busca da função transferência).
Podemos explorar esta gráfico de análise frequencial executando [mostra_bode.m]:
xxxxxxxxxx% mostra_bode.m% Fernando Passold, em 16/08/2026
clear;close all;
R = 1e3;C = 1e-6;
disp("Constante de tempo do circuito:")tau = R*Cdisp("Frequência de corte do circuito:")fc = 1/(2*pi*tau)
disp("Função transferência do circuito:")% H(s) = 1/(R*C*s + 1);num = 1; % numerador de H(s)den = [R*C 1]; % denominador de H(s)H = tf(num, den) % cria a função transferência no plano-sdisp('ou:')zpk(H)
disp("Segue gráfico do Diagrama de Bode")figure;bode(H)
%%%% Octave não permite especifica frequência em Hz na função bode()
% Obtém a resposta em frequência em rad/s[mag, phase, w] = bode(H);% O comando [mag, phase, w] = bode(sys) retorna as variáveis% mag (magnitude) e phase (fase) como arrays de 3 dimensões (3D).% - Dimensão 1: Número de saídas (1)% - Dimensão 2: Número de entradas (1)% - Dimensão 3: Quantidade de pontos de frequência gerados (ex: 500)
% Converte rad/s para Hz e a magnitude para dBf = w / (2 * pi);mag_db = 20 * log10(squeeze(mag));phase_deg = squeeze(phase);% A função `squeeze` reduz a dimensão de matrizes.% Se você tentar plotar o vetor diretamente usando% semilogx(f, mag), o Octave gerará um erro.% Ele não aceita uma matriz de tamanho [1, 1, 500]% para gerar um gráfico 2D comum.
figure; % Nova janela gráfica% Plota o diagrama de Magnitude em Hzsubplot(2, 1, 1);semilogx(f, mag_db, 'LineWidth', 1.5);grid on;title('Diagrama de Bode em Hz');ylabel('Magnitude (dB)');
% Plota o diagrama de Fase em Hzsubplot(2, 1, 2);semilogx(f, phase_deg, 'LineWidth', 1.5);grid on;xlabel('Frequência (Hz)');ylabel('Fase (graus)');
% Destacando nos gráficos os pontos na freq de corte% Note: s --> j*w, w = 2*pi*fwc = 2*pi*fc; % Freq de corte em rad/ss = 1i*wc; % define s como número completo jw% H(s) = 1/(R*C*s + 1);disp("Ganho absoluto na freq. de corte:");H_fc = 1/(tau*s + 1); % resulta um número complexoG = abs( H_fc )disp("Ganho em dB na freq. de corte:")G_dB = 20*log10(G)disp("Defasagem na freq. de corte:")ph = angle( H_fc )*180/pi % retorna valor em graussubplot(2, 1, 1);hold on % sobrepor no gráfico anteriorplot(fc, G_dB, 'om');subplot(2, 1, 2);hold onplot(fc, ph, 'om')
Este script gera as seguntes informações na janela de comandos:
xxxxxxxxxxoctave:37> mostra_bodeConstante de tempo do circuito:tau = 1.0000e-03Frequência de corte do circuito:fc = 159.15Função transferência do circuito:Transfer function 'H' from input 'u1' to output ...1y1: -----------0.001 s + 1Continuous-time model.ou:Transfer function 'ans' from input 'u1' to output ...1y1: -----------0.001 s + 1Continuous-time model.Segue gráfico do Diagrama de BodeGanho absoluto na freq. de corte:G = 0.7071Ganho em dB na freq. de corte:G_dB = -3.0103Defasagem na freq. de corte:ph = -45.000octave:38>
e gera os seguintes gráficos:

e:

Fernando Passold, em 16/08/2026