Berapa tegangan pada masing-masing komponen?

18

Gambar di bawah ini menunjukkan sirkuit RLC. Sirkuit RLC adalah sirkuit listrik yang terdiri dari resistor (R), induktor (L), dan kapasitor (C), dihubungkan secara seri atau paralel. (1)

masukkan deskripsi gambar di sini

Untuk menyederhanakan perhitungan, biasanya bekerja di domain frekuensi (Laplace) alih-alih domain waktu.

Tugas Anda adalah:

Ambil nilai R, Ldan Csebagai input, dan kembalikan voltase VR, VLdanVC

Konversi ke domain Laplace adalah sebagai berikut:

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

dimana j = sqrt(-1), dan w = 2*pi*50(Frekuensi adalah 50 Hz).

Impedansi gabungan, ketika komponen dalam seri adalah Z = R + XL + XC. Anda mungkin ingat U = R*Idari kuliah fisika SMA. Ini hampir sama, tapi sedikit lebih kompleks sekarang: VS = Z*I. Arus dihitung dengan membagi tegangan VSdengan impedansi total Z. Untuk menemukan tegangan pada satu komponen, Anda perlu mengetahui arus, kemudian mengalikannya dengan impedansi. Untuk kesederhanaan, tegangan diasumsikan VS = 1+0*j.

Persamaan yang mungkin Anda butuhkan adalah:

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)

Masukan dari STDIN atau sebagai argumen fungsi. Output / hasil harus tiga angka kompleks, dalam daftar, string atau apa pun yang paling praktis dalam bahasa Anda. Tidak perlu menyertakan nama (ex VR = ...), asalkan hasilnya dalam urutan yang sama seperti di bawah ini. Ketelitian harus minimal 3 angka desimal untuk bagian nyata dan imajiner. Input dan output / hasil dapat dalam notasi ilmiah jika itu default dalam bahasa Anda.

Rdan Lyang >= 0, dan C > 0. R, L, C <= inf(atau angka setinggi mungkin dalam bahasa Anda).

Kasus uji sederhana:

R = 1, L = 1, C = 0.00001

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

Untuk hasil di atas, ini bisa menjadi satu (dari banyak) format ouput yang valid:

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

Beberapa format ouput yang valid untuk satu nilai tegangan adalah:

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

Daftar ini tidak eksklusif, sehingga varian lain dapat digunakan, selama bagian imajiner ditunjukkan oleh a iatau j(umum dalam teknik elektro seperti iyang digunakan untuk saat ini).

Untuk memverifikasi hasil untuk nilai-nilai lain dari R, L dan C, berikut ini harus benar untuk semua hasil: VR + VL + VC = 1.

Kode terpendek dalam byte menang!

Ngomong-ngomong: Ya, itu tegangan atas komponen, dan arus melalui komponen. Tegangan tidak pernah melewati apa pun. =)

Stewie Griffin
sumber
2
Sebenarnya, reaktansi adalah bilangan real , jadi XL = omega * L. Impedansi induktor adalah Z = jXL. (Ini tidak mempengaruhi masalah, itu hanya koreksi)
Voitcus
@Vitcus, benar ... Saya menyederhanakannya sedikit, untuk tidak membuat pertanyaan terlalu membingungkan. Saya memasukkan j dalam istilah XL / XC, ketika pergi ke domain frekuensi. Saya tidak pernah mengatakan bahwa reaktansi itu rumit (walaupun saya menyebutnya X, dan bukan jX) =) Tapi saya setuju dengan Anda! Saya sebenarnya menyebutnya impedansi juga.
Stewie Griffin
Bisakah saya mengambil daftar 3 angka sebagai input fungsi, atau harus 3 argumen terpisah?
Martin Ender
@ MartinBüttner, daftarnya OK.
Stewie Griffin

Jawaban:

9

Mathematica, 33 byte

Begitu dekat dengan Pyth ...

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

Ini adalah fungsi yang tidak disebutkan namanya, yang mengambil R, Ldan Ctiga argumen dan mengembalikan daftar bilangan kompleks sebagai hasilnya (dalam urutan yang diperlukan VR, VL, VC). Contoh penggunaan:

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
sumber
3

