Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

pdeCoefficientsToDouble

シンボリック PDE 係数の double 形式への変換

説明

coeffs = pdeCoefficientsToDouble(symCoeffs) は、構造体 symCoeffs のシンボリック オブジェクトを倍精度数に変換します。出力は構造体 coeffs であり、Partial Differential Equation Toolbox™ で specifyCoefficients を呼び出すことにより、PDE モデルの係数を定義するために使用できます。

構造体 coeffs には、次の形式の PDE 系の係数 mdca、および f が含まれています。

m2ut2+dut·(cu)+au=f

これは PDE Toolbox で解くことができます。詳細については、Equations You Can Solve Using PDE Toolbox (Partial Differential Equation Toolbox)を参照してください。

すべて折りたたむ

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

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

2x2 u(x,y)+2y2 u(x,y)=fdiff(u(x, y), x, 2) + diff(u(x, y), y, 2) == f

PDE の係数をシンボリック式として抽出し、それらの値を表示します。

symCoeffs = pdeCoefficients(pdeeq,u,'Symbolic',true);
structfun(@disp,symCoeffs)
0sym(0)
0sym(0)

(-100-1)[-sym(1), sym(0); sym(0), -sym(1)]

ff
0sym(0)

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

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

また、係数 acmd、および f を抽出し、構造体 symCoeffs に格納します。

f の値を選択します。symCoeffs はシンボリック オブジェクトであるため、pdeCoefficientsToDouble を使用して係数を double データ型に変換します。double データ型の係数は、PDE Toolbox の関数 specifyCoefficients の有効な入力です。

symCoeffs = subs(symCoeffs,f,-3);
coeffs = pdeCoefficientsToDouble(symCoeffs)
coeffs = struct with fields:
    a: 0
    c: [4x1 double]
    m: 0
    d: 0
    f: -3

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: [1x1 sym]
    a: [2x2 sym]
    c: [4x4 sym]
    f: [2x1 sym]
    d: [1x1 sym]

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

structfun(@disp,symCoeffs)
0sym(0)

(0100)[sym(0), sym(1); sym(0), sym(0)]

(100001000025000273000025000273)[sym(1), sym(0), sym(0), sym(0); sym(0), sym(1), sym(0), sym(0); sym(0), sym(0), sym(25000/273), sym(0); sym(0), sym(0), sym(0), sym(25000/273)]

(0pres)[sym(0); pres]

0sym(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. The axes 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 係数。倍精度数の構造体として返されます。

R2021a で導入