Электростатика · Плоскопараллельная
Трёхжильный кабель: матрица Максвелла и взаимность
Восстановите полную матрицу ёмкостных коэффициентов трёх фаз внутри общего экрана. Каждый её столбец получается отдельным единичным возбуждением; взаимность и симметрия становятся независимыми численными проверками.
Самостоятельная учебная модель FEMM 5: от физических соотношений к полевому решению и проверке результата.
Допущения и устройство учебной модели
| Учебная модель FEMM 5 | Причина |
|---|---|
| Три независимых фазовых проводника A, B, C и общий экран | Можно собрать полную матрицу ёмкостных коэффициентов. |
| Одинаковая геометрия при повороте на 120° | Поворотная симметрия служит проверкой сетки. |
Все размеры, свойства материалов и условия возбуждения заданы ниже. Численные результаты относятся к опубликованной версии модели FEMM 5.
Физическая и математическая постановка
От одного конденсатора к системе проводников
Заряды трёх фаз линейно зависят от их потенциалов относительно экрана. Для j-го столбца задаются Vj=1 В, остальные фазовые потенциалы и потенциал экрана равны нулю. Заряды фаз непосредственно дают Cij.
Диагональные коэффициенты положительны, взаимные коэффициенты в матрице Максвелла отрицательны. Это не та же таблица, что положительные ёмкости ветвей эквивалентной схемы; соглашения нельзя смешивать.
Три возбуждения на каждой сетке
Жилы одинакового радиуса размещены по вершинам равностороннего треугольника. Поэтому диагональные коэффициенты должны совпадать с точностью дискретизации. Программа выполняет девять решений: три возбуждения на трёх сетках.
Проверяются баланс зарядов всех фаз и экрана, энергия единичного возбуждения, взаимность матрицы, поворотная симметрия и сеточная устойчивость Caa. Отрицательные взаимные коэффициенты не являются отрицательной запасённой энергией.
Исходные данные
Плоскопараллельная
| Параметр | Значение | Единица | Происхождение |
|---|---|---|---|
| Радиус каждой жилы | 2 | мм | Условие учебной задачи |
| Радиус расположения осей жил | 6 | мм | Условие учебной задачи |
| Радиус общего экрана | 15 | мм | Условие учебной задачи |
| Длина участка | 1 | м | Условие учебной задачи |
| Проницаемость изоляции | 3 | 1 | Условие учебной задачи |
| Единичное фазовое возбуждение | 1 | В | Условие учебной задачи |
Порядок воспроизведения
- Изучите размеры, материалы, возбуждение и выбранную двумерную постановку. Сначала вычислите аналитический ориентир в единицах СИ.
- Скачайте файлы по отдельным ссылкам в отдельную рабочую папку. Откройте reproduce.py во встроенном редакторе Python FEMM 5 и выполните сохранённый файл.
- Программа строит русифицированные модели, сохраняет их, закрывает и открывает заново. Затем выполняет расчёт и читает свойства проводников по точному русскому имени.
- Сравните три уровня пространственной сетки. В таблицах сохранены число узлов и элементов, интегральные величины и независимые критерии. Дополнительные режимы указаны в постановке.
- Откройте самый подробный сохранённый вход и соответствующее решение. Проверьте смысл единиц, знаков и объёмного множителя; новый запуск сохранит результаты в новой папке calculated-NN.
Скачайте нужные файлы по отдельным ссылкам ниже в одну рабочую папку, затем откройте reproduce.py во встроенном Python FEMM 5 и выполните его. Сохраните имена файлов и структуру подпапок. Условия конкретного запуска и путь новых результатов указаны в комментариях программы.
Программа встроенного Python FEMM 5
"""Матрица ёмкостей трёхжильного кабеля.
Среда: встроенный MicroPython FEMM 5; команды FEMM доступны глобально.
Геометрические размеры: миллиметры; поля и интегралы возвращаются в СИ.
Все материалы и проводники имеют русские имена. Каждая модель сохраняется,
закрывается и повторно открывается до нового расчёта, включая кириллицу.
Запуск создаёт новую папку calculated-NN рядом с программой; опубликованные
модели и предыдущие расчёты не перезаписываются. Все необходимые
исходные данные включены. Условия задачи и ограничения описаны в README.md.
"""
import os
import sys
import math
import json
saved = globals().get('__file__', '') or (sys.argv[0] if sys.argv else '')
base = os.path.dirname(os.path.abspath(saved)) if saved else os.getcwd()
index = 1
while os.path.exists(base + '/calculated-%02d' % index):
index += 1
directory = base + '/calculated-%02d' % index
os.mkdir(directory)
records = []
checks = []
EPS0 = 8.85418781762e-12
def real(value):
if isinstance(value, (list, tuple)):
return real(value[0])
return complex(value).real
def check(name, value, limit):
checks.append({'name': name, 'value': value, 'limit': limit,
'passed': math.isfinite(value) and value <= limit})
def label(x, y, material, mesh, group=1):
ei_addblocklabel(x, y)
ei_selectlabel(x, y)
ei_setblockprop(material, 0, mesh, group)
ei_clearselected()
def circle(x, radius, conductor, angle):
ei_addnode(x - radius, 0)
ei_addnode(x + radius, 0)
ei_addarc(x - radius, 0, x + radius, 0, 180, angle)
ei_addarc(x + radius, 0, x - radius, 0, 180, angle)
ei_selectarcsegment(x, radius)
ei_selectarcsegment(x, -radius)
ei_setarcsegmentprop(angle, '<None>', 0, 0, conductor)
ei_clearselected()
def solve(model):
ei_saveas(model)
ei_close()
opendocument(model)
ei_analyze(1)
ei_loadsolution()
eo_smooth('off')
def electric_result(mesh, model, input_name, output_name, exact_C):
voltage_in, charge_in = eo_getconductorproperties(input_name)
voltage_out, charge_out = eo_getconductorproperties(output_name)
voltage = real(voltage_in) - real(voltage_out)
charge = real(charge_in)
eo_groupselectblock(1)
energy = real(eo_blockintegral(0))
eo_clearblock()
capacitance = charge / voltage
energy_C = 2 * energy / voltage ** 2
row = {'mesh_mm': mesh, 'model': os.path.basename(model),
'nodes': eo_numnodes(), 'elements': eo_numelements(),
'voltage_V': voltage, 'charge_C': charge, 'energy_J': energy,
'capacitance_F': capacitance, 'energy_capacitance_F': energy_C,
'analytic_capacitance_F': exact_C,
'analytic_C_relative_error': abs(capacitance / exact_C - 1),
'energy_charge_relative_error': abs(energy_C / capacitance - 1)}
records.append(row)
check('Энергия и заряд: ' + os.path.basename(model),
row['energy_charge_relative_error'], 1e-5)
return row
def circle_xy(cx, cy, radius, conductor, angle):
ei_addnode(cx - radius, cy)
ei_addnode(cx + radius, cy)
ei_addarc(cx - radius, cy, cx + radius, cy, 180, angle)
ei_addarc(cx + radius, cy, cx - radius, cy, 180, angle)
ei_selectarcsegment(cx, cy + radius)
ei_selectarcsegment(cx, cy - radius)
ei_setarcsegmentprop(angle, '<None>', 0, 0, conductor)
ei_clearselected()
def polygon(points, conductor='<None>', mesh=0):
for x, y in points:
ei_addnode(x, y)
for k, (x, y) in enumerate(points):
x2, y2 = points[(k + 1) % len(points)]
ei_addsegment(x, y, x2, y2)
if conductor != '<None>':
ei_selectsegment((x + x2) / 2, (y + y2) / 2)
ei_setsegmentprop('<None>', mesh, 0, 0, 0, conductor)
ei_clearselected()
def terminal(x, y, name, mesh):
ei_selectsegment(x, y)
ei_setsegmentprop('<None>', mesh, 0, 0, 0, name)
ei_clearselected()
def summary(mesh, model, source, ground, exact_C=None):
v1, q1 = eo_getconductorproperties(source)
v0, q0 = eo_getconductorproperties(ground)
v1, v0, q1, q0 = real(v1), real(v0), real(q1), real(q0)
voltage = v1 - v0
eo_groupselectblock(1)
energy = real(eo_blockintegral(0))
eo_clearblock()
capacitance = q1 / voltage
row = {'mesh_mm': mesh, 'model': os.path.basename(model),
'nodes': eo_numnodes(), 'elements': eo_numelements(),
'voltage_V': voltage, 'charge_C': q1, 'energy_J': energy,
'capacitance_F': capacitance,
'energy_capacitance_F': 2 * energy / voltage ** 2}
if exact_C is not None:
row['analytic_capacitance_F'] = exact_C
row['analytic_C_relative_error'] = abs(capacitance / exact_C - 1)
records.append(row)
check('Энергия и терминальный заряд: ' + os.path.basename(model),
abs(2 * energy / voltage ** 2 / capacitance - 1), 1e-5)
return row
def field(x, y):
values = eo_getpointvalues(x, y)
return math.sqrt(real(values[3]) ** 2 + real(values[4]) ** 2)
def rectangle_field(mesh, filename, epsx=2, epsy=2, voltage=100, width=10, height=10, depth=100):
newdocument(1)
ei_probdef('millimeters', 'planar', 1e-10, depth, 30)
ei_addmaterial('Диэлектрик учебного образца', epsx, epsy, 0)
ei_addconductorprop('Питающий электрод', voltage, 0, 1)
ei_addconductorprop('Заземлённый электрод', 0, 0, 1)
polygon(((0, 0), (width, 0), (width, height), (0, height)))
terminal(0, height / 2, 'Питающий электрод', mesh)
terminal(width, height / 2, 'Заземлённый электрод', mesh)
label(width / 2, height / 2, 'Диэлектрик учебного образца', mesh)
model = directory + '/' + filename + '.fee'
solve(model)
return model
names = ('Фаза A', 'Фаза B', 'Фаза C')
centers = ((0, 6), (-3 * math.sqrt(3), -3), (3 * math.sqrt(3), -3))
for level, mesh in enumerate((0.6, 0.3, 0.15)):
matrix = []
for excitation in range(3):
newdocument(1)
ei_probdef('millimeters', 'planar', 1e-10, 1000, 30)
ei_addmaterial('Изоляция трёхжильного кабеля', 3, 3, 0)
for k, name in enumerate(names):
ei_addconductorprop(name, 1 if k == excitation else 0, 0, 1)
ei_addconductorprop('Общий заземлённый экран', 0, 0, 1)
angle = 4 / (2 ** level)
for k, (x, y) in enumerate(centers):
circle_xy(x, y, 2, names[k], angle)
label(x, y, '<No Mesh>', mesh, 0)
circle(0, 15, 'Общий заземлённый экран', angle)
label(0, 0, 'Изоляция трёхжильного кабеля', mesh)
model = directory + '/matrix-%02d-%s.fee' % (level + 1, 'ABC'[excitation])
solve(model)
row = summary(mesh, model, names[excitation], 'Общий заземлённый экран')
charges = [real(eo_getconductorproperties(name)[1]) for name in names]
row['excited_phase'] = 'ABC'[excitation]
for k, charge in enumerate(charges):
row['C_' + 'ABC'[k] + 'j_F'] = charge
matrix.append(charges)
shield_q = real(eo_getconductorproperties('Общий заземлённый экран')[1])
check('Баланс зарядов фаз и экрана', abs(sum(charges) + shield_q) / abs(charges[excitation]), 1e-5)
eo_close()
ei_close()
reciprocity = max(abs(matrix[i][j] - matrix[j][i]) for i in range(3) for j in range(3)) / max(matrix[k][k] for k in range(3))
check('Взаимность матрицы ёмкостей, сетка ' + str(mesh), reciprocity, 1e-5)
diagonals = [matrix[k][k] for k in range(3)]
check('Поворотная симметрия собственных коэффициентов', (max(diagonals) - min(diagonals)) / max(diagonals), 0.005)
check('Сходимость собственного коэффициента Caa', abs(records[6]['capacitance_F'] / records[3]['capacitance_F'] - 1), 0.005)
columns = {
'mesh_mm': 'Размер сетки, мм', 'model': 'Файл модели',
'nodes': 'Узлов', 'elements': 'Элементов',
'voltage_V': 'Разность потенциалов, В', 'charge_C': 'Заряд, Кл',
'energy_J': 'Энергия, Дж', 'capacitance_F': 'Ёмкость по заряду, Ф',
'energy_capacitance_F': 'Ёмкость по энергии, Ф',
'analytic_capacitance_F': 'Аналитическая ёмкость, Ф',
'analytic_C_relative_error': 'Относительная ошибка ёмкости',
'energy_charge_relative_error': 'Невязка энергии и заряда',
'E_7p5mm_V_m': 'Поле при r=7,5 мм, В/м',
'analytic_E_7p5mm_V_m': 'Аналитическое поле при r=7,5 мм, В/м',
'E_150mm_V_m': 'Поле при r=150 мм, В/м',
'analytic_E_150mm_V_m': 'Аналитическое поле при r=150 мм, В/м',
'outer_radius_mm': 'Радиус внешней границы, мм',
'insulation': 'Изоляция', 'analytic_Emax_kV_mm': 'Аналитический максимум поля, кВ/мм',
'Emax_from_charge_kV_mm': 'Максимум поля по заряду, кВ/мм',
'E_10mm_kV_mm': 'Поле при r=10 мм, кВ/мм',
'E_25mm_kV_mm': 'Поле при r=25 мм, кВ/мм',
'conductivity_S_m': 'Эквивалентная проводимость, См/м',
'I_real_A': 'Активная компонента амплитуды тока, А',
'I_imag_A': 'Квадратурная компонента амплитуды тока, А',
'analytic_I_real_A': 'Аналитическая активная компонента, А',
'analytic_I_imag_A': 'Аналитическая квадратурная компонента, А',
'losses_W': 'Диэлектрические потери, Вт',
'analytic_losses_W': 'Аналитические потери, Вт',
'terminal_power_W': 'Средняя мощность электрода, Вт',
'apparent_power_VA': 'Полная мощность, ВА',
'U_RMS_V': 'Действующее напряжение, В', 'U_amplitude_V': 'Амплитуда напряжения, В'
}
columns.update({'orientation': 'Ориентация главных осей', 'E_center_V_m': 'Поле в центре, В/м', 'E_first_V_m': 'Поле первого слоя, В/м', 'E_second_V_m': 'Поле второго слоя, В/м', 'interface_V': 'Потенциал интерфейса, В', 'floating_voltage_V': 'Потенциал изолированного электрода, В', 'floating_charge_C': 'Заряд изолированного электрода, Кл', 'overlap_mm': 'Перекрытие электродов, мм', 'rounding_radius_mm': 'Радиус скругления, мм', 'E_corner_sample_V_m': 'Поле в 0,2 мм от скругления, В/м', 'screen': 'Исполнение', 'E_inner_sample_V_m': 'Поле в контрольной точке, В/м', 'excited_phase': 'Возбуждённая фаза', 'C_Aj_F': 'Коэффициент строки A, Ф', 'C_Bj_F': 'Коэффициент строки B, Ф', 'C_Cj_F': 'Коэффициент строки C, Ф'})
result = {'runtime': 'FEMM 5.0; встроенный MicroPython', 'records': records,
'checks': checks, 'columns': columns,
'passed': all(item['passed'] for item in checks)}
with open(directory + '/result.json', 'w') as output:
json.dump(result, output)
print(json.dumps(result))
assert result['passed'], 'Не выполнен численный критерий'
Картина рассчитанного поля
Окна FEMM 5
Снимки интерфейса FEMM показывают геометрию, настройки и работу с результатами в FEMM 5. Откройте изображение, чтобы рассмотреть подписи и значения в полном размере.
Результаты и численные проверки
Сохранено решений FEMM: 9. Выполнено проверок: 25. Полная точность чисел и условия сравнения доступны в таблицах результатов JSON.
| Ёмкость по заряду, Ф | Файл модели | Заряд, Кл | Коэффициент строки A, Ф | Узлов | Коэффициент строки B, Ф | Разность потенциалов, В | Ёмкость по энергии, Ф | Возбуждённая фаза | Элементов | Энергия, Дж | Коэффициент строки C, Ф | Размер сетки, мм |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 102,5 × 10⁻¹² | matrix-01-A.fee | 102,5 × 10⁻¹² | 102,5 × 10⁻¹² | 4120 | -19,56 × 10⁻¹² | 1 | 102,5 × 10⁻¹² | A | 7785 | 51,26 × 10⁻¹² | -19,57 × 10⁻¹² | 0,6 |
| 102,5 × 10⁻¹² | matrix-01-B.fee | 102,5 × 10⁻¹² | -19,56 × 10⁻¹² | 4120 | 102,5 × 10⁻¹² | 1 | 102,5 × 10⁻¹² | B | 7785 | 51,26 × 10⁻¹² | -19,57 × 10⁻¹² | 0,6 |
| 102,5 × 10⁻¹² | matrix-01-C.fee | 102,5 × 10⁻¹² | -19,57 × 10⁻¹² | 4120 | -19,57 × 10⁻¹² | 1 | 102,5 × 10⁻¹² | C | 7785 | 51,26 × 10⁻¹² | 102,5 × 10⁻¹² | 0,6 |
| 102,4 × 10⁻¹² | matrix-02-A.fee | 102,4 × 10⁻¹² | 102,4 × 10⁻¹² | 10073 | -19,53 × 10⁻¹² | 1 | 102,4 × 10⁻¹² | A | 19261 | 51,19 × 10⁻¹² | -19,53 × 10⁻¹² | 0,3 |
| 102,4 × 10⁻¹² | matrix-02-B.fee | 102,4 × 10⁻¹² | -19,53 × 10⁻¹² | 10073 | 102,4 × 10⁻¹² | 1 | 102,4 × 10⁻¹² | B | 19261 | 51,19 × 10⁻¹² | -19,53 × 10⁻¹² | 0,3 |
| 102,4 × 10⁻¹² | matrix-02-C.fee | 102,4 × 10⁻¹² | -19,53 × 10⁻¹² | 10073 | -19,53 × 10⁻¹² | 1 | 102,4 × 10⁻¹² | C | 19261 | 51,19 × 10⁻¹² | 102,4 × 10⁻¹² | 0,3 |
| 102,3 × 10⁻¹² | matrix-03-A.fee | 102,3 × 10⁻¹² | 102,3 × 10⁻¹² | 37401 | -19,5 × 10⁻¹² | 1 | 102,3 × 10⁻¹² | A | 73028 | 51,14 × 10⁻¹² | -19,5 × 10⁻¹² | 0,15 |
| 102,3 × 10⁻¹² | matrix-03-B.fee | 102,3 × 10⁻¹² | -19,5 × 10⁻¹² | 37401 | 102,3 × 10⁻¹² | 1 | 102,3 × 10⁻¹² | B | 73028 | 51,14 × 10⁻¹² | -19,5 × 10⁻¹² | 0,15 |
| 102,3 × 10⁻¹² | matrix-03-C.fee | 102,3 × 10⁻¹² | -19,5 × 10⁻¹² | 37401 | -19,5 × 10⁻¹² | 1 | 102,3 × 10⁻¹² | C | 73028 | 51,14 × 10⁻¹² | 102,3 × 10⁻¹² | 0,15 |
| Критерий | Получено | Допуск или ожидаемое значение | Итог |
|---|---|---|---|
| Энергия и терминальный заряд: matrix-01-A.fee | 72,6 × 10⁻¹² | 1e-05 | Выполнен |
| Баланс зарядов фаз и экрана | 157 × 10⁻¹² | 1e-05 | Выполнен |
| Энергия и терминальный заряд: matrix-01-B.fee | 95,56 × 10⁻¹² | 1e-05 | Выполнен |
| Баланс зарядов фаз и экрана | 90,23 × 10⁻¹² | 1e-05 | Выполнен |
| Энергия и терминальный заряд: matrix-01-C.fee | 383,2 × 10⁻¹² | 1e-05 | Выполнен |
| Баланс зарядов фаз и экрана | 1,122 × 10⁻⁹ | 1e-05 | Выполнен |
| Взаимность матрицы ёмкостей, сетка 0.6 | 285,3 × 10⁻¹² | 1e-05 | Выполнен |
| Поворотная симметрия собственных коэффициентов | 92,22 × 10⁻⁶ | 0,005 | Выполнен |
| Энергия и терминальный заряд: matrix-02-A.fee | 283,2 × 10⁻¹² | 1e-05 | Выполнен |
| Баланс зарядов фаз и экрана | 554,3 × 10⁻¹² | 1e-05 | Выполнен |
| Энергия и терминальный заряд: matrix-02-B.fee | 214,8 × 10⁻¹² | 1e-05 | Выполнен |
| Баланс зарядов фаз и экрана | 133,8 × 10⁻¹² | 1e-05 | Выполнен |
| Энергия и терминальный заряд: matrix-02-C.fee | 273,3 × 10⁻¹² | 1e-05 | Выполнен |
| Баланс зарядов фаз и экрана | 493,7 × 10⁻¹² | 1e-05 | Выполнен |
| Взаимность матрицы ёмкостей, сетка 0.3 | 70,79 × 10⁻¹² | 1e-05 | Выполнен |
| Поворотная симметрия собственных коэффициентов | 19,81 × 10⁻⁶ | 0,005 | Выполнен |
| Энергия и терминальный заряд: matrix-03-A.fee | 311,6 × 10⁻¹² | 1e-05 | Выполнен |
| Баланс зарядов фаз и экрана | 250,6 × 10⁻¹² | 1e-05 | Выполнен |
| Энергия и терминальный заряд: matrix-03-B.fee | 190,1 × 10⁻¹² | 1e-05 | Выполнен |
| Баланс зарядов фаз и экрана | 202,9 × 10⁻¹² | 1e-05 | Выполнен |
| Энергия и терминальный заряд: matrix-03-C.fee | 250,2 × 10⁻¹² | 1e-05 | Выполнен |
| Баланс зарядов фаз и экрана | 1,453 × 10⁻⁹ | 1e-05 | Выполнен |
| Взаимность матрицы ёмкостей, сетка 0.15 | 620,8 × 10⁻¹² | 1e-05 | Выполнен |
| Поворотная симметрия собственных коэффициентов | 2,954 × 10⁻⁶ | 0,005 | Выполнен |
| Сходимость собственного коэффициента Caa | 849,6 × 10⁻⁶ | 0,005 | Выполнен |
Допуски относятся к указанной учебной задаче и способу сравнения. Число показанных цифр не означает такой же физической точности.
Модели, решения и программа
Для нового расчёта сохраните программу, модели и необходимые данные в одну рабочую папку, сохраняя структуру подпапок.
- Файл результатов: README.md1174 байт
- Электростатическая модель: matrix-01-A.fee1520 байт
- Электростатическое решение: matrix-01-A.res390895 байт
- Электростатическая модель: matrix-01-B.fee1520 байт
- Электростатическое решение: matrix-01-B.res390890 байт
- Электростатическая модель: matrix-01-C.fee1520 байт
- Электростатическое решение: matrix-01-C.res391056 байт
- Электростатическая модель: matrix-02-A.fee1520 байт
- Электростатическое решение: matrix-02-A.res970903 байт
- Электростатическая модель: matrix-02-B.fee1520 байт
- Электростатическое решение: matrix-02-B.res971145 байт
- Электростатическая модель: matrix-02-C.fee1520 байт
- Электростатическое решение: matrix-02-C.res971019 байт
- Электростатическая модель: matrix-03-A.fee1520 байт
- Электростатическое решение: matrix-03-A.res3829879 байт
- Электростатическая модель: matrix-03-B.fee1520 байт
- Электростатическое решение: matrix-03-B.res3829778 байт
- Электростатическая модель: matrix-03-C.fee1520 байт
- Электростатическое решение: matrix-03-C.res3829423 байт
- Программа встроенного Python: reproduce.py12272 байт
Границы применимости
- Матрица относится к квазистатической однородной изоляции данного сечения.
- Торцы, броня, полупроводящие слои и частотная дисперсия не включены.