pdeCoefficients

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

Описание

пример

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

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

m2ut2+dut·(cu)+au=f

и возвращает структуру coeffs это содержит коэффициенты mDCA, и f. Для получения дополнительной информации смотрите уравнения, которые Можно Решить Используя Тулбокс УЧП (Partial Differential Equation Toolbox).

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

пример

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

Примеры

свернуть все

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

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

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

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

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

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

m2ut2+dut-(cu)+au=f

и извлекает коэффициенты mDCA, и f в структуру coeffs. Для 2D систем N уравнения, c тензор с 4N2 элементы. Для получения дополнительной информации см. c Коэффициент для specifyCoefficients (Partial Differential Equation Toolbox). В этом случае, N=1, так коэффициент c 4 1 вектор-столбец, который представляет cxxCxyCyx, и cyy.

coeffs.c
ans = 4×1

    -1
     0
     0
    -1

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

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

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

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

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

Figure contains an axes object. The axes object 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)

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

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 object. The axes object contains an object of type patch.

Решите уравнение 2D Пуассона в области, ограниченной модульным кругом. Форма расхождения УЧП имеет непостоянный f коэффициент. Можно решить УЧП путем извлечения коэффициентов с помощью 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)

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

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+y2

Задайте коэффициенты модели 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 object. The axes object contains an object of type patch.

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

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

Figure contains an axes object. The axes object 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)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)

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

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

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

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

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)

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

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

Найдите решения зависящего от времени УЧП в диапазоне времени от 0s до 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 objects. Axes object 1 contains an object of type patch. Axes object 2 contains an object of type patch. Axes object 3 contains an object of type patch. Axes object 4 contains an object of type patch. Axes object 5 contains an object of type patch. Axes object 6 contains an object of type patch. Axes object 7 contains an object of type patch. Axes object 8 contains an object of type patch. Axes object 9 contains an object of type patch. Axes object 10 contains an object of type patch.

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

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

-2u1+u2=0,

-D2u2=p,

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

D=Eh312(1-ν2),

и E модуль эластичности, ν отношение Пуассона, 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

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

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: 0
    a: [2x2 sym]
    c: [4x4 sym]
    f: [2x1 sym]
    d: 0

Отобразите коэффициенты mACF, и d.

structfun(@disp,symCoeffs)
0

(0100)

(100001000025000273000025000273)

(0pres)

0

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

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.

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 геометрии и сгенерируйте mesh для модели 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 object. The axes object 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

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

свернуть все

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

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

  • syms u(x,y)

  • syms u(t,x,y)

  • syms u(x,y,z)

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

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

свернуть все

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

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

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

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

Введенный в R2021a