exponenta event banner

pdenonlin

(Не рекомендуется) Решение нелинейной эллиптической проблемы PDE

pdenonlin не рекомендуется. Использовать solvepde вместо этого.

Описание

пример

u = pdenonlin(model,c,a,f) решает нелинейный PDE

−∇⋅ (c∇u) + au = f

с геометрией, граничными условиями и сеткой конечных элементов в model, и коэффициенты c, a, и f. В этом контексте «нелинейный» означает некоторый коэффициент в c, a, или f зависит от решения u или его градиент. Если PDE представляет собой систему уравнений (model.PDESystemSize > 1), то pdenonlin решает систему уравнений

−∇⋅ (c⊗∇u) + au = f

пример

u = pdenonlin(b,p,e,t,c,a,f) решает PDE с граничными условиями b, и сетка конечных элементов (p,e,t).

пример

u = pdenonlin(___,Name,Value), для любых предыдущих аргументов изменяет процесс решения с помощью Name, Value пар.

[u,res] = pdenonlin(___) также возвращает норму остатков шага Ньютона res.

Примеры

свернуть все

Решите проблему минимальной поверхности. Потому что эта проблема имеет нелинейный c коэффициент, использование pdenonlin чтобы решить его.

Создание модели и включение круговой геометрии с помощью встроенного модуля circleg функция.

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

Установите коэффициенты.

a = 0;
f = 0;
c = '1./sqrt(1+ux.^2+uy.^2)';

Задайте граничное условие Дирихле со значением x2.

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)

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

Решите проблему минимальной поверхности с помощью унаследованного подхода для создания граничных условий и геометрии.

Создание геометрии с помощью встроенного модуля circleg функция. Постройте график геометрии для просмотра меток кромок.

g = @circleg;
pdegplot(g,'EdgeLabels','on')
axis equal

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

Создайте граничные условия 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)

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

Решите проблему нелинейной 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 contains an axes. The axes with title Bracket with Face Labels contains 3 objects of type quiver, patch, line.

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

Figure contains an axes. The axes with title Bracket with Face Labels, Rear View contains 3 objects of type quiver, patch, line.

Задайте граничное условие Дирихле со значением 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)

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

свернуть все

Модель PDE, указанная как PDEModel объект.

Пример: model = createpde

Коэффициент PDE, определяемый как скаляр, матрица, символьный вектор, символьный массив, строковый скаляр, строковый вектор или функция коэффициента. c представляет коэффициент c в скалярном PDE

−∇⋅ (c∇u) + au = f

или в системе ПДЭ

−∇⋅ (c⊗∇u) + au = f

Пример: 'cosh(x+y.^2)'

Типы данных: double | char | string | function_handle
Поддержка комплексного номера: Да

Коэффициент PDE, определяемый как скаляр, матрица, символьный вектор, символьный массив, строковый скаляр, строковый вектор или функция коэффициента. a представляет коэффициент в скалярном PDE

−∇⋅ (c∇u) + au = f

или в системе ПДЭ

−∇⋅ (c⊗∇u) + au = f

Пример: 2*eye(3)

Типы данных: double | char | string | function_handle
Поддержка комплексного номера: Да

Коэффициент PDE, определяемый как скаляр, матрица, символьный вектор, символьный массив, строковый скаляр, строковый вектор или функция коэффициента. f представляет коэффициент f в скалярном PDE

−∇⋅ (c∇u) + au = f

или в системе ПДЭ

−∇⋅ (c⊗∇u) + au = f

Пример: char('sin(x)';'cos(y)';'tan(z)')

Типы данных: double | char | string | function_handle
Поддержка комплексного номера: Да

Граничные условия, заданные как граничная матрица или граничный файл. Передайте граничный файл как дескриптор функции или как имя файла. Граничная матрица обычно является экспортом из приложения PDE Modeler.

Пример: b = 'circleb1', b = "circleb1", или b = @circleb1

Типы данных: double | char | string | function_handle

Точки сетки, заданные как 2-по-Np матрица точек, где Np - количество точек в сетке. Для описания (p,e,t) матрицы, см. Данные сетки как [p, e, t] Тройки.

Как правило, используется p, e, и t данные, экспортированные из приложения PDE Modeler, или сгенерированные initmesh или refinemesh.

Пример: [p,e,t] = initmesh(gd)

Типы данных: double

