Яка напруга над кожним компонентом?


18

На малюнку нижче показана схема RLC. Схема RLC - електрична схема, що складається з резистора (R), індуктора (L) і конденсатора (C), з'єднаних послідовно або паралельно. (1)

введіть тут опис зображення

Для спрощення обчислень прийнято працювати в частотній (Laplace) області замість часової.

Ваше завдання:

Візьміть значення R, Lі в Cякості вхідних даних, і повертати напруги VR, VLіVC

Перетворення в домен Лапласа відбувається наступним чином:

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 Гц).

Комбінований опір, коли компоненти послідовно є 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 = ...), якщо результати будуть у тому ж порядку, як наведено нижче. Точність повинна бути не менше 3-х десяткових знаків як для реальної, так і для уявної частини. Введення та вихід / результати можуть бути в наукових позначеннях, якщо це за замовчуванням у вашій мові.

Rі Lє >= 0, і C > 0. R, 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.

Цей список не є винятковим, тому можна використовувати інші варіанти, якщо уявна частина позначена символом " ia" j(поширене в електротехніці, iяке використовується для струму).

Щоб перевірити результат для інших значень R, L і С, наступне має бути істинним для всіх результатів: VR + VL + VC = 1.

Виграє найкоротший код у байтах!

До речі: Так, це напруга над компонентом, і струм через компонент. Напруга ніколи нічого не проходило. =)


2
Власне, реактивні речовини - це реальні числа, тому XL = омега * L. Імпеданс індуктора становить Z = jXL. (Це не впливає на проблему, це лише виправлення)
Voitcus

@Voitcus, правда ... Я трохи спростив це, щоб не зробити питання занадто заплутаним. Я включив j в умови XL / XC, переходячи до частотної області. Я ніколи не казав, що реакція була складною, хоча (я називав це X, а не jX) =) Але я з вами згоден! Я насправді назвав це імпедансом теж.
Стюі Гріффін

Чи можу я взяти список із 3-х чисел як функцію введення, чи це повинні бути 3 окремі аргументи?
Мартін Ендер

@ MartinBüttner, список добре.
Стюі Гріффін

Відповіді:



9

Математика, 33 байти

Так близько до Pyth ...

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

Це безіменна функція, яка приймає R, Lа Cтакож його три аргументи і повертає список комплексних чисел як результат (в необхідному порядку VR, VL, VC). Приклад використання:

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

Октава / Матлаб, 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: Мабуть, я знаю про тебе більше, ніж ти! Тому що, ви / знали, що це можливо ! =)
Стюі Гріффін

@StewieGriffin Ooooh. Знову це сталося зі мною. Погана пам’ять !!: - D (я ніколи не використовую це позначення)
Луїс Мендо

Ви можете зберегти інший байт, якщо ви почнете з обертання 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). =)
Стюі Гріффін

@StewieGriffin Хороша ідея! Відредаговано
Луїс Мендо

3

APL (Dyalog Unicode) , 27 24 байт SBCS

Повна програма. Запитує C, L, Rв такому порядку.

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

Спробуйте в Інтернеті!

0J100 100  i

 π разів, ніж це

÷ зворотне це

() Застосувати таку негласну функцію:

÷∘⎕ розділити аргумент на введення ( C)

⎕∘÷, Prepend input ( L), розділене на аргумент

⎕, подати вхід ( R)

() Застосувати таку негласну функцію:

+/ підсумуйте аргументи

⊢÷ розділіть аргументи на те


@StewieGriffin Я зауважу, що ти маєш на увазі. "високий мінус" ¯- префікс негативного числа APL, який можна відрізнити від функції (тобто математичного оператора) -. У будь-якому разі, було б справедливо не рахувати символи APL як одиничні байти, це лише питання кодування, і існує багато систем APL, які використовують один байт для зберігання коду APL. Наприклад, Dyalog має як Unicode, так і Classic (однобайтові) версії свого інтерпретатора.
Adám

1
Я згоден, якщо ви використовували кодування, де кожен символ є одним байтом, то кількість символів повинна дорівнювати кількості байтів. Чи можете ви переконатися, що це так (я не надто знайомий з apl різними системами кодування). Крім того, я не був знайомий зі знаком "високий мінус". Моє погано ...
Стюі Гріффін

Я просто вставив код у поле "порахувати кількість байтів" і повернувся 31. Якщо це неправильно, то, звичайно, у вас буде оцінка 28 :-) Хоча, ..,49J¯17.4..означало б, що перша частина уявна, а друга є реальною в будь-якій іншій мові (або в математичній нотації взагалі), тому може порушити правило "до тих пір, поки уявна частина позначена i або aj". Майте +1 для того, щоб навчити мене про "високий мінус", і приємну відповідь, але я не впевнений, що зможу обрати це як прийняту відповідь, коли настане цей день.
Стюі Гріффін

1
@StewieGriffin Ninja'd;)
бета-версія занепаду


2

Октава, 41 байт

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

1/(100*j*pi)можна скоротити, до -.01j/piякого набагато коротше. Призначивши його до змінної kinline, змінна може бути використана двічі. Призначення всього вектора змінної Zкоштує 4 байти, але дозволяє ділити на sum(Z), що на 5 байт коротше, ніж (R+L/k+k/C).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.