pdeCoefficients
説明
は、偏微分方程式 (PDE) の係数を倍精度数と関数ハンドルの構造体として抽出します。この構造体は、Partial Differential Equation Toolbox™ で関数 coeffs = pdeCoefficients(pdeeq,u)specifyCoefficients の入力として使用できます。
pdeeq は、スカラーの PDE またはシンボリック形式の PDE 系で、u の関数です。関数 pdeCoefficients は、pdeeq を
の形式の連立方程式に変換し、係数 m、d、c、a、および f を含む構造体 coeffs を返します。詳細については、Equations You Can Solve Using Partial Differential Equation Toolbox (Partial Differential Equation Toolbox)を参照してください。
pdeCoefficients は、PDE を上記の発散形式に変換できない場合、警告メッセージを表示し、残りのすべての勾配を係数 f に書き込みます。Partial Differential Equation Toolbox は、このタイプの PDE を解くことができません。
例
変数 u(x,y) のラプラシアンを表すシンボリック PDE を作成します。
syms u(x,y)
pdeeq = laplacian(u,[x y]) == -3pdeeq(x, y) =
PDE の係数を抽出します。
coeffs = pdeCoefficients(pdeeq,u)
coeffs = struct with fields:
a: 0
c: [4×1 double]
m: 0
d: 0
f: -3
pdeCoefficients は、シンボリック PDE を以下の形式のスカラー PDE 方程式に変換します。
また、係数 m、d、c、a、および f を抽出し、構造体 coeffs に格納します。2 次元の連立 次方程式の場合、c は 4 個の要素をもつテンソルとなります。詳細については、c Coefficient for specifyCoefficients (Partial Differential Equation Toolbox)を参照してください。この例では であるため、係数 c は、c、c、c、および c を表す 4 行 1 列の列ベクトルとなります。
coeffs.c
ans = 4×1
-1
0
0
-1
単位円で囲まれた領域における 2 次元の斉次ラプラス方程式を解きます。関数 pdeCoefficients を使用して、ラプラス方程式の係数を抽出します。
PDE モデルを作成し、このモデルに幾何形状を含めます。
model = createpde; geometryFromEdges(model,@circleg);
幾何形状をプロットし、境界条件の定義に使用する辺のラベルを表示します。
figure pdegplot(model,'EdgeLabels','on') axis equal

