BoundaryUnitNormal[x,y,…]
領域に対して外向きの単位法線ベクトル
を表す.
BoundaryUnitNormal
BoundaryUnitNormal[x,y,…]
領域に対して外向きの単位法線ベクトル
を表す.
詳細とオプション
- BoundaryUnitNormalは,境界の単位法線ベクトル
に従属する,偏微分方程式の境界条件を構築するために使える. - BoundaryUnitNormalは,NeumannValue,DirichletCondition,NIntegrateと一緒に使える.
- BoundaryUnitNormalは,AcousticAbsorbingValue,HeatFluxValue,MassOutflowValue等の境界条件によって生成できる.
- BoundaryUnitNormalは,境界上の接線を指定するために使える.
- BoundaryUnitNormalは,境界条件が離散化される場合には,領域
の埋込み次元の長さのベクトルに評価する. - 境界の単位法線成分
には,Indexedを使ってアクセスできる. - 有限要素の近似には,偏微分方程式に検定関数
が掛けられ,
上で積分される.部分積分で
が得られる.境界の積分における被積分関数
は,NeumannValueの
で置き換えられる. - 偏微分方程式がノイマン値を
と指定する場合には,NeumannValueを
と指定することによって,代りにBoundaryUnitNormalを使って
をモデル化することができる. - 逆に,偏微分方程式がノイマン値を
と指定する場合には,NeumannValueを
と指定することによって,代りにBoundaryUnitNormalを使って
をモデル化することができる. - 領域の内部境界においては,境界の単位法線成分は一意的には定義されない.
- 境界の単位法線の値
は,領域
全体で内部境界を含むすべての境界について,
のディリクレ条件で
を解くことによって計算される.すると,境界の単位法線成分は
で正規化された
の勾配になる.
例題
すべて開く すべて閉じる例 (1)
<<NDSolve`FEM`単位Diskについてポワソン方程式を解く:
solution = NDSolveValue[{-Laplacian[u[x, y], {x, y}] == 1, DirichletCondition[u[x, y] == 0, True]}, u, {x, y}∈Disk[]]Plot3D[solution[x, y], {x, y}∈Disk[]]領域の境界を通る流束の合計を,境界領域の二次近似で計算する:
NIntegrate[BoundaryUnitNormal[x, y].Grad[-solution[x, y], {x, y}], {x, y}∈ToBoundaryMesh[solution["ElementMesh"], "MeshOrder" -> 2]]NIntegrate[BoundaryUnitNormal[x, y].Grad[-solution[x, y], {x, y}], {x, y}∈RegionBoundary[Rectangle[{-1 / 2, -1 / 2}, {1 / 2, 1 / 2}]]]スコープ (6)
単位Diskについてポワソン方程式を解く:
solution = NDSolveValue[{-Laplacian[u[x, y], {x, y}] == 1, DirichletCondition[u[x, y] == 0, True]}, u, {x, y}∈Disk[]]-NIntegrate[Grad[solution[x, y], {x, y}].BoundaryUnitNormal[x, y], {x, y}∈RegionBoundary[Disk[]]]領域の境界を通る流束の合計を,境界領域の二次近似で計算する:
-NIntegrate[Grad[solution[x, y], {x, y}].BoundaryUnitNormal[x, y], {x, y}∈ToBoundaryMesh[solution["ElementMesh"], "MeshOrder" -> 2]]op = Inactive[Div][-0.075*Inactive[Grad][c[x], {x}], {x}] + 1;
Ω = Line[{{0}, {1}}];左に,境界の単位法線成分でNeumannValueを設定し,方程式を解く:
solution1 = NDSolveValue[{
op == NeumannValue[BoundaryUnitNormal[x].{-c[x]}, x == 0]}, c, x∈Ω]Plot[solution1[x], {x}∈Ω]この範囲について,左のBoundaryUnitNormalの等価は
である:
solution2 = NDSolveValue[{
op == NeumannValue[{-1}.{-c[x]}, x == 0]}, c, x∈Ω]Plot[solution1[x] - solution2[x], {x}∈Ω]NeumannValueについて接線成分を作成する:
Ω = RegionDifference[Rectangle[{0, 0}, {4, 4}], Disk[]];
solution = NDSolveValue[{Laplacian[u[x, y], {x, y}] == NeumannValue[Cross[BoundaryUnitNormal[x, y]].{1, 1}, x ^ 2 + y ^ 2 == 1], DirichletCondition[u[x, y] == 0, x == 4 && y == 0]}, u, {x, y}∈Ω];
StreamPlot[Evaluate[Grad[solution[x, y], {x, y}]], {x, y}∈Ω]BoundaryUnitNormalのIndexed成分を利用してNeumannValueを計算する:
Ω = RegionDifference[Rectangle[{0, 0}, {4, 4}], Disk[]];
solution = NDSolveValue[{Laplacian[u[x, y], {x, y}] == NeumannValue[{-Indexed[BoundaryUnitNormal[x, y], 2], 0}.{1, 1}, x ^ 2 + y ^ 2 == 1], DirichletCondition[u[x, y] == 0, x == 4 && y == 0]}, u, {x, y}∈Ω];
StreamPlot[Evaluate[Grad[solution[x, y], {x, y}]], {x, y}∈Ω]Ω = RegionDifference[RegionUnion[Disk[{0, 0}, 5], Rectangle[{0, 0}, {7, 5}]], Ellipsoid[{0, 0}, {3, 2}]];
solution = NDSolveValue[{-Laplacian[u[x, y], {x, y}] == 1, DirichletCondition[u[x, y] == 0, True]}, u, {x, y}∈Ω]Plot3D[solution[x, y], {x, y}∈Ω]NIntegrate[BoundaryUnitNormal[x, y].Grad[-solution[x, y], {x, y}], {x, y}∈ToBoundaryMesh[solution["ElementMesh"], "MeshOrder" -> 2]]境界の法線成分でNeumannValueを設定する:
op = D[c[t, x], t] + Inactive[Div][-0.075*Inactive[Grad][c[t, x], {x}], {x}];
ifunNormal = NDSolveValue[{op == NeumannValue[-BoundaryUnitNormal[x].({-1} * c[t, x]), x == 0], c[0, x] == Exp[-100 * (x - 1 / 2) ^ 2]}, c, {t, 0, 2}, x∈Line[{{0}, {1}}]]ifunNeumannZero = NDSolveValue[{op == NeumannValue[0, x == 0], c[0, x] == Exp[-100 * (x - 1 / 2) ^ 2]}, c, {t, 0, 2}, x∈Line[{{0}, {1}}]]Manipulate[Plot[{ifunNormal[t, x], ifunNeumannZero[t, x]}, {x, 0, 1}, PlotRange -> {0, 1}], {t, 0, 2}, SaveDefinitions -> True]この領域では,左のBoundaryUnitNormalの等価は
である:
ifunNormal2 = NDSolveValue[{op == NeumannValue[-{-1}.({-1} * c[t, x]), x == 0], c[0, x] == Exp[-100 * (x - 1 / 2) ^ 2]}, c, {t, 0, 2}, x∈Line[{{0}, {1}}]]Plot3D[ifunNormal[t, x] - ifunNormal2[t, x], {x, 0, 1}, {t, 0, 2}]アプリケーション (1)
以下の例では,環帯領域において指定された表面力境界条件を持つストークス流を考える.辺の外側では
において粘着境界条件が存在する.これらが
と
の方向での流速を0,つまり
に設定する.内側の境界では
において表面力が指定される.応力ベクトル
の表面力は以下で与えられる:
ここでは,
は
として与えられる動径単位ベクトルであり,
は
として与えられる接線単位ベクトルである.
と
はそれぞれ
と
の方向でのデカルト単位ベクトルである.この例では,表面力は法線方向には
,接線成分の表面力は
に設定される.言い換えれば,内側の境界では,速度は指定されず,表面力
のみが指定される.
pars = <|a -> 1 / 5, b -> 1, μ -> 1|>;
Ω = Annulus[{0, 0}, {a, b}] /. pars;
mesh = ToElementMesh[Ω, "RegionHoles" -> {0, 0}, MeshRefinementFunction -> Function[{vertices, area}, area > 0.000025 (0.1 + 20 Norm[Mean[vertices]])]];op = {Inactive[Div][{{-2 * μ, 0}, {0, -μ}}.Inactive[Grad][u[x, y], {x, y}], {x, y}] +
Inactive[Div][{{0, 0}, {-μ, 0}}.Inactive[Grad][v[x, y], {x, y}], {x, y}] + Inactive[Div][{1, 0} * p[x, y], {x, y}],
Inactive[Div][{{0, -μ}, {0, 0}}.Inactive[Grad][u[x, y], {x, y}], {x, y}] +
Inactive[Div][{{-μ, 0}, {0, -2 * μ}}.Inactive[Grad][v[x, y], {x, y}], {x, y}] +
Inactive[Div][{0, 1} * p[x, y], {x, y}],
Derivative[1, 0][u][x, y] + Derivative[0, 1][v][x, y]
} /. pars;ΓWall = DirichletCondition[{u[x, y] == 0, v[x, y] == 0}, ElementMarker == 2]内側の表面では,外向きの単位法線
とクロス積から接線単位法線を計算することができる.クロス積を使って,単位法線ベクトル
から単位接線を計算する:
Cross[{Subscript[n, x], Subscript[n, y]}]
と
の方向それぞれについてクロス積の第1成分と第2成分を抽出するためには,Indexedを使う.
Γu = NeumannValue[Indexed[Cross[BoundaryUnitNormal[x, y]], 1] * ((x / a) ^ 2 - (y / a) ^ 2), ElementMarker == 1];
Γv = NeumannValue[Indexed[Cross[BoundaryUnitNormal[x, y]], 2] * ((x / a) ^ 2 - (y / a) ^ 2), ElementMarker == 1];接線単位法線も同じように
として与えられることが可能であることに注意する.内側の表面の単位法線ベクトルは
であり,すると単位接線は
になるからである:
NeumannValue[(y / a) * ((x / a) ^ 2 - (y / a) ^ 2), ElementMarker == 1];
NeumannValue[-(x / a) * ((x / a) ^ 2 - (y / a) ^ 2), ElementMarker == 1];圧力に対する境界条件を指定しなければ,圧力値が浮いてしまい,NDSolveは十分な境界条件が指定されていないと警告を発する:
{ufun, vfun, pfun} = NDSolveValue[{op == {Γu, Γv, 0} /. pars, ΓWall}, {u, v, p}, {x, y}∈mesh, Method -> {"FiniteElement", "InterpolationOrder" -> {u -> 2, v -> 2, p -> 1}}, DependentVariables -> {u, v, p}]Show[{DensityPlot[pfun[x, y], {x, y}∈mesh, ...], StreamPlot[{ufun[x, y], vfun[x, y]}, {x, y}∈mesh, ...]}, ...]表面力境界条件がうまく使えることを確かめるためには,速度の動径成分と接線成分を計算し,それらを
においてすべての
についてプロットすることができる.動径速度については
に比例する解が期待され,接線速度については
に比例する解が期待される.
vr[x_, y_] := x / Sqrt[x ^ 2 + y ^ 2] * ufun[x, y] + y / Sqrt[x ^ 2 + y ^ 2] * vfun[x, y]
vt[x_, y_] := -(y / Sqrt[x ^ 2 + y ^ 2]) * ufun[x, y] + x / Sqrt[x ^ 2 + y ^ 2] * vfun[x, y]Plot[Evaluate[{vr[a * Cos[θ], a * Sin[θ]], -Sin[2θ] * a / 20} /. pars], {θ, 0, 2π}, PlotLegends -> {"vr", "∝ sin(2θ)"}]Plot[Evaluate[{vt[a * Cos[θ], a * Sin[θ]], -Cos[2θ] * a / 5} /. pars], {θ, 0, 2π}, PlotLegends -> {"vt", "∝ cos(2θ)"}]次に内側の境界での法線応力と剪断応力を計算し,それらが指定された表面力境界条件と一致することを確かめる.応力テンソルは以下で与えられる:
gradU = Grad[{ufun[x, y], vfun[x, y]}, {x, y}];
sigma[x_, y_] := Evaluate[(μ * (gradU + Transpose[gradU]) - pfun[x, y] * IdentityMatrix[2]) /. pars];normal = ElementMeshBoundaryUnitNormal[mesh]tangent[x_, y_] := Cross[normal[x, y]]normalStress[x_ ? NumberQ, y_ ? NumberQ] := normal[x, y].(sigma[x, y].normal[x, y]);shearStress[x_ ? NumberQ, y_ ? NumberQ] := tangent[x, y].(sigma[x, y].normal[x, y]);stresses = {normalStress[a * Cos[θ], a * Sin[θ]], shearStress[a * Cos[θ], a * Sin[θ]]} /. pars;
Plot[stresses, {θ, 0, 2 Pi}, ...]境界条件から
における法線応力と剪断応力の境界条件との差を可視化する:
Plot[Evaluate[stresses - {0, Cos[2θ]}], {θ, 0, 2 Pi}, ...]特性と関係 (2)
boundaryUnitNormal = ElementMeshBoundaryUnitNormal[ToElementMesh[Disk[]]]VectorPlot[boundaryUnitNormal[x, y], {x, y}∈Disk[]]VectorPlot[boundaryUnitNormal[x, y], {x, y}∈Disk[], VectorPoints -> ToBoundaryMesh[Disk[]]["Coordinates"]]境界単位法線は,領域上でポワソン方程式を解き,ゼロディリクレ条件を指定することによって計算される.単位Disk上でのポワソン方程式を計算する:
potential = NDSolveValue[{Laplacian[u[x, y], {x, y}] == 1, DirichletCondition[u[x, y] == 0, True]}, u[x, y], {x, y}∈Disk[], "ExtrapolationHandler" -> {Automatic, "WarningMessage" -> False}];unitNormal = Normalize[Grad[potential, {x, y}], Sqrt[Total[# ^ 2]]&];VectorPlot[unitNormal, {x, y}∈Disk[]]これは,ElementMeshの境界単位法線を計算することと同じである:
boundaryUnitNormal = ElementMeshBoundaryUnitNormal[ToElementMesh[Disk[]]];
VectorPlot[boundaryUnitNormal[x, y], {x, y}∈Disk[]]テキスト
Wolfram Research (2023), BoundaryUnitNormal, Wolfram言語関数, https://reference.wolfram.com/language/FEMDocumentation/ref/BoundaryUnitNormal.html.
CMS
Wolfram Language. 2023. "BoundaryUnitNormal." Wolfram Language & System Documentation Center. Wolfram Research. https://reference.wolfram.com/language/FEMDocumentation/ref/BoundaryUnitNormal.html.
APA
Wolfram Language. (2023). BoundaryUnitNormal. Wolfram Language & System Documentation Center. Retrieved from https://reference.wolfram.com/language/FEMDocumentation/ref/BoundaryUnitNormal.html
BibTeX
@misc{reference.wolfram_2026_boundaryunitnormal, author="Wolfram Research", title="{BoundaryUnitNormal}", year="2023", howpublished="\url{https://reference.wolfram.com/language/FEMDocumentation/ref/BoundaryUnitNormal.html}", note=[Accessed: 11-August-2026]}
BibLaTeX
@online{reference.wolfram_2026_boundaryunitnormal, organization={Wolfram Research}, title={BoundaryUnitNormal}, year={2023}, url={https://reference.wolfram.com/language/FEMDocumentation/ref/BoundaryUnitNormal.html}, note=[Accessed: 11-August-2026]}