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)
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
, L
et C
comme entrée, et renvoyez les tensions VR
, VL
etVC
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
où 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*I
des 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 VS
par 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.
R
et L
sont >= 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 i
ou un j
(commun en électrotechnique comme i
pour 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. =)
la source
Réponses:
Pyth,
302928 octetsEssayez-le en ligne.
la source
Mathematica, 33 octets
Si proche de Pyth ...
Ceci est une fonction anonyme, qui prend
R
,L
etC
que ses trois arguments et retourne une liste de nombres complexes comme le résultat (dans l'ordre requisVR
,VL
,VC
). Exemple d'utilisation:la source
Octave / Matlab,
5351 octetsEssayez-le en ligne
Merci à @StewieGriffin d'avoir supprimé deux octets.
la source
100j
?! Tant d'années en utilisant Matlab et je ne savais pas que cela pouvait être fait! :-) (Je le savais1j
, mais je pensais que c'était juste ça). Merci!k=-.01j/pi;Z=[R,L/k,k/C];Z/sum(Z)
ouk=-.01j/pi;[R L/k k/C]/(R+L/k+k/C)
. =)APL (Dyalog Unicode) ,
2724 octets SBCSProgramme complet. Aller se
C
,L
,R
dans cet ordre.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 celuila source
¯
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...,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.Octave, 41 octets
1/(100*j*pi)
peut être raccourci,-.01j/pi
ce qui est beaucoup plus court. En l'affectant à la variablek
inline, la variable peut être utilisée deux fois. Assigner le vecteur entier à la variableZ
coûte 4 octets, mais nous permet de diviser parsum(Z)
, ce qui est 5 octets plus court que(R+L/k+k/C)
.la source