FEMM 5

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

Два провода: ёмкость и контроль открытой области

Найдите взаимную ёмкость двух проводов разных радиусов. Здесь требуется контролировать и сетку около тонкого провода, и удаление искусственной внешней границы.

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

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

Принятые допущения и их назначение
Учебная модель FEMM 5Причина
Противоположные заданные заряды и удалённая граница V=0Фиксируется электростатическая задача и определяется разность потенциалов пары.
Локально сгущённые воздушные подобласти около обоих проводовМалый провод требует меньших элементов.
Четыре состояния: три сетки и увеличенная областьОтдельно контролируется чувствительность к усечению области.

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

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

Аналитический ориентир для пары проводов

Для двух непересекающихся цилиндров расстояние d измеряется между осями. Решение в биполярных координатах даёт взаимную ёмкость длинного участка в однородном диэлектрике. При указанных размерах результат равен примерно 18,359 пФ на метр.

Проводникам задаются заряды +q и −q. Отношение q к разности их потенциалов определяет ёмкость пары; отдельный потенциал относительно удалённой опорной границы в это определение не входит.

C=\frac{2\pi\varepsilon_0\varepsilon_r l}{\operatorname{arcosh}\left((d^2-a_1^2-a_2^2)/(2a_1a_2)\right)},\quad d>a_1+a_2

Разделение двух численных ограничений

Три расчёта с внешним радиусом 80 мм уточняют сетку. Четвёртый расчёт переносит границу на 160 мм и сохраняет локальную сетку около проводов. Дополнительные круговые подобласти заполнены тем же воздухом; они нужны только для задания мелких элементов там, где быстро меняется поле.

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

C=\frac{q}{V_+-V_-},\qquad W=\frac12q(V_+-V_-)

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

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

Величины, единицы и происхождение параметров
ПараметрЗначениеЕдиницаПроисхождение
Радиус первого провода a₁4ммУсловие учебной задачи
Радиус второго провода a₂1ммУсловие учебной задачи
Межосевое расстояние d10ммУсловие учебной задачи
Длина участка1мУсловие учебной задачи
Модуль заряда каждого провода1 × 10⁻⁹КлУсловие учебной задачи
Радиусы внешней границы80; 160ммУсловие учебной задачи

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

  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


# acosh(x) = ln(x+sqrt(x^2-1)); расстояние d задано между центрами.
x = (10 ** 2 - 4 ** 2 - 1 ** 2) / (2 * 4 * 1)
exact_C = 2 * math.pi * EPS0 / math.log(x + math.sqrt(x ** 2 - 1))
for level, settings in enumerate(((80, 6, 4), (80, 3, 2), (80, 1.5, 1), (160, 3, 1))):
    radius, mesh, angle = settings
    newdocument(1)
    ei_probdef('millimeters', 'planar', 1e-10, 1000, 30)
    ei_addmaterial('Воздух вокруг проводов', 1, 1, 0)
    ei_addconductorprop('Положительно заряженный провод', 0, 1e-9, 0)
    ei_addconductorprop('Отрицательно заряженный провод', 0, -1e-9, 0)
    ei_addconductorprop('Удалённая опорная граница', 0, 0, 1)
    circle(-5, 4, 'Положительно заряженный провод', angle)
    circle(5, 1, 'Отрицательно заряженный провод', angle)
    # Воздушные подобласти служат только для локального контроля сетки.
    circle(-5, 6, '<None>', angle)
    circle(5, 3, '<None>', angle)
    circle(0, radius, 'Удалённая опорная граница', 4)
    label(-5, 0, '<No Mesh>', mesh, 0)
    label(5, 0, '<No Mesh>', mesh, 0)
    circle(0, 20, '<None>', angle)
    label(0, 10, 'Воздух вокруг проводов', 0.8 / (2 ** min(level, 2)))
    label(0, 30, 'Воздух вокруг проводов', mesh)
    local_mesh = 0.4 / (2 ** min(level, 2))
    label(-5, 5, 'Воздух вокруг проводов', local_mesh)
    label(5, 2, 'Воздух вокруг проводов', local_mesh)
    model = directory + '/wires-%02d.fee' % (level + 1)
    solve(model)
    row = electric_result(mesh, model, 'Положительно заряженный провод',
                          'Отрицательно заряженный провод', exact_C)
    row['outer_radius_mm'] = radius
    check('Баланс зарядов пары', abs(real(eo_getconductorproperties(
          'Отрицательно заряженный провод')[1]) + row['charge_C']) / 1e-9, 1e-6)
    eo_close()
    ei_close()