Oktaf / Matlab, 53 51 byte

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

Cobalah online

Terima kasih kepada @StewieGriffin karena menghapus dua byte.

Luis Mendo
sumber
@StewieGriffin 100j?! Bertahun-tahun menggunakan Matlab dan saya tidak tahu itu bisa dilakukan! :-) (Saya memang tahu 1j, tapi saya pikir itu hanya itu). Terima kasih!
Luis Mendo
... aaaand: Rupanya aku tahu lebih banyak tentangmu daripada dirimu! Karena, Anda memang tahu bahwa itu mungkin ! =)
Stewie Griffin
@StewieGriffin Ooooh. Itu terjadi pada saya lagi. Memori buruk !!: - D (Saya tidak pernah benar-benar menggunakan notasi itu)
Luis Mendo
Anda dapat menyimpan byte lain jika Anda memulai dengan kebalikan dari k, seperti ini:, k=-.01j/pi;Z=[R,L/k,k/C];Z/sum(Z)atau k=-.01j/pi;[R L/k k/C]/(R+L/k+k/C). =)
Stewie Griffin
@StewieGriffin Ide bagus! Diedit
Luis Mendo
3

APL (Dyalog Unicode) , 27 24 byte SBCS

Program lengkap. Anjuran untuk C, L, Rdalam urutan itu.

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

Cobalah online!

0J100 100  i

 π kali itu

÷ kebalikan dari itu

(... ) terapkan fungsi diam-diam berikut:

÷∘⎕ bagilah argumen dengan input ( C)

⎕∘÷, input prepend ( L) dibagi dengan argumen

⎕, masukan awal ( R)

(... ) terapkan fungsi diam-diam berikut:

+/ jumlah argumen

⊢÷ pisahkan argumen dengan itu

Adm
sumber
@StewieGriffin Saya yakin apa yang Anda maksud. "minus tinggi" ¯adalah awalan angka negatif APL, untuk membedakan dari fungsi (yaitu operator matematika) meniadakan -. Bagaimanapun, itu tidak adil untuk tidak menghitung karakter APL sebagai byte tunggal, itu hanya masalah pengkodean, dan ada banyak sistem APL yang menggunakan byte tunggal untuk menyimpan kode APL. Misalnya Dyalog memiliki versi penerjemah mereka dari Unicode dan Classic (single-byte).
Adám
1
Saya setuju, jika Anda telah menggunakan pengkodean di mana setiap karakter adalah satu byte, maka jumlah karakter harus sama dengan jumlah byte. Bisakah Anda memverifikasi bahwa ini terjadi (saya tidak terlalu akrab dengan apl sistem pengkodean yang berbeda). Juga, saya tidak terbiasa dengan tanda minus tinggi. Buruk saya ...
Stewie Griffin
Saya baru saja menempelkan kode ke dalam kotak "hitung jumlah byte" dan kembali 31. Jika itu tidak benar, maka tentu saja Anda akan memiliki skor 28 :-) Meskipun, ..,49J¯17.4..akan berarti bagian pertama adalah imajiner dan yang kedua nyata dalam bahasa lain (atau dalam notasi matematika secara umum), sehingga mungkin melanggar aturan "selama bagian imajiner ditunjukkan oleh i atau aj". Punya +1 untuk mengajari saya tentang "minus tinggi", dan jawaban yang bagus, tetapi saya tidak yakin saya bisa memilihnya sebagai jawaban yang diterima, ketika hari itu tiba.
Stewie Griffin
1
@StewieGriffin Ninja'd;)
Beta Decay
2

Oktaf, 41 byte

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

1/(100*j*pi)dapat dipersingkat -.01j/piyang jauh lebih pendek. Dengan menugaskannya ke variabel kinline, variabel dapat digunakan dua kali. Menetapkan seluruh vektor ke Zbiaya variabel 4 byte, tetapi memungkinkan kita untuk membaginya sum(Z), yaitu 5 byte lebih pendek dari (R+L/k+k/C).

Stewie Griffin
sumber