pdenonlin

(Не рекомендуемый) Решить нелинейную эллиптическую задачу УЧП

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

Описание

пример

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

(cu)+au=f

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

(cu)+au=f

пример

u = pdenonlin(b,p,e,t,c,a,f) решает УЧП с граничными условиями b, и конечный элемент mesh (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');

Сгенерируйте mesh и решите проблему.

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.

Создайте граничные условия Дирихле со значением x2.Создать следующий файл и сохранить его в пути 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;

Сгенерируйте mesh и решите проблему.

[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';

Сгенерируйте mesh и решите УЧП. Начните с начального предположения 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

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

(cu)+au=f

или в системе PDE

(cu)+au=f

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

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

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

(cu)+au=f

или в системе PDE

(cu)+au=f

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

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

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

(cu)+au=f

или в системе PDE

(cu)+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

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

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

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

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

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

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

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

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

Сетка треугольников, заданная как 4-by- Nt матрица треугольников, где Nt - количество треугольников в mesh. Описание (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 уравнений и mesh с Np узлы, дайте вектор-столбец с N * Np компоненты. Узлы либо model.Mesh.Nodes, или p данные из initmesh или meshToPet. Смотрите данные сетки как [p, e, t] Тройки.

Первый Np элементы содержат значения компонента 1, где значение элемента k соответствует узлу p(k). Следующая Np точки содержат значения компонента 2 и т.д. Может быть удобно сначала представить начальные условия u0 как Np-by- 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 значение для Lp norm, или как 'energy'. p может быть любым положительным вещественным значением, Inf, или -Inf. The p норма векторного v является sum(abs(v)^p)^(1/p). Посмотрите norm.

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

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

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

свернуть все

Решение, возвращенный как вектор.

  • Если УЧП скаляром, что означает только одно уравнение, то u является вектором-столбцом, представляющей u решения в каждом узле mesh. u(i) является решением в i1-й столбец model.Mesh.Nodes или i1-й столбец p.

  • Если УЧП является системой N > 1 уравнений, то u является вектор-столбец с N * Np элементы, где Np - число узлов в mesh. Первый Np элементы u представляют решение уравнения 1, затем следующую Np элементы представляют решение уравнения 2 и т.д.

Чтобы получить решение в произвольной точке геометрии, используйте pdeInterpolant.

Чтобы построить график решения, используйте pdeplot для 2-D геометрии или смотрите 3-D графики решения и градиента с функциями MATLAB ®.

Норма степенных невязок Ньютона, возвращаемая в виде скаляра. Для получения информации об алгоритме см. «Нелинейные уравнения».

Совет

  • Если итерация Ньютона не сходится, pdenonlin отображает сообщение об ошибке Too many iterations или Stepsize too small.

  • Если начальное предположение создает матрицы, содержащие NaN или Inf элементы, pdenonlin отображает сообщение об ошибке Unsuitable initial guess U0 (default: U0 = 0).

  • Если у вас очень маленькие коэффициенты или очень маленькие геометрические размерности, pdenonlin может не сходиться, или может сходиться к неправильному решению. Если это так, можно иногда получить лучшие результаты путем масштабирования коэффициентов или геометрических размерностей, чтобы иметь порядок один.

Алгоритмы

свернуть все

Нелинейные уравнения

Основной идеей является использование итераций Гаусса-Ньютона для решения нелинейных уравнений. Скажите, что вы пытаетесь решить уравнение

r (<reservedrangesplaceholder8>) = - ∇ · (c (<reservedrangesplaceholder6>)  <reservedrangesplaceholder5>) + a (<reservedrangesplaceholder3>) u - f (<reservedrangesplaceholder0>) = 0.

В настройке КЭМ вы решаете слабую форму r (u) = 0. Установите как обычно

u(x)=Ujϕj

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

0=ρ(U)=j(Ω((c(x,U)ϕj(x))ϕj(x)+a(x,U)ϕj(x)ϕi(x))dx+Ωq(x,U)ϕj(x)ϕi(x)ds)UjΩf(x,U)ϕi(x)dxΩg(x,U)ϕi(x)ds

который должен храниться для всех индексов i.

Вектор невязок ρ (U) можно легко вычислить как

ρ (<reservedrangesplaceholder6>) = (K + M + Q) U – (F + G)

где матрицы K, M, Q и векторы F и G получаются путем сборки задачи

– ∇ · (c (<reservedrangesplaceholder6>)  <reservedrangesplaceholder5>) + a (<reservedrangesplaceholder3>) u = f (<reservedrangesplaceholder0>).

Предположим, что у вас есть догадка U(n) решения. Если U(n) достаточно близко к точному решению, улучшенному приближению U(n+1) получается путем решения линеаризированной задачи

ρ(U(n))U(U(n+1)U(n))=αρ(U(n))

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

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

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

и

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

называется направлением спуска для ρ(U), где является L 2-нормой. Итерация

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 не имеет смысла, или сходимость невозможна.

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

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

Jn=ρ(U(n))U

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

ρ(U(n)+εϕi)ρ(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)Jn1ρ(U(n))=U(n)K1(KU(n)F)=K1F

Во многих случаях темп сходимости медленный, но затраты на каждую итерацию малы.

Нелинейный решатель Partial Differential Equation Toolbox™ производными также обеспечивает компромисс между двумя крайностями. Чтобы вычислить производную от U отображения KU, продолжите следующим образом. Термин a был опущен для ясности, но снова появляется в конечном результате.

(KU)iUj=limε01εl(Ωc(U+εϕj)ϕlϕidx(Ul+εδl,j)Ωc(U)ϕlϕidxUl)=Ωc(U)ϕjϕidx+lΩϕjcuϕlϕidxUl

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

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

δi,jlΩcuϕlϕidxUl

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

Ωfuϕiϕjdx

который является большой матрицей, сопоставленной с коэффициентом ∂ f/ ∂ u. Таким образом, якобиан невязки ρ (U) аппроксимируется

J=K(c)+M(af)+diag((K(c)+M(a))U)

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

(cu)+(af')u=0(c'u)+a'u=0

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

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

K˜U˜=[KHH0][Uμ]=[FR]=F˜

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

[JHH0]

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

См. также

Представлено до R2006a
Для просмотра документации необходимо авторизоваться на сайте