FEMM 5

Электростатика · Плоскопараллельная

Трёхжильный кабель: матрица Максвелла и взаимность

Восстановите полную матрицу ёмкостных коэффициентов трёх фаз внутри общего экрана. Каждый её столбец получается отдельным единичным возбуждением; взаимность и симметрия становятся независимыми численными проверками.

Самостоятельная учебная модель FEMM 5: от физических соотношений к полевому решению и проверке результата.

Допущения и устройство учебной модели

Принятые допущения и их назначение
Учебная модель FEMM 5Причина
Три независимых фазовых проводника A, B, C и общий экранМожно собрать полную матрицу ёмкостных коэффициентов.
Одинаковая геометрия при повороте на 120°Поворотная симметрия служит проверкой сетки.

Все размеры, свойства материалов и условия возбуждения заданы ниже. Численные результаты относятся к опубликованной версии модели FEMM 5.

Физическая и математическая постановка

От одного конденсатора к системе проводников

Заряды трёх фаз линейно зависят от их потенциалов относительно экрана. Для j-го столбца задаются Vj=1 В, остальные фазовые потенциалы и потенциал экрана равны нулю. Заряды фаз непосредственно дают Cij.

Диагональные коэффициенты положительны, взаимные коэффициенты в матрице Максвелла отрицательны. Это не та же таблица, что положительные ёмкости ветвей эквивалентной схемы; соглашения нельзя смешивать.

q_i=\sum_j C_{ij}V_j,\quad W=\frac12\mathbf V^T\mathbf C\mathbf V,\quad C_{ij}=C_{ji}

Три возбуждения на каждой сетке

Жилы одинакового радиуса размещены по вершинам равностороннего треугольника. Поэтому диагональные коэффициенты должны совпадать с точностью дискретизации. Программа выполняет девять решений: три возбуждения на трёх сетках.

Проверяются баланс зарядов всех фаз и экрана, энергия единичного возбуждения, взаимность матрицы, поворотная симметрия и сеточная устойчивость Caa. Отрицательные взаимные коэффициенты не являются отрицательной запасённой энергией.

Исходные данные

Плоскопараллельная

Величины, единицы и происхождение параметров
ПараметрЗначениеЕдиницаПроисхождение
Радиус каждой жилы2ммУсловие учебной задачи
Радиус расположения осей жил6ммУсловие учебной задачи
Радиус общего экрана15ммУсловие учебной задачи
Длина участка1мУсловие учебной задачи
Проницаемость изоляции31Условие учебной задачи
Единичное фазовое возбуждение1ВУсловие учебной задачи

Порядок воспроизведения

  1. Изучите размеры, материалы, возбуждение и выбранную двумерную постановку. Сначала вычислите аналитический ориентир в единицах СИ.
  2. Скачайте файлы по отдельным ссылкам в отдельную рабочую папку. Откройте reproduce.py во встроенном редакторе Python FEMM 5 и выполните сохранённый файл.
  3. Программа строит русифицированные модели, сохраняет их, закрывает и открывает заново. Затем выполняет расчёт и читает свойства проводников по точному русскому имени.
  4. Сравните три уровня пространственной сетки. В таблицах сохранены число узлов и элементов, интегральные величины и независимые критерии. Дополнительные режимы указаны в постановке.
  5. Откройте самый подробный сохранённый вход и соответствующее решение. Проверьте смысл единиц, знаков и объёмного множителя; новый запуск сохранит результаты в новой папке calculated-NN.

Скачайте нужные файлы по отдельным ссылкам ниже в одну рабочую папку, затем откройте reproduce.py во встроенном Python FEMM 5 и выполните его. Сохраните имена файлов и структуру подпапок. Условия конкретного запуска и путь новых результатов указаны в комментариях программы.

