Qual é a tensão sobre cada componente?

18

A imagem abaixo mostra um circuito RLC. Um circuito RLC é um circuito elétrico que consiste em um resistor (R), um indutor (L) e um capacitor (C), conectados em série ou em paralelo. (1)

insira a descrição da imagem aqui

Para simplificar os cálculos, é comum trabalhar no domínio da frequência (Laplace) em vez do domínio do tempo.

Sua tarefa é:

Toma os valores R, Le Ccomo entrada, e retornar as tensões VR, VLeVC

A conversão para o domínio Laplace é a seguinte:

R = R
XL = j*w*L      // OK, XL = w*L, and ZL = j*XL, but don't mind this here.  
XC = 1/(j*w*C)  // I haven't ruined physics, it's only a minor terminology tweak

onde j = sqrt(-1)e w = 2*pi*50(A frequência é de 50 Hz).

A impedância combinada, quando os componentes estão em série, é Z = R + XL + XC. Você deve se lembrar U = R*Idas aulas de física do ensino médio. É quase o mesmo, mas um pouco mais complexo agora: VS = Z*I. A corrente é calculada dividindo a tensão VSpela impedância total Z. Para encontrar a tensão em um único componente, você precisa conhecer a corrente e multiplicá-la pela impedância. Por simplicidade, presume-se que a tensão seja VS = 1+0*j.

As equações que você pode precisar são:

XL = j*w*L
XC = 1/(j*w*C)
Z = R + XL + XC   // The combined impedance of the circuit
I = VS / Z         // The current I (Voltage divided by impedance)
VR = I * R        // Voltage over resistance (Current times resistance)
VL = I * XL       // Voltage over inductor (Current times impedance)
VC = I * XC       // Voltage over capacitor (Current times impedance)

A entrada é de STDIN ou como argumentos de função. A saída / resultado deve ser três números complexos, em uma lista, sequência ou o que for mais prático no seu idioma. Não é necessário incluir nomes (ex VR = ...), desde que os resultados estejam na mesma ordem que abaixo. A precisão deve ter pelo menos três casas decimais para a parte real e imaginária. A entrada e saída / resultados podem estar em notação científica, se isso for o padrão no seu idioma.

Re Lsão >= 0e C > 0. R, L, C <= inf(ou o número mais alto possível no seu idioma).

Um caso de teste simples:

R = 1, L = 1, C = 0.00001

VR = 0.0549 + 0.2277i
VL = -71.5372 +17.2353i
VC = 72.4824 -17.4630i

Para os resultados acima, esse pode ser um (de muitos) formatos de saída válidos:

(0.0549 + 0.2277i, -71.5372 +17.2353i, 72.4824 -17.4630i)

Alguns formatos de saída válidos para um valor de tensão são:

1.234+i1.234,   1.23456+1.23456i,   1.2345+i*1.2345,   1.234e001+j*1.234e001.

Esta lista não é exclusiva; portanto, outras variantes podem ser usadas, desde que a parte imaginária seja indicada por um iou a j(comum em engenharia elétrica iusada para corrente).

Para verificar o resultado para outros valores de R, G e C, o seguinte deve ser verdadeiro para todos os resultados: VR + VL + VC = 1.

O código mais curto em bytes vence!

A propósito: Sim, é tensão sobre um componente e corrente através de um componente. Uma voltagem nunca passou por nada. =)

Stewie Griffin
fonte
2
Na verdade, as reatâncias são números reais , então XL = ômega * L. A impedância do indutor é Z = jXL. (Isto não afeta o problema, é apenas uma correção)
Voitcus
@ Voitcus, é verdade ... simplifiquei um pouco, para não tornar a pergunta muito confusa. Incluí j nos termos XL / XC, quando vou para o domínio da frequência. Eu nunca disse que a reatância era complexa (embora eu a chamasse X, e não jX) =) Mas eu concordo com você! Na verdade, eu também chamei isso de impedância.
Stewie Griffin
Posso pegar uma lista de 3 números como uma entrada de função ou precisa ter 3 argumentos separados?
Martin Ender
@ MartinBüttner, a lista está OK.
Stewie Griffin

Respostas:

9

Mathematica, 33 bytes

Tão perto de Pyth ...

