exponenta event banner

pdenonlin

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

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

Синтаксис

u = pdenonlin(model,c,a,f)
u = pdenonlin(b,p,e,t,c,a,f)
u = pdenonlin(___,Name,Value)
[u,res] = pdenonlin(___)

Описание

пример

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

(cu)+au=f

с геометрией граничные условия и конечный элемент сцепляются в 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)

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

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

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

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

Сгенерируйте 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')
view(30,30)
title('Bracket with Face Labels')

figure
pdegplot(model,'FaceLabels','on')
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.0799e-02   1.0000000
   3          1.1344e-02   1.0000000
   4          2.2741e-03   1.0000000
   5          1.7768e-04   1.0000000
   6          1.4230e-06   1.0000000

Постройте решение на контуре геометрии.

pdeplot3D(model,'ColorMapData',u)

Входные параметры

свернуть все

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

Пример: model = createpde

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

(cu)+au=f

или в системе УЧП

(cu)+au=f

Вы можете specifyc в различных способах, детализированных в c Коэффициенте для Систем. См. также Задают Скалярные Коэффициенты УЧП в символьной Форме, Задают 2D Скалярные Коэффициенты в Функциональной Форме и Задают 3-D Коэффициенты УЧП в Функциональной Форме.

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

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

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

(cu)+au=f

или в системе УЧП

(cu)+au=f

Вы можете specifya в различных способах, детализированных в a или d Коэффициенте для Систем. См. также Задают Скалярные Коэффициенты УЧП в символьной Форме, Задают 2D Скалярные Коэффициенты в Функциональной Форме и Задают 3-D Коэффициенты УЧП в Функциональной Форме.

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

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

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

(cu)+au=f

или в системе УЧП

(cu)+au=f

Вы можете specifyf в различных способах, детализированных в f Коэффициенте для Систем. См. также Задают Скалярные Коэффициенты УЧП в символьной Форме, Задают 2D Скалярные Коэффициенты в Функциональной Форме и Задают 3-D Коэффициенты УЧП в Функциональной Форме.

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

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

Граничные условия, заданные как граничная матрица или массив данных граничных условий. Передайте массив данных граничных условий как указатель на функцию или как имя файла.

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

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

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

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

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

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

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

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

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

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

Поймайте в сети треугольники, заданные как 4-by-Nt матрица треугольников, где Nt является количеством треугольников в mesh. Для описания (p, e, t) матрицы, смотрите Данные о Mesh.

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

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

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

Аргументы в виде пар имя-значение

Укажите необязательные аргументы в виде пар ""имя, значение"", разделенных запятыми. Имя (Name) — это имя аргумента, а значение (Value) — соответствующее значение. Name должен появиться в кавычках. Вы можете задать несколько аргументов в виде пар имен и значений в любом порядке, например: Name1, Value1, ..., NameN, ValueN.

Пример: 'Jacobian','full'

Приближение якобиана, заданного как 'full', 'fixed' или 'lumped'.

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

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

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

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

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

Начальное предположение решения, заданное как скаляр, вектор символов или вектор чисел. Для получения дополнительной информации смотрите, Решают УЧП с Начальными условиями.

  • Скаляр задает постоянное начальное условие или для скаляра или для системы УЧП.

  • Для скалярных проблем используйте тот же синтаксис, как Задают Скалярные Коэффициенты УЧП в символьной Форме.

  • Для систем уравнений N запишите символьный массив со строками N, где каждая строка имеет синтаксис, Задают Скалярные Коэффициенты УЧП в символьной Форме.

  • Для систем уравнений N и mesh с узлами Np, дают вектор-столбец с N *Np компоненты. Узлами является или model.Mesh.Nodes или данные p из initmesh или meshToPet. Смотрите Данные о Mesh.

    Первые элементы 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, или как '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 является вектор-столбцом, представляющим решение u в каждом узле в mesh. u(i) является решением в i th столбец model.Mesh.Nodes или i th столбец p.

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

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

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

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

Советы

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

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

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

Алгоритмы

свернуть все

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

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

r (u) = – ∇ · (c (u) ∇u) + a (u) u - f (u) = 0.(1)

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

u(x)=Ujϕj

где x представляет 2D или 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) может быть легко вычислен как

ρ (U) = (K + M + Q) U – (F + G) (2)

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

– ∇ · (c (U) ∇u) + a (U) u = f (U).(3)

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

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

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

Это известно это за достаточно маленький α

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

и

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

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

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) и затем собирает матрицы FEM K и F и вычисляет

U (1) = K –1F(4)

Ослабленная итерация Ньютона Гаусса затем запускается с U (1), который должен быть лучшим предположением, чем U (0). Если граничные условия не зависят от решения u, то U (1) удовлетворяет их, даже если U (0) не делает. Кроме того, если уравнение линейно, то U (1) является точным решением FEM, и решатель не вводит цикл Ньютона Гаусса.

Существуют ситуации, где U (0) = 0 не имеет никакого смысла, или сходимость невозможна.

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

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

Jn=ρ(U(n))U

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

ρ(U(n)+εϕi)ρ(U(n))ε

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

U (n +1) = K –1F .(5)

Это эквивалентно приближению якобиана с матрицей жесткости. Действительно, начиная с ρ (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™ нелинейный решатель также предусматривает компромисс между этими двумя экстремальными значениями. Чтобы вычислить производную отображения UKU, продолжите можно следующим образом. Термин 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 th компонент K (c') U, где K (c') является матрицей жесткости, сопоставленной с коэффициентом ∂c / ∂ u, а не c. То же обоснование может быть применено к производной отображения UMU. Производная отображения 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