exponenta event banner

assembleFEMatrices

Собрать матрицы конечных элементов

Описание

пример

FEM = assembleFEMatrices(model) возвращает структурный массив, содержащий все матрицы конечных элементов для задачи PDE, указанной как model.

пример

FEM = assembleFEMatrices(model,matrices) возвращает структурный массив, содержащий только указанные матрицы конечных элементов.

пример

FEM = assembleFEMatrices(model,bcmethod) собирает матрицы конечных элементов и накладывает граничные условия методом, указанным bcmethod.

пример

FEM = assembleFEMatrices(___,state) собирает матрицы конечных элементов, используя время ввода или решение, указанное в state структурный массив. Функция использует time поле структуры для зависящих от времени моделей и поле решения u для нелинейных моделей. Этот аргумент можно использовать с любым из предыдущих синтаксисов.

Примеры

свернуть все

Создайте модель PDE для уравнения Пуассона на L-образной мембране с нулевыми граничными условиями Дирихле.

model = createpde(1);
geometryFromEdges(model,@lshapeg);
specifyCoefficients(model,'m',0,'d',0,'c',1,'a',0,'f',1);
applyBoundaryCondition(model,'Edge',1:model.Geometry.NumEdges,'u',0);

Создайте сетку и получите матрицы конечных элементов по умолчанию для задачи и сетки.

generateMesh(model,'Hmax',0.2);
FEM = assembleFEMatrices(model)
FEM = struct with fields:
    K: [401x401 double]
    A: [401x401 double]
    F: [401x1 double]
    Q: [401x401 double]
    G: [401x1 double]
    H: [80x401 double]
    R: [80x1 double]
    M: [401x401 double]
    T: [401x401 double]

Ускорьте вычисления, указав, какие матрицы конечных элементов нужно собрать.

Создание нестационарной тепловой модели и включение геометрии встроенной функции squareg.

thermalmodel = createpde('thermal','steadystate');
geometryFromEdges(thermalmodel,@squareg);

Постройте график геометрии с метками кромок.

pdegplot(thermalmodel,'EdgeLabels','on')
xlim([-1.1 1.1])
ylim([-1.1 1.1])

Figure contains an axes. The axes contains 5 objects of type line, text.

Укажите теплопроводность материала и внутреннего источника тепла.

thermalProperties(thermalmodel,'ThermalConductivity',0.2);
internalHeatSource(thermalmodel,10);

Задайте граничные условия.

thermalBC(thermalmodel,'Edge',[1,3],'Temperature',100);

Создайте сетку.

generateMesh(thermalmodel);

Собрать матрицы жесткости и массы.

FEM_KM = assembleFEMatrices(thermalmodel,'KM')
FEM_KM = struct with fields:
    K: [1541x1541 double]
    M: [1541x1541 double]

Теперь соберите матрицы конечных элементов M, K, A и F.

FEM_MKAF = assembleFEMatrices(thermalmodel,'MKAF')
FEM_MKAF = struct with fields:
    M: [1541x1541 double]
    K: [1541x1541 double]
    A: [1541x1541 double]
    F: [1541x1 double]

Четыре матрицы M, K, A и F соответствуют дискретизированным версиям коэффициентов PDE m, c, a и F. Эти четыре матрицы также представляют область конечноэлементной модели PDE. Вместо явного указания их можно использовать domain аргумент.

FEMd = assembleFEMatrices(thermalmodel,'domain')
FEMd = struct with fields:
    M: [1541x1541 double]
    K: [1541x1541 double]
    A: [1541x1541 double]
    F: [1541x1 double]

Четыре матрицы Q, G, H и R соответствуют дискретизированным версиям q, g, h и r в спецификации граничных условий Неймана и Дирихле. Эти четыре матрицы также представляют границу конечноэлементной модели PDE. Используйте boundary аргумент для сборки только этих матриц.

FEMb = assembleFEMatrices(thermalmodel,'boundary')
FEMb = struct with fields:
    H: [74x1541 double]
    R: [74x1 double]
    G: [1541x1 double]
    Q: [1541x1541 double]

Создайте модель PDE для уравнения Пуассона на L-образной мембране с нулевыми граничными условиями Дирихле.

model = createpde(1);
geometryFromEdges(model,@lshapeg);
specifyCoefficients(model,'m',0,'d',0,'c',1,'a',0,'f',1);
applyBoundaryCondition(model,'Edge',1:model.Geometry.NumEdges,'u',0);

Создайте сетку.

generateMesh(model,'Hmax',0.2);

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

FEMn = assembleFEMatrices(model,'nullspace')
FEMn = struct with fields:
    Kc: [321x321 double]
    Fc: [321x1 double]
     B: [401x321 double]
    ud: [401x1 double]
     M: [321x321 double]

