pdeCoefficients

Извлечение коэффициентов дифференциального уравнения с частными производными

Описание

пример

coeffs = pdeCoefficients(pdeeq,u) извлекает коэффициенты дифференциального уравнения с частными производными (PDE) как структуру чисел двойной точности и указателей на функцию, которая может использоваться как вход specifyCoefficients функция в Partial Differential Equation Toolbox™.

pdeeq является скалярным УЧП или системой PDE в символьной форме, которая является функцией u. The pdeCoefficients функция преобразует pdeeq в систему уравнений вида

m2ut2+dut·(cu)+au=f

и возвращает структуру coeffs который содержит коэффициенты m, d, c, a, и f. Для получения дополнительной информации смотрите Уравнения, которые можно решить с помощью PDE Toolbox (Набор Partial Differential Equation Toolbox).

Если pdeCoefficients не может преобразовать УЧП в форму расхождения выше, затем выдает предупреждающее сообщение и записывает все оставшиеся градиенты в f коэффициент. PDE Toolbox не сможет решить этот тип PDE.

пример

symCoeffs = pdeCoefficients(pdeeq,u,'Symbolic',true) возвращает коэффициенты УЧП как структуру символьных выражений.

Примеры

свернуть все

Создайте символьный УЧП, который представляет Laplacian переменной u(x,y).

syms u(x,y)
pdeeq = laplacian(u,[x y]) == -3
pdeeq(x, y) = 

2x2 u(x,y)+2y2 u(x,y)=-3diff (u (x, y), x, 2) + diff (u (x, y), y, 2) = = -3

Извлеките коэффициенты УЧП.

coeffs = pdeCoefficients(pdeeq,u)
coeffs = struct with fields:
    a: 0
    c: [4x1 double]
    m: 0
    d: 0
    f: -3

pdeCoefficients преобразует символическое УЧП в скалярное уравнение УЧП вида

m2ut2+dut-(cu)+au=f

и извлекает коэффициенты m, d, c, a, и f в структуру coeffs. Для 2-D систем N уравнения, c является тензором с 4N2 элементы. Для получения дополнительной информации см. Раздел «Коэффициенты c» для sefectCofficients (Partial Differential Equation Toolbox). В этом случае, N=1, так что коэффициент c является вектор-строка 4 на 1, которая представляет cxx, cxy, cyx, и cyy.

coeffs.c
ans = 4×1

    -1
     0
     0
    -1

Решить 2-D однородное уравнение Лапласа в области, ограниченном модуле кругом. Используйте pdeCoefficients функция для извлечения коэффициентов уравнения Лапласа.

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

model = createpde;
geometryFromEdges(model,@circleg);

Постройте график геометрии и отобразите метки ребра для использования в определении граничного условия.

figure
pdegplot(model,'EdgeLabels','on')
axis equal

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

Создайте символическое выражение pdeeq это представляет уравнение Лапласа.

syms u(x,y)
pdeeq = laplacian(u,[x y])
pdeeq(x, y) = 

2x2 u(x,y)+2y2 u(x,y)diff (u (x, y), x, 2) + diff (u (x, y), y, 2)

Извлечь коэффициенты уравнения Лапласа.

coeffs = pdeCoefficients(pdeeq,u)
coeffs = struct with fields:
    a: 0
    c: [4x1 double]
    m: 0
    d: 0
    f: 0

Задайте коэффициенты модели PDE.

specifyCoefficients(model,'m',coeffs.m,'d',coeffs.d, ...
    'c',coeffs.c,'a',coeffs.a,'f',coeffs.f);

Примените граничное условие Дирихле u(x,y)=x4+y4 на всех 4 ребрах, образующих круг.

applyBoundaryCondition(model,'dirichlet','Edge',1:4,'u',@(region,state) region.x.^4 + region.y.^4);

Сгенерируйте mesh по умолчанию для геометрии.

generateMesh(model);

Решите УЧП и постройте график решения.

results = solvepde(model);
pdeplot(model,'XYData',results.NodalSolution)

Figure contains an axes. The axes contains an object of type patch.

