Электростатика · Плоскопараллельная
Изолированная металлическая вставка: потенциал ищет решатель
Поместите нейтральную металлическую пластину между питающим и заземлённым электродами. Её потенциал не задаётся: известен только нулевой суммарный заряд. Объясните, почему ёмкость определяется суммой толщин зазоров.
Самостоятельная учебная модель FEMM 5: от физических соотношений к полевому решению и проверке результата.
Допущения и устройство учебной модели
| Учебная модель FEMM 5 | Причина |
|---|---|
| Две поверхности составляют один проводник с q=0 | Решатель находит общий неизвестный потенциал. |
| Поле внутри металла исключено | В металлической вставке нет диэлектрического падения напряжения. |
Все размеры, свойства материалов и условия возбуждения заданы ниже. Численные результаты относятся к опубликованной версии модели FEMM 5.
Физическая и математическая постановка
Электростатическая индукция в металле
Поле внутри идеального проводника равно нулю, поэтому металл является эквипотенциальным. На противоположных поверхностях возникают заряды разных знаков, но их сумма для изолированной нейтральной пластины остаётся нулевой. Потенциал вставки определяется связанной полевой задачей.
Симметричный контроль
При равных зазорах по 4 мм потенциал вставки должен составлять половину 100 В. Толщина металла 2 мм в знаменатель ёмкости не входит. FEMM проверяет Vf=50 В, нулевой суммарный заряд и точную последовательную ёмкость.
Вставка исключена из диэлектрической сетки. Две её поверхности назначены одному именованному проводнику; две независимые границы с неопределёнными потенциалами задали бы другую задачу.
Исходные данные
Плоскопараллельная
| Параметр | Значение | Единица | Происхождение |
|---|---|---|---|
| Зазоры слева и справа | 4; 4 | мм | Условие учебной задачи |
| Толщина вставки | 2 | мм | Условие учебной задачи |
| Высота | 10 | мм | Условие учебной задачи |
| Глубина | 100 | мм | Условие учебной задачи |
| Проницаемость | 3 | 1 | Условие учебной задачи |
| Напряжение | 100 | В | Условие учебной задачи |
| Суммарный заряд вставки | 0 | Кл | Условие учебной задачи |
Порядок воспроизведения
- Изучите размеры, материалы, возбуждение и выбранную двумерную постановку. Сначала вычислите аналитический ориентир в единицах СИ.
- Скачайте файлы по отдельным ссылкам в отдельную рабочую папку. Откройте 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
exact = EPS0 * 3 * 0.01 * 0.1 / 0.008
for level, mesh in enumerate((1, 0.5, 0.25)):
newdocument(1)
ei_probdef('millimeters', 'planar', 1e-10, 100, 30)
ei_addmaterial('Диэлектрик зазоров', 3, 3, 0)
ei_addconductorprop('Питающий электрод', 100, 0, 1)
ei_addconductorprop('Заземлённый электрод', 0, 0, 1)
ei_addconductorprop('Изолированная металлическая вставка', 0, 0, 0)
polygon(((0, 0), (4, 0), (6, 0), (10, 0), (10, 10), (6, 10), (4, 10), (0, 10)))
ei_addsegment(4, 0, 4, 10)
ei_addsegment(6, 0, 6, 10)
terminal(0, 5, 'Питающий электрод', mesh)
terminal(10, 5, 'Заземлённый электрод', mesh)
for x in (4, 6):
terminal(x, 5, 'Изолированная металлическая вставка', mesh)
label(2, 5, 'Диэлектрик зазоров', mesh)
label(8, 5, 'Диэлектрик зазоров', mesh)
label(5, 5, '<No Mesh>', mesh, 0)
model = directory + '/floating-%02d.fee' % (level + 1)
solve(model)
row = summary(mesh, model, 'Питающий электрод', 'Заземлённый электрод', exact)
vf, qf = eo_getconductorproperties('Изолированная металлическая вставка')
row['floating_voltage_V'], row['floating_charge_C'] = real(vf), real(qf)
check('Потенциал плавающей вставки', abs(real(vf) / 50 - 1), 1e-5)
check('Нулевой суммарный заряд вставки', abs(real(qf)), 1e-15)
check('Ёмкость двух воздушных зазоров', row['analytic_C_relative_error'], 1e-5)
eo_close()
ei_close()
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: 3. Выполнено проверок: 12. Полная точность чисел и условия сравнения доступны в таблицах результатов JSON.
| Ёмкость по заряду, Ф | Аналитическая ёмкость, Ф | Заряд, Кл | Файл модели | Узлов | Заряд изолированного электрода, Кл | Разность потенциалов, В | Ёмкость по энергии, Ф | Потенциал изолированного электрода, В | Элементов | Относительная ошибка ёмкости | Энергия, Дж | Размер сетки, мм |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 3,3203204 × 10⁻¹² | 3,3203204 × 10⁻¹² | 332,03204 × 10⁻¹² | floating-01.fee | 3960 | 0 | 100 | 3,3203204 × 10⁻¹² | 50 | 7518 | 24,118485 × 10⁻¹² | 16,601602 × 10⁻⁹ | 1 |
| 3,3203204 × 10⁻¹² | 3,3203204 × 10⁻¹² | 332,03204 × 10⁻¹² | floating-02.fee | 3960 | 0 | 100 | 3,3203204 × 10⁻¹² | 50 | 7518 | 24,118485 × 10⁻¹² | 16,601602 × 10⁻⁹ | 0,5 |
| 3,3203204 × 10⁻¹² | 3,3203204 × 10⁻¹² | 332,03204 × 10⁻¹² | floating-03.fee | 3960 | 0 | 100 | 3,3203204 × 10⁻¹² | 50 | 7518 | 24,118485 × 10⁻¹² | 16,601602 × 10⁻⁹ | 0,25 |
| Критерий | Получено | Допуск или ожидаемое значение | Итог |
|---|---|---|---|
| Энергия и терминальный заряд: floating-01.fee | 109,2 × 10⁻¹² | 1e-05 | Выполнен |
| Потенциал плавающей вставки | 2,613 × 10⁻¹² | 1e-05 | Выполнен |
| Нулевой суммарный заряд вставки | 0 | 1e-15 | Выполнен |
| Ёмкость двух воздушных зазоров | 24,12 × 10⁻¹² | 1e-05 | Выполнен |
| Энергия и терминальный заряд: floating-02.fee | 109,2 × 10⁻¹² | 1e-05 | Выполнен |
| Потенциал плавающей вставки | 2,613 × 10⁻¹² | 1e-05 | Выполнен |
| Нулевой суммарный заряд вставки | 0 | 1e-15 | Выполнен |
| Ёмкость двух воздушных зазоров | 24,12 × 10⁻¹² | 1e-05 | Выполнен |
| Энергия и терминальный заряд: floating-03.fee | 109,2 × 10⁻¹² | 1e-05 | Выполнен |
| Потенциал плавающей вставки | 2,613 × 10⁻¹² | 1e-05 | Выполнен |
| Нулевой суммарный заряд вставки | 0 | 1e-15 | Выполнен |
| Ёмкость двух воздушных зазоров | 24,12 × 10⁻¹² | 1e-05 | Выполнен |
Допуски относятся к указанной учебной задаче и способу сравнения. Число показанных цифр не означает такой же физической точности.
Модели, решения и программа
Для нового расчёта сохраните программу, модели и необходимые данные в одну рабочую папку, сохраняя структуру подпапок.
- Файл результатов: README.md1191 байт
- Электростатическая модель: floating-01.fee1318 байт
- Электростатическое решение: floating-01.res357450 байт
- Электростатическая модель: floating-02.fee1330 байт
- Электростатическое решение: floating-02.res357462 байт
- Электростатическая модель: floating-03.fee1336 байт
- Электростатическое решение: floating-03.res357468 байт
- Программа встроенного Python: reproduce.py11779 байт
Границы применимости
- Боковые краевые поля исключены естественными условиями.
- Задан нулевой начальный суммарный заряд; для заряженной вставки ответ изменится.