Qual è la tensione su ogni componente?


18

L'immagine seguente mostra un circuito RLC. Un circuito RLC è un circuito elettrico costituito da un resistore (R), un induttore (L) e un condensatore (C), collegati in serie o in parallelo. (1)

inserisci qui la descrizione dell'immagine

Per semplificare i calcoli, è comune lavorare nel dominio della frequenza (Laplace) anziché nel dominio del tempo.

Il tuo compito è:

Assumere i valori R, Le Ccome input, e restituire le tensioni VR, VLeVC

La conversione al dominio Laplace è la seguente:

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

dove j = sqrt(-1)e w = 2*pi*50(La frequenza è 50 Hz).

L'impedenza combinata, quando i componenti sono in serie, è Z = R + XL + XC. Potresti ricordare U = R*Idalle lezioni di fisica delle superiori. E 'quasi la stessa, ma un po' più complessa ora: VS = Z*I. La corrente viene calcolata dividendo la tensione VSper l'impedenza totale Z. Per trovare la tensione su un singolo componente, è necessario conoscere la corrente, quindi moltiplicarla per l'impedenza. Per semplicità, si presume che la tensione sia VS = 1+0*j.

Le equazioni di cui potresti aver bisogno sono:

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)

L'input proviene da STDIN o come argomento di funzione. L'output / risultato deve essere composto da tre numeri complessi, in un elenco, stringa o qualunque cosa sia più pratica nella tua lingua. Non è necessario includere i nomi (ex VR = ...), purché i risultati siano nello stesso ordine di seguito. La precisione deve essere di almeno 3 punti decimali sia per la parte reale che per quella immaginaria. L'input e l'output / i risultati possono essere in notazione scientifica se è l'impostazione predefinita nella tua lingua.

Re Lsono >= 0, e C > 0. R, L, C <= inf(o il numero più alto possibile nella tua lingua).

Un semplice test case:

R = 1, L = 1, C = 0.00001

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

Per i risultati precedenti, questo potrebbe essere uno (di molti) formati di output validi:

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

Alcuni formati di uscita validi per un valore di tensione sono:

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

Questo elenco non è esclusivo, quindi è possibile utilizzare altre varianti, purché la parte immaginaria sia indicata da un io un j(comune in ingegneria elettrica come iviene utilizzato per la corrente).

Per verificare il risultato per altri valori di R, L e C, il seguente deve essere vero per tutti i risultati: VR + VL + VC = 1.

Il codice più corto in byte vince!

A proposito: Sì, è la tensione su un componente e la corrente attraverso un componente. Una tensione non ha mai attraversato nulla. =)


2
In realtà, le reattanze sono numeri reali , quindi XL = omega * L. L'impedenza dell'induttore è Z = jXL. (Questo non influisce sul problema, è solo una correzione)
Voitcus

@Voitcus, vero ... L'ho semplificato un po ', per non rendere la domanda troppo confusa. Ho incluso j nei termini XL / XC, quando si passa al dominio della frequenza. Non ho mai detto che la reattanza fosse complessa (anche se l'ho chiamata X, e non jX) =) Ma sono d'accordo con te! In realtà l'ho chiamata anche impedenza.
Stewie Griffin,

Posso prendere un elenco di 3 numeri come input di funzione o devono essere 3 argomenti separati?
Martin Ender,

@ MartinBüttner, l'elenco è OK.
Stewie Griffin,

Risposte:



9

Mathematica, 33 byte

Così vicino a Pyth ...

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

Questa è una funzione senza nome, che prende R, Le Ccome i suoi tre argomenti e restituisce un elenco di numeri complessi come risultato (nell'ordine richiesto VR, VL, VC). Esempio di utilizzo:

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} *)

3

Ottava / Matlab, 53 51 byte

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

Provalo online

Grazie a @StewieGriffin per la rimozione di due byte.


@StewieGriffin 100j?! Tanti anni usando Matlab e non sapevo che si potesse fare! :-) (lo sapevo 1j, ma pensavo fosse proprio quello). Grazie!
Luis Mendo,

... aaaand: a quanto pare so più di te di te! Perché, lo sai / lo sai che è possibile ! =)
Stewie Griffin

@StewieGriffin Ooooh. Mi è successo di nuovo. Brutta memoria !!: - D (non ho mai usato quella notazione)
Luis Mendo,

È possibile salvare un altro byte se si inizia con l'inverso di k, in questo modo:, k=-.01j/pi;Z=[R,L/k,k/C];Z/sum(Z)o k=-.01j/pi;[R L/k k/C]/(R+L/k+k/C). =)
Stewie Griffin

@StewieGriffin Buona idea! A cura
Luis Mendo

3

APL (Dyalog Unicode) , 27 24 byte SBCS

Programma completo. Prompt per C, L, Rin questo ordine.

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

Provalo online!

0J100 100  i

 π volte quello

÷ reciproco di quello

(... ) applica la seguente funzione tacita:

÷∘⎕ dividere l'argomento per input ( C)

⎕∘÷, prepend input ( L) diviso per l'argomento

⎕, prepend input ( R)

(... ) applica la seguente funzione tacita:

+/ sommare gli argomenti

⊢÷ dividere gli argomenti per quello


@StewieGriffin Sono sicuro di cosa intendi. l '"alto meno" ¯è il prefisso del numero negativo di APL, per distinguere dalla funzione (ovvero operatore matematico) negare -. In ogni caso, non sarebbe corretto non contare i caratteri APL come singoli byte, è solo una questione di codifica e ci sono molti sistemi APL che utilizzano singoli byte per memorizzare il codice APL. Ad esempio, Dyalog ha entrambe le versioni Unicode e Classic (a byte singolo) del loro interprete.
Adám,

1
Sono d'accordo, se hai usato la codifica in cui ogni carattere è un singolo byte, il numero di caratteri dovrebbe essere uguale al numero di byte. Puoi verificare che sia così (non ho troppa familiarità con sistemi di codifica diversi). Inoltre, non avevo familiarità con il segno meno alto. Mio cattivo ...
Stewie Griffin,

Ho appena incollato il codice in una casella "conta numero di byte" e sono tornato 31. Se non è corretto, ovviamente avrai un punteggio di 28 :-) Anche se, ..,49J¯17.4..significherebbe che la prima parte è immaginaria e la seconda è reale in qualsiasi altra lingua (o in notazione matematica in generale), quindi potrebbe violare la regola "purché la parte immaginaria sia indicata da una i o aj". Avere un +1 per insegnarmi "high minus" e una bella risposta, ma non sono sicuro di poterlo scegliere come risposta accettata, quando arriverà quel giorno.
Stewie Griffin,

1
@StewieGriffin Ninja'd;)
Decadimento beta


2

Ottava, 41 byte

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

1/(100*j*pi)può essere abbreviato in modo -.01j/piche sia molto più breve. Assegnandolo alla variabile in klinea, la variabile può essere utilizzata due volte. L'assegnazione dell'intero vettore alla variabile Zcosta 4 byte, ma ci consente di dividere per sum(Z), che è 5 byte in meno di (R+L/k+k/C).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.