Решить 2-D уравнение Пуассона в области, ограниченном модуле кругом. Форма расхождения УЧП имеет неконстантную f коэффициент. Можно решить УЧП, извлечя коэффициенты с помощью pdeCoefficients и определение коэффициентов в модели PDE с помощью specifyCoefficients.

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

model = createpde;
geometryFromEdges(model,@circleg);

Создайте символическое выражение pdeeq это представляет уравнение Пуассона.

syms u(x,y)
pdeeq = diff(u,x,x) + diff(u,y,y) - 1/(x^2 + y^2)
pdeeq(x, y) = 

2x2 u(x,y)-1x2+y2+2y2 u(x,y)diff (u (x, y), x, 2) - 1/( x ^ 2 + y ^ 2) + diff (u (x, y), y, 2)

Извлеките коэффициенты уравнения.

coeffs = pdeCoefficients(pdeeq,u)
coeffs = struct with fields:
    a: 0
    c: [4x1 double]
    m: 0
    d: 0
    f: @makeCoefficient/coefficientFunction

The f коэффициент не является константой. Отображается следующим @makeCoefficient/coefficientFunction, что указывает на то, что он был возвращен из рабочей области некоторой внутренней функции. Чтобы показать формулу за указателем на функцию, используйте coeffs.f('show').

coeffs.f('show')
ans = 

1x2+y21/( x ^ 2 + y ^ 2)

Задайте коэффициенты модели PDE.

specifyCoefficients(model,'m',coeffs.m,'d',coeffs.d, ...
    'c',coeffs.c,'a',coeffs.a,'f',coeffs.f);

Примените граничное условие Дирихле u(x,y)=0 на всех 4 ребрах, образующих круг.

applyBoundaryCondition(model,'dirichlet','Edge',1:4,'u',0);

Сгенерируйте mesh по умолчанию для геометрии.

generateMesh(model);

Решить УЧП. Постройте график узлового решения с помощью опции 'XYData' в pdeplot функция.

results = solvepde(model);
pdeplot(model,'XYData',results.NodalSolution)

Figure contains an axes. The axes contains an object of type patch.

Постройте график градиента решения в узловых местоположениях с помощью опции 'FlowData'.

pdeplot(model,'FlowData',[results.XGradients results.YGradients])

Figure contains an axes. The axes contains an object of type quiver.

Создайте УЧП без формы расхождения.

syms u(x,y)
pdeeq = diff(u,x,x) + cos(x+y)/4*diff(u,x,y) + 1/2*diff(u,y,y)
pdeeq(x, y) = 

2x2 u(x,y)+cos(x+y)y x u(x,y)4+2y2 u(x,y)2diff (u (x, y), x, 2) + (cos (x + y) * diff (diff (u (x, y), x), y) )/4 + diff (u (x, y), y, 2 )/2

Извлеките его коэффициенты. Когда pdeCoefficients невозможно преобразовать УЧП в форму расхождения

m2ut2+dut-(cu)+au=f,

оно выдает предупреждающее сообщение, но все еще формирует выход.

coeffs = pdeCoefficients(pdeeq,u)
Warning: After extracting m, d, and c, some gradients remain. Writing all remaining terms to f.
coeffs = struct with fields:
    a: 0
    c: @makeCoefficient/coefficientFunction
    m: 0
    d: 0
    f: @makeCoefficient/coefficientFunction

Чтобы показать указатели на функцию в извлеченных коэффициентах c и f, используйте опцию 'show'. Все оставшиеся градиенты в УЧП записываются в f коэффициент.

coeffs.c('show')
ans = 

(-118-cos(x+y)418-cos(x+y)4-12)[-сим (1); sym (1/8) - cos (x + y )/4; sym (1/8) - cos (x + y )/4; -sym (1/2)]

coeffs.f('show')
ans = 

sin(x+y)x u(x,y)4+sin(x+y)y u(x,y)4-cos(x+y)y x u(x,y)4+y x u(x,y)4(sin (x + y) * diff (u (x, y), x) )/4 + (sin (x + y) * diff (u (x, y), y) )/4 - (cos (x + y) * diff (diff (u (x, y), x), y) )/4 + diff (diff (u (x, y), x)), y))

