La siguiente imagen muestra un circuito RLC. Un circuito RLC es un circuito eléctrico que consiste en una resistencia (R), un inductor (L) y un condensador (C), conectados en serie o en paralelo. (1)
Para simplificar los cálculos, es común trabajar en el dominio de la frecuencia (Laplace) en lugar del dominio del tiempo.
Tu tarea es:
Tome los valores R
, L
y C
como entrada, y devuelva los voltajes VR
, VL
yVC
La conversión al dominio de Laplace es la siguiente:
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
donde j = sqrt(-1)
, y w = 2*pi*50
(La frecuencia es de 50 Hz).
La impedancia combinada, cuando los componentes están en serie es Z = R + XL + XC
. Quizás recuerdes U = R*I
de las conferencias de física de la escuela secundaria. Es casi lo mismo, pero un poco más compleja ahora: VS = Z*I
. La corriente se calcula dividiendo el voltaje VS
por la impedancia total Z
. Para encontrar el voltaje en un solo componente, debe conocer la corriente y luego multiplicarla por la impedancia. Por simplicidad, se supone que el voltaje es VS = 1+0*j
.
Las ecuaciones que puede necesitar son:
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)
La entrada es de STDIN o como argumentos de función. El resultado / resultado debe ser tres números complejos, en una lista, cadena o lo que sea más práctico en su idioma. No es necesario incluir nombres (ex VR = ...
), siempre que los resultados estén en el mismo orden que a continuación. La precisión debe ser de al menos 3 puntos decimales tanto para la parte real como para la imaginaria. La entrada y salida / resultados pueden estar en notación científica si eso es predeterminado en su idioma.
R
y L
son >= 0
y C > 0
.R, L, C <= inf
(o el número más alto posible en su idioma).
Un caso de prueba simple:
R = 1, L = 1, C = 0.00001
VR = 0.0549 + 0.2277i
VL = -71.5372 +17.2353i
VC = 72.4824 -17.4630i
Para los resultados anteriores, este podría ser uno (de muchos) formatos de salida válidos:
(0.0549 + 0.2277i, -71.5372 +17.2353i, 72.4824 -17.4630i)
Algunos formatos de salida válidos para un valor de voltaje son:
1.234+i1.234, 1.23456+1.23456i, 1.2345+i*1.2345, 1.234e001+j*1.234e001.
Esta lista no es exclusiva, por lo que se pueden usar otras variantes, siempre que la parte imaginaria esté indicada por una i
o una j
(común en ingeniería eléctrica comoi
se usa para la corriente).
Para verificar el resultado para otros valores de R, L y C, la siguiente debe ser cierto para todos los resultados: VR + VL + VC = 1
.
¡El código más corto en bytes gana!
Por cierto: sí, es el voltaje sobre un componente y la corriente a través de un componente. Un voltaje nunca ha pasado por nada. =)
fuente
Respuestas:
Pyth,
302928 bytesPruébalo en línea.
fuente
Mathematica, 33 bytes
Tan cerca de Pyth ...
Esta es una función sin nombre, que toma
R
,L
yC
como sus tres argumentos y devuelve una lista de números complejos como el resultado (en el orden requeridoVR
,VL
,VC
). Ejemplo de uso:fuente
Octave / Matlab,
5351 bytesPruébalo en línea
Gracias a @StewieGriffin por eliminar dos bytes.
fuente
100j
?! ¡Tantos años usando Matlab y no sabía que se podía hacer! :-) (Lo sabía1j
, pero pensé que era solo eso). ¡Gracias!k=-.01j/pi;Z=[R,L/k,k/C];Z/sum(Z)
ok=-.01j/pi;[R L/k k/C]/(R+L/k+k/C)
. =)APL (Dyalog Unicode) ,
27SBCSde24 bytesPrograma completo Indicaciones para
C
,L
,R
en ese orden.Pruébalo en línea!
0J100
100 i○
π veces que÷
recíproco de eso(
...)
aplique la siguiente función tácita:÷∘⎕
dividir el argumento por input (C
)⎕∘÷,
anteponer input (L
) dividido por el argumento⎕,
anteponer entrada (R
)(
...)
aplique la siguiente función tácita:+/
suma los argumentos⊢÷
dividir los argumentos por esofuente
¯
es el prefijo de número negativo de APL, para distinguirlo de la función (es decir, operador matemático) negada-
. De todos modos, no sería justo no contar los caracteres APL como bytes únicos, es solo una cuestión de codificación, y hay muchos sistemas APL que usan bytes individuales para almacenar el código APL. Por ejemplo, Dyalog tiene versiones Unicode y Classic (byte único) de su intérprete...,49J¯17.4..
significaría que la primera parte es imaginaria y la segunda es real en cualquier otro idioma (o en notación matemática en general), por lo que podría violar la regla "siempre que la parte imaginaria esté indicada por un i o aj". Tenga un +1 por enseñarme sobre "alto menos" y una buena respuesta, pero no estoy seguro de poder elegirla como la respuesta aceptada, cuando llegue ese día.Octava, 41 bytes
1/(100*j*pi)
se puede acortar a lo-.01j/pi
que es mucho más corto. Al asignarlo a la variable enk
línea, la variable se puede usar dos veces. Asignar todo el vector a la variableZ
cuesta 4 bytes, pero nos permite dividir porsum(Z)
, que es 5 bytes más corto que(R+L/k+k/C)
.fuente