Получение решения для PDE с помощью nullspace матрицы конечных элементов.

un = FEMn.B*(FEMn.Kc\FEMn.Fc) + FEMn.ud;

Сравните этот результат с решением, заданным solvepde. Два решения идентичны.

u1 = solvepde(model);
norm(un - u1.NodalSolution)
ans = 0

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

FEMs = assembleFEMatrices(model,'stiff-spring')
FEMs = struct with fields:
    Ks: [401x401 double]
    Fs: [401x1 double]
     M: [401x401 double]

Получите решение для PDE, используя матрицы конечных элементов жесткой пружины. Этот метод дает менее точное решение.

us = FEMs.Ks\FEMs.Fs;
norm(us - u1.NodalSolution)
ans = 0.0098

Собрать матрицы конечных элементов для первого и последнего временных этапов переходной структурной задачи.

Создайте переходную структурную модель для решения твердотельной (3-D) задачи.

structuralmodel = createpde('structural','transient-solid');

Создайте геометрию и включите ее в модель. Постройте график геометрии.

gm = multicylinder(0.01,0.05);
addVertex(gm,'Coordinates',[0,0,0.05]);
structuralmodel.Geometry = gm;
pdegplot(structuralmodel,'FaceLabels','on','FaceAlpha',0.5)

Figure contains an axes. The axes contains 3 objects of type quiver, patch, line.

Укажите модуль Юнга и коэффициент Пуассона.

structuralProperties(structuralmodel,'Cell',1,'YoungsModulus',201E9, ...
                                              'PoissonsRatio',0.3, ...
                                              'MassDensity',7800);

Укажите, что нижняя часть цилиндра является фиксированной границей.

structuralBC(structuralmodel,'Face',1,'Constraint','fixed');

Укажите гармоническое давление в верхней части цилиндра.

structuralBoundaryLoad(structuralmodel,'Face',2,'Pressure',5E7,'Frequency',50);

Задайте нулевое начальное смещение и скорость.

structuralIC(structuralmodel,'Displacement',[0;0;0],'Velocity',[0;0;0]);

Создайте линейную сетку.

generateMesh(structuralmodel,'GeometricOrder','linear');
tlist = linspace(0,1,300);

Соберите матрицы конечных элементов для начального шага времени.

state.time = tlist(1);
FEM_domain = assembleFEMatrices(structuralmodel,state)
FEM_domain = struct with fields:
    K: [6609x6609 double]
    A: [6609x6609 double]
    F: [6609x1 double]
    Q: [6609x6609 double]
    G: [6609x1 double]
    H: [252x6609 double]
    R: [252x1 double]
    M: [6609x6609 double]

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

state.time = tlist(1);
FEM_boundary_init = assembleFEMatrices(structuralmodel,'G',state)
FEM_boundary_init = struct with fields:
    G: [6609x1 double]

state.time = tlist(floor(length(tlist)/2));
FEM_boundary_half = assembleFEMatrices(structuralmodel,'G',state)
FEM_boundary_half = struct with fields:
    G: [6609x1 double]

state.time = tlist(end);
FEM_boundary_final = assembleFEMatrices(structuralmodel,'G',state)
FEM_boundary_final = struct with fields:
    G: [6609x1 double]

Собрать матрицы конечных элементов для проблемы теплопередачи с температурно-зависимой теплопроводностью.

Создайте стационарную тепловую модель.

thermalmodelS = createpde('thermal','steadystate');

Создайте 2-D геометрию, нарисовав один прямоугольник размером блока и второй прямоугольник размером паза.

r1 = [3 4 -.5 .5 .5 -.5  -.8 -.8 .8 .8];
r2 = [3 4 -.05 .05 .05 -.05  -.4 -.4 .4 .4];
gdm = [r1; r2]';

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