Кромки сети, заданные как 7около-Ne матрица рёбер, где Ne - количество кромок в сетке. Для описания (p,e,t) матрицы, см. Данные сетки как [p, e, t] Тройки.

Как правило, используется p, e, и t данные, экспортированные из приложения PDE Modeler, или сгенерированные initmesh или refinemesh.

Пример: [p,e,t] = initmesh(gd)

Типы данных: double

Треугольники сети, заданные как 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'

Аппроксимация якобиана, указанная как 'full', 'fixed', или 'lumped'.

  • 'full' означает численную оценку полного якобиана на основе разреженной версии numjac функция. 3-D геометрия использует только 'full'любая другая спецификация дает ошибку.

  • 'fixed' задает матрицу итерации с фиксированной точкой, где якобиан аппроксимируется матрицей жесткости. Это 2-D геометрия по умолчанию.

  • 'lumped' задает «блочное» приближение, как описано в разделе «Нелинейные уравнения». Это приближение основано на численном дифференцировании коэффициентов.

Пример: u = pdenonlin(model,c,a,f,'Jacobian','full')

Типы данных: char | string

Начальное решение, определяемое как скаляр, вектор символов или вектор чисел. Скаляр задает постоянное начальное условие для скалярной или 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
Поддержка комплексного номера: Да

Остаточный размер при завершении, заданный как положительный скаляр. pdenonlin повторяется до тех пор, пока остаточный размер не станет меньше 'Tol'.

Пример: u = pdenonlin(model,c,a,f,'Tol',1e-6)

Типы данных: double

Максимальное число итераций Гаусса - Ньютона, указанное как положительное целое число.

Пример: u = pdenonlin(model,c,a,f,'MaxIter',12)

Типы данных: double

Минимальное демпфирование направления поиска, заданное как положительный скаляр.

Пример: u = pdenonlin(model,c,a,f,'MinStep',1e-3)

Типы данных: double

Печать информации о сходимости, указанной как 'off' или 'on'.

Пример: u = pdenonlin(model,c,a,f,'Report','on')

Типы данных: char | string

Остаточная норма, указанная как 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

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

свернуть все

PDE-решение, возвращенное в виде вектора.

  • Если 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.

Норма остатков шага Ньютона, возвращаемая как скаляр. Сведения об алгоритме см. в разделе Нелинейные уравнения.

Совет

  • Если итерация Ньютона не сходится, 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. Установить как обычно

u (x) =∑Ujϕj

где x представляет 2-D или точку 3-D. Затем умножьте уравнение на произвольную тестовую функцию, интегрируйте в области Λ и используйте формулу Грина и граничные условия для получения

0 = ρ (U) = ∑j (Ω ((c (x, U) ϕj (x)) ϕj (x) +a (x, U) ϕj (x) ϕi (x)) дуплекс + ∫∂Ωq (x, U) ϕj (x) ϕi (x) ds) Uj − ∫Ωf (x, U) ϕi (x) dx− ∫∂Ωg (x, U) ϕi (x) 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) получается решением линеаризованной задачи

∂ρ (U (n)) ∂U (U (n + 1) U (n)) = − αstart( U (n))

где α - положительное число. (Не обязательно, чтобы (U)   = 0 имели решение, даже если (u)   = 0 имеет.) В этом случае итерация Гаусса - Ньютона имеет тенденцию быть минимизатором остатка, то есть решением minU ‖ start( U) ‖.

Хорошо известно, что для достаточно малых α

‖ (U (n + 1)) <‖ρ (U (n)) ‖

и

pn = (∂ρ (U (n)) ∂U) 1start( U (n))

называется направлением спуска для start( U) ‖, где ‖ ⋅ ‖ - L2-norm. Итерация

U (n + 1) = U (n) + αpn,

где α ≤ 1 выбирается как можно большим, так что шаг имеет разумный спуск.

Метод Гаусса-Ньютона является локальным, и сходимость гарантируется только тогда, когда U (0) достаточно близко к решению. В общем, первое предположение может находиться вне области сходимости. Чтобы улучшить сходимость от плохих начальных догадок, реализуется стратегия демпфирования для выбора α, поиска линии Армийо-Гольдштейна. Он выбирает наибольший коэффициент демпфирования α из последовательности 1, 1/2, 1/4,.. таким образом, что следующее неравенство сохраняется:

