每个组件上的电压是多少?


18

下图显示了RLC电路。RLC电路是由串联或并联连接的电阻器(R),电感器(L)和电容器(C)组成的电路。(1)

在此处输入图片说明

为了简化计算,通常在频率(Laplace)域而不是时域中工作。

您的任务是:

就拿值RLC作为输入,并返回电压VRVLVC

到Laplace域的转换如下:

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)w = 2*pi*50(频率为50 Hz)。

组件串联时的组合阻抗为Z = R + XL + XC。您可能还记得U = R*I高中物理课。几乎相同,但现在有点复杂VS = Z*I。通过将电压VS除以总阻抗可得出电流Z。要查找单个组件上的电压,您需要知道电流,然后将其乘以阻抗。为简单起见,假定电压为VS = 1+0*j

您可能需要的公式是:

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)

输入来自STDIN或作为函数参数。输出/结果必须是三个复数,以列表,字符串或您的语言最实用的形式出现。VR = ...只要结果按以下相同顺序,就不必包括名称(ex )。实部和虚部的精度都必须至少为3个小数点。如果您的语言是默认输入和输出/结果,则可以用科学计数法表示。

RL>= 0,和C > 0R, L, C <= inf(或您所用语言中的最高编号)。

一个简单的测试用例:

R = 1, L = 1, C = 0.00001

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

对于上面的结果,这可能是一种(许多)有效的输出格式:

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

一个电压值的一些有效输出格式为:

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

该列表不是唯一的,因此可以使用其他变体,只要虚部用i或指示j(在电气工程中i很常见,如电流所用)。

要验证R,L和C的其他值的结果,所有结果必须满足以下条件:VR + VL + VC = 1

以字节为单位的最短代码获胜!

顺便说一句:是的,它的电压超过一个组成部分,目前通过的组件。电压从未经历过任何事情。=)


2
实际上,电抗是数,因此XL = omega * L。电感器的阻抗为Z = jXL。(这不会影响问题,仅是更正)
Voitcus 2015年

@Voitcus,是的。。。我简化了一点,以免使问题变得混乱。转到频域时,我在XL / XC术语中包括了j。我从未说过电抗很复杂(尽管我称它为X,而不是jX)=)但是我同意你的观点!我实际上也称它为阻抗。
Stewie Griffin's

我可以将3个数字的列表用作函数输入,还是必须是3个单独的参数?
Martin Ender

@MartinBüttner,列表确定。
Stewie Griffin

Answers:



9

Mathematica,33个字节

如此接近Pyth ...

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

这是一个未命名的函数,该函数RLC作为其三个参数,并返回复数的列表作为结果(以所要求的顺序VRVLVC)。用法示例:

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

八度/ Matlab,53 51字节

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

在线尝试

感谢@StewieGriffin删除了两个字节。


@StewieGriffin 100j?!使用Matlab这么多年了,我不知道可以做到!:-)(我确实知道1j,但是我以为就是这样)。谢谢!
路易斯·门多

... aaaand:显然我比你了解更多!因为,您确实知道有可能!=)
Stewie Griffin 2015年

@StewieGriffin哦。这又发生在我身上。记性不好!!:-D(我从未真正使用过这种记法)
Luis Mendo

如果以k的倒数开头,则可以保存另一个字节,例如:k=-.01j/pi;Z=[R,L/k,k/C];Z/sum(Z)k=-.01j/pi;[R L/k k/C]/(R+L/k+k/C)。=)
Stewie Griffin

@StewieGriffin好主意!编辑
路易斯·门多

3

APL(Dyalog Unicode)27个 24 字节SBCS

完整程序。为提示CLR的顺序。

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

在线尝试!

0J100 100 

 π倍

÷ 倒数的

() 应用以下默认功能:

÷∘⎕ 将参数除以输入(C

⎕∘÷, 前置输入(L)除以参数

⎕, 前置输入(R

() 应用以下默认功能:

+/ 总结论点

⊢÷ 将论点除以


@StewieGriffin我注意到您的意思。“高减” ¯是APL的负数前缀,以区别于函数(即数学运算符)negate -。无论如何,不​​将APL字符计为单个字节是不公平的,这只是编码问题,并且有许多APL系统使用单个字节来存储APL代码。例如,Dyalog的解释器同时具有Unicode和Classic(单字节)版本。
2015年

1
我同意,如果您使用的编码中每个字符都是一个字节,那么字符数应等于字节数。您能验证这种情况吗(我对其他编码系统不太熟悉)。另外,我对高减号不熟悉。我的糟糕...
Stewie Griffin 2015年

我只是将代码粘贴到“字节数”框中,然后返回31。如果不正确,那么您的分数当然为28 :-)尽管,..,49J¯17.4..这意味着第一部分是虚构的,第二部分是虚构的在任何其他语言中(或通常在数学符号中)都是实数,因此它可能会违反“只要虚部由i或aj指示”的规则。有+1可以教我有关“高减”的知识,还有一个不错的答案,但是我不确定当那天到来时我是否可以将其选作可接受的答案。
Stewie Griffin

1
@StewieGriffin Ninja'd;)
Beta Decay


2

八度,41字节

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

1/(100*j*pi)可以缩短到-.01j/pi更短。通过将其分配给k内联变量,该变量可以使用两次。将整个向量分配给变量的Z费用为4个字节,但允许我们除以sum(Z),比短5个字节(R+L/k+k/C)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.