ラプラス方程式を表すシンボリック式 pdeeq を作成します。
syms u(x,y)
pdeeq = laplacian(u,[x y])pdeeq(x, y) =
ラプラス方程式の係数を抽出します。
coeffs = pdeCoefficients(pdeeq,u)
coeffs = struct with fields:
a: 0
c: [4×1 double]
m: 0
d: 0
f: 0
PDE モデルの係数を指定します。
specifyCoefficients(model,'m',coeffs.m,'d',coeffs.d, ... 'c',coeffs.c,'a',coeffs.a,'f',coeffs.f);
円を形成する 4 辺すべてにディリクレ境界条件 を適用します。
applyBoundaryCondition(model,'dirichlet','Edge',1:4,'u',@(region,state) region.x.^4 + region.y.^4);
この幾何形状に対する既定のメッシュを生成します。
generateMesh(model);
PDE を解いて解をプロットします。
results = solvepde(model);
pdeplot(model,'XYData',results.NodalSolution)
単位円で囲まれた領域における 2 次元のポアソン方程式を解きます。この PDE の発散形式は、非定数係数 f をもちます。この PDE を解くには、pdeCoefficients を使用して係数を抽出し、specifyCoefficients を使用して PDE モデルの係数を指定します。
PDE モデルを作成し、このモデルに幾何形状を含めます。
model = createpde; geometryFromEdges(model,@circleg);
ポアソン方程式を表すシンボリック式 pdeeq を作成します。
syms u(x,y)
pdeeq = diff(u,x,x) + diff(u,y,y) - 1/(x^2 + y^2)pdeeq(x, y) =
方程式の係数を抽出します。
coeffs = pdeCoefficients(pdeeq,u)
coeffs = struct with fields:
a: 0
c: [4×1 double]
m: 0
d: 0
f: @makeCoefficient/coefficientFunction
係数 f は定数ではありません。これは @makeCoefficient/coefficientFunction として表示されます。これは、この係数が内部関数のワークスペースから返されたことを表します。関数ハンドルの背後にある式を表示するには、coeffs.f('show') を使用します。
coeffs.f('show')ans =
PDE モデルの係数を指定します。
specifyCoefficients(model,'m',coeffs.m,'d',coeffs.d, ... 'c',coeffs.c,'a',coeffs.a,'f',coeffs.f);
円を形成する 4 辺すべてにディリクレ境界条件 を適用します。
applyBoundaryCondition(model,'dirichlet','Edge',1:4,'u',0);
この幾何形状に対する既定のメッシュを生成します。
generateMesh(model);
PDE を解きます。関数 pdeplot のオプション 'XYData' を使用して、ノード解をプロットします。
results = solvepde(model);
pdeplot(model,'XYData',results.NodalSolution)
オプション 'FlowData' を使用して、ノード位置における解の勾配をプロットします。
pdeplot(model,'FlowData',[results.XGradients results.YGradients])
非発散形式で PDE を構築します。
syms u(x,y)
pdeeq = diff(u,x,x) + cos(x+y)/4*diff(u,x,y) + 1/2*diff(u,y,y)pdeeq(x, y) =
係数を抽出します。pdeCoefficients は、PDE を以下の発散形式に変換できない場合があります。
,
この場合、警告メッセージを表示しますが、結果も出力します。
coeffs = pdeCoefficients(pdeeq,u)
Warning: After extracting m, d, and c, some gradients remain. Writing all remaining terms to f.
coeffs = struct with fields:
a: 0
c: @makeCoefficient/coefficientFunction
m: 0
d: 0
f: @makeCoefficient/coefficientFunction
抽出した係数 c および f の関数ハンドルを表示するには、'show' オプションを使用します。PDE に含まれる残りの勾配は、すべて係数 f に書き込まれます。
coeffs.c('show')ans =
coeffs.f('show')ans =
この PDE には PDE Toolbox が必要とする発散形式が含まれていないため、PDE Toolbox はこの PDE を解くことができません。
単位円で囲まれた領域における時間依存波動方程式を解きます。この波動方程式は、時間 と座標 および に依存するスカラー関数 をもつ PDE です。
PDE モデルを作成し、このモデルに幾何形状を含めます。
model = createpde(1); geometryFromEdges(model,@circleg);
波動方程式を表すシンボリック PDE を作成します。
syms u(t,x,y)
pdeeq = diff(u,t,t) - laplacian(u,[x y])pdeeq(t, x, y) =
PDE の係数を抽出します。
coeffs = pdeCoefficients(pdeeq,u)
coeffs = struct with fields:
a: 0
c: [4×1 double]
m: 1
d: 0
f: 0
PDE モデルの係数を指定します。
specifyCoefficients(model,'m',coeffs.m,'d',coeffs.d, ... 'c',coeffs.c,'a',coeffs.a,'f',coeffs.f);
幾何形状全体に関する時間依存問題の初期条件を設定します。
setInitialConditions(model,0,1);
円を形成する 4 辺すべてにディリクレ境界条件 を適用します。
applyBoundaryCondition(model,'dirichlet','Edge',1:4,'u',0);
この幾何形状に対する既定のメッシュを生成します。
generateMesh(model);
時間範囲 0 秒 ~ 50 秒、時間間隔 2 秒の条件で、時間依存 PDE の解を求めます。
results = solvepde(model,linspace(0,2,50));
5 秒間隔で波動方程式の解をプロットします。
figure; for k = 1:10 subplot(5,2,k); pdeplot(model,'XYData',results.NodalSolution(:,k*5)) axis equal end

