Simulação do modelo T de um transformador no MATLAB (programação OO)
- Publicado em MATLAB
Por meio do MATLAB (linguagem e interface de desenvolvimento), que suporta a programação orientada a objetos há muitos anos, podemos desenvolver qualquer tipo de simulação computacional ou software matemático. Neste exemplo, efetuamos uma simulação simples do modelo T de um transformador por meio do método trapezoidal implícito de integração apenas para demonstrar a capacidade de programação orientada a objetos no MATLAB e exibimos alguns gráficos para demonstrar os resultados (código desenvolvido na versão 2013b).
Para a simulação desejada, desenvolvemos uma classe denominada "SimulacaoTransformador_T" com alguns parâmetros elétricos com seus valores padrão já definidos (60Hz, tensão de entrada RMS de 110V, entre outros) e os parâmetros referentes à simulação em si. Ambos os parâmetros são as propriedades da classe e em algumas linguagens de programação OO são denominados como atributos.
Conforme o código-fonte abaixo, na seção methods (métodos), temos a modelagem do comportamento do objeto a ser instanciado por meio da classe. Neste exemplo, definimos um construtor padrão e os métodos definidos visam a simulação de um curto-circuito e circuito aberto, com a respectiva geração dos gráficos. Não se preocupe com o código-fonte referente aos algoritmos de computação numérica: o mesmo foi desenvolvido dessa maneira para atender o escopo de um trabalho acadêmico: de fato, há diversas outras possibilidades melhores de solução para esse problema, inclusive a utilização direta do Simulink.
Na figura a seguir, exibimos a tensão primária, corrente primária, assim como a tensão secundária no caso de um circuito aberto, na qual percebemos que a corrente transitória de inrush é exponencialmente amortecida (modelo T simplificado):
No caso de curto-circuito, percebemos que a corrente primária é obviamente bem maior do que em relação ao caso do circuito secundário em aberto, assim como a corrente secundária, que possui um deslocamento de fase de 180° em relação à primária:
A seguir, apresentamos o código-fonte orientado a objetos completo:
classdef SimulacaoTransformador_T < handle % Simulação de um transformador pelo modelo equivalente T % Detailed explanation goes here properties %% Parâmetros Elétricos V0=110; % tensao eficaz frequencia_nominal=60; % frequencia nominal R1_primario=6; % resistencia primario R2_secundario_referida=5;% resistencia secundario referida L_magnetizante=0.2639; % indutancia magnetizante L1_dispersao=0.0135; % dispersao primario L2_dispersao=0.0135; % dispersao secundario referida %% Parâmetros Simulação (inicializados no construtor) V_entrada; V_saida; I_entrada; I_saida; tempo; funcao_entrada; t_inicial_s=0; % tempo inicial t_final_s=0.15; % tempo final num_pontos=1000; % numero de pontos end methods %% Construtor Padrão function obj = SimulacaoTransformador_T() %% construtor padrão obj.V_entrada=zeros(obj.num_pontos,1); % inicializacao das variaveis obj.V_saida=zeros(obj.num_pontos,1); obj.I_entrada=zeros(obj.num_pontos,1); obj.I_saida=zeros(obj.num_pontos,1); obj.tempo=zeros(obj.num_pontos,1); obj.funcao_entrada = @(t) sqrt(2)*obj.V0*sin(2*pi*obj.frequencia_nominal*t); % tensao inicial end %% Simulação de circuito aberto function simularCircuitoAberto(obj) I_entrada_derivada=zeros(obj.num_pontos,1); % Configuração da integração obj.tempo(1)=obj.t_inicial_s; % tempo inicial obj.I_entrada(1)=0; % corrente inicial obj.V_entrada(1)=sqrt(2)*obj.V0*sin(2*pi*obj.frequencia_nominal*obj.tempo(1)); % tensao inicial I_entrada_derivada(1)=(obj.V_entrada(1)-obj.R1_primario*obj.I_entrada(1))/(obj.L1_dispersao+obj.L_magnetizante); % derivada corrente instante inicial passo=(obj.t_final_s-obj.t_inicial_s)/obj.num_pontos; for n=1:obj.num_pontos tolerancia=10; % tolerancia para convergencia do processo obj.V_saida(n)=obj.L_magnetizante*I_entrada_derivada(n); % tensao secundaria instantanea obj.tempo(n+1)=obj.t_inicial_s+n*passo; % tempo atual n+1 obj.V_entrada(n+1)=sqrt(2)*obj.V0*sin(2*pi*obj.frequencia_nominal*obj.tempo(n+1)); % tensao fonte instante n+1 corrente_estimada_n1=obj.I_entrada(n)+passo*I_entrada_derivada(n); % estimativa da corrente (Euler) while tolerancia > 1e-6 i1Ln1=(obj.V_entrada(n+1)-obj.R1_primario*corrente_estimada_n1)/(obj.L1_dispersao+obj.L_magnetizante); % modelo instante n+1 corrente_entrada_n1=obj.I_entrada(n)+passo*(I_entrada_derivada(n)+i1Ln1)/2; % metodo trapezoidal tolerancia=abs(corrente_entrada_n1-corrente_estimada_n1); % calcula precisao/tolerancia corrente_estimada_n1=corrente_entrada_n1; end obj.I_entrada(n+1)=corrente_entrada_n1; % corrente no instante n+1 I_entrada_derivada(n+1)=(obj.V_entrada(n+1)-obj.R1_primario*obj.I_entrada(n+1))/(obj.L1_dispersao+obj.L_magnetizante); % modelo instante n+1 obj.V_saida(n+1)=obj.L_magnetizante*I_entrada_derivada(n+1); % tensao secundaria instante n+1 end end %% Simulação de circuito fechado function simularCurtoCircuito(obj) I1_entrada_derivada=zeros(obj.num_pontos,1); I2_saida_derivada=zeros(obj.num_pontos,1); % Configuração da integração obj.tempo(1)=obj.t_inicial_s; % tempo inicial obj.I_entrada(1)=0; % corrente inicial obj.I_saida(1)=0; % corrente inicial % cálculo da tensão de entrada senoidal - função anonymous obj.V_entrada(1) = obj.funcao_entrada(obj.tempo(1)); % a = 1/(L1+Lm) para facilitar os cálculos a = 1/(obj.L1_dispersao + obj.L_magnetizante); % variável de auxílio % Derivadas em n = 1 I1_entrada_derivada(1)=(1-obj.L_magnetizante^2*a^2)^(-1)*(a*(obj.V_entrada(1)-obj.R1_primario*obj.I_entrada(1)) + ... obj.R2_secundario_referida*obj.I_saida(1)*obj.L_magnetizante*a^2); % derivada corrente instante inicial I2_saida_derivada(1)=(1-obj.L_magnetizante^2*a^2)^(-1)*(-obj.L_magnetizante*a^2*(obj.V_entrada(1)-obj.R1_primario*obj.I_entrada(1)) + ... -obj.R2_secundario_referida*obj.I_saida(1)*a); % derivada corrente instante inicial % Cálculo do passo h passo_h=(obj.t_final_s-obj.t_inicial_s)/obj.num_pontos; %% Loop for n=1:obj.num_pontos-1 tolerancia=10; % tolerancia para convergencia do processo % t(n) = to + nh - item a) obj.tempo(n+1)=obj.t_inicial_s+n*passo_h; % tempo atual n+1 % cálculo da tensão de entrada senoidal - função anonymous obj.V_entrada(n+1) = obj.funcao_entrada(obj.tempo(n+1)); % i1_estimada(n+1) = i1(n) + h.i1_derivada(n) corrente_estimada_entrada=obj.I_entrada(n)+passo_h*I1_entrada_derivada(n); % estimativa da corrente (Euler) = OK % i2_estimada(n+1) = i2(n) + h.i2_derivada(n) corrente_estimada_saida=obj.I_saida(n)+passo_h*I2_saida_derivada(n); % estimativa da corrente (Euler) = OK while tolerancia > 1e-10 %% Cálculo das derivadas em n+1 - item d % di1/dt = (1-Lm².a²)^(-1)(a(v1-R1.i1) + R2.i2.Lm.a²) derivada_corrente_entrada_n_1=(1-obj.L_magnetizante^2*a^2)^(-1)*(a*(obj.V_entrada(n+1)-obj.R1_primario*corrente_estimada_entrada) + ... obj.R2_secundario_referida*corrente_estimada_saida*obj.L_magnetizante*a^2); % derivada corrente entrada % di2/dt = (1-Lm².a²)^(-1)(-Lm.a².(v1-R1.i1) - R2.i2.a) derivada_corrente_saida_n_1=(1-obj.L_magnetizante^2*a^2)^(-1)*(-obj.L_magnetizante*a^2*(obj.V_entrada(n+1)-obj.R1_primario*corrente_estimada_entrada) + ... -obj.R2_secundario_referida*corrente_estimada_saida*a); % derivada corrente saída %% Método Trapezoidal - item e corrente_entrada_n_1=obj.I_entrada(n)+passo_h*(derivada_corrente_entrada_n_1+I1_entrada_derivada(n))/2; % metodo trapezoidal corrente_saida_n_1=obj.I_saida(n)+passo_h*(derivada_corrente_saida_n_1+I2_saida_derivada(n))/2; % metodo trapezoidal %% Teste de Convergência |i1(n+1)-i1_estimado(n+1)| < eps tolerancia=abs(corrente_entrada_n_1-corrente_estimada_entrada); % calcula precisao/tolerancia corrente_estimada_entrada=corrente_entrada_n_1; end obj.I_entrada(n+1)=corrente_entrada_n_1; % corrente entrada no instante n+1 obj.I_saida(n+1)=corrente_saida_n_1; % corrente saída no instante n+1 I1_entrada_derivada(n+1)=(1-obj.L_magnetizante^2*a^2)^(-1)*(a*(obj.V_entrada(n+1)-obj.R1_primario*obj.I_entrada(n+1)) + ... obj.R2_secundario_referida*obj.I_saida(n+1)*obj.L_magnetizante*a^2); % derivada corrente entrada I2_saida_derivada(n+1)=(1-obj.L_magnetizante^2*a^2)^(-1)*(-obj.L_magnetizante*a^2*(obj.V_entrada(n+1)-obj.R1_primario*obj.I_entrada(n+1)) + ... -obj.R2_secundario_referida*obj.I_saida(n+1)*a); % derivada corrente saída end end %% Gráficos - Circuito Aberto function gerarGraficosCircuitoAberto(obj) set(gcf,'Color','white'); axes; subplot(3,1,1); % abre e divide tela grafica plot(obj.tempo,obj.V_entrada,'LineWidth',2); % desenha grafico tensao entrada title('Análise de Circuito Aberto - Circ. Equivalente T', 'FontSize',14); grid on; xlabel('tempo (s)'); ylabel('Tensao primária (V)'); % Gráfico - Corrente Primária subplot(3,1,2); % divide tela grafica plot(obj.tempo,obj.I_entrada,'LineWidth',2,'Color','green'); % desenha grafico corrente entrada grid on; xlabel('tempo (s)'); ylabel('Corrente primária (A)'); % Gráfico - Tensão Secundária subplot(3,1,3) % divide tela grafica plot(obj.tempo,obj.V_saida,'LineWidth',2,'Color','red') % desenha grafico tensao saída grid on; xlabel('tempo (s)'); ylabel('Tensao secundária (V)'); end %% Gráficos - Curto Circuito Primária function gerarGraficosCurtoCircuito(obj) set(gcf,'Color','white'); axes; subplot(3,1,1); % abre e divide tela grafica plot(obj.tempo,obj.V_entrada,'LineWidth',2); % desenha grafico tensao entrada set(gca,'YTick',[-200 -150 -100 -50 0 50 100 150 200]); axis([obj.t_inicial_s obj.t_final_s -200 200]); title('Análise de Curto-Circuito - Circ. Equivalente T', 'FontSize',14); grid on; xlabel('tempo (s)'); ylabel('Tensao primária (V)'); % Gráfico - Corrente Primária subplot(3,1,2); % divide tela grafica plot(obj.tempo,obj.I_entrada,'LineWidth',2,'Color','green'); % desenha grafico corrente entrada set(gca,'YTick',[-15 -10 -5 0 5 10 15]); axis([obj.t_inicial_s obj.t_final_s -15 15]); grid on; xlabel('tempo (s)'); ylabel('Corrente primária (A)'); % Gráfico - Tensão Secundária subplot(3,1,3) % divide tela grafica plot(obj.tempo,obj.I_saida,'LineWidth',2,'Color','red') % desenha grafico corrente saída set(gca,'YTick',[-15 -10 -5 0 5 10 15]); axis([obj.t_inicial_s obj.t_final_s -15 15]); grid on; xlabel('tempo (s)'); ylabel('Corrente secundária (A)'); end end end
Itens relacionados (por tag)
- Princípios da programação orientada a objetos
- Desenvolvimento de software com a biblioteca JFreeChart (Java)
- Simulação do motor de indução trifásico por meio da transformação dq0 no Simulink
- Simulação de um motor de corrente contínua no Simulink
- Simulação do comportamento dinâmico de um motor à relutância no Simulink