Поскольку УЧП не имеет формы расхождения, требуемой PDE Toolbox, тулбокс не сможет решить эту УЧП.

Решить зависящее от времени волновое уравнение в области, ограниченном модуле кругом. Волновое уравнение является УЧП со скалярной функцией u(t,x,y) что зависит от времени t и координаты x и y.

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

model = createpde(1);
geometryFromEdges(model,@circleg);

Создайте символьный УЧП, который представляет волновое уравнение.

syms u(t,x,y)
pdeeq = diff(u,t,t) - laplacian(u,[x y])
pdeeq(t, x, y) = 

2t2 u(t,x,y)-2x2 u(t,x,y)-2y2 u(t,x,y)diff (u (t, x, y), t, 2) - diff (u (t, x, y), x, 2) - diff (u (t, x, y), y, 2)

Извлеките коэффициенты УЧП.

coeffs = pdeCoefficients(pdeeq,u)
coeffs = struct with fields:
    a: 0
    c: [4x1 double]
    m: 1
    d: 0
    f: 0

Задайте коэффициенты модели PDE.

specifyCoefficients(model,'m',coeffs.m,'d',coeffs.d, ...
    'c',coeffs.c,'a',coeffs.a,'f',coeffs.f);

Установите начальные условия зависящей от времени задачи на всей геометрии.

setInitialConditions(model,0,1);

Примените граничное условие Дирихле u(x,y)=0 на всех 4 ребрах, образующих круг.

applyBoundaryCondition(model,'dirichlet','Edge',1:4,'u',0);

Сгенерируйте mesh по умолчанию для геометрии.

generateMesh(model);

Найдите решения зависящего от времени УЧП во временной области значений от 0 до 50 с интервалом 2с.

results = solvepde(model,linspace(0,2,50));

Постройте график решения волнового уравнения для каждого 5с интервала.

figure;
for k = 1:10
    subplot(5,2,k);
    pdeplot(model,'XYData',results.NodalSolution(:,k*5))
    axis equal
end  

Figure contains 10 axes. Axes 1 contains an object of type patch. Axes 2 contains an object of type patch. Axes 3 contains an object of type patch. Axes 4 contains an object of type patch. Axes 5 contains an object of type patch. Axes 6 contains an object of type patch. Axes 7 contains an object of type patch. Axes 8 contains an object of type patch. Axes 9 contains an object of type patch. Axes 10 contains an object of type patch.

Решить систему из два уЧП второго порядка. Можно решить систему PDE, извлечя коэффициенты УЧП символически используя pdeCoefficients, преобразование коэффициентов в числа с двойной точностью с помощью pdeCoefficientsToDouble, и определение коэффициентов в модели PDE с помощью specifyCoefficients.

Система PDE представляет собой отклонение зажатого конструктивного диска под равномерной нагрузкой давления. Система PDE с зависимыми переменными u1 и u2 дается

-2u1+u2=0,

-D2u2=p,

где D - жесткость изгиба пластины, заданная

D=Eh312(1-ν2),

и E - модуль упругости, ν - коэффициент Пуассона, h - толщина пластины, u1 - поперечное отклонение пластины, и p - нагрузка под давлением.

Создайте модель УЧП для системы двух уравнений.

model = createpde(2);

Создайте квадратную геометрию. Задайте длину стороны квадрата. Затем включите геометрию в модель PDE.