2 つの 2 階 PDE からなる方程式を解きます。この PDE 系を解くには、pdeCoefficients を使用して PDE の係数をシンボリックに抽出し、pdeCoefficientsToDouble を使用してその係数を倍精度数に変換し、specifyCoefficients を使用して PDE モデルの係数を指定します。
この PDE 系は、固定された構造板に一様な圧力負荷をかけたときの構造板のたわみを表します。従属変数 および をもつ PDE 系は、次の式で与えられます。
,
,
ここで、 は板のたわみ剛性で、次の式で与えられます。
,
また、 は弾性率、 はポアソン比、 は板の厚さ、 は板の横方向のたわみ、 は圧力負荷です。
2 つの連立方程式の PDE モデルを作成します。
model = createpde(2);
矩形形状を作成します。矩形の側面の長さを指定します。次に、この幾何形状を PDE モデルに組み込みます。
len = 10.0; gdm = [3 4 0 len len 0 0 0 len len]'; g = decsg(gdm,'S1',('S1')'); geometryFromEdges(model,g);
方程式の物理パラメーターの値を指定します。外部の圧力 は、任意の値を取ることができるシンボリック変数 pres とします。
E = 1.0e6;
h_thick = 0.1;
nu = 0.3;
D = E*h_thick^3/(12*(1 - nu^2));
syms presPDE 系をシンボリック方程式として宣言します。PDE の係数を抽出し、その係数をシンボリック形式で返します。
syms u1(x,y) u2(x,y) pdeeq = [-laplacian(u1) + u2; -D*laplacian(u2) - pres]; symCoeffs = pdeCoefficients(pdeeq,[u1 u2],'Symbolic',true)
symCoeffs = struct with fields:
m: 0
a: [2×2 sym]
c: [4×4 sym]
f: [2×1 sym]
d: 0
係数 m、a、c、f、および d を表示します。
structfun(@disp,symCoeffs)
関数 subs を使用して pres の値を代入します。subs の出力はシンボリック オブジェクトであるため、Partial Differential Equation Toolbox への有効な入力となるように、係数を pdeCoefficientsToDouble 関数を使用して double データ型に変換します。
symCoeffs = subs(symCoeffs,pres,2); coeffs = pdeCoefficientsToDouble(symCoeffs)
coeffs = struct with fields:
a: [4×1 double]
c: [16×1 double]
m: 0
d: 0
f: [2×1 double]
PDE モデルの PDE 係数を指定します。
specifyCoefficients(model,'m',coeffs.m,'d',coeffs.d, ... 'c',coeffs.c,'a',coeffs.a,'f',coeffs.f);
バネの剛性を指定します。4 つの辺すべてで分布するバネを定義し、境界条件を指定します。
k = 1e7; bOuter = applyBoundaryCondition(model,'neumann','Edge',(1:4), ... 'g',[0 0],'q',[0 0; k 0]);
幾何形状のメッシュ サイズを指定し、PDE モデルのメッシュを生成します。
hmax = len/20;
generateMesh(model,'Hmax',hmax);モデルを解きます。
res = solvepde(model);
ノード位置における解にアクセスします。
u = res.NodalSolution;
板の横方向のたわみをプロットします。
numNodes = size(model.Mesh.Nodes,2); figure; pdeplot(model,'XYData',u(1:numNodes),'contour','on') title 'Transverse Deflection'

板の中央における横方向のたわみを求めます。
wMax = min(u(1:numNodes,1))
wMax = -0.2763
この結果を、解析的に計算した、板の中央における横方向のたわみと比較します。
pres = 2; wMax = -.0138*pres*len^4/(E*h_thick^3)
wMax = -0.2760
入力引数
シンボリック形式の PDE。シンボリック方程式、シンボリック式、またはシンボリック ベクトルとして指定します。
PDE の従属変数。シンボリック関数として指定します。u には、2 次元または 3 次元の定常変数または時間依存変数が含まれていなければなりません。たとえば、次のいずれかのステートメントを使用して変数 u を作成します。
syms u(x,y)syms u(t,x,y)syms u(x,y,z)syms u(t,x,y,z)
出力引数
double で演算を行う PDE の係数。関数 specifyCoefficients が必要とする倍精度数と関数ハンドルの構造体として返されます。この構造体のフィールドは、a、c、m、d、および f です。Partial Differential Equation Toolbox が必要とする形式で係数を解釈する方法については、以下を参照してください。
c Coefficient for specifyCoefficients (Partial Differential Equation Toolbox)
m, d, or a Coefficient for specifyCoefficients (Partial Differential Equation Toolbox)
f Coefficient for specifyCoefficients (Partial Differential Equation Toolbox)
pdeCoefficients が関数ハンドルとして係数を返す際、関数ハンドルは入力引数として location と state の 2 つの構造体を取り、倍精度出力を返します。関数ハンドルは、コマンド ウィンドウで @makeCoefficient/coefficientFunction として表示されます。coeffs.f の関数ハンドルの式をシンボリック形式で表示するには、coeffs.f('show') を使用します。
生成されたすべての係数を specifyCoefficients で使用できない場合もあります。たとえば、m が非ゼロの場合、係数 d は特別な行列形式を取らなければなりません。詳細については、d Coefficient When m Is Nonzero (Partial Differential Equation Toolbox)を参照してください。
シンボリック形式の PDE 係数。シンボリック式の構造体として返されます。
バージョン履歴
R2021a で導入
参考
syms | diff | laplacian | pdeCoefficientsToDouble | specifyCoefficients (Partial Differential Equation Toolbox)
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Web サイトの選択
Web サイトを選択すると、翻訳されたコンテンツにアクセスし、地域のイベントやサービスを確認できます。現在の位置情報に基づき、次のサイトの選択を推奨します:
また、以下のリストから Web サイトを選択することもできます。
最適なサイトパフォーマンスの取得方法
中国のサイト (中国語または英語) を選択することで、最適なサイトパフォーマンスが得られます。その他の国の MathWorks のサイトは、お客様の地域からのアクセスが最適化されていません。
南北アメリカ
- América Latina (Español)
- Canada (English)
- United States (English)
ヨーロッパ
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)