(Не рекомендуемый) Решить нелинейную эллиптическую задачу УЧП
pdenonlin
не рекомендуется. Использовать solvepde
вместо этого.
решает нелинейный УЧПu
= pdenonlin(model
,c
,a
,f
)
с геометрией, граничными условиями и конечным элементом, mesh в model
, и коэффициенты c
, a
, и f
. В этом контексте «нелинейный» означает некоторый коэффициент в c
, a
, или f
зависит от решения u
или его градиент. Если УЧП является системой уравнений (model.PDESystemSize
> 1), затем pdenonlin
решает систему уравнений
для любых предыдущих аргументов изменяет процесс решения с помощью 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');
Сгенерируйте mesh и решите проблему.
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
Создайте граничные условия Дирихле со значением .Создать следующий файл и сохранить его в пути 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)
Решите нелинейную задачу 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';
Сгенерируйте 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)
model
- модель PDEPDEModel
объектМодель PDE, заданная как PDEModel
объект.
Пример: model = createpde
c
- коэффициент УЧПКоэффициент УЧП, заданный как скаляр, матрица, вектор символов, символьный массив, строковый скаляр, строковый вектор или функция коэффициента. c
представляет коэффициент c в скалярном УЧП
или в системе PDE
Пример: 'cosh(x+y.^2)'
Типы данных: double
| char
| string
| function_handle
Поддержка комплексного числа: Да
a
- коэффициент УЧПКоэффициент УЧП, заданный как скаляр, матрица, вектор символов, символьный массив, строковый скаляр, строковый вектор или функция коэффициента. a
представляет коэффициент a в скалярном УЧП
или в системе PDE
Пример: 2*eye(3)
Типы данных: double
| char
| string
| function_handle
Поддержка комплексного числа: Да
f
- коэффициент УЧПКоэффициент УЧП, заданный как скаляр, матрица, вектор символов, символьный массив, строковый скаляр, строковый вектор или функция коэффициента. f
представляет коэффициент f в скалярном УЧП
или в системе PDE
Пример: 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
- MeshMesh точки, заданные как 2-бай- Np
матрица точек, где Np
- число точек в mesh. Описание (p
, e
, t
) матрицы, см. Данные сетки как [p, e, t] Тройки.
Как правило, вы используете p
, e
, и t
данные экспортированы из приложения PDE Modeler или сгенерированы initmesh
или refinemesh
.
Пример: [p,e,t] = initmesh(gd)
Типы данных: double
e
- Кромки сеткиСетка ребер, заданная как 7
-by- Ne
матрица ребер, где Ne
- количество ребер в mesh. Описание (p
, e
, t
) матрицы, см. Данные сетки как [p, e, t] Тройки.
Как правило, вы используете p
, e
, и t
данные экспортированы из приложения PDE Modeler или сгенерированы initmesh
или refinemesh
.
Пример: [p,e,t] = initmesh(gd)
Типы данных: double
t
- Сетчатые треугольникиСетка треугольников, заданная как 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'
'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 уравнений и 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
Поддержка комплексного числа: Да
'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 для Lp норма | 'energy'
Норма невязки, заданная как 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
является вектором-столбцом, представляющей u решения в каждом узле mesh. u(i)
является решением в i
1-й столбец model.Mesh.Nodes
или i
1-й столбец p
.
Если УЧП является системой N > 1 уравнений, то u
является вектор-столбец с N * Np
элементы, где Np
- число узлов в mesh. Первый Np
элементы u
представляют решение уравнения 1, затем следующую Np
элементы представляют решение уравнения 2 и т.д.
Чтобы получить решение в произвольной точке геометрии, используйте pdeInterpolant
.
Чтобы построить график решения, используйте pdeplot
для 2-D геометрии или смотрите 3-D графики решения и градиента с функциями MATLAB ®.
res
- Норма шаговых невязок НьютонаНорма степенных невязок Ньютона, возвращаемая в виде скаляра. Для получения информации об алгоритме см. «Нелинейные уравнения».
Если итерация Ньютона не сходится, 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. Установите как обычно
где x представляет 2-D или 3-D точку. Затем умножьте уравнение на произвольную тестовую функцию ϕi, интегрируйте в области, и используйте формулу Грина и граничные условия, чтобы получить
который должен храниться для всех индексов 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 ) = 0 имели решение, даже если ρ ( u) = 0 имеет.) В этом случае итерация Гаусса-Ньютона имеет тенденцию быть минимизатором остаточного, то есть решения min U.
Хорошо известно, что для достаточно малых
и
называется направлением спуска для , где является L 2-нормой. Итерация
где ≤ 1 выбирают как можно большим, так что шаг имеет разумное спуск.
Метод Гаусса-Ньютона является локальным, и сходимость гарантируется только при U(0) достаточно близко к решению. В целом первое предположение может находиться вне области сходимости. Чтобы улучшить сходимость из плохих начальных догадок, реализуется стратегия демпфирования для выбора α, поиска линии Армиджо-Гольдштейна. Он выбирает самый большой коэффициент демпфирования α из последовательности 1, 1/2, 1/4,. таким образом обеспечивается следующее неравенство:
который гарантирует уменьшение нормы невязки не менее чем на 1 - /2. Каждый шаг алгоритма линейного поиска требует оценки остаточного .
Важной точкой этой стратегии является то, что когда 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 не имеет смысла, или сходимость невозможна.
В некоторых ситуациях вы можете уже иметь хорошее приближение и нелинейный решатель может быть запущен с ним, избегая режима медленной сходимости. Эта идея используется в генераторе адаптивной сетки. Он вычисляет решение на mesh оценивает ошибку и может уточнить некоторые треугольники. Интерполяция очень хорошее начальное приближение для решения на рафинированном mesh.
В целом точный якобиан
недоступен. Приближение Jn конечными различиями следующим образом дорого, но допустимо. i-й столбец Jn может быть аппроксимирован
что подразумевает сборку матриц КЭМ для треугольников, содержащих i точек сетки. Очень простое приближение к Jn, которое дает фиксированную итерацию точек, также возможно следующим образом. По существу, для заданного U(n), вычислите матрицы КЭМ K и F и установите
U(n+1) = K–1F .
Это эквивалентно аппроксимации якобиана с матрицей жесткости. Действительно, с ρ года (U(n)) = KU(n) - F, помещая Jn = K выражения
Во многих случаях темп сходимости медленный, но затраты на каждую итерацию малы.
Нелинейный решатель Partial Differential Equation Toolbox™ производными также обеспечивает компромисс между двумя крайностями. Чтобы вычислить производную от U отображения → KU, продолжите следующим образом. Термин a был опущен для ясности, но снова появляется в конечном результате.
Первый интегральный термин не более чем Ki,j.
Второй член является «комом», т.е. заменен диагональной матрицей, которая содержит суммы строк. Так как и j ϕj = 1, второй член аппроксимируется
который является i-м компонентом K(c')U, где K(c') - матрица жесткости, связанная с коэффициентом ∂ c/ ∂ u а не с c. Те же аргументы могут быть применены к производной от отображения U → MU. Производная от отображения U − F в точности
который является большой матрицей, сопоставленной с коэффициентом ∂ f/ ∂ u. Таким образом, якобиан невязки ρ (U) аппроксимируется
где дифференцирование относительно u, K и M обозначают жесткость и большие матрицы, а их индексы обозначают коэффициенты, относительно которых они собраны. На каждой итерации Гаусса-Ньютона нелинейный решатель собирает матрицы, соответствующие уравнениям
а затем производит приблизительный якобиан. Дифференциации коэффициентов выполняются численно.
В общей настройке эллиптических систем граничные условия добавляются к матрице жесткости, чтобы сформировать полную линейную систему:
где коэффициенты и может зависеть от решения . «Ограниченный» подход аппроксимирует производное отображения невязки
Нелинейности граничных условий и зависимости коэффициентов от производных не были правильно линеаризированы этой схемой. Когда такие нелинейности сильны, схема уменьшается до итерации с фиксированной точкой и может сходиться медленно или вообще не сходиться. Когда граничные условия линейны, они не влияют на свойства сходимости схем итерации. В случае Неймана они невидимы (H является пустой матрицей), и в случае Дирихле они просто заявляют, что невязка равна нулю на соответствующих граничных точках.
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.