check('Сходимость ёмкости при R=80 мм', abs(records[2]['capacitance_F'] /
      records[1]['capacitance_F'] - 1), 0.003)
check('Контроль удаления внешней границы 80→160 мм',
      abs(records[3]['capacitance_F'] / records[2]['capacitance_F'] - 1), 0.005)
check('Ёмкость в сравнении с бесконечной областью',
      records[-1]['analytic_C_relative_error'], 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': 'Амплитуда напряжения, В'
}
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'], 'Не выполнен численный критерий'

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

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

Окна FEMM 5

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

Рабочая область двухпроводной электростатической модели. Увеличены проводники и окружающий воздух; внешняя открытая область продолжается за пределами кадра.
Рабочая область двухпроводной электростатической модели. Увеличены проводники и окружающий воздух; внешняя открытая область продолжается за пределами кадра. Открыть в полном размере
Сохранённое решение «Два провода: ёмкость и контроль открытой области». Цвет показывает потенциал V в вольтах; чёрные линии — эквипотенциали. Увеличена область около проводов.
Сохранённое решение «Два провода: ёмкость и контроль открытой области». Цвет показывает потенциал V в вольтах; чёрные линии — эквипотенциали. Увеличена область около проводов. Открыть в полном размере

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

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

Результаты расчётов и производные итоги
Ёмкость по заряду, ФФайл моделиЗаряд, КлАналитическая ёмкость, ФУзловНевязка энергии и зарядаРадиус внешней границы, ммРазность потенциалов, ВЁмкость по энергии, ФЭлементовОтносительная ошибка ёмкостиЭнергия, ДжРазмер сетки, мм
18,49531 × 10⁻¹²wires-01.fee1 × 10⁻⁹18,359256 × 10⁻¹²697960,396133 × 10⁻¹⁵8054,0677618,49531 × 10⁻¹²135850,00741068127,03388 × 10⁻⁹6
18,451683 × 10⁻¹²wires-02.fee1 × 10⁻⁹18,359256 × 10⁻¹²1590420,872193 × 10⁻¹⁵8054,195618,451683 × 10⁻¹²312570,005034341627,0978 × 10⁻⁹3
18,432923 × 10⁻¹²wires-03.fee1 × 10⁻⁹18,359256 × 10⁻¹²56205717,20407 × 10⁻¹⁵8054,25075718,432923 × 10⁻¹²1113330,004012519627,125378 × 10⁻⁹1,5
18,385731 × 10⁻¹²wires-04.fee1 × 10⁻⁹18,359256 × 10⁻¹²56926703,21526 × 10⁻¹⁵16054,39000418,385731 × 10⁻¹²1127740,001442076427,195002 × 10⁻⁹3
Проверки опубликованного расчёта
КритерийПолученоДопуск или ожидаемое значениеИтог
Энергия и заряд: wires-01.fee60,4 × 10⁻¹⁵1e-05Выполнен
Баланс зарядов пары01e-06Выполнен
Энергия и заряд: wires-02.fee20,87 × 10⁻¹⁵1e-05Выполнен
Баланс зарядов пары01e-06Выполнен
Энергия и заряд: wires-03.fee717,2 × 10⁻¹⁵1e-05Выполнен
Баланс зарядов пары01e-06Выполнен
Энергия и заряд: wires-04.fee703,2 × 10⁻¹⁵1e-05Выполнен
Баланс зарядов пары01e-06Выполнен
Сходимость ёмкости при R=80 мм0,0010170,003Выполнен
Контроль удаления внешней границы 80→160 мм0,002560,005Выполнен
Ёмкость в сравнении с бесконечной областью0,0014420,005Выполнен

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

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

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

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

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