len = 10.0;
gdm = [3 4 0 len len 0 0 0 len len]';
g = decsg(gdm,'S1',('S1')');
geometryFromEdges(model,g);

Задайте значения физических параметров системы. Допустим внешнее давление p быть символьной переменной pres который может принять любое значение.

E = 1.0e6;
h_thick = 0.1;
nu = 0.3;
D = E*h_thick^3/(12*(1 - nu^2));
syms pres

Объявите УЧП систему как системные символьные уравнения. Извлечь коэффициенты УЧП и вернуть их в символьной форме.

syms u1(x,y) u2(x,y)
pdeeq = [-laplacian(u1) + u2; -D*laplacian(u2) - pres];
symCoeffs = pdeCoefficients(pdeeq,[u1 u2],'Symbolic',true)
symCoeffs = struct with fields:
    m: [1x1 sym]
    a: [2x2 sym]
    c: [4x4 sym]
    f: [2x1 sym]
    d: [1x1 sym]

Отобразите коэффициенты m, a, c, f, и d.

structfun(@disp,symCoeffs)
0sym (0)

(0100)[sym (0), sym (1); sym (0), sym (0)]

(100001000025000273000025000273)[sym (1), sym (0), sym (0), sym (0); sym (0), sym (1), sym (0), sym (0); sym (0), sym (0), sym (25000/273), sym (0); sym (0), sym (0), sym (0), sym (25000/273)]

(0pres)[sym (0); pres]

0sym (0)

Замените значение на pres использование subs функция. Поскольку выходы subs являются символическими объектами, используйте pdeCoefficientsToDouble функция для преобразования коэффициентов в double тип данных, который делает их допустимыми входами для PDE Toolbox.

symCoeffs = subs(symCoeffs,pres,2);
coeffs = pdeCoefficientsToDouble(symCoeffs)
coeffs = struct with fields:
    a: [4x1 double]
    c: [16x1 double]
    m: 0
    d: 0
    f: [2x1 double]

Задайте коэффициенты УЧП для модели УЧП.

specifyCoefficients(model,'m',coeffs.m,'d',coeffs.d, ...
    'c',coeffs.c,'a',coeffs.a,'f',coeffs.f);

Задайте жесткость пружины. Задайте граничные условия путем определения распределенных пружин на всём четырёх ребрах.

k = 1e7;
bOuter = applyBoundaryCondition(model,'neumann','Edge',(1:4), ...
    'g',[0 0],'q',[0 0; k 0]);

Задайте размер сетки геометрии и сгенерируйте mesh для модели УЧП.

hmax = len/20;
generateMesh(model,'Hmax',hmax);

Решить модель.

res = solvepde(model);

Доступ к решению в узловых местоположениях.

u = res.NodalSolution;

Постройте график поперечного отклонения диска.

numNodes = size(model.Mesh.Nodes,2);
figure;
pdeplot(model,'XYData',u(1:numNodes),'contour','on')
title 'Transverse Deflection'

Figure contains an axes. The axes with title Transverse Deflection contains 12 objects of type patch, line.

Найдите поперечное отклонение в центре диска.

wMax = min(u(1:numNodes,1))
wMax = -0.2763

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

pres = 2;
wMax = -.0138*pres*len^4/(E*h_thick^3)
wMax = -0.2760

Входные параметры

свернуть все

УЧП в символьной форме, заданной как символьное уравнение, выражение или символьный вектор.

Переменная PDE, заданная как символьная функция. u должна быть стационарной или зависящей от времени переменной в двух или трёх размерностях. Например, создайте переменную u используя одно из следующих операторов:

  • syms u(x,y)

  • syms u(t,x,y)

  • syms u(x,y,z)

  • syms u(t,x,y,z)

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

свернуть все

Коэффициенты УЧП, возвращенные как структура чисел двойной точности и указателей на функцию в соответствии с требованиями specifyCoefficients функция. Поля структуры a, c, m, d, и f. Для получения дополнительной информации о интерпретации коэффициентов в формате, требуемом PDE Toolbox, смотрите:

Любой коэффициент может быть числом двойной точности или указателем на функцию. Для примера коэффициент coeffs.f может быть указателем на функцию, который представляет некоторую внутреннюю функцию в рабочей области. Это принимает две структуры как входные параметры, location и state, и возвращает double.

Указатели на функцию отображаются следующим @makeCoefficient/coefficientFunction в Командном окне. Чтобы отобразить формулу указателя на функцию coeffs.f в символической форме используйте coeffs.f('show').

Коэффициенты УЧП в символьной форме, возвращенные как структура символьных выражений.

Введенный в R2021a