g = decsg(gdm,'R1-R2',['R1'; 'R2']');

Преобразовать decsg форматировать в геометрический объект. Включите геометрию в модель и постройте график геометрии.

geometryFromEdges(thermalmodelS,g);
figure
pdegplot(thermalmodelS,'EdgeLabels','on'); 
axis([-.9 .9 -.9 .9]);

Figure contains an axes. The axes contains 9 objects of type line, text.

Установите температуру на левом ребре равной 100 градусам. Установите тепловой поток вне блока на правой кромке равным -10. Верхний и нижний края и края внутри полости все изолированы: по этим краям нет теплопередачи.

thermalBC(thermalmodelS,'Edge',6,'Temperature',100);
thermalBC(thermalmodelS,'Edge',1,'HeatFlux',-10);

Укажите теплопроводность материала как простую линейную функцию температуры u.

k = @(~,state) 0.7+0.003*state.u;
thermalProperties(thermalmodelS,'ThermalConductivity',k);

Создайте сетку.

generateMesh(thermalmodelS);

Рассчитайте стационарное решение.

Rnonlin = solve(thermalmodelS);

Поскольку теплопроводность нелинейна (зависит от температуры), вычислите системные матрицы, соответствующие сходящейся температуре. Назначьте распределение температуры для u области state структурный массив. Потому что u поле должно содержать вектор строки, транспонировать распределение температуры.

state.u = Rnonlin.Temperature.';

Соберите матрицы конечных элементов, используя распределение температуры в узловых точках.

FEM = assembleFEMatrices(thermalmodelS,'nullspace',state)
FEM = struct with fields:
    Kc: [1277x1277 double]
    Fc: [1277x1 double]
     B: [1320x1277 double]
    ud: [1320x1 double]
     M: [1277x1277 double]

Вычислите решение с помощью системных матриц, чтобы убедиться, что они дают ту же температуру, что и Rnonlin.

u = FEM.B*(FEM.Kc\FEM.Fc) + FEM.ud; 

Сравните этот результат с решением, заданным solve.

norm(u - Rnonlin.Temperature)
ans = 9.8994e-05

Входные аргументы

свернуть все

Объект модели, указанный как PDEModel объект, ThermalModel объект, StructuralModel объект, или ElectroMagneticModel объект.

Пример: model = createpde(1)

Пример: thermalmodel = createpde('thermal','steadystate')

Пример: structuralmodel = createpde('structural','static-solid')

Пример: emagmodel = createpde('electromagnetic','electrostatic')

Метод включения граничных условий, указанный как 'none', 'nullspace', или 'stiff-spring'. Дополнительные сведения см. в разделе Алгоритмы.

Пример: FEM = assembleFEMatrices(model,'nullspace')

Типы данных: char | string

Матрицы для сборки, указанные как:

  • Идентификаторы матрицы, такие как 'F', 'MKF', 'K', и так далее - собрать соответствующие матрицы. Каждая прописная буква представляет одну матрицу: K, A, F, Q, G, H, R, M, и T. Можно объединить несколько букв в один символьный вектор или строку, например: 'MKF'.

  • 'boundary' - собрать все матрицы, связанные с границами геометрии.

  • 'domain' - Собрать все матрицы, связанные с доменами.

Пример: FEM = assembleFEMatrices(model,'KAF')

Типы данных: char | string

Время для зависящих от времени моделей и решение для нелинейных моделей, указанных в массиве структуры. Поля массива представляют следующие значения:

  • state.time содержит неотрицательное число, определяющее значение времени для моделей, зависящих от времени.

  • state.u содержит матрицу решения размера N-на-Np, которая может использоваться для сборки матриц в нелинейной постановке задачи, где коэффициенты являются функциями state.u. Здесь N - количество уравнений в системе, а Np - количество узлов в сетке.

Пример: state.time = tlist(end); FEM = assembleFEMatrices(model,'boundary',state)

Выходные аргументы

свернуть все

Матрицы конечных элементов, возвращаемые как структурный массив. Используйте bcmethod и matrices аргументы, чтобы указать, какие матрицы конечных элементов требуется собрать.

Поля в структурном массиве зависят от bcmethod:

  • Если значение равно 'none', то поля K, A, F, Q, G, H, R, и M.

  • Если значение равно 'nullspace', то поля Kc, Fc, B, ud, и M.

  • Если значение равно 'stiff-spring', то поля Ks, Fs, и M.

Поля в структурном массиве также зависят от matrices:

  • Если значение равно boundaryЗатем поля представляют собой все матрицы, связанные с границами геометрии.

  • Если значение равно domain, то поля все связанные с доменом матрицы.

  • Если значение является идентификатором матрицы или идентификаторами, например, 'F', 'MKF', 'K'и так далее, тогда поля являются соответствующими матрицами.

Дополнительные сведения см. в разделе Алгоритмы.

Алгоритмы

свернуть все

Дифференциальное уравнение в частных производных Toolbox™ решает уравнения вида

m∂2u∂t2+d∂u∂t−∇ · (c ⊗∇ u) +au=f

и уравнения собственных значений формы

−∇· (c⊗∇u) +au=λduor−∇· (c⊗∇u) + au = λ 2mu

с граничными условиями Дирихле, hu = r, и граничными условиями Неймана, n· (c⊗∇u) +

assembleFEMatrices возвращает следующие полные матрицы и векторы конечных элементов, которые представляют соответствующую задачу PDE:

  • K - матрица жесткости, интеграл дискретизированной версии c коэффициент.

  • M - массовая матрица, интеграл дискретизированной версии m или d коэффициенты. M является ненулевым для зависящих от времени и собственных значений проблем.

  • A является интегралом дискретизированной версии a коэффициент.

  • F является интегралом дискретизированной версии f коэффициент. Для тепловых, электромагнитных и структурных проблем, F - вектор исходной нагрузки или нагрузки на тело.

  • Q является интегралом дискретизированной версии q член в граничном условии Неймана.

  • G является интегралом дискретизированной версии g член в граничном условии Неймана. Для структурных проблем, G - вектор граничной нагрузки.

  • H и R матрицы поступают непосредственно из условий Дирихле и сетки.

Наложение граничных условий Дирихле

'nullspace' техника исключает условия Дирихле из задачи с помощью подхода линейной алгебры. Он генерирует объединенные конечно-элементные матрицы Kc, Fc, B, и вектор ud соответствует уменьшенной системе Kc*u = Fc, где Kc = B'*(K + A + Q)*B, и Fc = B'*(F + G). B матрица охватывает пустое пространство столбцов H (матрица условий Дирихле, представляющая h*ud = r). R вектор представляет условия Дирихле в H*ud = R. ud вектор имеет размер вектора раствора. Его элементы представляют собой нули везде, за исключением местоположений степени свободы Дирихле (DoF), где они содержат заданные значения.

От 'nullspace' матрицы, вы можете вычислить решение u как

u = B*(Kc\Fc) + ud.

Если собран определенный набор матриц, например G и M, можно наложить граничные условия на G и M следующим образом. Сначала вычислите пространство NULL столбцов H.

[B,Or] = pdenullorth(H);
ud = Or*((H*Or\R)); % Vector with known value of the constraint DoF.

Затем используйте B матрица следующим образом. Исключение степеней свободы Дирихле из вектора нагрузки G, использовать:

GwithBC = B'*G

Чтобы исключить степени свободы Дирихле из матрицы массы, используйте:

M = B'*M*B

С помощью той же техники можно исключить степени свободы Дирихле из других векторов и матриц.

'stiff-spring' метод преобразует граничные условия Дирихле в граничные условия Неймана, используя жесткую пружинную аппроксимацию. Возвращает матрицу Ks и вектор Fs которые вместе представляют другой тип комбинированных матриц конечных элементов. Приблизительное решение: u = Ks\Fs. По сравнению с 'nullspace' техника, 'stiff-spring' способ быстрее генерирует матрицы, но обычно дает менее точные решения.

Примечание

Внутри панели инструментов используется 'nullspace' подход к навязыванию граничных условий Дирихле при вычислении решения с использованием solvepde и solve.

Степени свободы (DoF)

Если количество узлов в модели равно NumNodes, и число уравнений равно N, то длина векторов столбцов u и ud является N*NumNodes. Панель инструментов назначает идентификаторы степеням свободы в u и ud:

  • Записи от 1 до NumNodes соответствуют первому уравнению.

  • Записи из NumNodes+1 кому 2*NumNodes соответствуют второму уравнению.

  • Записи из 2*NumNodes+1 кому 3*NumNodes соответствуют третьему уравнению.

Такой же подход применяется ко всем другим позициям, вплоть до N*NumNodes.

Например, в 3-D структурной модели длина вектора решения u является 3*NumNodes. Первое NumNodes записи соответствуют x-размещение на каждом узле, следующий NumNodes записи соответствуют y-размещение и следующее NumNodes записи соответствуют z-размещение.

Термический, структурный и электромагнитный анализ

В тепловом анализе m и a коэффициенты равны нулю. Теплопроводность соответствует c коэффициент. Произведение массовой плотности и удельного тепла соответствует d коэффициент. Внутренний источник тепла соответствует f коэффициент. Температура на границе соответствует термину граничного условия Дирихле r с h = 1. Различные формы граничного теплового потока, такие как сам тепловой поток, коэффициент излучения и коэффициент конвекции, сопоставляются с терминами граничных условий Неймана q и g.

В структурном анализе a коэффициент равен нулю. Карта отношения модуля Юнга и Пуассона к c коэффициент. Плотность массы соответствует m коэффициент. Нагрузки тела сопоставляются с f коэффициент. Смещения, зависимости и компоненты перемещения вдоль осей сопоставляются с терминами граничных условий Дирихле h и r. Граничные нагрузки, такие как давление, тяга поверхности и поступательная жесткость, соответствуют терминам граничных условий Неймана q и g. При задании модели демпфирования с использованием параметров релейного демпфирования Alpha и Beta, дискретизированная демпфирующая матрица C вычисляется с использованием матрицы массы M и матрица жесткости K как C = Alpha*M + Beta*K.

В электростатическом и магнитостатическом анализах m, a, и d коэффициенты равны нулю. Карта относительной диэлектрической проницаемости и относительной проницаемости для c коэффициент. Плотность заряда и плотность тока соответствуют f коэффициент. Напряжение и магнитный потенциал на границе соответствуют термину граничного условия Дирихле r с h = 1.

Представлен в R2016a