(Не рекомендуется) Решение нелинейной эллиптической проблемы PDE
pdenonlin не рекомендуется. Использовать solvepde вместо этого.
решает нелинейный PDEu = pdenonlin(model,c,a,f)
au = f
с геометрией, граничными условиями и сеткой конечных элементов в model, и коэффициенты c, a, и f. В этом контексте «нелинейный» означает некоторый коэффициент в c, a, или f зависит от решения u или его градиент. Если PDE представляет собой систему уравнений (model.PDESystemSize > 1), то pdenonlin решает систему уравнений
au = f
, для любых предыдущих аргументов изменяет процесс решения с помощью u = pdenonlin(___,Name,Value)Name, Value пар.
Решите проблему минимальной поверхности. Потому что эта проблема имеет нелинейный c коэффициент, использование pdenonlin чтобы решить его.
Создание модели и включение круговой геометрии с помощью встроенного модуля circleg функция.
model = createpde; geometryFromEdges(model,@circleg);
Установите коэффициенты.
a = 0;
f = 0;
c = '1./sqrt(1+ux.^2+uy.^2)';Задайте граничное условие Дирихле со значением .
boundaryfun = @(region,state)region.x.^2; applyBoundaryCondition(model,'edge',1:model.Geometry.NumEdges,... 'u',boundaryfun,'Vectorized','on');
Создайте сетку и решите проблему.
generateMesh(model,'GeometricOrder','linear','Hmax',0.1); u = pdenonlin(model,c,a,f); pdeplot(model,'XYData',u,'ZData',u)

Решите проблему минимальной поверхности с помощью унаследованного подхода для создания граничных условий и геометрии.
Создание геометрии с помощью встроенного модуля circleg функция. Постройте график геометрии для просмотра меток кромок.
g = @circleg; pdegplot(g,'EdgeLabels','on') axis equal

Создайте граничные условия Dirichlet со значением x2.Create следующем файле и сохраните его в пути MATLAB.
function [qmatrix,gmatrix,hmatrix,rmatrix] = pdex2bound(p,e,u,time)
ne = size(e,2); % number of edges qmatrix = zeros(1,ne); gmatrix = qmatrix; hmatrix = zeros(1,2*ne); rmatrix = hmatrix;
for k = 1:ne
x1 = p(1,e(1,k)); % x at first point in segment
x2 = p(1,e(2,k)); % x at second point in segment
xm = (x1 + x2)/2; % x at segment midpoint
y1 = p(2,e(1,k)); % y at first point in segment
y2 = p(2,e(2,k)); % y at second point in segment
ym = (y1 + y2)/2; % y at segment midpoint
switch e(5,k)
case {1,2,3,4}
hmatrix(k) = 1;
hmatrix(k+ne) = 1;
rmatrix(k) = x1^2;
rmatrix(k+ne) = x2^2;
end
end
Задайте коэффициенты и граничные условия.
a = 0;
f = 0;
c = '1./sqrt(1+ux.^2+uy.^2)';
b = @pdex2bound;Создайте сетку и решите проблему.
[p,e,t] = initmesh(g,'Hmax',0.1); u = pdenonlin(b,p,e,t,c,a,f); pdeplot(p,e,t,'XYData',u,'ZData',u)

Решите проблему нелинейной 3-D с нетривиальной геометрией.
Импорт геометрии из BracketWithHole.stl файл. Печать меток геометрии и граней.
model = createpde(); importGeometry(model,'BracketWithHole.stl'); figure pdegplot(model,'FaceLabels','on','FaceAlpha',0.5) view(30,30) title('Bracket with Face Labels')

figure pdegplot(model,'FaceLabels','on','FaceAlpha',0.5) view(-134,-32) title('Bracket with Face Labels, Rear View')