l/Tr[l={#,#2(x=100Pi*I),1/x/#3}]&

Esta é uma função não identificada, que leva R, Le Ccomo as suas três argumentos e retorna uma lista de números complexos como o resultado (na ordem necessária VR, VL, VC). Exemplo de uso:

l/Tr[l={#,#2(x=100Pi*I),1/x/#3}]&[1, 1, 0.00001]
(* {0.0548617 + 0.22771 I, -71.5372 + 17.2353 I, 72.4824 - 17.463 I} *)
Martin Ender
fonte
3

Oitava / Matlab, 53 51 bytes

function f(R,L,C)
k=-.01j/pi;Z=[R L/k k/C];Z/sum(Z)

Experimente online

Agradecemos a @StewieGriffin por remover dois bytes.

Luis Mendo
fonte
@StewieGriffin 100j?! Tantos anos usando o Matlab e eu não sabia que isso poderia ser feito! :-) (eu sabia 1j, mas pensei que era apenas isso). Obrigado!
Luis Mendo
... aaaand: Aparentemente, eu sei mais sobre você do que você! Porque você sabia / sabia que é possível ! =)
Stewie Griffin
@StewieGriffin Ooooh. Isso aconteceu comigo de novo. Bad memória !!: - D (Eu nunca realmente usar essa notação)
Luis Mendo
Você pode salvar outro byte se começar com o inverso de k, assim:: k=-.01j/pi;Z=[R,L/k,k/C];Z/sum(Z)ou k=-.01j/pi;[R L/k k/C]/(R+L/k+k/C). =)
Stewie Griffin
@StewieGriffin Good idea! Editado
Luis Mendo
3

APL (Dyalog Unicode) , 27 SBCS de 24 bytes

Programa completo. Solicita C, L, Rnessa ordem.

(⊢÷+/)(⎕,⎕∘÷,÷∘⎕)÷○0J100

Experimente online!

0J100 100  i

 π vezes isso

÷ recíproco disso

() Aplique a seguinte função tácita:

÷∘⎕ divida o argumento por input ( C)

⎕∘÷, prepend input ( L) dividido pelo argumento

⎕, entrada de prefixo ( R)

() Aplique a seguinte função tácita:

+/ somar os argumentos

⊢÷ dividir os argumentos por que

Adão
fonte
@StewieGriffin Estou certo do que você quer dizer. o "menos alto" ¯é o prefixo do número negativo da APL, para distinguir da função (ou seja, operador matemático) negar -. De qualquer forma, não seria justo não contar os caracteres APL como bytes únicos, é apenas uma questão de codificação e existem muitos sistemas de APL que usam bytes únicos para armazenar o código APL. Por exemplo, o Dyalog possui as versões Unicode e Classic (byte único) de seu intérprete.
Adám
1
Concordo que, se você usou codificação em que cada caractere é um byte único, o número de caracteres deve ser igual ao número de bytes. Você pode verificar se é esse o caso (não estou muito familiarizado com um sistema de codificação diferente). Além disso, eu não estava familiarizado com o sinal de menos. My bad ...
Stewie Griffin
Acabei de colar o código em uma caixa "contar número de bytes" e retornei 31. Se não estiver correto, é claro que você terá uma pontuação de 28 :-) Embora, ..,49J¯17.4..significaria que a primeira parte é imaginária e a segunda é real em qualquer outro idioma (ou em notação matemática em geral), portanto, pode violar a regra "desde que a parte imaginária seja indicada por um i ou aj". Tenha um +1 para me ensinar sobre "menos-alto" e uma boa resposta, mas não tenho certeza se posso escolher como resposta aceita quando chegar o dia.
Stewie Griffin
1
@StewieGriffin Ninja'd;)
Decay beta
2

Oitava, 41 bytes

@(R,L,C)(Z=[R L/(k=-.01j/pi) k/C])/sum(Z)

1/(100*j*pi)pode ser reduzido para o -.01j/pique é muito menor. Ao atribuí-lo à variável kinline, a variável pode ser usada duas vezes. Atribuir o vetor inteiro à variável Zcusta 4 bytes, mas nos permite dividir por sum(Z), que é 5 bytes menor que (R+L/k+k/C).

Stewie Griffin
fonte