Jakie jest napięcie na każdym elemencie?

18

Poniższy obrazek pokazuje obwód RLC. Obwód RLC to obwód elektryczny składający się z rezystora (R), induktora (L) i kondensatora (C), połączonych szeregowo lub równolegle. (1)

wprowadź opis zdjęcia tutaj

Aby uprościć obliczenia, często pracuje się w domenie częstotliwości (Laplace'a) zamiast w domenie czasu.

Twoim zadaniem jest:

Przyjmować wartości R, La Cjako wejście i powrót napięcia VR, VLaVC

Konwersja do domeny Laplace wygląda następująco:

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

gdzie j = sqrt(-1)i w = 2*pi*50(Częstotliwość wynosi 50 Hz).

Łączna impedancja, gdy elementy są szeregowo, wynosi Z = R + XL + XC. Być może pamiętasz U = R*Iz wykładów z fizyki w szkole średniej. To prawie to samo, ale nieco bardziej skomplikowany teraz: VS = Z*I. Prąd jest obliczany poprzez podzielenie napięcia VSprzez całkowitą impedancję Z. Aby znaleźć napięcie na jednym elemencie, musisz znać prąd, a następnie pomnożyć go przez impedancję. Dla uproszczenia przyjmuje się, że napięcie wynosi VS = 1+0*j.

Równania, których możesz potrzebować, to:

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)

Dane wejściowe pochodzą z STDIN lub jako argumenty funkcji. Wynik / wynik muszą składać się z trzech liczb zespolonych, z listy, łańcucha lub dowolnego innego najbardziej praktycznego w twoim języku. Nie jest konieczne dołączanie nazw (np. VR = ...), O ile wyniki są w takiej samej kolejności jak poniżej. Precyzja musi wynosić co najmniej 3 miejsca po przecinku zarówno dla części rzeczywistej, jak i urojonej. Dane wejściowe i wyjściowe / wyniki mogą być zapisane w notacji naukowej, jeśli jest to domyślne w Twoim języku.

Ri L>= 0, i C > 0. R, L, C <= inf(lub najwyższy możliwy numer w Twoim języku).

Prosty przypadek testowy:

R = 1, L = 1, C = 0.00001

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

Dla powyższych wyników może to być jeden (z wielu) prawidłowych formatów wyjściowych:

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

Niektóre prawidłowe formaty wyjściowe dla jednej wartości napięcia to:

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

Ta lista nie jest wyłączna, więc można stosować inne warianty, o ile część wyobrażona jest oznaczona przez ia j( a) (powszechne w elektrotechnice istosowanej dla prądu).

Aby sprawdzić, czy wynik dla innych wartości R, L i C, dodaje się, muszą być spełnione dla wszystkich wyników: VR + VL + VC = 1.

Najkrótszy kod w bajtach wygrywa!

Nawiasem mówiąc: Tak, to napięcie nad komponentem i prąd przez komponent. Napięcie nigdy przez nic nie przeszło. =)

Stewie Griffin
źródło
2
W rzeczywistości reaktancje są liczbami rzeczywistymi , więc XL = omega * L. Impedancja cewki indukcyjnej wynosi Z = jXL. (Nie ma to wpływu na problem, to tylko korekta)
Voitcus
@Voitcus, prawda ... Uprościłem to trochę, aby pytanie nie było zbyt mylące. Wchodząc do dziedziny częstotliwości, zawarłem literę j w kategoriach XL / XC. Nigdy nie mówiłem, że reaktancja jest złożona (chociaż nazwałem ją X, a nie jX) =) Ale zgadzam się z tobą! Właściwie nazwałem to również impedancją.
Stewie Griffin,
Czy mogę wziąć listę 3 liczb jako dane wejściowe funkcji, czy też muszą to być 3 osobne argumenty?
Martin Ender,
@ MartinBüttner, lista jest OK.
Stewie Griffin,

Odpowiedzi:

9

Mathematica, 33 bajty

Tak blisko Pyth ...

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