Программа встроенного Python FEMM 5
Python · reproduce.py
"""Матрица ёмкостей трёхжильного кабеля.
Среда: встроенный 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'], 'Не выполнен численный критерий'

Картина рассчитанного поля

Потенциал, В: matrix-03-C.res
Визуализация сохранённого решения FEMM 5 matrix-03-C.res. Электрический потенциал по сохранённым узловым значениям. Показана расчётная область. Контуры деталей взяты из той же модели. Области вне сохранённых треугольников не заполняются. Это научный график сохранённых данных. Нажмите на карту, чтобы открыть её отдельно и увеличить.

Окна FEMM 5

Снимки интерфейса FEMM показывают геометрию, настройки и работу с результатами в FEMM 5. Откройте изображение, чтобы рассмотреть подписи и значения в полном размере.

Рабочая область модели «Трёхжильный кабель: матрица Максвелла и взаимность». Нативный препроцессор FEMM 5.
Рабочая область модели «Трёхжильный кабель: матрица Максвелла и взаимность». Нативный препроцессор FEMM 5. Открыть в полном размере
Сохранённое решение «Трёхжильный кабель: матрица Максвелла и взаимность». Базисное поле для матрицы ёмкостей: потенциал V, В, при возбуждении одной жилы напряжением 1 В.
Сохранённое решение «Трёхжильный кабель: матрица Максвелла и взаимность». Базисное поле для матрицы ёмкостей: потенциал V, В, при возбуждении одной жилы напряжением 1 В. Открыть в полном размере

Результаты и численные проверки

Сохранено решений FEMM: 9. Выполнено проверок: 25. Полная точность чисел и условия сравнения доступны в таблицах результатов JSON.

Результаты расчётов и производные итоги
Ёмкость по заряду, ФФайл моделиЗаряд, КлКоэффициент строки A, ФУзловКоэффициент строки B, ФРазность потенциалов, ВЁмкость по энергии, ФВозбуждённая фазаЭлементовЭнергия, ДжКоэффициент строки C, ФРазмер сетки, мм
102,5 × 10⁻¹²matrix-01-A.fee102,5 × 10⁻¹²102,5 × 10⁻¹²4120-19,56 × 10⁻¹²1102,5 × 10⁻¹²A778551,26 × 10⁻¹²-19,57 × 10⁻¹²0,6
102,5 × 10⁻¹²matrix-01-B.fee102,5 × 10⁻¹²-19,56 × 10⁻¹²4120102,5 × 10⁻¹²1102,5 × 10⁻¹²B778551,26 × 10⁻¹²-19,57 × 10⁻¹²0,6
102,5 × 10⁻¹²matrix-01-C.fee102,5 × 10⁻¹²-19,57 × 10⁻¹²4120-19,57 × 10⁻¹²1102,5 × 10⁻¹²C778551,26 × 10⁻¹²102,5 × 10⁻¹²0,6
102,4 × 10⁻¹²matrix-02-A.fee102,4 × 10⁻¹²102,4 × 10⁻¹²10073-19,53 × 10⁻¹²1102,4 × 10⁻¹²A1926151,19 × 10⁻¹²-19,53 × 10⁻¹²0,3
102,4 × 10⁻¹²matrix-02-B.fee102,4 × 10⁻¹²-19,53 × 10⁻¹²10073102,4 × 10⁻¹²1102,4 × 10⁻¹²B1926151,19 × 10⁻¹²-19,53 × 10⁻¹²0,3
102,4 × 10⁻¹²matrix-02-C.fee102,4 × 10⁻¹²-19,53 × 10⁻¹²10073-19,53 × 10⁻¹²1102,4 × 10⁻¹²C1926151,19 × 10⁻¹²102,4 × 10⁻¹²0,3
102,3 × 10⁻¹²matrix-03-A.fee102,3 × 10⁻¹²102,3 × 10⁻¹²37401-19,5 × 10⁻¹²1102,3 × 10⁻¹²A7302851,14 × 10⁻¹²-19,5 × 10⁻¹²0,15
102,3 × 10⁻¹²matrix-03-B.fee102,3 × 10⁻¹²-19,5 × 10⁻¹²37401102,3 × 10⁻¹²1102,3 × 10⁻¹²B7302851,14 × 10⁻¹²-19,5 × 10⁻¹²0,15
102,3 × 10⁻¹²matrix-03-C.fee102,3 × 10⁻¹²-19,5 × 10⁻¹²37401-19,5 × 10⁻¹²1102,3 × 10⁻¹²C7302851,14 × 10⁻¹²102,3 × 10⁻¹²0,15
Проверки опубликованного расчёта
КритерийПолученоДопуск или ожидаемое значениеИтог
Энергия и терминальный заряд: matrix-01-A.fee72,6 × 10⁻¹²1e-05Выполнен
Баланс зарядов фаз и экрана157 × 10⁻¹²1e-05Выполнен
Энергия и терминальный заряд: matrix-01-B.fee95,56 × 10⁻¹²1e-05Выполнен
Баланс зарядов фаз и экрана90,23 × 10⁻¹²1e-05Выполнен
Энергия и терминальный заряд: matrix-01-C.fee383,2 × 10⁻¹²1e-05Выполнен
Баланс зарядов фаз и экрана1,122 × 10⁻⁹1e-05Выполнен
Взаимность матрицы ёмкостей, сетка 0.6285,3 × 10⁻¹²1e-05Выполнен
Поворотная симметрия собственных коэффициентов92,22 × 10⁻⁶0,005Выполнен
Энергия и терминальный заряд: matrix-02-A.fee283,2 × 10⁻¹²1e-05Выполнен
Баланс зарядов фаз и экрана554,3 × 10⁻¹²1e-05Выполнен
Энергия и терминальный заряд: matrix-02-B.fee214,8 × 10⁻¹²1e-05Выполнен
Баланс зарядов фаз и экрана133,8 × 10⁻¹²1e-05Выполнен
Энергия и терминальный заряд: matrix-02-C.fee273,3 × 10⁻¹²1e-05Выполнен
Баланс зарядов фаз и экрана493,7 × 10⁻¹²1e-05Выполнен
Взаимность матрицы ёмкостей, сетка 0.370,79 × 10⁻¹²1e-05Выполнен
Поворотная симметрия собственных коэффициентов19,81 × 10⁻⁶0,005Выполнен
Энергия и терминальный заряд: matrix-03-A.fee311,6 × 10⁻¹²1e-05Выполнен
Баланс зарядов фаз и экрана250,6 × 10⁻¹²1e-05Выполнен
Энергия и терминальный заряд: matrix-03-B.fee190,1 × 10⁻¹²1e-05Выполнен
Баланс зарядов фаз и экрана202,9 × 10⁻¹²1e-05Выполнен
Энергия и терминальный заряд: matrix-03-C.fee250,2 × 10⁻¹²1e-05Выполнен
Баланс зарядов фаз и экрана1,453 × 10⁻⁹1e-05Выполнен
Взаимность матрицы ёмкостей, сетка 0.15620,8 × 10⁻¹²1e-05Выполнен
Поворотная симметрия собственных коэффициентов2,954 × 10⁻⁶0,005Выполнен
Сходимость собственного коэффициента Caa849,6 × 10⁻⁶0,005Выполнен

Допуски относятся к указанной учебной задаче и способу сравнения. Число показанных цифр не означает такой же физической точности.

Модели, решения и программа

Для нового расчёта сохраните программу, модели и необходимые данные в одну рабочую папку, сохраняя структуру подпапок.

Полные численные результаты

Границы применимости