‖ (U (n)) −‖ρ (U (n)) +αpn‖≥α2‖ρ (U (n)) ‖

что гарантирует снижение остаточной нормы не менее чем на 1 - α/2. На каждом этапе алгоритма поиска строки требуется оценка остаточного (U (n) + α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 не имеет смысла или сходимость невозможна .

В некоторых ситуациях вы уже можете иметь хорошее приближение, и нелинейный решатель может быть запущен с ним, избегая медленного режима сходимости. Эта идея используется в адаптивном генераторе сетки. Он вычисляет решение, на сетке, оценивает ошибку и может уточнить некоторые треугольники. Интерполант является очень хорошим начальным предположением для решения на очищенной сетке.

В целом точный якобиан

Jn=∂ρ (U (n)) ∂U

недоступен. Аппроксимация Jn конечными различиями следующим образом является дорогостоящей, но осуществимой. i-й столбец Jn может быть аппроксимирован

start( U (n) + αλ i) start( U (n))

что подразумевает сборку матриц КЭМ для треугольников, содержащих точку сетки I. Очень простое приближение к Jn, которое дает итерацию фиксированной точки, также возможно следующим образом. По существу, для данного U (n) вычисляют КЭМ матрицы K и F и устанавливают

U (n + 1) = K-1F.

Это эквивалентно аппроксимации якобиана матрицей жесткости. Действительно, так как (U (n)) = KU (n) - F, ставя Jn = K выходов

U (n + 1) = U (n) Jn 1start( U (n)) = U (n) K − 1 (KU (n) − F) = K − 1F

Во многих случаях скорость сходимости является медленной, но стоимость каждой итерации является дешевой.

Дифференциальное уравнение в частных производных Toolbox™ нелинейный решатель также обеспечивает компромисс между двумя крайними значениями. Чтобы вычислить производную U→KU отображения, выполните следующие действия. Термин был опущен для ясности, но снова появляется в окончательном результате.

(KU) i∂Uj=limε 01ε l (Ωc (U +εϕj) ϕl ∇ϕi дуплекс (ул. +εδl, j) ∫Ωc (U)  ϕl ϕi dxUl) = Ωc (U) ϕj ∇ϕi дуплекс + l Ωϕjcu ϕl ϕi dxUl

Первый интегральный член не более чем Ki, j .

Второй член является «скошенным», т.е. замененным диагональной матрицей, которая содержит суммы строк. Поскольку Λ j = 1, второе слагаемое аппроксимируется

δi,j∑l∫Ω∂c∂u∇ϕl∇ϕi dxUl

который является ith компонентом K (c') U, где K (c') является матрицей жесткости, связанной с коэффициентом ∂c / ∂ u, а не c. То же рассуждение может быть применено к производной отображения U→MU. Производная отображения U→ -F точно

−∫Ω∂f∂uϕiϕj dx

которая является массовой матрицей, связанной с коэффициентом ∂f/∂u. Таким образом, якобиан остаточного (U)

J = K (c) + M (a − f ) + diag ((K (c ′) + M (a ′)) U)

где дифференцирование по отношению к u, К и М обозначают матрицы жесткости и массы, а их индексы обозначают коэффициенты, относительно которых они собраны. При каждой итерации Гаусса - Ньютона нелинейный решатель собирает матрицы, соответствующие уравнениям

−∇⋅ (c∇u) + (a f ') u=0−∇⋅ (c'∇u) + a' u = 0

и затем производит приблизительный якобиан. Дифференциации коэффициентов делаются численно.

В общем задании эллиптических систем граничные условия добавляются к матрице жесткости для формирования полной линейной системы:

K˜U˜=[KH′H0] [Uμ]=[FR]=F˜

где коэффициенты и могут зависеть от U˜ решения. «Блочный» подход аппроксимирует производное отображение остатка на

[JH′H0]

Нелинейности граничных условий и зависимости коэффициентов от производных недостаточно линеаризованы этой схемой. Когда такие нелинейности сильны, схема сводится к итерации фиксированной точки и может сходиться медленно или вообще не сходиться. Если граничные условия являются линейными, они не влияют на свойства сходимости схем итерации. В случае Неймана они невидимы (H - пустая матрица), а в случае Дирихле они просто утверждают, что остаток равен нулю в соответствующих граничных точках.

См. также

Представлен до R2006a