Задайте граничное условие Дирихле со значением 1000 на задней грани, которая является гранью 4. Задайте для больших граней 1 и 7, а также круговой грани 11 граничные условия Неймана со значением g = -10. Не устанавливайте граничные условия на других гранях. Эти грани по умолчанию соответствуют граничным условиям Неймана со значением g = 0.
applyBoundaryCondition(model,'Face',4,'u',1000); applyBoundaryCondition(model,'Face',[1,7,11],'g',-10);
Установите c коэффициент к 1, f до 0,1, и a к нелинейному значению '0.1 + 0.001*u.^2'.
c = 1;
f = 0.1;
a = '0.1 + 0.001*u.^2';Создайте сетку и решите PDE. Начать с начального предположения u0 = 1000, которое соответствует значению, заданному на грани 4. Включить Report для наблюдения сходимости во время решения.
generateMesh(model); u = pdenonlin(model,c,a,f,'U0',1000,'Report','on');
Iteration Residual Step size Jacobian: full 0 7.2059e-01 1 1.3755e-01 1.0000000 2 4.0800e-02 1.0000000 3 1.1343e-02 1.0000000 4 2.2740e-03 1.0000000 5 1.7779e-04 1.0000000 6 1.4223e-06 1.0000000
Постройте график решения на границе геометрии.
pdeplot3D(model,'ColorMapData',u)
model - модель PDEPDEModel объектМодель PDE, указанная как PDEModel объект.
Пример: model = createpde
c - коэффициент PDEКоэффициент PDE, определяемый как скаляр, матрица, символьный вектор, символьный массив, строковый скаляр, строковый вектор или функция коэффициента. c представляет коэффициент c в скалярном PDE
au = f
или в системе ПДЭ
au = f
Пример: 'cosh(x+y.^2)'
Типы данных: double | char | string | function_handle
Поддержка комплексного номера: Да
a - коэффициент PDEКоэффициент PDE, определяемый как скаляр, матрица, символьный вектор, символьный массив, строковый скаляр, строковый вектор или функция коэффициента. a представляет коэффициент в скалярном PDE
au = f
или в системе ПДЭ
au = f
Пример: 2*eye(3)
Типы данных: double | char | string | function_handle
Поддержка комплексного номера: Да
f - коэффициент PDEКоэффициент PDE, определяемый как скаляр, матрица, символьный вектор, символьный массив, строковый скаляр, строковый вектор или функция коэффициента. f представляет коэффициент f в скалярном PDE
au = f
или в системе ПДЭ
au = f
Пример: char('sin(x)';'cos(y)';'tan(z)')
Типы данных: double | char | string | function_handle
Поддержка комплексного номера: Да
b - Граничные условияГраничные условия, заданные как граничная матрица или граничный файл. Передайте граничный файл как дескриптор функции или как имя файла. Граничная матрица обычно является экспортом из приложения PDE Modeler.
Пример: b = 'circleb1', b = "circleb1", или b = @circleb1
Типы данных: double | char | string | function_handle
p - Точки сеткиТочки сетки, заданные как 2-по-Np матрица точек, где Np - количество точек в сетке. Для описания (p,e,t) матрицы, см. Данные сетки как [p, e, t] Тройки.
Как правило, используется p, e, и t данные, экспортированные из приложения PDE Modeler, или сгенерированные initmesh или refinemesh.
Пример: [p,e,t] = initmesh(gd)
Типы данных: double
e - Кромки сеткиКромки сети, заданные как 7около-Ne матрица рёбер, где Ne - количество кромок в сетке. Для описания (p,e,t) матрицы, см. Данные сетки как [p, e, t] Тройки.
Как правило, используется p, e, и t данные, экспортированные из приложения PDE Modeler, или сгенерированные initmesh или refinemesh.
Пример: [p,e,t] = initmesh(gd)
Типы данных: double
t - Треугольники сеткиТреугольники сети, заданные как 4около-Nt матрица треугольников, где Nt - количество треугольников в сетке. Для описания (p,e,t) матрицы, см. Данные сетки как [p, e, t] Тройки.
Как правило, используется p, e, и t данные, экспортированные из приложения PDE Modeler, или сгенерированные initmesh или refinemesh.
Пример: [p,e,t] = initmesh(gd)
Типы данных: double
Укажите дополнительные пары, разделенные запятыми Name,Value аргументы. Name является именем аргумента и Value - соответствующее значение. Name должен отображаться внутри кавычек. Можно указать несколько аргументов пары имен и значений в любом порядке как Name1,Value1,...,NameN,ValueN.
'Jacobian','full''Jacobian' - Приближение Якобиана'full' (3-D по умолчанию) | 'fixed' (2-D по умолчанию) | 'lumped'Аппроксимация якобиана, указанная как 'full', 'fixed', или 'lumped'.
'full' означает численную оценку полного якобиана на основе разреженной версии numjac функция. 3-D геометрия использует только 'full'любая другая спецификация дает ошибку.
'fixed' задает матрицу итерации с фиксированной точкой, где якобиан аппроксимируется матрицей жесткости. Это 2-D геометрия по умолчанию.
'lumped' задает «блочное» приближение, как описано в разделе «Нелинейные уравнения». Это приближение основано на численном дифференцировании коэффициентов.
Пример: u = pdenonlin(model,c,a,f,'Jacobian','full')
Типы данных: char | string
'U0' - Начальное предположение о решенииНачальное решение, определяемое как скаляр, вектор символов или вектор чисел. Скаляр задает постоянное начальное условие для скалярной или PDE-системы.
Для систем уравнений N и сетки с Np узлы, задайте вектор столбца с N *Np компоненты. Узлы: model.Mesh.Nodes, или p данные из initmesh или meshToPet. См. раздел Данные сетки как [p, e, t] Тройки.
Первое Np элементы содержат значения компонента 1, где значение элемента k соответствует узлу p(k). Следующее Np точки содержат значения компонента 2 и т.д. Может быть удобно сначала представить начальные условия u0 как Npоколо-N матрица, где первый столбец содержит записи для компонента 1, второй столбец содержит записи для компонента 2 и т.д. Окончательное представление начальных условий: u0(:).
Пример: u = pdenonlin(model,c,a,f,'U0','x.^2-y.^2')
Типы данных: double | char | string
Поддержка комплексного номера: Да
'Tol' - Остаточный размер при прекращенииОстаточный размер при завершении, заданный как положительный скаляр. pdenonlin повторяется до тех пор, пока остаточный размер не станет меньше 'Tol'.
Пример: u = pdenonlin(model,c,a,f,'Tol',1e-6)
Типы данных: double
'MaxIter' - Максимальное количество итераций Гаусса-Ньютона25 (по умолчанию) | положительное целое числоМаксимальное число итераций Гаусса - Ньютона, указанное как положительное целое число.
Пример: u = pdenonlin(model,c,a,f,'MaxIter',12)
Типы данных: double
'MinStep' - Минимальное демпфирование направления поиска1/2^16 (по умолчанию) | положительный скалярМинимальное демпфирование направления поиска, заданное как положительный скаляр.
Пример: u = pdenonlin(model,c,a,f,'MinStep',1e-3)
Типы данных: double
'Report' - Печать информации о сходимости'off' (по умолчанию) | 'on'Печать информации о сходимости, указанной как 'off' или 'on'.
Пример: u = pdenonlin(model,c,a,f,'Report','on')
Типы данных: char | string
'Norm' - Остаточная нормаInf (по умолчанию) | значение p для нормы Лп | 'energy'Остаточная норма, указанная как p значение для нормы Лп, или как 'energy'. p может быть любым положительным действительным значением, Inf, или -Inf. p норма вектора v является sum(abs(v)^p)^(1/p). Посмотрите norm.
Пример: u = pdenonlin(model,c,a,f,'Norm',2)
Типы данных: double | char | string
u - решение PDEPDE-решение, возвращенное в виде вектора.
Если PDE является скалярным, что означает только одно уравнение, то u - вектор столбца, представляющий решение u в каждом узле сетки. u(i) является решением на i4-я колонна model.Mesh.Nodes или i4-я колонна p.
Если PDE является системой из N > 1 уравнений, то u - вектор столбца с N *Np элементы, где Np - количество узлов в сетке. Первое Np элементы u представим решение уравнения 1, затем Np элементы представляют решение уравнения 2 и т.д.
Чтобы получить решение в произвольной точке геометрии, используйте pdeInterpolant.
Для построения графика решения используйте pdeplot для 2-й геометрии, или см. 3D Сюжеты Решения и Градиента с MATLAB® Functions.
res - Норма ступенчатых остатков НьютонаНорма остатков шага Ньютона, возвращаемая как скаляр. Сведения об алгоритме см. в разделе Нелинейные уравнения.
Если итерация Ньютона не сходится, pdenonlin отображает сообщение об ошибке Too many iterations или Stepsize too small.
Если начальное предположение создает матрицы, содержащие NaN или Inf элементы, pdenonlin отображает сообщение об ошибке Unsuitable initial guess U0 (default: U0 = 0).
Если у вас очень маленькие коэффициенты или очень маленькие геометрические размеры, pdenonlin может не сойтись или может сойтись к неверному решению. Если да, то иногда можно получить лучшие результаты, масштабировав коэффициенты или геометрические размеры порядка 1.
Основная идея заключается в использовании итераций Гаусса - Ньютона для решения нелинейных уравнений. Скажи, что пытаешься решить уравнение
r (u) = - ∇· (c (u) ∇u) + a (u) u-f (u) = 0.
В настройке КЭМ решается слабая форма r (u) = 0. Установить как обычно
=∑Ujϕj
где x представляет 2-D или точку 3-D. Затем умножьте уравнение на произвольную тестовую функцию, интегрируйте в области Λ и используйте формулу Грина и граничные условия для получения
ds
которая должна быть сохранена для всех индексов i.
Остаточный вектор start( U) может быть легко вычислен как
(U) = (K + M + Q) U - (F + G)
где матрицы K, M, Q и векторы F и G формируются посредством сборки задачи
- ∇· (c (U) ∇u) + a (U) u = f (U).
Предположим, что у вас есть предположение U (n) решения. Если U (n) достаточно близко к точному решению, улучшенное приближение U (n + 1) получается решением линеаризованной задачи
= − αstart( U (n))
где - положительное число. (Не обязательно, чтобы (U) = 0 имели решение, даже если (u) = 0 имеет.) В этом случае итерация Гаусса - Ньютона имеет тенденцию быть минимизатором остатка, то есть решением minU ‖ start( U
Хорошо известно, что для достаточно малых
(U (n)) ‖
и
1start( U (n))
называется направлением спуска для ) ‖, ‖ ⋅ ‖ - L2-norm. Итерация
) + αpn,
где ≤ 1 выбирается как можно большим, так что шаг имеет разумный спуск.
Метод Гаусса-Ньютона является локальным, и сходимость гарантируется только тогда, когда U (0) достаточно близко к решению. В общем, первое предположение может находиться вне области сходимости. Чтобы улучшить сходимость от плохих начальных догадок, реализуется стратегия демпфирования для выбора α, поиска линии Армийо-Гольдштейна. Он выбирает наибольший коэффициент демпфирования α из последовательности 1, 1/2, 1/4,.. таким образом, что следующее неравенство сохраняется:
+αpn‖≥α2‖ρ (U (n)) ‖
что гарантирует снижение остаточной нормы не менее чем на 1 - α/2. На каждом этапе алгоритма поиска строки требуется оценка остаточного (αpn).
Важным моментом этой стратегии является то, что когда U (n) приближается к решению, то α→1 и, таким образом, скорость сходимости увеличивается. Если существует решение, обеспечивающее (U) = 0, схема в конечном итоге восстанавливает квадратичную скорость сходимости стандартной итерации Ньютона.
С предшествующей проблемой тесно связан выбор начального приближения U (0). По умолчанию решатель устанавливает U (0), а затем собирает матрицы КЭМ K и F и вычисляет
U (1) = K-1F
Затем затухающая итерация Гаусса-Ньютона начинается с U (1), что должно быть лучшим предположением, чем U (0). Если граничные условия не зависят от решения u, то U (1) удовлетворяет им, даже если U (0) не имеет. Кроме того, если уравнение является линейным, то U (1) является точным решением КЭМ и решатель не входит в цикл Гаусса-Ньютона.
Бывают ситуации, когда U (0) = 0 не имеет смысла или сходимость невозможна .
В некоторых ситуациях вы уже можете иметь хорошее приближение, и нелинейный решатель может быть запущен с ним, избегая медленного режима сходимости. Эта идея используется в адаптивном генераторе сетки. Он вычисляет решение, на сетке, оценивает ошибку и может уточнить некоторые треугольники. Интерполант является очень хорошим начальным предположением для решения на очищенной сетке.
В целом точный якобиан
∂U
недоступен. Аппроксимация Jn конечными различиями следующим образом является дорогостоящей, но осуществимой. i-й столбец Jn может быть аппроксимирован
U (n))
что подразумевает сборку матриц КЭМ для треугольников, содержащих точку сетки I. Очень простое приближение к Jn, которое дает итерацию фиксированной точки, также возможно следующим образом. По существу, для данного U (n) вычисляют КЭМ матрицы K и F и устанавливают
U (n + 1) = K-1F.
Это эквивалентно аппроксимации якобиана матрицей жесткости. Действительно, так как (U (n)) = KU (n) - F, ставя Jn = K выходов
K − 1 (KU (n) − F) = K − 1F
Во многих случаях скорость сходимости является медленной, но стоимость каждой итерации является дешевой.
Дифференциальное уравнение в частных производных Toolbox™ нелинейный решатель также обеспечивает компромисс между двумя крайними значениями. Чтобы вычислить производную U→KU отображения, выполните следующие действия. Термин был опущен для ясности, но снова появляется в окончательном результате.
Ωϕjcu ϕl ϕi dxUl
Первый интегральный член не более чем Ki, j .
Второй член является «скошенным», т.е. замененным диагональной матрицей, которая содержит суммы строк. Поскольку Λ j = 1, второе слагаемое аппроксимируется
который является ith компонентом K (c') U, где K (c') является матрицей жесткости, связанной с коэффициентом ∂c / ∂ u, а не c. То же рассуждение может быть применено к производной отображения U→MU. Производная отображения U→ -F точно
которая является массовой матрицей, связанной с коэффициентом ∂f/∂u. Таким образом, якобиан остаточного (U)
(c ′) + M (a ′)) U)
где дифференцирование по отношению к u, К и М обозначают матрицы жесткости и массы, а их индексы обозначают коэффициенты, относительно которых они собраны. При каждой итерации Гаусса - Ньютона нелинейный решатель собирает матрицы, соответствующие уравнениям
c'∇u) + a' u = 0
и затем производит приблизительный якобиан. Дифференциации коэффициентов делаются численно.
В общем задании эллиптических систем граничные условия добавляются к матрице жесткости для формирования полной линейной системы:
Uμ]=[FR]=F˜
где коэффициенты и могут зависеть от решения. «Блочный» подход аппроксимирует производное отображение остатка на
Нелинейности граничных условий и зависимости коэффициентов от производных недостаточно линеаризованы этой схемой. Когда такие нелинейности сильны, схема сводится к итерации фиксированной точки и может сходиться медленно или вообще не сходиться. Если граничные условия являются линейными, они не влияют на свойства сходимости схем итерации. В случае Неймана они невидимы (H - пустая матрица), а в случае Дирихле они просто утверждают, что остаток равен нулю в соответствующих граничных точках.
Имеется измененная версия этого примера. Открыть этот пример с помощью изменений?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.