FEMM 5

Электростатика · Осесимметричная

Сферический конденсатор: заданный заряд и осевая симметрия

Задайте заряд изолированной внутренней сферы и найдите её потенциал, ёмкость и энергию. Этот пример показывает, как вращение меридионального сечения восстанавливает объём сферы без ручного множителя 2πr.

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

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

Принятые допущения и их назначение
Учебная модель FEMM 5Причина
Правое меридиональное полукольцо вращается вокруг оси zТочно воспроизводит концентрические сферы.
Внутренний проводник имеет заданный заряд и неизвестный потенциалУчит выбирать разные типы условий проводника.
Глобальные интегралы и поле при r=150 мм проверяются отдельноПроверяются ёмкость, энергия и локальный закон Кулона.

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

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

Сферический закон поля

Для концентрических сфер поток D через сферу радиуса r равен заряду q. Площадь поверхности растёт как r², поэтому напряжённость убывает как 1/r². Интегрирование от a до b даёт потенциал внутренней сферы относительно заземлённой внешней.

E(r)=\frac{q}{4\pi\varepsilon_0\varepsilon_r r^2},\quad U=\frac{q}{4\pi\varepsilon_0\varepsilon_r}\left(\frac1a-\frac1b\right)
C=4\pi\varepsilon_0\varepsilon_r\frac{ab}{b-a}

Условие заряда вместо условия потенциала

Внутреннему проводнику задаётся суммарный заряд 1 нКл; FEMM ищет постоянный потенциал этого проводника. Ожидаются U≈44,94 В и C≈22,253 пФ. Энергия даёт дополнительное значение C_W=2W/U².

В осесимметричной модели горизонтальная координата — радиус r≥0, вертикальная — z. Вычисленный заряд и энергия уже относятся ко всей сфере. Дополнительное умножение результата на 2π приводит к ошибке.

W=\frac{q^2}{2C}

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

Осесимметричная

Величины, единицы и происхождение параметров
ПараметрЗначениеЕдиницаПроисхождение
Радиус внутренней сферы a100ммУсловие учебной задачи
Радиус внешней сферы b200ммУсловие учебной задачи
Заряд внутренней сферы q1 × 10⁻⁹КлУсловие учебной задачи
Относительная проницаемость11Условие учебной задачи

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

  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


exact_C = 4 * math.pi * EPS0 * 0.1 * 0.2 / (0.2 - 0.1)


def hemisphere(radius, conductor, angle):
    ei_addnode(0, -radius)
    ei_addnode(radius, 0)
    ei_addnode(0, radius)
    ei_addarc(0, -radius, radius, 0, 90, angle)
    ei_addarc(radius, 0, 0, radius, 90, angle)
    p = radius / math.sqrt(2)
    ei_selectarcsegment(p, -p)
    ei_selectarcsegment(p, p)
    ei_setarcsegmentprop(angle, '<None>', 0, 0, conductor)
    ei_clearselected()


for level, mesh in enumerate((8, 4, 2)):
    newdocument(1)
    ei_probdef('millimeters', 'axi', 1e-10, 1, 30)
    ei_addmaterial('Вакуум между сферами', 1, 1, 0)
    ei_addconductorprop('Заряженная внутренняя сфера', 0, 1e-9, 0)
    ei_addconductorprop('Заземлённая внешняя сфера', 0, 0, 1)
    angle = 4 / (2 ** level)
    hemisphere(100, 'Заряженная внутренняя сфера', angle)
    hemisphere(200, 'Заземлённая внешняя сфера', angle)
    ei_addsegment(0, 100, 0, 200)
    ei_addsegment(0, -200, 0, -100)
    label(150, 0, 'Вакуум между сферами', mesh)
    model = directory + '/sphere-%02d.fee' % (level + 1)
    solve(model)
    row = electric_result(mesh, model, 'Заряженная внутренняя сфера',
                          'Заземлённая внешняя сфера', exact_C)
    values = eo_getpointvalues(150, 0)
    field = math.sqrt(real(values[3]) ** 2 + real(values[4]) ** 2)
    expected = 1e-9 / (4 * math.pi * EPS0 * 0.15 ** 2)
    row['E_150mm_V_m'] = field
    row['analytic_E_150mm_V_m'] = expected
    check('Заданный заряд сохранён', abs(row['charge_C'] / 1e-9 - 1), 1e-6)
    check('Закон Кулона в средней точке, сетка %d' % (level + 1),
          abs(field / expected - 1), 0.035)
    eo_close()
    ei_close()