Jest anonimowa funkcja, która odbywa R, Li Cw trzech argumentów i zwraca listę liczb zespolonych w wyniku (w odpowiedniej kolejności VR, VL, VC). Przykładowe użycie:

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} *)
Martin Ender
źródło
3

Octave / Matlab, 53 51 bajtów

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

Wypróbuj online

Dzięki @StewieGriffin za usunięcie dwóch bajtów.

Luis Mendo
źródło
@StewieGriffin 100j?! Tyle lat korzystania z Matlaba i nie wiedziałem, że da się to zrobić! :-) (wiedziałem 1j, ale myślałem, że to po prostu). Dzięki!
Luis Mendo,
... aaaand: Najwyraźniej wiem o tobie więcej niż ty! Ponieważ wiesz / wiedziałeś, że to możliwe ! =)
Stewie Griffin,
@StewieGriffin Ooooh. Znowu mi się to przytrafiło. Zła pamięć !!: - D (Nigdy tak naprawdę nie używam tego zapisu)
Luis Mendo
Możesz zapisać kolejny bajt, jeśli zaczniesz od odwrotności k, na przykład: k=-.01j/pi;Z=[R,L/k,k/C];Z/sum(Z)lub k=-.01j/pi;[R L/k k/C]/(R+L/k+k/C). =)
Stewie Griffin
@StewieGriffin Dobry pomysł! Edytowane
Luis Mendo,
3

APL (Dyalog Unicode) , 27 24 bajtów SBCS

Pełny program Pyta o C, L, Rw tej kolejności.

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

Wypróbuj online!

0J100 100  i

 π razy to

÷ odwrotność tego

() Zastosuj następującą funkcję ukrytą:

÷∘⎕ podziel argument przez input ( C)

⎕∘÷, poprzedzone wejście ( L) podzielone przez argument

⎕, prepend input ( R)

() Zastosuj następującą funkcję ukrytą:

+/ zsumuj argumenty

⊢÷ podziel przez to argumenty

Adám
źródło
@StewieGriffin Jestem pewien, że masz na myśli. „wysoki minus” ¯to przedrostek liczby ujemnej APL, aby odróżnić od funkcji (tj. operatora matematycznego) negację -. W każdym razie nie byłoby fair nie liczyć znaków APL jako pojedynczych bajtów, to tylko kwestia kodowania, a wiele systemów APL używa pojedynczych bajtów do przechowywania kodu APL. Np. Dyalog ma wersje interpretera zarówno Unicode, jak i Classic (jednobajtowe).
Adám
1
Zgadzam się, jeśli użyłeś kodowania, w którym każdy znak jest pojedynczym bajtem, liczba znaków powinna być równa liczbie bajtów. Czy możesz zweryfikować, że tak jest (nie znam się na różnych systemach kodowania). Poza tym nie znałem wysokiego znaku minus. Mój zły ...
Stewie Griffin
Właśnie wkleiłem kod do pola „policz liczbę bajtów” i wróciłem 31. Jeśli nie jest poprawny, to oczywiście uzyskasz wynik 28 :-) Chociaż ..,49J¯17.4..oznaczałoby to, że pierwsza część jest wymyślona, ​​a druga jest prawdziwy w każdym innym języku (lub ogólnie w notacji matematycznej), więc może naruszać zasadę „o ile część wyobrażona jest oznaczona przez i lub aj”. Zdobądź +1 za nauczenie mnie o „wysokim minusie” i miłą odpowiedź, ale nie jestem pewien, czy mogę wybrać ją jako przyjętą odpowiedź, gdy nadejdzie ten dzień.
Stewie Griffin,
1
@StewieGriffin Ninja'd;)
Beta Decay
2

Oktawa, 41 bajtów

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

1/(100*j*pi)można skrócić, do -.01j/piczego jest znacznie krótszy. Przypisując ją do zmiennej kinline, zmiennej można użyć dwukrotnie. Przypisanie całego wektora do zmiennej Zkosztuje 4 bajty, ale pozwala nam dzielić sum(Z), czyli o 5 bajtów mniej niż (R+L/k+k/C).

Stewie Griffin
źródło