Main Content

pdeCoefficients

偏微分方程式の係数の抽出

説明

coeffs = pdeCoefficients(pdeeq,u) は、偏微分方程式 (PDE) の係数を倍精度数と関数ハンドルの構造体として抽出します。この構造体は、Partial Differential Equation Toolbox™ で関数 specifyCoefficients の入力として使用できます。

pdeeq は、スカラーの PDE またはシンボリック形式の PDE 系で、u の関数です。関数 pdeCoefficients は、pdeeq

m2ut2+dut·(cu)+au=f

の形式の方程式系に変換し、係数 mdca、および f を含む構造体 coeffs を返します。詳細については、Equations You Can Solve Using PDE Toolbox (Partial Differential Equation Toolbox)を参照してください。

pdeCoefficients は、PDE を上記の発散形式に変換できない場合、警告メッセージを表示し、残りのすべての勾配を係数 f に書き込みます。PDE Toolbox は、このタイプの PDE を解くことができません。

symCoeffs = pdeCoefficients(pdeeq,u,'Symbolic',true) は、PDE の係数をシンボリック式の構造体として返します。

すべて折りたたむ

変数 u(x,y) のラプラシアンを表すシンボリック PDE を作成します。

syms u(x,y)
pdeeq = laplacian(u,[x y]) == -3
pdeeq(x, y) = 

2x2 u(x,y)+2y2 u(x,y)=-3

PDE の係数を抽出します。

coeffs = pdeCoefficients(pdeeq,u)
coeffs = struct with fields:
    a: 0
    c: [4x1 double]
    m: 0
    d: 0
    f: -3

pdeCoefficients は、シンボリック PDE を以下の形式のスカラー PDE 方程式に変換します。

m2ut2+dut-(cu)+au=f

また、係数 mdca、および f を抽出し、構造体 coeffs に格納します。2 次元の N 次方程式系の場合、c は 4N2 個の要素をもつテンソルとなります。詳細については、c Coefficient for specifyCoefficients (Partial Differential Equation Toolbox)を参照してください。この例では N=1 であるため、係数 c は、cxxcxycyx、および cyy を表す 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

Figure contains an axes object. The axes object contains 5 objects of type line, text.

ラプラス方程式を表すシンボリック式 pdeeq を作成します。

syms u(x,y)
pdeeq = laplacian(u,[x y])
pdeeq(x, y) = 

2x2 u(x,y)+2y2 u(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 辺すべてにディリクレ境界条件 u(x,y)=x4+y4 を適用します。

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)

Figure contains an axes object. The axes object contains an object of type patch.

単位円で囲まれた領域における 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) = 

2x2 u(x,y)-1x2+y2+2y2 u(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 = 

1x2+y2

PDE モデルの係数を指定します。

specifyCoefficients(model,'m',coeffs.m,'d',coeffs.d, ...
    'c',coeffs.c,'a',coeffs.a,'f',coeffs.f);

円を形成する 4 辺すべてにディリクレ境界条件 u(x,y)=0 を適用します。

applyBoundaryCondition(model,'dirichlet','Edge',1:4,'u',0);

この幾何形状に対する既定のメッシュを生成します。

generateMesh(model);

PDE を解きます。関数 pdeplot のオプション 'XYData' を使用して、ノード解をプロットします。

results = solvepde(model);
pdeplot(model,'XYData',results.NodalSolution)

Figure contains an axes object. The axes object contains an object of type patch.

オプション 'FlowData' を使用して、ノード位置における解の勾配をプロットします。

pdeplot(model,'FlowData',[results.XGradients results.YGradients])

Figure contains an axes object. The axes object contains an object of type quiver.

非発散形式で 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) = 

2x2 u(x,y)+cos(x+y)y x u(x,y)4+2y2 u(x,y)2

係数を抽出します。pdeCoefficients は、PDE を以下の発散形式に変換できない場合があります。

m2ut2+dut-(cu)+au=f,

この場合、警告メッセージを表示しますが、結果も出力します。

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 = 

(-118-cos(x+y)418-cos(x+y)4-12)

coeffs.f('show')
ans = 

sin(x+y)x u(x,y)4+sin(x+y)y u(x,y)4-cos(x+y)y x u(x,y)4+y x u(x,y)4

この PDE には PDE Toolbox が必要とする発散形式が含まれていないため、PDE Toolbox はこの PDE を解くことができません。

単位円で囲まれた領域における時間依存波動方程式を解きます。この波動方程式は、時間 t と座標 x および y に依存するスカラー関数 u(t,x,y) をもつ 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) = 

2t2 u(t,x,y)-2x2 u(t,x,y)-2y2 u(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 辺すべてにディリクレ境界条件 u(x,y)=0 を適用します。

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  

Figure contains 10 axes objects. Axes object 1 contains an object of type patch. Axes object 2 contains an object of type patch. Axes object 3 contains an object of type patch. Axes object 4 contains an object of type patch. Axes object 5 contains an object of type patch. Axes object 6 contains an object of type patch. Axes object 7 contains an object of type patch. Axes object 8 contains an object of type patch. Axes object 9 contains an object of type patch. Axes object 10 contains an object of type patch.

2 つの 2 階 PDE からなる系を解きます。この PDE 系を解くには、pdeCoefficients を使用して PDE の係数をシンボリックに抽出し、pdeCoefficientsToDouble を使用してその係数を倍精度数に変換し、specifyCoefficients を使用して PDE モデルの係数を指定します。

この PDE 系は、固定された構造板に一様な圧力負荷をかけたときの構造板のたわみを表します。従属変数 u1 および u2 をもつ PDE 系は、次の式で与えられます。

-2u1+u2=0,

-D2u2=p,

ここで、D は板のたわみ剛性で、次の式で与えられます。

D=Eh312(1-ν2),

また、E は弾性率、ν はポアソン比、h は板の厚さ、u1 は板の横方向のたわみ、p は圧力負荷です。

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);

系の物理パラメーターの値を指定します。外部の圧力 p は、任意の値を取ることができるシンボリック変数 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

係数 macf、および d を表示します。

structfun(@disp,symCoeffs)
0

(0100)

(100001000025000273000025000273)

(0pres)

0

関数 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'

Figure contains an axes object. The axes object with title Transverse Deflection contains 12 objects of type patch, line.

板の中央における横方向のたわみを求めます。

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)

出力引数

すべて折りたたむ

PDE の係数。関数 specifyCoefficients が必要とする倍精度数と関数ハンドルの構造体として返されます。この構造体のフィールドは、acmd、および f です。PDE Toolbox が必要とする形式で係数を解釈する方法については、以下を参照してください。

どの係数も、倍精度数または関数ハンドルで指定できます。たとえば、係数 coeffs.f は、ワークスペースの内部関数を表す関数ハンドルとして指定できます。これは、入力引数として 2 つの構造体 location および state を取り、倍精度数を返します。

関数ハンドルは、コマンド ウィンドウで @makeCoefficient/coefficientFunction として表示されます。関数ハンドル coeffs.f の式をシンボリック形式で表示するには、coeffs.f('show') を使用します。

シンボリック形式の PDE 係数。シンボリック式の構造体として返されます。

バージョン履歴

R2021a で導入