Извлечение коэффициентов дифференциального уравнения с частными производными
извлекает коэффициенты дифференциального уравнения с частными производными (PDE) как структуру чисел двойной точности и указателей на функцию, которая может использоваться как вход coeffs
= pdeCoefficients(pdeeq
,u
)specifyCoefficients
функция в Partial Differential Equation Toolbox™.
pdeeq
является скалярным УЧП или системой PDE в символьной форме, которая является функцией u
. The pdeCoefficients
функция преобразует pdeeq
в систему уравнений вида
и возвращает структуру coeffs
который содержит коэффициенты m
, d
, c
, a
, и f
. Для получения дополнительной информации смотрите Уравнения, которые можно решить с помощью PDE Toolbox (Набор Partial Differential Equation Toolbox).
Если pdeCoefficients
не может преобразовать УЧП в форму расхождения выше, затем выдает предупреждающее сообщение и записывает все оставшиеся градиенты в f
коэффициент. PDE Toolbox не сможет решить этот тип PDE.
Создайте символьный УЧП, который представляет Laplacian переменной u(x,y)
.
syms u(x,y)
pdeeq = laplacian(u,[x y]) == -3
pdeeq(x, y) =
Извлеките коэффициенты УЧП.
coeffs = pdeCoefficients(pdeeq,u)
coeffs = struct with fields:
a: 0
c: [4x1 double]
m: 0
d: 0
f: -3
pdeCoefficients
преобразует символическое УЧП в скалярное уравнение УЧП вида
и извлекает коэффициенты m
, d
, c
, a
, и f
в структуру coeffs
. Для 2-D систем уравнения, c
является тензором с 4 элементы. Для получения дополнительной информации см. Раздел «Коэффициенты c» для sefectCofficients (Partial Differential Equation Toolbox). В этом случае, , так что коэффициент c
является вектор-строка 4 на 1, которая представляет c
, c
, c
, и c
.
coeffs.c
ans = 4×1
-1
0
0
-1
Этот пример использует:
Решить 2-D однородное уравнение Лапласа в области, ограниченном модуле кругом. Используйте pdeCoefficients
функция для извлечения коэффициентов уравнения Лапласа.
Создайте модель УЧП и включите геометрию.
model = createpde; geometryFromEdges(model,@circleg);
Постройте график геометрии и отобразите метки ребра для использования в определении граничного условия.
figure pdegplot(model,'EdgeLabels','on') axis equal
Создайте символическое выражение pdeeq
это представляет уравнение Лапласа.
syms u(x,y)
pdeeq = laplacian(u,[x y])
pdeeq(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);
Примените граничное условие Дирихле на всех 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)
f
КоэффициентЭтот пример использует:
Решить 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) =
Извлеките коэффициенты уравнения.
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 =
Задайте коэффициенты модели PDE.
specifyCoefficients(model,'m',coeffs.m,'d',coeffs.d, ... 'c',coeffs.c,'a',coeffs.a,'f',coeffs.f);
Примените граничное условие Дирихле на всех 4 ребрах, образующих круг.
applyBoundaryCondition(model,'dirichlet','Edge',1:4,'u',0);
Сгенерируйте mesh по умолчанию для геометрии.
generateMesh(model);
Решить УЧП. Постройте график узлового решения с помощью опции 'XYData'
в pdeplot
функция.
results = solvepde(model);
pdeplot(model,'XYData',results.NodalSolution)
Постройте график градиента решения в узловых местоположениях с помощью опции 'FlowData'
.
pdeplot(model,'FlowData',[results.XGradients results.YGradients])
Создайте УЧП без формы расхождения.
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) =
Извлеките его коэффициенты. Когда pdeCoefficients
невозможно преобразовать УЧП в форму расхождения
,
оно выдает предупреждающее сообщение, но все еще формирует выход.
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 =
coeffs.f('show')
ans =
Поскольку УЧП не имеет формы расхождения, требуемой PDE Toolbox, тулбокс не сможет решить эту УЧП.
Этот пример использует:
Решить зависящее от времени волновое уравнение в области, ограниченном модуле кругом. Волновое уравнение является УЧП со скалярной функцией что зависит от времени и координаты и .
Создайте модель УЧП и включите геометрию.
model = createpde(1); geometryFromEdges(model,@circleg);
Создайте символьный УЧП, который представляет волновое уравнение.
syms u(t,x,y)
pdeeq = diff(u,t,t) - laplacian(u,[x y])
pdeeq(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);
Примените граничное условие Дирихле на всех 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
Этот пример использует:
Решить систему из два уЧП второго порядка. Можно решить систему PDE, извлечя коэффициенты УЧП символически используя pdeCoefficients
, преобразование коэффициентов в числа с двойной точностью с помощью pdeCoefficientsToDouble
, и определение коэффициентов в модели PDE с помощью specifyCoefficients
.
Система PDE представляет собой отклонение зажатого конструктивного диска под равномерной нагрузкой давления. Система 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);
Задайте значения физических параметров системы. Допустим внешнее давление быть символьной переменной 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)
Замените значение на 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'
Найдите поперечное отклонение в центре диска.
wMax = min(u(1:numNodes,1))
wMax = -0.2763
Сравните результат с отклонением в центре диска, вычисленным аналитически.
pres = 2; wMax = -.0138*pres*len^4/(E*h_thick^3)
wMax = -0.2760
pdeeq
- УЧП в символическом видеУЧП в символьной форме, заданной как символьное уравнение, выражение или символьный вектор.
u
- Переменная PDEПеременная PDE, заданная как символьная функция. u
должна быть стационарной или зависящей от времени переменной в двух или трёх размерностях. Например, создайте переменную u
используя одно из следующих операторов:
syms u(x,y)
syms u(t,x,y)
syms u(x,y,z)
syms u(t,x,y,z)
coeffs
- Коэффициенты УЧПКоэффициенты УЧП, возвращенные как структура чисел двойной точности и указателей на функцию в соответствии с требованиями specifyCoefficients
функция. Поля структуры a
, c
, m
, d
, и f
. Для получения дополнительной информации о интерпретации коэффициентов в формате, требуемом PDE Toolbox, смотрите:
c Коэффициент для specifyCofficients (Partial Differential Equation Toolbox)
m, d или коэффициент для specificients (Partial Differential Equation Toolbox)
f Коэффициент для specifyCofficients (Partial Differential Equation Toolbox)
Любой коэффициент может быть числом двойной точности или указателем на функцию. Для примера коэффициент coeffs.f
может быть указателем на функцию, который представляет некоторую внутреннюю функцию в рабочей области. Это принимает две структуры как входные параметры, location
и state
, и возвращает double.
Указатели на функцию отображаются следующим @makeCoefficient/coefficientFunction
в Командном окне. Чтобы отобразить формулу указателя на функцию coeffs.f
в символической форме используйте coeffs.f('show')
.
symCoeffs
- Коэффициенты УЧП в символьной формеКоэффициенты УЧП в символьной форме, возвращенные как структура символьных выражений.
diff
| laplacian
| pdeCoefficientsToDouble
| syms
| specifyCoefficients
(Partial Differential Equation Toolbox)
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.