Quelle est la tension sur chaque composant?


18

L'image ci-dessous montre un circuit RLC. Un circuit RLC est un circuit électrique composé d'une résistance (R), d'une inductance (L) et d'un condensateur (C), connectés en série ou en parallèle. (1)

entrez la description de l'image ici

Afin de simplifier les calculs, il est courant de travailler dans le domaine fréquentiel (Laplace) au lieu du domaine temporel.

Votre tâche est:

Prenez les valeurs R, Let Ccomme entrée, et renvoyez les tensions VR, VLetVC

La conversion vers le domaine Laplace est la suivante:

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

j = sqrt(-1)et w = 2*pi*50(La fréquence est de 50 Hz).

L'impédance combinée, lorsque les composants sont en série, est Z = R + XL + XC. Vous vous souvenez peut-être U = R*Ides cours de physique au lycée. Il est presque le même, mais un peu plus complexe maintenant: VS = Z*I. Le courant est calculé en divisant la tension VSpar l'impédance totale Z. Pour trouver la tension sur un seul composant, vous devez connaître le courant, puis le multiplier par l'impédance. Pour simplifier, la tension est supposée être VS = 1+0*j.

Les équations dont vous pourriez avoir besoin sont:

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'entrée provient de STDIN ou d'arguments de fonction. La sortie / le résultat doit être composé de trois nombres complexes, dans une liste, une chaîne ou tout ce qui est le plus pratique dans votre langue. Il n'est pas nécessaire d'inclure des noms (ex VR = ...), tant que les résultats sont dans le même ordre que ci-dessous. La précision doit être d'au moins 3 décimales pour la partie réelle et imaginaire. L'entrée et la sortie / les résultats peuvent être en notation scientifique si c'est par défaut dans votre langue.

Ret Lsont >= 0, et C > 0. R, L, C <= inf(ou le plus grand nombre possible dans votre langue).

Un cas de test simple:

R = 1, L = 1, C = 0.00001

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

Pour les résultats ci-dessus, cela pourrait être un (parmi plusieurs) formats de sortie valides:

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

Certains formats de sortie valides pour une valeur de tension sont les suivants:

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

Cette liste n'est pas exclusive, donc d'autres variantes peuvent être utilisées, tant que la partie imaginaire est indiquée par un iou un j(commun en électrotechnique comme ipour le courant).

Pour vérifier le résultat d'autres valeurs de R, L et C, ce qui suit doit être vrai pour tous les résultats: VR + VL + VC = 1.

Le code le plus court en octets gagne!

Soit dit en passant: oui, c'est la tension sur un composant et le courant à travers un composant. Une tension n'a jamais traversé quoi que ce soit. =)


2
En fait, les réactances sont des nombres réels , donc XL = oméga * L. L'impédance de l'inductance est Z = jXL. (Cela n'affecte pas le problème, ce n'est qu'une correction)
Voitcus

@Voitcus, c'est vrai ... Je l'ai un peu simplifié, pour ne pas rendre la question trop confuse. J'ai inclus le j dans les termes XL / XC, en allant dans le domaine fréquentiel. Je n'ai jamais dit que la réactance était complexe (même si je l'appelais X, et non jX) =) Mais je suis d'accord avec vous! En fait, je l'ai aussi appelé impédance.
Stewie Griffin du

Puis-je prendre une liste de 3 nombres comme entrée de fonction, ou faut-il que ce soit 3 arguments distincts?
Martin Ender

@ MartinBüttner, la liste est OK.
Stewie Griffin du

Réponses:



9

Mathematica, 33 octets

Si proche de Pyth ...

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

Ceci est une fonction anonyme, qui prend R, Let Cque ses trois arguments et retourne une liste de nombres complexes comme le résultat (dans l'ordre requis VR, VL, VC). Exemple d'utilisation:

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

Octave / Matlab, 53 51 octets

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

Essayez-le en ligne

Merci à @StewieGriffin d'avoir supprimé deux octets.


@StewieGriffin 100j?! Tant d'années en utilisant Matlab et je ne savais pas que cela pouvait être fait! :-) (Je le savais 1j, mais je pensais que c'était juste ça). Merci!
Luis Mendo

... aaaand: Apparemment, j'en sais plus sur vous que vous! Parce que vous savez / saviez que c'est possible ! =)
Stewie Griffin

@StewieGriffin Ooooh. Cela m'est encore arrivé. Mauvaise mémoire !!: - D (je n'utilise jamais vraiment cette notation)
Luis Mendo

Vous pouvez enregistrer un autre octet si vous commencez par l'inverse de k, comme ceci:, 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 Bonne idée! Modifié
Luis Mendo

3

APL (Dyalog Unicode) , 27 24 octets SBCS

Programme complet. Aller se C, L, Rdans cet ordre.

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

Essayez-le en ligne!

0J100 100  i

 π fois

÷ réciproque de cela

() Appliquez la fonction tacite suivante:

÷∘⎕ diviser l'argument par input ( C)

⎕∘÷, ajouter le préfixe input ( L) divisé par l'argument

⎕, entrée avant ( R)

() Appliquez la fonction tacite suivante:

+/ résumer les arguments

⊢÷ diviser les arguments par celui


@StewieGriffin Je suis sûr de savoir ce que vous voulez dire. le «haut moins» ¯est le préfixe du nombre négatif d'APL, pour distinguer de la fonction (c.-à-d. opérateur mathématique) nier -. Quoi qu'il en soit, il ne serait pas juste de ne pas compter les caractères APL comme des octets uniques, c'est juste une question d'encodage, et il existe de nombreux systèmes APL qui utilisent des octets uniques pour stocker le code APL. Par exemple, Dyalog a des versions Unicode et Classic (mono-octet) de leur interprète.
Adám

1
Je suis d'accord, si vous avez utilisé un encodage où chaque caractère est un seul octet, alors le nombre de caractères doit être égal au nombre d'octets. Pouvez-vous vérifier que c'est le cas (je ne suis pas trop familier avec un autre système d'encodage). De plus, je ne connaissais pas le signe moins élevé. Mon mauvais ...
Stewie Griffin

Je viens de coller le code dans une case "compter le nombre d'octets" et j'en ai récupéré 31. Si ce n'est pas correct, alors vous aurez bien sûr un score de 28 :-) Bien que ..,49J¯17.4..cela signifierait que la première partie est imaginaire et la seconde est réel dans n'importe quel autre langage (ou en notation mathématique en général), donc il pourrait violer la règle "tant que la partie imaginaire est indiquée par un i ou un aj". Avoir un +1 pour m'avoir enseigné le «haut moins» et une belle réponse, mais je ne suis pas sûr de pouvoir la choisir comme réponse acceptée, le jour venu.
Stewie Griffin du

1
@StewieGriffin Ninja'd;)
Beta Decay


2

Octave, 41 octets

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

1/(100*j*pi)peut être raccourci, -.01j/pice qui est beaucoup plus court. En l'affectant à la variable kinline, la variable peut être utilisée deux fois. Assigner le vecteur entier à la variable Zcoûte 4 octets, mais nous permet de diviser par sum(Z), ce qui est 5 octets plus court que (R+L/k+k/C).

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.