InitializePDECoefficients[vd,sd,rules]
変数データ vd と解データ sd に従った規則によって指定された係数を初期化し,PDECoefficientDataオブジェクトを生成する.
InitializePDECoefficients
InitializePDECoefficients[vd,sd,rules]
変数データ vd と解データ sd に従った規則によって指定された係数を初期化し,PDECoefficientDataオブジェクトを生成する.
詳細とオプション
- 係数は,以下の形式の
個の空間次数における
個の二階偏微分方程式の系からのものであると想定される. - InitializePDECoefficients[vd,sd,rules]では,rules は name->coefficient の形式のものでなければならない.可能な係数名は以下の通りである.
-
"LoadCoefficients" {{f1},{f2},…}
はスカラーである"LoadDerivativeCoefficients" {{γ1},{γ2},…}
は長さ
のベクトルである"DiffusionCoefficients" {{-c11,-c12,…},{-c21,-c22,…},…}
は,スカラー,長さ
の対角ベクトル,
×
の行列のいずれかとして指定することができる"ConservativeConvectionCoefficients" {{-α11,-α12,…},{-α21,-α22,…},…}
は長さ
のベクトルである"ConvectionCoefficients" {{β11,β12,…},{β21,β22,…},…}
は長さ
のベクトルである"ReactionCoefficients" {{a11,a12,…},{a21,a22,…},…}
はスカラーである - 規則がこれらの係数名について指定されていない場合には,そのタイプの係数はすべて0であると想定される.
- DiscretizePDEは一般化されたPDECoefficientDataオブジェクトを取り,以下のような系の行列を提供する.
- このとき
は剛性行列であり,
は荷重ベクトルである. - 偏微分方程式の定常系は
が一階の時間導関数,
が二階の時間導関数として,二階まで指定することができる. - 定常係数形式は以下である.
- DiscretizePDEは一般化されたPDECoefficientDataオブジェクトを取り,以下のような系の行列を提供する.
- このとき
は質量行列,
は減衰行列,
は剛性行列,
は荷重ベクトルである. - 可能な減衰係数名は以下の通りである.
-
"DampingDiffusionCoefficients" {{-dc11,-dc12,…},{-dc21,-dc22,…},…}
はスカラー,長さ
の対角ベクトル,
×
行列のいずれかとして指定できる."DampingConservativeConvectionCoefficients" {{-dα11,-dα12,…},{-dα21,-dα22,…},…}
は長さ
のベクトルである"DampingConvectionCoefficients" {{dβ11,dβ12,…},{dβ21,dβ22,…},…}
は長さ
のベクトルである"DampingReactionCoefficients" {{dα11,dα12,…},{dα21,dα22,…},…}
はスカラーである - 可能な質量係数名は以下の通りである.
-
"MassDiffusionCoefficients" {{-mc11,-mc12,…},{-mc21,-mc22,…},…}
はスカラー,長さ
の対角ベクトル,
×
行列のいずれかとして指定できる."MassConservativeConvectionCoefficients" {{-mα11,-mα12,…},{-mα21,-mα22,…},…}
は長さ
のベクトルである"MassConvectionCoefficients" {{mβ11,mβ12,…},{mβ21,mβ22,…},…}
は長さ
のベクトルである"MassReactionCoefficients" {{mα11,mα12,…},{mα21,mα22,…},…}
はスカラーである - "Mass"係数は質量行列
,"Damping"係数は減衰行列
,残りの係数は剛性行列
と荷重ベクトル
に貢献する. - NDSolveは,非定常系を簡約し,時間において一階であるようにする.
- 係数は,空間関数,時間関数,パラメータ関数,従属変数関数,従属変数の一次微分の関数のいずれでもよい.
- 変数データ vd と解データ sd は,変数と値の対応するリストである.vd と sd のテンプレートは,NDSolve`VariableDataとNDSolve`SolutionDataを使って生成することができ,成分は,NDSolve`SetSolutionDataComponentを使って設定できる.
- InitializePDECoefficientsは,変数データ vd と解データ sd に従って,係数を確かめ最適化する.
- vd と sd の"Space"成分は,それぞれNumericalRegionオブジェクトとして表された空間変数と空間メッシュに設定されなければならない.
- vd の"DependentVariables"成分は,引数を持たない従属変数名のシンボルのリストでなければならない.
- 時間依存問題については,vd と sd の"Time"成分は,それぞれ時間変数と初期時間に設定されなければならない.
- 非線形問題については,sd の"DependentVariables"成分は,従属変数の初期シード値に設定されなければならない.
- パラメトリック問題については,vd と sd の"Parameters"成分は,それぞれパラメトリック変数と初期パラメトリック値に設定されなければならない.
- InitializePDECoefficientsには以下のオプションがある.
-
"VerificationData" Automatic 偏微分方程式の係数検証データを指定する - InitializePDECoefficientsに与えられるオプションは,"InitializePDECoefficientsOptions"を指定することによってNDSolveに与えることができる. »
- NDSolveおよび関連の関数からオプションを設定することについては,有限要素のためのNDSolveオプションに説明がある.
例題
すべて開く すべて閉じる例 (2)
Needs["NDSolve`FEM`"]NumericalRegionを設定する:
nr = ToNumericalRegion[Disk[]]vd = NDSolve`VariableData[{"DependentVariables", "Space"} -> {{u}, {x, y}}];
sd = NDSolve`SolutionData["Space" -> nr];InitializePDECoefficients[vd, sd, "DiffusionCoefficients" -> {{-IdentityMatrix[2]}}]InitializePDECoefficients[vd, sd, "DiffusionCoefficients" -> {{-IdentityMatrix[2]}}, "LoadCoefficients" -> {{1}}]スコープ (6)
f[x_, y_] := {{x ^ 2, 0}, {x + y, y ^ 2}}InitializePDECoefficients[vd, sd, "DiffusionCoefficients" -> {{-f[x, y]}}]ifun = Interpolation[Flatten[Table[Evaluate[{{x, y}, Sin[x y]}], {x, 0, 1, 0.2}, {y, 0, 1 / 2, 0.1}], 1]]InitializePDECoefficients[vd, sd, "LoadCoefficients" -> {{-ifun[x, y]}}]sdnonlinear = sd;
NDSolve`SetSolutionDataComponent[sdnonlinear, "DependentVariables", {0.}];
InitializePDECoefficients[vd, sdnonlinear, "DiffusionCoefficients" -> {{{{-u[x, y], 0}, {0, -Derivative[1, 0][u][x, y]}}}}]"DiffusionCoefficient"の入力がベクトルである場合には,これは要求された入力行列の対角要素として解釈される:
InitializePDECoefficients[vd, sd, "DiffusionCoefficients" -> {{-{1, 1}}}] === InitializePDECoefficients[vd, sd, "DiffusionCoefficients" -> {{-IdentityMatrix[2]}}]"DiffusionCoefficient"の入力がスカラーである場合には,スカラーは,要求された行列の対角要素の場所すべてに置かれる:
InitializePDECoefficients[vd, sd, "DiffusionCoefficients" -> {{-1}}] === InitializePDECoefficients[vd, sd, "DiffusionCoefficients" -> {{-IdentityMatrix[2]}}]vd2 = vd;
NDSolve`SetSolutionDataComponent[vd2, "DependentVariables", {u, v}];
InitializePDECoefficients[vd2, sd, "DiffusionCoefficients" -> -{{{{(100000/91), 0}, {0, (5000/13)}}, {{0, (30000/91)}, {(5000/13), 0}}}, {{{0, (5000/13)}, {(30000/91), 0}}, {{(5000/13), 0}, {0, (100000/91)}}}}]オプション (1)
"VerificationData" (1)
InitializePDECoefficientsに与えられる偏微分方程式の係数は,評価すると数値入力になるように検証される:
rc[x_ ? NumericQ, y_ ? NumericQ] := (Print["Test Coordinate: ", {x, y}];1)InitializePDECoefficients[vd, sd, "ReactionCoefficients" -> {{-rc[x, y]}}]検証は,NumericalRegion内に存在する検定座標を求めることによって行われる.しかし,自動的に選ばれた検定座標あるいは検定のElementMarkerが特異点にある場合もある.
rc[x_ ? NumericQ, y_ ? NumericQ] := (Print["Test Coordinate: ", {x, y}];1 / (x + 0.5 + y + 0.5))InitializePDECoefficients[vd, sd, "ReactionCoefficients" -> {{-rc[x, y]}}]
検証データから自動的に求められるものを上書きすることは,"VerificationData"オプションを使って行うことができる:
InitializePDECoefficients[vd, sd, "ReactionCoefficients" -> {{-rc[x, y]}}, "VerificationData" -> {"Coordinate" -> {0, 0}}]加えて,自動のElementMarkerも変更することができる:
InitializePDECoefficients[vd, sd, "ReactionCoefficients" -> {{-rc[x, y]}}, "VerificationData" -> {"Coordinate" -> {0, 0}, "ElementMarker" -> 1}]非線形問題では,従属変数と従属変数の微分についての検証データは,それぞれ"DependentVariables"と "DependentVariablesDerivative"を使って変更することができる:
sdnonlinear = sd;
NDSolve`SetSolutionDataComponent[sdnonlinear, "DependentVariables", {0.}];
InitializePDECoefficients[vd, sdnonlinear, "ReactionCoefficients" -> {{-1 / u[x, y]}}]
InitializePDECoefficients[vd, sdnonlinear, "ReactionCoefficients" -> {{-1 / u[x, y]}}, "VerificationData" -> {"DependentVariables" -> {1}}]従属変数の微分係数の値をベクトル{1,1}に変更する.ベクトルの成分は,それぞれの空間方向での微分係数の値である.同時にデフォルトの0.1が使われる:
InitializePDECoefficients[vd, sdnonlinear, "ReactionCoefficients" -> {{-1 / (0.1 - Derivative[1, 0][u][x, y])}}, "VerificationData" -> {"DependentVariablesDerivatives" -> {{1, 1}}}]アプリケーション (6)
ラプラス方程式
を
のときに
であるディリクレ条件と,
のときに
であるノイマン条件を持つ円板上で指定する:
pded = InitializePDECoefficients[vd, sd, "DiffusionCoefficients" -> {{-IdentityMatrix[2]}}];
bcd = InitializeBoundaryConditions[vd, sd, {{DirichletCondition[u[x, y] == 0, x ≤ -0.3], NeumannValue[1., x ≥ 0.35]}}];
md = InitializePDEMethodData[vd, sd];pded["DiffusionCoefficients"]dpde = DiscretizePDE[pded, md, sd];
dbc = DiscretizeBoundaryConditions[bcd, md, sd];
{l, s, d, m} = dpde["SystemMatrices"];
DeployBoundaryConditions[{l, s, d, m}, dbc];
res = LinearSolve[s, l];
efun = ElementMeshInterpolation[{nr["ElementMesh"]}, res];
Plot3D[efun[x, y], {x, y}∈nr["ElementMesh"]]"LoadCoefficients"係数をNIntegrateで使って,ある領域上で積分する:
ipde = InitializePDECoefficients[vd, sd, "LoadCoefficients" -> {{1}}];
md = InitializePDEMethodData[vd, sd];
dpde = DiscretizePDE[ipde, md, sd];
Total[dpde["LoadVector"], 2]NIntegrateを使って結果を確かめる:
NIntegrate[1, {x, y}∈Disk[]]"ReactionCoefficients"を
とし,例として関数
を評価することができる:
ipde = InitializePDECoefficients[vd, sd, "ReactionCoefficients" -> {{1}}, "LoadCoefficients" -> {{x ^ 2 + y ^ 2}}];
md = InitializePDEMethodData[vd, sd];
dpde = DiscretizePDE[ipde, md, sd];
sol = LinearSolve[dpde["StiffnessMatrix"], dpde["LoadVector"]];
if = ElementMeshInterpolation[{md["ElementMesh"]}, sol]Plot3D[if[x, y], {x, y}∈Disk[]]"LoadCoefficients"と組み合せた
の"ReactionCoefficients"を使って関数をスケールすることができる.例えば,
が領域上で
倍にスケールできる:
ipde = InitializePDECoefficients[vd, sd, "ReactionCoefficients" -> {{10}}, "LoadCoefficients" -> {{x ^ 2 + y ^ 2}}];
md = InitializePDEMethodData[vd, sd];
dpde = DiscretizePDE[ipde, md, sd];
sol = LinearSolve[dpde["StiffnessMatrix"], dpde["LoadVector"]];
if = ElementMeshInterpolation[{md["ElementMesh"]}, sol]Plot3D[if[x, y], {x, y}∈Disk[], PlotRange -> All]"ReactionCoefficients"を"LoadDerivativeCoefficients"と組み合せて使い,領域上で関数の導関数を補間することができる:
uExact[x_] := Cos[x] + 1
vd1D = NDSolve`VariableData[{"DependentVariables", "Space"} -> {{u}, {x}}];
sd1D = NDSolve`SolutionData["Space" -> ToNumericalRegion[Line[{{0}, {π}}]]];
ipde = InitializePDECoefficients[vd1D, sd1D, "ReactionCoefficients" -> {{-1}},
"LoadDerivativeCoefficients" -> {{{uExact[x]}}}];
ibcd = InitializeBoundaryConditions[vd1D, sd1D, {{DirichletCondition[u[x] == (D[uExact[x], x] /. x -> 0), x == 0], DirichletCondition[u[x] == (D[uExact[x], x] /. x -> π), x == π]}}];
md = InitializePDEMethodData[vd1D, sd1D];
dpde = DiscretizePDE[ipde, md, sd1D];
dbcd = DiscretizeBoundaryConditions[ibcd, md, sd1D, "Stationary"];
{s, l} = {dpde["StiffnessMatrix"], dpde["LoadVector"]};
DeployBoundaryConditions[{l, s}, dbcd];
sol = LinearSolve[s, l];
if = ElementMeshInterpolation[{md["ElementMesh"]}, sol]Plot[Evaluate[{if[x] - Div[{uExact[x]}, {x}]}], {x, 0, π}, PlotRange -> All]aeqn = -Derivative[0, 2][V][t, x] - Derivative[1, 2][V][t, x]ic = V[0, x] == 0;
bcRight = V[t, 1] == 0;
bcLeftValue = Sin[2 * π * t];
bcLeft = V[t, 0] == bcLeftValue;
tEnd = 3;vd1D = NDSolve`VariableData[{"DependentVariables" -> {u}, "Space" -> {x}, "Time" -> t}];
nr1D = ToNumericalRegion[FullRegion[1], {{0, 1}}];
sd1D = NDSolve`SolutionData[{"Space" -> nr1D, "Time" -> 0.}];initCoeffs = InitializePDECoefficients[vd1D, sd1D,
"DiffusionCoefficients" -> {{-IdentityMatrix[1]}},
"DampingDiffusionCoefficients" -> {{-IdentityMatrix[1]}}
]initBCs = InitializeBoundaryConditions[vd1D, sd1D, {{DirichletCondition[u[t, x] == bcLeftValue, x == 0], DirichletCondition[u[t, x] == 0, x == 1]}}]md = InitializePDEMethodData[vd1D, sd1D]偏微分方程式係数を離散化する.この場合,すべての偏微分方程式係数が時間非依存である:
sdpde = DiscretizePDE[initCoeffs, md, sd1D, "Stationary"];sdpde["StiffnessMatrix"]sdpde["DampingMatrix"]sbcs = DiscretizeBoundaryConditions[initBCs, md, sd1D]discretizePDEResidual[t_ ? NumericQ, u_ ? VectorQ, dudt_ ? VectorQ] :=
Module[{l, s, d, tdpde, tbcs, nldpde, nlbcs},
NDSolve`SetSolutionDataComponent[sd1D, "Time", t];
NDSolve`SetSolutionDataComponent[sd1D, "DependentVariables", u];
l = sdpde["LoadVector"];
s = sdpde["StiffnessMatrix"];
d = sdpde["DampingMatrix"];
tbcs = DiscretizeBoundaryConditions[initBCs, md, sd1D, "Transient"];
DeployBoundaryConditions[{l, s, d}, tbcs];
DeployBoundaryConditions[{l, s, d}, sbcs];
d.dudt + s.u - l
]init = EvaluateOnElementMesh[{x}, 0, md["ElementMesh"]]["ValuesOnGrid"];sparsityPatterns[t_, u_ ? VectorQ] := Module[
{s, d, tdpde, nldpde},
NDSolve`SetSolutionDataComponent[sd1D, "Time", t];
NDSolve`SetSolutionDataComponent[sd1D, "DependentVariables", u];
s = sdpde["StiffnessMatrix"];
d = sdpde["DampingMatrix"];
{s["PatternArray"], d["PatternArray"]}
]{stiffnessSparsity, dampingSparsity} = sparsityPatterns[10 ^ -6, init]ufun = NDSolveValue[{discretizePDEResidual[t, U[t], U'[t]] == 0, U[0] == init}, U, {t, 0, tEnd}, Method -> {"EquationSimplification" -> "Residual"}, Jacobian -> {"X" -> {Automatic, Sparse -> stiffnessSparsity}, "XP" -> {Automatic, Sparse -> dampingSparsity}}]femSolution = ElementMeshInterpolation[{ufun["Coordinates"][[1]], md["ElementMesh"]}, Partition[ufun["ValuesOnGrid"], 1]]tpgSolution = NDSolveValue[{aeqn == 0, bcLeft, bcRight, ic}, V, {x, 0, 1}, {t, 0, tEnd}]Plot3D[tpgSolution[t, x] - femSolution[t, x], {t, 0, tEnd}, {x, 0., 1.}]特性と関係 (2)
InitializePDECoefficientsに与えられるオプションは,"InitializePDECoefficientsOptions"を指定することによってNDSolveに与えることができる:
NDSolve[{Laplacian[u[x, y], {x, y}] == 1 / (x + 1 / 2 + y + 1 / 2), DirichletCondition[u[x, y] == 0, True]}, u, {x, y}∈Disk[]]
"VerificationData"を指定して,特異点にない座標を渡す:
NDSolve[{Laplacian[u[x, y], {x, y}] == 1 / (x + 1 / 2 + y + 1 / 2), DirichletCondition[u[x, y] == 0, True]}, u, {x, y}∈Disk[], Method -> {"FiniteElement", "InitializePDECoefficientsOptions" -> {"VerificationData" -> {"Coordinate" -> {0, 0}}}}]pdec = InitializePDECoefficients[vd, sd, "DiffusionCoefficients" -> {{-IdentityMatrix[2]}}, "LoadCoefficients" -> {{1}}]GetInactivePDEを使って,非アクティブなバージョンの入力を作成する:
GetInactivePDE[pdec, vd]考えられる問題 (1)
通常NDSolveは,係数を評価したときに正しい次元の数量にならない場合に,これを検知して警告を発する:
NDSolveValue[{D[u[t, x], {t, 1}] - D[u[t, x], {x, 2}] == k Sin[x], u[0, x] == 0, DirichletCondition[u[t, x] == 0, True]}, u, {t, 0, π}, {x, -π, π}, Method -> {"PDEDiscretization" -> {"MethodOfLines"}}]それぞれの演算子について与えられた係数が適切であるかどうかを確かめるために,この係数は時間の初期点と領域からの座標を使って評価を試行する.係数と使用された値が相殺される場合には,NDSolveは係数が指定されていないのかどうかを検知することができない.その場合NDSolveは,特定の演算子による要素を計算できなかったというメッセージを返す:
NDSolveValue[{D[u[t, x], {t, 1}] - D[u[t, x], {x, 2}] == Cos[t] Sin[x] + k Sin[t] Sin[x], u[0, x] == 0, DirichletCondition[u[t, x] == 0, True]}, u, {t, 0, π}, {x, -π, π}, Method -> {"PDEDiscretization" -> {"MethodOfLines"}}]上の例では,t=0と x=-π で負荷演算子を評価することによって,負荷演算子が消え,NDSolveは k が指定されていないことを検知することができない:
(Cos[t] * Sin[x] + k * Sin[t] * Sin[x]) /. {t -> 0., x -> -π}テクニカルノート
関連するガイド
-
▪
- 有限要素法
テキスト
Wolfram Research (2014), InitializePDECoefficients, Wolfram言語関数, https://reference.wolfram.com/language/FEMDocumentation/ref/InitializePDECoefficients.html (2024年に更新).
CMS
Wolfram Language. 2014. "InitializePDECoefficients." Wolfram Language & System Documentation Center. Wolfram Research. Last Modified 2024. https://reference.wolfram.com/language/FEMDocumentation/ref/InitializePDECoefficients.html.
APA
Wolfram Language. (2014). InitializePDECoefficients. Wolfram Language & System Documentation Center. Retrieved from https://reference.wolfram.com/language/FEMDocumentation/ref/InitializePDECoefficients.html
BibTeX
@misc{reference.wolfram_2026_initializepdecoefficients, author="Wolfram Research", title="{InitializePDECoefficients}", year="2024", howpublished="\url{https://reference.wolfram.com/language/FEMDocumentation/ref/InitializePDECoefficients.html}", note=[Accessed: 10-July-2026]}
BibLaTeX
@online{reference.wolfram_2026_initializepdecoefficients, organization={Wolfram Research}, title={InitializePDECoefficients}, year={2024}, url={https://reference.wolfram.com/language/FEMDocumentation/ref/InitializePDECoefficients.html}, note=[Accessed: 10-July-2026]}