exponenta event banner

pdeCoefficients

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

Описание

пример

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

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

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

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

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

пример

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

Примеры

свернуть все

Создание символьного PDE, представляющего лапласиан переменной 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

Извлеките коэффициенты PDE.

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

pdeCoefficients преобразует символьный PDE в скалярное уравнение PDE вида

m∂2u∂t2+d∂u∂t-∇⋅ (c∇u) + au = f

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

coeffs.c
ans = 4×1

    -1
     0
     0
    -1

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

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

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);

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

generateMesh(model);

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

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

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

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

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

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

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);

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

generateMesh(model);

Решите проблему PDE. Постройте график узлового решения с помощью опции '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.

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

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 не удается преобразовать PDE в форму расхождения

m∂2u∂t2+d∂u∂t-∇⋅ (c⊗∇u) + 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'. Все оставшиеся градиенты в PDE записываются в f коэффициент.

coeffs.c('show')
ans = 

(-118-cos(x+y)418-cos(x+y)4-12)[-sym(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)/4

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

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

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

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

Создайте символьный PDE, представляющий волновое уравнение.

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)

Извлеките коэффициенты PDE.

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);

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

generateMesh(model);

Найдите решения зависящего от времени PDE в диапазоне времени от 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 второго порядка. Вы можете решить систему PDE, извлекая коэффициенты PDE символически с помощью pdeCoefficients, преобразование коэффициентов в числа с двойной точностью с помощью pdeCoefficientsToDoubleи определение коэффициентов в модели PDE с использованием specifyCoefficients.

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

- ∇2u1+u2=0,

- D∇2u2=p,

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

D = Eh312 (1-start2),

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

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

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

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

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.

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]

Укажите коэффициенты PDE для модели PDE.

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]);

Укажите размер сетки геометрии и создайте сетку для модели PDE.

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 в символьной форме, определяемой как символьное уравнение, выражение или символьный вектор.

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

  • syms u(x,y)

  • syms u(t,x,y)

  • syms u(x,y,z)

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

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

свернуть все

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

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

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

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

См. также

| | | | (Панель инструментов дифференциального уравнения в частных производных)

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