check('Ёмкость по сферической формуле', records[-1]['analytic_C_relative_error'], 0.002)
check('Сходимость ёмкости', abs(records[-1]['capacitance_F'] /
      records[-2]['capacitance_F'] - 1), 0.002)

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'], 'Не выполнен численный критерий'

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

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

Окна FEMM 5

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

Осесимметричная модель сферического конденсатора в FEMM 5: показано меридиональное сечение при r ≥ 0 и вакуум между сферическими электродами.
Осесимметричная модель сферического конденсатора в FEMM 5: показано меридиональное сечение при r ≥ 0 и вакуум между сферическими электродами. Открыть в полном размере
Нативное решение сферического конденсатора с заданным зарядом: потенциал V в вольтах и эквипотенциали в меридиональном сечении.
Нативное решение сферического конденсатора с заданным зарядом: потенциал V в вольтах и эквипотенциали в меридиональном сечении. Открыть в полном размере

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

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

Результаты расчётов и производные итоги
Ёмкость по заряду, ФФайл моделиЗаряд, КлАналитическая ёмкость, ФУзловНевязка энергии и зарядаПоле при r=150 мм, В/мРазность потенциалов, ВЁмкость по энергии, ФАналитическое поле при r=150 мм, В/мЭлементовОтносительная ошибка ёмкостиЭнергия, ДжРазмер сетки, мм
22,260682 × 10⁻¹²sphere-01.fee1 × 10⁻⁹22,253001 × 10⁻¹²236315,987212 × 10⁻¹⁵412,6387944,92225422,260682 × 10⁻¹²399,446754470345,15719 × 10⁻⁶22,461127 × 10⁻⁹8
22,261878 × 10⁻¹²sphere-02.fee1 × 10⁻⁹22,253001 × 10⁻¹²35772,3314684 × 10⁻¹⁵399,5392944,91984122,261878 × 10⁻¹²399,446756811398,89104 × 10⁻⁶22,45992 × 10⁻⁹4
22,255176 × 10⁻¹²sphere-03.fee1 × 10⁻⁹22,253001 × 10⁻¹²139372,3314684 × 10⁻¹⁵401,2065544,93336722,255176 × 10⁻¹²399,446752722997,752174 × 10⁻⁶22,466683 × 10⁻⁹2
Проверки опубликованного расчёта
КритерийПолученоДопуск или ожидаемое значениеИтог
Энергия и заряд: sphere-01.fee15,99 × 10⁻¹⁵1e-05Выполнен
Заданный заряд сохранён01e-06Выполнен
Закон Кулона в средней точке, сетка 10,033030,035Выполнен
Энергия и заряд: sphere-02.fee2,331 × 10⁻¹⁵1e-05Выполнен
Заданный заряд сохранён01e-06Выполнен
Закон Кулона в средней точке, сетка 2231,7 × 10⁻⁶0,035Выполнен
Энергия и заряд: sphere-03.fee2,331 × 10⁻¹⁵1e-05Выполнен
Заданный заряд сохранён01e-06Выполнен
Закон Кулона в средней точке, сетка 30,0044060,035Выполнен
Ёмкость по сферической формуле97,75 × 10⁻⁶0,002Выполнен
Сходимость ёмкости301 × 10⁻⁶0,002Выполнен

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

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

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

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

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