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 PDE Toolbox (Partial Differential Equation Toolbox)を参照してください。
pdeCoefficients
は、PDE を上記の発散形式に変換できない場合、警告メッセージを表示し、残りのすべての勾配を係数 f
に書き込みます。PDE Toolbox は、このタイプの PDE を解くことができません。
例
シンボリック PDE からの係数の抽出
変数 u(x,y)
のラプラシアンを表すシンボリック PDE を作成します。
syms u(x,y)
pdeeq = laplacian(u,[x y]) == -3
pdeeq(x, y) =
PDE の係数を抽出します。
coeffs = pdeCoefficients(pdeeq,u)
coeffs = struct with fields:
a: 0
c: [4x1 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: [4x1 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)
非定数係数 f
をもつポアソン方程式の求解
単位円で囲まれた領域における 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: [4x1 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
非発散形式で 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: [4x1 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
複数の PDE からなる系
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 pres
PDE 系を系のシンボリック方程式として宣言します。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: [2x2 sym]
c: [4x4 sym]
f: [2x1 sym]
d: 0
係数 m
、a
、c
、f
、および d
を表示します。
structfun(@disp,symCoeffs)
関数 subs
を使用して pres
の値を代入します。subs
の出力はシンボリック オブジェクトであるため、PDE Toolbox への有効な入力となるように、係数を関数 pdeCoefficientsToDouble
を使用して double
データ型に変換します。
symCoeffs = subs(symCoeffs,pres,2); coeffs = pdeCoefficientsToDouble(symCoeffs)
coeffs = struct with fields:
a: [4x1 double]
c: [16x1 double]
m: 0
d: 0
f: [2x1 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
入力引数
pdeeq
— シンボリック形式の PDE
シンボリック方程式 | シンボリック式 | シンボリック ベクトル
シンボリック形式の PDE。シンボリック方程式、シンボリック式、またはシンボリック ベクトルとして指定します。
u
— 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)
出力引数
coeffs
— double で演算を行う PDE の係数
倍精度数と関数ハンドルの構造体
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)を参照してください。
symCoeffs
— シンボリック形式の PDE 係数
シンボリック式の構造体
シンボリック形式の PDE 係数。シンボリック式の構造体として返されます。
バージョン履歴
R2021a で導入
参考
syms
| diff
| laplacian
| pdeCoefficientsToDouble
| specifyCoefficients
(Partial Differential Equation Toolbox)
MATLAB コマンド
次の MATLAB コマンドに対応するリンクがクリックされました。
コマンドを MATLAB コマンド ウィンドウに入力して実行してください。Web ブラウザーは MATLAB コマンドをサポートしていません。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- 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)