Гармоническое магнитное поле · Плоскопараллельная
Проводник в ферромагнитном пазу: вытеснение и потери
Ферромагнитные стенки паза усиливают и изменяют поперечное поле медного проводника. Поэтому потери зависят не только от частоты и площади меди, но и от окружающей магнитной геометрии. Работа сравнивает проводник в открытом воздушном окружении и в U-образном линейном магнитопроводе. Одинаковые токи и размеры позволяют выделить влияние проницаемости стенок.
Сечение медного проводника 6×12 мм, амплитуда тока 100 А, проводимость 57 МСм/м. Паз имеет ширину 16 мм, дно на y=−10 мм и выход на y=25 мм; наружная ширина магнитопровода 40 мм. Обратный провод расположен на x=70 мм. Частоты 50, 500 и 2000 Гц исследуются при μr=1 и μr=1000 окружающей U-образной области.
Самостоятельная учебная модель FEMM 5: от физических соотношений к полевому решению и проверке результата.
Допущения и устройство учебной модели
Все размеры, свойства материалов и условия возбуждения заданы ниже. Численные результаты относятся к опубликованной версии модели FEMM 5.
Физическая и математическая постановка
Почему ток вытесняется внутри паза
Плотность тока определяется одновременно требованием заданного полного тока и индуцированным электрическим полем. Условие одинакового тока цепи не означает одинаковую плотность во всех точках меди. Магнитные стенки меняют пространственное распределение потока и тем самым меняют вихревую составляющую тока внутри проводника.
В обоих вариантах построена одна геометрия. При μr=1 U-образная область магнитно совпадает с воздухом; при μr=1000 она представляет линейный непроводящий магнитопровод. Проводимость стенок равна нулю, поэтому их собственные вихревые потери не смешиваются с изучаемыми потерями меди.
Контроль сравнения
Для каждой частоты и обоих состояний выполняются три сетки. Средняя мощность в меди сравнивается с суммой активных мощностей двух цепей. Дополнительно проверяется нижняя граница равномерного постоянного тока. Эта граница относится к обоим проводникам, поскольку в интегральную мощность входит и обратный провод.
В отчёте полезно сравнивать отношение потерь с магнитопроводом и без него при одинаковой частоте. Затем измените ширину паза или положение проводника, сохраняя размеры меди. Такое исследование показывает, почему вывод об эффекте близости по двум свободным круглым проводам нельзя напрямую переносить на паз электрической машины. Для реальной машины понадобятся шихтовка, насыщение и распределение нескольких проводников.
Исходные данные
Плоскопараллельная
| Параметр | Значение | Единица | Происхождение |
|---|---|---|---|
| Размер медного проводника | 6 × 12 | мм | Заданный параметр самостоятельной учебной модели |
| Расстояние до обратного проводника | 70 | мм | Заданный параметр самостоятельной учебной модели |
| Амплитуда тока | 100 | А | Заданный параметр самостоятельной учебной модели |
| Относительная проницаемость стенок | 1; 1000 | Заданный параметр самостоятельной учебной модели | |
| Частоты | 50; 500; 2000 | Гц | Заданный параметр самостоятельной учебной модели |
Порядок воспроизведения
- До запуска запишите уравнение контрольной величины и ожидаемое направление изменения при вариации параметра. Согласуйте миллиметры геометрии с единицами СИ в формулах. Создайте отдельную папку и откройте reproduce.py во встроенном редакторе Python FEMM 5. Команды mi_* и mo_* в этой среде уже доступны глобально.
- Выполните программу целиком. Она создаёт новый calculated-NN, строит каждую модель с русскими именами материалов и цепей, сохраняет файл FEM, закрывает его и повторно открывает перед решением. Поэтому проверка относится к точному записанному варианту модели и охватывает сохранение кириллицы.
- Изучите result.json: records хранит численные результаты всех режимов и трёх сеток, checks — названия проверок, измеренные отклонения, допуски и итог. Откройте модель и решение финальной сетки; сопоставьте материалы, направление токов и характерные размеры с таблицей параметров.
- Составьте отчёт с физическим объяснением, таблицей сходимости и независимым контрольным расчётом. Затем измените один параметр и выполните новую серию. Сохраняйте предыдущую серию для сравнения; успешное завершение решателя само по себе не заменяет проверки физического масштаба и сеточной устойчивости.
Скачайте нужные файлы по отдельным ссылкам ниже в одну рабочую папку, затем откройте reproduce.py во встроенном Python FEMM 5 и выполните его. Сохраните имена файлов и структуру подпапок. Условия конкретного запуска и путь новых результатов указаны в комментариях программы.
Программа встроенного Python FEMM 5
"""Собственная учебная лабораторная FEMM 5: встроенный Python.
Команды FEMM доступны глобально, внешний пакет femm не используется.
Каждая сетка сохраняется в отдельный FEM, закрывается, открывается повторно
и решается с русскими именами свойств. Новый запуск создаёт calculated-NN.
Опубликованные модели и квитанции не изменяются. Размеры: мм; результаты: СИ.
"""
import os
import sys
import math
import json
CONFIG = {'I': 100, 'sigma': 57000000.0, 'variants': [50, 500, 2000]}
MODE = 'slot'
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=[]
MU0=4*math.pi*1e-7
def real(x):
if isinstance(x,(list,tuple)):x=x[0]
return complex(x).real
def check(name,value,limit):
checks.append({'name':name,'value':value,'limit':limit,'passed':math.isfinite(value) and value<=limit})
def material(name,mu=1,sigma=0):
mi_addmaterial(name,mu,mu,0,0,sigma/1e6)
def label(x,y,name,mesh,group=1,circuit='<None>',turns=1):
mi_addblocklabel(x,y);mi_selectlabel(x,y)
mi_setblockprop(name,0,mesh,circuit,0,group,turns);mi_clearselected()
def polygon(points,boundary=None,spacing=0):
for x,y in points:mi_addnode(x,y)
for i,(x,y) in enumerate(points):
x2,y2=points[(i+1)%len(points)];mi_addsegment(x,y,x2,y2)
if boundary:
mi_selectsegment((x+x2)/2,(y+y2)/2)
mi_setsegmentprop(boundary,spacing,0,0,0);mi_clearselected()
def rect(x1,y1,x2,y2):polygon([(x1,y1),(x2,y1),(x2,y2),(x1,y2)])
def circle(x,y,r,angle,boundary=None):
mi_addnode(x-r,y);mi_addnode(x+r,y)
mi_addarc(x-r,y,x+r,y,180,angle);mi_addarc(x+r,y,x-r,y,180,angle)
if boundary:
mi_selectarcsegment(x,y-r);mi_selectarcsegment(x,y+r)
mi_setarcsegmentprop(angle,boundary,0,0);mi_clearselected()
def halfcircle(r,angle,boundary=None):
mi_addnode(0,-r);mi_addnode(0,r)
mi_addarc(0,-r,0,r,180,angle)
if boundary:
mi_selectarcsegment(r,0);mi_setarcsegmentprop(angle,boundary,0,0);mi_clearselected()
def start(axis,f,outer,level,uniform=0):
newdocument(0)
mi_probdef(f,'millimeters','axi' if axis else 'planar',1e-10,1000,30,0)
material('Воздух')
# Коэффициенты пространственной функции A вводятся на миллиметр геометрии.
mi_addboundprop('Внешняя граница',0,uniform/2000 if axis else 0,0 if axis else uniform/1000,0,0,0,0,0,0)
if axis:
# Ось r=0, z снизу вверх: исходные координаты библиотек не используются.
halfcircle(outer,4/(2**level),'Внешняя граница')
mi_addsegment(0,-outer,0,outer)
else:circle(0,0,outer,4/(2**level),'Внешняя граница')
def close_axis():
# FEMM автоматически разбивает осевой отрезок вершинами внутренних дуг.
pass
def coil(r,z,width,height,current,turns,mesh,num):
name='Обмотка %d'%num
mi_addcircprop(name,current,1)
rect(r-width/2,z-height/2,r+width/2,z+height/2)
label(r,z,'Медь обмотки',mesh,10+num,name,turns)
return name
def solve(level,variant,tag=''):
name='model-%s-%02d%s.fem'%(str(variant).replace('.','p'),level+1,tag)
mi_saveas(directory+'/'+name);mi_close();opendocument(directory+'/'+name)
mi_analyze(1);mi_loadsolution();mo_smooth('off')
mo_groupselectblock();energy=real(mo_blockintegral(2));loss=real(mo_blockintegral(4));mo_clearblock()
return {'model':name,'level':level+1,'variant':variant,'nodes':mo_numnodes(),'elements':mo_numelements(),'energy_J':energy,'ohmic_loss_W':loss,'saved_reopened_solved':True}
def finish():mo_close();mi_close()
def loop_field(r,z,turns,current,position):
r*=0.001;dz=(position-z)*0.001
return MU0*turns*current*r*r/(2*(r*r+dz*dz)**1.5)
def bessel(n,z):
term=(z/2)**n
total=term
for k in range(1,100):
term*=-(z*z/4)/(k*(k+n));total+=term
if abs(term)<1e-15*max(1,abs(total)):break
return total
def skin_resistance(radius,sigma,f):
a=radius*.001
if f==0:return 1/(math.pi*a*a*sigma)
delta=math.sqrt(2/(2*math.pi*f*MU0*sigma));k=(1-1j)/delta
return (k*bessel(0,k*a)/(2*math.pi*a*sigma*bessel(1,k*a))).real
def circuit_values(name):
i,v,psi=mo_getcircuitproperties(name)
return complex(i),complex(v),complex(psi)
def magnetic_b(x,y):
mo_smooth('on')
values=mo_getpointvalues(x,y)
mo_smooth('off')
return values[1],values[2]
def asinh(x):return math.log(x+math.sqrt(x*x+1))
def energy_identity(row,circuits,frequency):
power=0;fluxenergy=0
for name in circuits:
i,v,psi=circuit_values(name)
power+=(v*i.conjugate()).real/2
fluxenergy+=(psi*i.conjugate()).real/(4 if frequency else 2)
row['circuit_active_power_W']=power
row['circuit_energy_J']=fluxenergy
if frequency:
error=abs(power-row['ohmic_loss_W'])/max(abs(power),1e-20)
row['power_balance_relative']=error
check('Баланс активной мощности '+row['model'],error,0.015)
else:
error=abs(fluxenergy-row['energy_J'])/max(abs(fluxenergy),1e-20)
row['energy_identity_relative']=error
check('Энергия и потокосцепление '+row['model'],error,0.012/(2**(row['level']-1)))
if MODE=='slot':
for variant in CONFIG['variants']:
for enclosed in (0,1):
for level in range(3):
start(False,variant,300,level);material('Медь проводника',1,CONFIG['sigma']);material('Материал паза',1000 if enclosed else 1,0)
polygon([(-20,-25),(20,-25),(20,25),(8,25),(8,-10),(-8,-10),(-8,25),(-20,25)])
label(0,-18,'Материал паза',2/(2**level),5)
names=[]
for num,(x,current) in enumerate(((0,CONFIG['I']),(70,-CONFIG['I'])),1):
name='Цепь проводника %d'%num;mi_addcircprop(name,current,1);names.append(name)
rect(x-3,-6,x+3,6);label(x,0,'Медь проводника',.8/(2**level),10+num,name)
circle(0,0,110,3/(2**level));label(0,70,'Воздух',3/(2**level),3);label(0,220,'Воздух',25/(2**level))
row=solve(level,variant,'-core%d'%enclosed);row['core']=enclosed
energy_identity(row,names,variant);row['R_loop_ohm']=2*row['ohmic_loss_W']/CONFIG['I']**2;row['primary']=row['R_loop_ohm']
dc=2/(CONFIG['sigma']*.006*.012)
check('Нижняя DC-граница '+row['model'],max(0,dc/row['R_loop_ohm']-1),.01)
row['shape']=str(enclosed);records.append(row);finish()
elif MODE=='lamination':
for variant in CONFIG['variants']:
for level in range(3):
f=CONFIG['f'];thickness=variant;width=20;mesh=thickness/5/(2**level)
newdocument(0);mi_probdef(f,'millimeters','planar',1e-11,1000,30,0)
material('Электротехническая пластина',CONFIG['mu'],CONFIG['sigma'])
aa=CONFIG['B']*thickness*.001/2
mi_addboundprop('Потенциал верхней поверхности',aa,0,0,0,0,0,0,0,0)
mi_addboundprop('Потенциал нижней поверхности',-aa,0,0,0,0,0,0,0,0)
# Осевой повторяющийся фрагмент с нулевым потоком через боковые торцы.
rect(-width/2,-thickness/2,width/2,thickness/2)
for y,name in ((thickness/2,'Потенциал верхней поверхности'),(-thickness/2,'Потенциал нижней поверхности')):
mi_selectsegment(0,y);mi_setsegmentprop(name,1,0,0,0);mi_clearselected()
label(0,0,'Электротехническая пластина',mesh,5)
row=solve(level,variant)
volume=width*thickness*1e-6
thin=math.pi**2/6*CONFIG['sigma']*f*f*CONFIG['B']**2*(thickness*.001)**2*volume
row.update({'thin_sheet_loss_W':thin,'volume_m3':volume,'loss_density_W_m3':row['ohmic_loss_W']/volume,'primary':row['ohmic_loss_W']})
check('Тонколистовое аналитическое решение '+row['model'],abs(row['ohmic_loss_W']/thin-1),.025)
records.append(row);finish()
elif MODE=='litz':
for variant in CONFIG['variants']:
for balanced in (0,1):
for level in range(3):
start(False,variant,50,level);material('Медь изолированных жил',1,CONFIG['sigma'])
positions=[(0,0)]+[(math.cos(k*math.pi/3),math.sin(k*math.pi/3)) for k in range(6)]
names=[]
if not balanced:
mi_addcircprop('Общие выводы пучка',CONFIG['I'],0);names.append('Общие выводы пучка')
for num,(x,y) in enumerate(positions):
name='Ток жилы %d'%(num+1) if balanced else 'Общие выводы пучка'
if balanced:mi_addcircprop(name,CONFIG['I']/7,1);names.append(name)
circle(x,y,.4,4/(2**level));label(x,y,'Медь изолированных жил',.1/(2**level),10+num,name)
mi_addcircprop('Обратный провод',-CONFIG['I'],1);names.append('Обратный провод')
circle(10,0,.4*math.sqrt(7),4/(2**level));label(10,0,'Медь изолированных жил',.15/(2**level),30,'Обратный провод')
circle(0,0,15,4/(2**level));label(0,7,'Воздух',.5/(2**level),3);label(0,35,'Воздух',5/(2**level))
row=solve(level,variant,'-balanced%d'%balanced);row['balanced']=balanced
energy_identity(row,names,variant)
currents=[]
for num in range(7):
mo_groupselectblock(10+num);currents.append(complex(mo_blockintegral(7)));mo_clearblock()
check('Суммарный ток семи жил '+row['model'],abs(sum(currents)-CONFIG['I'])/CONFIG['I'],1e-6)
row['strand_current_amplitudes_A']=[abs(i) for i in currents]
row['current_spread_relative']=(max(abs(i) for i in currents)-min(abs(i) for i in currents))/(CONFIG['I']/7)
row['primary']=row['ohmic_loss_W'];row['shape']=str(balanced)
records.append(row);finish()
elif MODE=='threephase':
for variant in CONFIG['variants']:
for shield in (0,1):
for level in range(3):
start(False,variant,350,level);material('Медь фазных шин',1,CONFIG['sigma']);material('Материал экрана',1,35e6 if shield else 0)
circle(0,0,75,3/(2**level));circle(0,0,80,3/(2**level));label(77,0,'Материал экрана',1/(2**level),5)
names=[];current_sum=0j
for num,(x,phase) in enumerate(((-20,0),(0,-120),(20,120))):
name=('A','B','C')[num]+' — фазная шина';current=CONFIG['I']*complex(math.cos(phase*math.pi/180),math.sin(phase*math.pi/180))
mi_addcircprop(name,current,1);names.append(name);current_sum+=current
rect(x-3,-7.5,x+3,7.5);label(x,0,'Медь фазных шин',1/(2**level),10+num,name)
if shield:
mi_addcircprop('Экран без внешнего тока',0,1);mi_selectlabel(77,0);mi_setblockprop('Материал экрана',0,1/(2**level),'Экран без внешнего тока',0,5,1);mi_clearselected();names.append('Экран без внешнего тока')
label(0,40,'Воздух',3/(2**level),3);label(0,200,'Воздух',30/(2**level))
row=solve(level,variant,'-shield%d'%shield);row['shield']=shield;row['shape']=str(shield)
energy_identity(row,names,variant);check('Баланс фазных токов '+row['model'],abs(current_sum)/CONFIG['I'],1e-12)
mo_groupselectblock(5);row['shield_loss_W']=real(mo_blockintegral(4));mo_clearblock()
row['primary']=row['ohmic_loss_W'];records.append(row);finish()
elif MODE=='line-matrix':
for variant in CONFIG['variants']:
for level in range(3):
start(False,0,800,level);material('Немагнитные провода')
names=[]
for num,x in enumerate((-30,-10,10,30)):
name=('A','B','C','N')[num]+' — провод линии'
current=1 if num==variant else (-1 if num==3 else 0)
mi_addcircprop(name,current,1);names.append(name)
circle(x,0,3,3/(2**level));label(x,0,'Немагнитные провода',.5/(2**level),10+num,name)
circle(0,0,100,3/(2**level));label(0,70,'Воздух',3/(2**level),3);label(0,600,'Воздух',50/(2**level))
row=solve(level,variant);energy_identity(row,names,0)
flux=[circuit_values(n)[2].real for n in names]
column=[flux[k]-flux[3] for k in range(3)];row['matrix_column_H_per_m']=column
row['self_L_H_per_m']=column[variant];row['primary']=column[variant]
distance=abs((-30,-10,10)[variant]-30);exact=MU0/math.pi*(math.log(distance/3)+.25)
row['analytic_self_H_per_m']=exact
check('Аналитическая петля с нейтралью '+row['model'],abs(column[variant]/exact-1),.025)
records.append(row);finish()
matrix=[[0,0,0] for _ in range(3)]
for row in records:
if row['level']==3:
for k in range(3):matrix[k][row['variant']]=row['matrix_column_H_per_m'][k]
for i in range(3):
for j in range(3):check('Взаимность матрицы L%d%d'%(i,j),abs(matrix[i][j]-matrix[j][i])/math.sqrt(matrix[i][i]*matrix[j][j]),.002)
for i in range(3):
for j in range(i):check('Положительность главного минора L%d%d'%(i,j),max(0,matrix[i][j]**2/(matrix[i][i]*matrix[j][j])-1),1e-8)
average=[[sum(matrix[(i+k)%3][(j+k)%3] for k in range(3))/3 for j in range(3)] for i in range(3)]
records.append({'measurement':'matrix_and_ideal_transposition','matrix_H_per_m':matrix,'transposed_average_H_per_m':average})
elif MODE=='earth':
delta=math.sqrt(2/(2*math.pi*CONFIG['f']*MU0*CONFIG['sigma']))
for variant in CONFIG['variants']:
for level in range(3):
outer=delta*variant*1000
start(False,CONFIG['f'],outer,level);material('Медь надземного провода',1,57e6);material('Проводящая среда возврата',1,CONFIG['sigma'])
mi_addnode(-outer,0);mi_addnode(outer,0);mi_addsegment(-outer,0,outer,0)
# Две смежные области грунта — один проводник с ОБЩИМ полным током.
# Параллельный тип делит ток по областям вместо повторения -I в каждой.
mi_addcircprop('Надземный провод',CONFIG['I'],1);mi_addcircprop('Возврат через среду',-CONFIG['I'],0)
circle(0,2000,20,4/(2**level));label(0,2000,'Медь надземного провода',2/(2**level),10,'Надземный провод')
circle(0,0,20000,4/(2**level))
label(0,10000,'Воздух',500/(2**level),3)
label(0,-10000,'Проводящая среда возврата',1000/(2**level),5,'Возврат через среду')
label(0,outer*.7,'Воздух',outer/16/(2**level),1)
label(0,-outer*.7,'Проводящая среда возврата',delta*1000/8/(2**level),6,'Возврат через среду')
row=solve(level,variant);energy_identity(row,['Надземный провод','Возврат через среду'],CONFIG['f'])
i,v,p=circuit_values('Надземный провод');ig,vg,pg=circuit_values('Возврат через среду')
zz=(v-vg)/i
row.update({'skin_depth_m':delta,'outer_radius_m':outer*.001,'loop_Zreal_ohm_per_m':zz.real,'loop_Zimag_ohm_per_m':zz.imag,'primary':zz.real})
ground_current=0j
for group in (5,6):
mo_groupselectblock(group);ground_current+=complex(mo_blockintegral(7));mo_clearblock()
row['integrated_ground_current_real_A']=ground_current.real
row['integrated_ground_current_imag_A']=ground_current.imag
check('Интегральный баланс токов провод — среда '+row['model'],abs(i+ground_current)/CONFIG['I'],1e-6)
records.append(row);finish()
finest=[r for r in records if r['level']==3]
check('Удаление внешней границы от6δдо8δ',abs(finest[-1]['primary']/finest[-2]['primary']-1),.03)
elif MODE=='pipe-joint':
for variant in CONFIG['variants']:
for level in range(3):
start(True,CONFIG['f'],600,level);material('Медь обмотки');material('Основной металл трубы',1,6e6);material('Кольцевая зона трубы',1,6e6*variant)
name=coil(48,0,4,20,CONFIG['I'],CONFIG['N'],1/(2**level),1)
for lo,hi,mat,group in ((-40,-4,'Основной металл трубы',5),(-4,4,'Кольцевая зона трубы',6),(4,40,'Основной металл трубы',5)):
rect(35,lo,40,hi);label(37,(lo+hi)/2,mat,.5/(2**level),group)
label(0.5,0,'Воздух',2/(2**level),3);label(300,0,'Воздух',30/(2**level),1)
row=solve(level,variant);energy_identity(row,[name],CONFIG['f'])
for group,key in ((5,'bulk_loss_W'),(6,'joint_loss_W')):
mo_groupselectblock(group);row[key]=real(mo_blockintegral(4));mo_clearblock()
check('Сумма потерь зон трубы '+row['model'],abs((row['bulk_loss_W']+row['joint_loss_W'])/row['ohmic_loss_W']-1),1e-8)
row['joint_loss_density_W_m3']=row['joint_loss_W']/(math.pi*(.04**2-.035**2)*.008)
row['primary']=row['joint_loss_W'];records.append(row);finish()
elif MODE=='particle':
for variant in CONFIG['variants']:
for level in range(3):
start(True,0,400,level);material('Медь обмотки');material('Ферромагнитная частица',CONFIG['mu'])
name=coil(20,0,2,2,CONFIG['I'],CONFIG['N'],.5/(2**level),1)
for radius in (1,3):
mi_addnode(0,variant-radius);mi_addnode(0,variant+radius);mi_addarc(0,variant-radius,0,variant+radius,180,2/(2**level))
label(.5,variant,'Ферромагнитная частица',.2/(2**level),5)
label(2,variant,'Воздух',.2/(2**level),6)
rect(0,-50,60,80);label(40,0,'Воздух',1.5/(2**level),3);label(200,0,'Воздух',25/(2**level))
row=solve(level,variant);energy_identity(row,[name],0)
mo_groupselectblock(5);force=real(mo_blockintegral(19));volume=real(mo_blockintegral(10));mo_clearblock()
r=.02;z=variant*.001;b=MU0*CONFIG['N']*CONFIG['I']*r*r/(2*(r*r+z*z)**1.5);deriv=-3*z/(r*r+z*z)*b
exact=3*(4/3*math.pi*.001**3)*(CONFIG['mu']-1)/(CONFIG['mu']+2)/MU0*b*deriv
row.update({'Fz_N':force,'dipole_force_N':exact,'particle_volume_m3':volume,'primary':force})
check('Дипольная оценка малой сферы '+row['model'],abs(force/exact-1),.04)
check('Сила направлена к катушке '+row['model'],max(0,force),0)
records.append(row);finish()
# Сходимость по трём сеткам проверяется отдельно для каждого физического режима.
groups={}
for row in records:
if 'level' not in row:continue
key=str(row['variant'])+str(row.get('shape',''))+str(row.get('excitation',''))
if key not in groups:groups[key]=[]
groups[key].append(row)
for key,rows in groups.items():
rows.sort(key=lambda row:row['level'])
value=abs(rows[-1]['primary']/rows[-2]['primary']-1)
check('Сходимость измеряемой величины, режим '+key,value,0.025 if MODE in ('slot','lamination','litz','threephase','line-matrix','earth','pipe-joint','particle') else 0.012)
result={'runtime':'FEMM 5; embedded MicroPython','case_id':'ferromagnetic-slot','records':records,'checks':checks,'passed':all(c['passed'] for c in checks),'scope':'Самостоятельная учебная 2D/осесимметричная модель; численные проверки относятся к указанным параметрам.'}
with open(directory+'/result.json','w') as stream:json.dump(result,stream)
print(json.dumps(result))
assert result['passed']
Картина рассчитанного поля
Окна FEMM 5
Снимки интерфейса FEMM показывают геометрию, настройки и работу с результатами в FEMM 5. Откройте изображение, чтобы рассмотреть подписи и значения в полном размере.
Результаты и численные проверки
Сохранено решений FEMM: 18. Выполнено проверок: 42. Полная точность чисел и условия сравнения доступны в таблицах результатов JSON.
| Частота, Гц | Файл модели | Магнитные стенки: 0 — воздух, 1 — μr=1000 | Сохранение, открытие и решение | Число узлов | Активное сопротивление петли, Ом | Энергия по потокосцеплениям, Дж | Относительная ошибка баланса мощности | Средняя джоулева мощность, Вт | Уровень сетки | Активная мощность цепей, Вт | Число элементов | Основной численный результат | Энергия поля, Дж | Контрольный вариант |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 50 | model-50-01-core0.fem | 0 | Да | 10384 | 488,17267 × 10⁻⁶ | 0,0028161819 | 9,8270928 × 10⁻¹² | 2,4408633 | 1 | 2,4408633 | 20572 | 488,17267 × 10⁻⁶ | 0,0028161819 | 0 |
| 50 | model-50-02-core0.fem | 0 | Да | 27155 | 488,17844 × 10⁻⁶ | 0,0028239376 | 19,417617 × 10⁻¹² | 2,4408922 | 2 | 2,4408922 | 54128 | 488,17844 × 10⁻⁶ | 0,0028239376 | 0 |
| 50 | model-50-03-core0.fem | 0 | Да | 97535 | 488,18087 × 10⁻⁶ | 0,0028276836 | 4,1408711 × 10⁻¹² | 2,4409044 | 3 | 2,4409044 | 194708 | 488,18087 × 10⁻⁶ | 0,0028276836 | 0 |
| 50 | model-50-01-core1.fem | 1 | Да | 10384 | 495,55744 × 10⁻⁶ | 0,0087935691 | 5,7582419 × 10⁻¹² | 2,4777872 | 1 | 2,4777872 | 20572 | 495,55744 × 10⁻⁶ | 0,0087935691 | 1 |
| 50 | model-50-02-core1.fem | 1 | Да | 27155 | 495,57509 × 10⁻⁶ | 0,0088136723 | 9,2942615 × 10⁻¹² | 2,4778754 | 2 | 2,4778754 | 54128 | 495,57509 × 10⁻⁶ | 0,0088136723 | 1 |
| 50 | model-50-03-core1.fem | 1 | Да | 97535 | 495,57838 × 10⁻⁶ | 0,0088246632 | 2,4723478 × 10⁻¹² | 2,4778919 | 3 | 2,4778919 | 194708 | 495,57838 × 10⁻⁶ | 0,0088246632 | 1 |
| 500 | model-500-01-core0.fem | 0 | Да | 10384 | 557,95291 × 10⁻⁶ | 0,0027934524 | 2,2276376 × 10⁻¹² | 2,7897646 | 1 | 2,7897646 | 20572 | 557,95291 × 10⁻⁶ | 0,0027934524 | 0 |
| 500 | model-500-02-core0.fem | 0 | Да | 27155 | 558,07477 × 10⁻⁶ | 0,0028008025 | 5,5543502 × 10⁻¹² | 2,7903738 | 2 | 2,7903738 | 54128 | 558,07477 × 10⁻⁶ | 0,0028008025 | 0 |
| 500 | model-500-03-core0.fem | 0 | Да | 97535 | 558,11601 × 10⁻⁶ | 0,0028043684 | 14,668766 × 10⁻¹² | 2,7905801 | 3 | 2,7905801 | 194708 | 558,11601 × 10⁻⁶ | 0,0028043684 | 0 |
| 500 | model-500-01-core1.fem | 1 | Да | 10384 | 804,79121 × 10⁻⁶ | 0,0085124713 | 28,526422 × 10⁻¹² | 4,023956 | 1 | 4,023956 | 20572 | 804,79121 × 10⁻⁶ | 0,0085124713 | 1 |
| 500 | model-500-02-core1.fem | 1 | Да | 27155 | 803,77773 × 10⁻⁶ | 0,0085322272 | 3,8922696 × 10⁻¹² | 4,0188887 | 2 | 4,0188887 | 54128 | 803,77773 × 10⁻⁶ | 0,0085322272 | 1 |
| 500 | model-500-03-core1.fem | 1 | Да | 97535 | 802,85371 × 10⁻⁶ | 0,008543287 | 105,18856 × 10⁻¹² | 4,0142685 | 3 | 4,0142685 | 194708 | 802,85371 × 10⁻⁶ | 0,008543287 | 1 |
| 2000 | model-2000-01-core0.fem | 0 | Да | 10384 | 926,27427 × 10⁻⁶ | 0,0027090317 | 1,5909603 × 10⁻¹² | 4,6313714 | 1 | 4,6313714 | 20572 | 926,27427 × 10⁻⁶ | 0,0027090317 | 0 |
| 2000 | model-2000-02-core0.fem | 0 | Да | 27155 | 920,60994 × 10⁻⁶ | 0,0027165423 | 35,275334 × 10⁻¹² | 4,6030497 | 2 | 4,6030497 | 54128 | 920,60994 × 10⁻⁶ | 0,0027165423 | 0 |
| 2000 | model-2000-03-core0.fem | 0 | Да | 97535 | 917,96197 × 10⁻⁶ | 0,0027201559 | 78,649812 × 10⁻¹² | 4,5898099 | 3 | 4,5898099 | 194708 | 917,96197 × 10⁻⁶ | 0,0027201559 | 0 |
| 2000 | model-2000-01-core1.fem | 1 | Да | 10384 | 0,0014934045 | 0,0082805627 | 869,73901 × 10⁻¹⁵ | 7,4670223 | 1 | 7,4670223 | 20572 | 0,0014934045 | 0,0082805627 | 1 |
| 2000 | model-2000-02-core1.fem | 1 | Да | 27155 | 0,0014824364 | 0,0083014426 | 18,154487 × 10⁻¹² | 7,4121818 | 2 | 7,4121818 | 54128 | 0,0014824364 | 0,0083014426 | 1 |
| 2000 | model-2000-03-core1.fem | 1 | Да | 97535 | 0,0014753103 | 0,0083133339 | 8,894365 × 10⁻¹² | 7,3765513 | 3 | 7,3765513 | 194708 | 0,0014753103 | 0,0083133339 | 1 |
| Критерий | Получено | Допуск или ожидаемое значение | Итог |
|---|---|---|---|
| Баланс активной мощности model-50-01-core0.fem | 9,827 × 10⁻¹² | 0,015 | Выполнен |
| Нижняя DC-граница model-50-01-core0.fem | 0 | 0,01 | Выполнен |
| Баланс активной мощности model-50-02-core0.fem | 19,42 × 10⁻¹² | 0,015 | Выполнен |
| Нижняя DC-граница model-50-02-core0.fem | 0 | 0,01 | Выполнен |
| Баланс активной мощности model-50-03-core0.fem | 4,141 × 10⁻¹² | 0,015 | Выполнен |
| Нижняя DC-граница model-50-03-core0.fem | 0 | 0,01 | Выполнен |
| Баланс активной мощности model-50-01-core1.fem | 5,758 × 10⁻¹² | 0,015 | Выполнен |
| Нижняя DC-граница model-50-01-core1.fem | 0 | 0,01 | Выполнен |
| Баланс активной мощности model-50-02-core1.fem | 9,294 × 10⁻¹² | 0,015 | Выполнен |
| Нижняя DC-граница model-50-02-core1.fem | 0 | 0,01 | Выполнен |
| Баланс активной мощности model-50-03-core1.fem | 2,472 × 10⁻¹² | 0,015 | Выполнен |
| Нижняя DC-граница model-50-03-core1.fem | 0 | 0,01 | Выполнен |
| Баланс активной мощности model-500-01-core0.fem | 2,228 × 10⁻¹² | 0,015 | Выполнен |
| Нижняя DC-граница model-500-01-core0.fem | 0 | 0,01 | Выполнен |
| Баланс активной мощности model-500-02-core0.fem | 5,554 × 10⁻¹² | 0,015 | Выполнен |
| Нижняя DC-граница model-500-02-core0.fem | 0 | 0,01 | Выполнен |
| Баланс активной мощности model-500-03-core0.fem | 14,67 × 10⁻¹² | 0,015 | Выполнен |
| Нижняя DC-граница model-500-03-core0.fem | 0 | 0,01 | Выполнен |
| Баланс активной мощности model-500-01-core1.fem | 28,53 × 10⁻¹² | 0,015 | Выполнен |
| Нижняя DC-граница model-500-01-core1.fem | 0 | 0,01 | Выполнен |
| Баланс активной мощности model-500-02-core1.fem | 3,892 × 10⁻¹² | 0,015 | Выполнен |
| Нижняя DC-граница model-500-02-core1.fem | 0 | 0,01 | Выполнен |
| Баланс активной мощности model-500-03-core1.fem | 105,2 × 10⁻¹² | 0,015 | Выполнен |
| Нижняя DC-граница model-500-03-core1.fem | 0 | 0,01 | Выполнен |
| Баланс активной мощности model-2000-01-core0.fem | 1,591 × 10⁻¹² | 0,015 | Выполнен |
| Нижняя DC-граница model-2000-01-core0.fem | 0 | 0,01 | Выполнен |
| Баланс активной мощности model-2000-02-core0.fem | 35,28 × 10⁻¹² | 0,015 | Выполнен |
| Нижняя DC-граница model-2000-02-core0.fem | 0 | 0,01 | Выполнен |
| Баланс активной мощности model-2000-03-core0.fem | 78,65 × 10⁻¹² | 0,015 | Выполнен |
| Нижняя DC-граница model-2000-03-core0.fem | 0 | 0,01 | Выполнен |
| Баланс активной мощности model-2000-01-core1.fem | 869,7 × 10⁻¹⁵ | 0,015 | Выполнен |
| Нижняя DC-граница model-2000-01-core1.fem | 0 | 0,01 | Выполнен |
| Баланс активной мощности model-2000-02-core1.fem | 18,15 × 10⁻¹² | 0,015 | Выполнен |
| Нижняя DC-граница model-2000-02-core1.fem | 0 | 0,01 | Выполнен |
| Баланс активной мощности model-2000-03-core1.fem | 8,894 × 10⁻¹² | 0,015 | Выполнен |
| Нижняя DC-граница model-2000-03-core1.fem | 0 | 0,01 | Выполнен |
| Сходимость измеряемой величины, режим 500 | 4,983 × 10⁻⁶ | 0,025 | Выполнен |
| Сходимость измеряемой величины, режим 501 | 6,644 × 10⁻⁶ | 0,025 | Выполнен |
| Сходимость измеряемой величины, режим 20000 | 0,002876 | 0,025 | Выполнен |
| Сходимость измеряемой величины, режим 20001 | 0,004807 | 0,025 | Выполнен |
| Сходимость измеряемой величины, режим 5000 | 73,91 × 10⁻⁶ | 0,025 | Выполнен |
| Сходимость измеряемой величины, режим 5001 | 0,00115 | 0,025 | Выполнен |
Допуски относятся к указанной учебной задаче и способу сравнения. Число показанных цифр не означает такой же физической точности.
Модели, решения и программа
Для нового расчёта сохраните программу, модели и необходимые данные в одну рабочую папку, сохраняя структуру подпапок.
- Файл результатов: README.md6759 байт
- Магнитное решение: model-2000-01-core0.ans1472225 байт
- Магнитная модель: model-2000-01-core0.fem2845 байт
- Магнитное решение: model-2000-01-core1.ans1473596 байт
- Магнитная модель: model-2000-01-core1.fem2851 байт
- Магнитное решение: model-2000-02-core0.ans3993016 байт
- Магнитная модель: model-2000-02-core0.fem2853 байт
- Магнитное решение: model-2000-02-core1.ans3996627 байт
- Магнитная модель: model-2000-02-core1.fem2859 байт
- Магнитное решение: model-2000-03-core0.ans14567218 байт
- Магнитная модель: model-2000-03-core0.fem2858 байт
- Магнитное решение: model-2000-03-core1.ans14579184 байт
- Магнитная модель: model-2000-03-core1.fem2864 байт
- Магнитное решение: model-50-01-core0.ans1472152 байт
- Магнитная модель: model-50-01-core0.fem2843 байт
- Магнитное решение: model-50-01-core1.ans1473090 байт
- Магнитная модель: model-50-01-core1.fem2849 байт
- Магнитное решение: model-50-02-core0.ans3993192 байт
- Магнитная модель: model-50-02-core0.fem2851 байт
- Магнитное решение: model-50-02-core1.ans3994918 байт
- Магнитная модель: model-50-02-core1.fem2857 байт
- Магнитное решение: model-50-03-core0.ans14566881 байт
- Магнитная модель: model-50-03-core0.fem2856 байт
- Магнитное решение: model-50-03-core1.ans14573204 байт
- Магнитная модель: model-50-03-core1.fem2862 байт
- Магнитное решение: model-500-01-core0.ans1472253 байт
- Магнитная модель: model-500-01-core0.fem2844 байт
- Магнитное решение: model-500-01-core1.ans1473213 байт
- Магнитная модель: model-500-01-core1.fem2850 байт
- Магнитное решение: model-500-02-core0.ans3993131 байт
- Магнитная модель: model-500-02-core0.fem2852 байт
- Магнитное решение: model-500-02-core1.ans3995492 байт
- Магнитная модель: model-500-02-core1.fem2858 байт
- Магнитное решение: model-500-03-core0.ans14567179 байт
- Магнитная модель: model-500-03-core0.fem2857 байт
- Магнитное решение: model-500-03-core1.ans14575415 байт
- Магнитная модель: model-500-03-core1.fem2863 байт
- Программа встроенного Python: reproduce.py20077 байт
Границы применимости
- Материал стенок линейный и непроводящий; насыщение, потери шихтованной стали и отдельные витки обмотки не моделируются.
- Проверены точные учебные файлы и численные критерии. Физические измерения и снимки интерфейса FEMM относятся к отдельным проходам.