Какое напряжение на каждом компоненте?

18

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

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

Чтобы упростить вычисления, принято работать в частотной (лапласовой) области вместо временной.

Ваша задача:

Возьмите значения 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, либо в качестве аргументов функции. Вывод / результат должен состоять из трех комплексных чисел в виде списка, строки или чего-либо более практичного на вашем языке. Не обязательно включать имена (ex 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.

Этот список не является исключительным, поэтому могут использоваться другие варианты, если мнимая часть обозначена символом iили или 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

Mathematica, 33 байта

Так близко к Пифу ...

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, но думал, что это именно так). Благодарность!
Луис Мендо
... аааа: видимо я знаю о тебе больше чем ты! Потому что вы знаете, что это возможно ! =)
Стьюи Гриффин
@StewieGriffin Оооо. Это случилось со мной снова. Плохая память !!: - 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  я

 π раз

÷ взаимность этого

() Применить следующую молчаливую функцию:

÷∘⎕ разделить аргумент на input ( C)

⎕∘÷, prepend input ( L) делится на аргумент

⎕, предварительный ввод ( R)

() Применить следующую молчаливую функцию:

+/ суммировать аргументы

⊢÷ разделите аргументы этим

Адам
источник
@ StewieGriffin Я уверен, что вы имеете в виду. «высокий минус» ¯- это префикс отрицательного числа APL, чтобы отличить его от функции (т. е. математического оператора) отрицания -. В любом случае, было бы несправедливо не считать символы APL одиночными байтами, это просто вопрос кодирования, и есть много систем APL, которые используют отдельные байты для хранения кода APL. Например, Dyalog имеет как Unicode, так и Classic (однобайтовые) версии своего интерпретатора.
Адам
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).

Стьюи Гриффин
источник