Main Content

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

functionalDerivative

汎関数微分 (変分導関数)

説明

G = functionalDerivative(f,y) は、汎関数 S[y]=abf[x,y(x),y'(x),...]dx の関数 y = y(x) に対する汎関数微分 δSδy(x) を返します。ここで、x は 1 つ以上の独立変数です。汎関数微分は、y(x) の微小な変動に対する汎関数 S[y] の変化に関連しています。汎関数微分は変分導関数としても知られています。

y がシンボリック関数のベクトルの場合、functionalDerivativey の関数に対する汎関数微分のベクトルを返します。ここで、y のすべての関数は同じ独立変数に従属する必要があります。

すべて折りたたむ

汎関数 S[y]=bay(x)sin(y(x))dx の関数 y に対する汎関数微分を求めます。ここで、被積分は f[y(x)]=y(x)sin(y(x)) です。

y(x) をシンボリック関数として宣言し、fS の被積分として定義します。fyfunctionalDerivative のパラメーターとして使用します。

syms y(x)
f = y*sin(y);
G = functionalDerivative(f,y)
G(x) = sin(y(x))+cos(y(x))y(x)sin(y(x)) + cos(y(x))*y(x)

汎関数 S[u,v]=ba(u2(x)dv(x)dx+v(x)d2u(x)dx2)dx の関数 u および v に対する汎関数微分を求めます。ここで、被積分は f[u(x),v(x),u(x),v(x)]=u2dvdx+vd2udx2 です。

u(x)v(x) をシンボリック関数として宣言し、fS の被積分として定義します。

syms u(x) v(x)
f = u^2*diff(v,x) + v*diff(u,x,x);

シンボリック関数 [u v] のベクトルを、functionalDerivative の 2 番目の入力引数として指定します。

G = functionalDerivative(f,[u v])
G(x) = 

(2x2 v(x)+2u(x)x v(x)2x2 u(x)-2u(x)x u(x))[diff(v(x), x, 2) + 2*u(x)*diff(v(x), x); diff(u(x), x, 2) - 2*u(x)*diff(u(x), x)]

functionalDerivative は、被積分 fu および v それぞれに対する汎関数微分を含むシンボリック関数のベクトルを返します。

バネ定数 k のバネに接続されている重り m のオイラー・ラグランジュ方程式を求めます。

系の運動エネルギー T、位置エネルギー V、およびラグランジュ関数 L を定義します。ラグランジュ関数は、運動エネルギーと位置エネルギーの差です。

syms m k x(t)
T = 1/2*m*diff(x,t)^2;
V = 1/2*k*x^2;
L = T - V
L(t) = 

mt x(t)22-kx(t)22(m*(diff(x(t), t))^2)/2 - (k*x(t)^2)/2

ラグランジュ力学では、系の作用汎関数は、時間の経過に伴うラグランジュ関数の積分に等しくなります (S[x]=t1t2L[t,x(t),x˙(t)]dt)。オイラー・ラグランジュ方程式は、S[x(t)] が定常である系の運動を表します。

被積分 L の汎関数微分を取って、それを 0 に設定することにより、オイラー・ラグランジュ方程式を求めます。

eqn = functionalDerivative(L,x) == 0
eqn(t) = 

-m2t2 x(t)-kx(t)=0- m*diff(x(t), t, 2) - k*x(t) == 0

eqn は、ばね質量系の振動を表す微分方程式です。

dsolve を使用して、eqn の解を求めます。質量 m とバネ定数 k は正であると仮定します。振動振幅の初期条件を x(0)=10 に、重りの初期速度を x˙(0)=0 に設定します。

assume(m,'positive')
assume(k,'positive')
Dx(t) = diff(x(t),t);
xSol = dsolve(eqn,[x(0) == 10, Dx(0) == 0])
xSol = 

10cos(ktm)10*cos((sqrt(k)*t)/sqrt(m))

計算を続けるため、仮定を消去します。

assume([k m],'clear')

最速降下問題は、摩擦のない重力下における粒子の最短の降下経路を見つける問題です。運動は垂直面に限定されます。重力 g の下で、曲線 y(x) に沿って a から b へ動く物体の時間は、次式で与えられます。

t=ab1+y22gydx.

経路 y の微小な変動に対する t の変化を最小にすることによって、最速経路を求めます。最小にするための条件は、δtδy(x)=0 です。

この汎関数微分を計算して、最速降下問題を記述する微分方程式を求めます。simplify を使用して方程式を単純化し、想定される形式にします。

syms g y(x)
assume(g,'positive')
f = sqrt((1 + diff(y)^2)/(2*g*y));
eqn = functionalDerivative(f,y) == 0;
eqn = simplify(eqn)
eqn(x) = 

2y(x)2x2 y(x)+x y(x)2=-12*y(x)*diff(y(x), x, 2) + (diff(y(x), x))^2 == -1

この方程式は、最速降下問題の標準の微分方程式です。微分方程式の解を見つけるには、dsolve を使用します。'Implicit' オプションを true に指定して、F(y(x))=g(x) の形式を取る陰的な解を返します。

sols = dsolve(eqn,'Implicit',true)
sols = 

(y(x)=C2-xiy(x)=C3+xiσ1=C4+xσ1=C5-xC1+y(x)y(x)=0)where  σ1=C1atan(-C1y(x)-1)-y(x)-C1y(x)-1[y(x) == C2 - x*sym(1i); y(x) == C3 + x*sym(1i); C1*atan(sqrt(- C1/y(x) - 1)) - y(x)*sqrt(- C1/y(x) - 1) == C4 + x; C1*atan(sqrt(- C1/y(x) - 1)) - y(x)*sqrt(- C1/y(x) - 1) == C5 - x; (C1 + y(x))/y(x) == 0]

シンボリック ソルバー dsolve は複素空間での一般解を返します。Symbolic Math Toolbox™ は、シンボリック関数 y(x) が実数であるとの仮定を受け入れません。

境界条件に応じて、この最速降下問題に対する 2 つの実空間の解があります。以下の 2 つの解のうち一方が実空間でのサイクロイド曲線を表します。

solCycloid1 = sols(3)
solCycloid1 = 

C1atan(-C1y(x)-1)-y(x)-C1y(x)-1=C4+xC1*atan(sqrt(- C1/y(x) - 1)) - y(x)*sqrt(- C1/y(x) - 1) == C4 + x

solCycloid2 = sols(4)
solCycloid2 = 

C1atan(-C1y(x)-1)-y(x)-C1y(x)-1=C5-xC1*atan(sqrt(- C1/y(x) - 1)) - y(x)*sqrt(- C1/y(x) - 1) == C5 - x

実空間での別の解は、水平直線です。ここで y は定数です。

solStraight = simplify(sols(5))
solStraight = C1+y(x)=0C1 + y(x) == 0

サイクロイドの解について説明するため、境界条件 y(0)=5 および y(4)=1 での例を考えます。この場合、与えられた境界条件を満たすことができる方程式は solCycloid2 です。2 つの境界条件を solCycloid2 に代入します。

eq1 = subs(solCycloid2,[x y(x)],[0 5]);
eq2 = subs(solCycloid2,[x y(x)],[4 1]);

2 つの方程式 eq1eq2 には 2 つの未知の係数 C1C5 があります。vpasolve を使用して、係数の数値解を求めます。それらの解を solCycloid2 に代入します。

coeffs = vpasolve([eq1 eq2]);
eqCycloid = subs(solCycloid2,{'C1','C5'},{coeffs.C1,coeffs.C5})
eqCycloid = 

-6.4199192418473511250705556729108atan(6.4199192418473511250705556729108y(x)-1)-y(x)6.4199192418473511250705556729108y(x)-1=-x-5.8078336827583088482183433150164- vpa('6.4199192418473511250705556729108')*atan(sqrt(vpa('6.4199192418473511250705556729108')/y(x) - 1)) - y(x)*sqrt(vpa('6.4199192418473511250705556729108')/y(x) - 1) == - x - vpa('5.8078336827583088482183433150164')

陰的方程式 eqCycloid は、xy(x) に関する最速降下問題のサイクロイドの解を表します。

次に、fimplicit を使用して eqCycloid をプロットできます。fimplicit はシンボリック変数 x および y を含む陰的なシンボリック方程式のみを受け入れるため、シンボリック関数 y(x) をシンボリック変数 y に変換します。mapSymType を使用して、y(x)x に変換します。境界条件 0<x<4 および 1<y<5 の範囲でサイクロイドの解をプロットします。

funToVar = @(obj) sym('y');
eqPlot = mapSymType(eqCycloid,'symfun',funToVar);
fimplicit(eqPlot,[0 4 1 5])

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

3 次元空間の表面を表す関数 u(x,y) の表面積は次の汎関数で求めることができます。

F[u]=y1y2x1x2f[x,y(x),u(x,y),ux,uy]dxdy=y1y2x1x21+ux2+uy2dxdy

ここで ux および uyxy に対する u の偏導関数です。

被積分 f の汎関数微分を、u について求めます。

syms u(x,y)
f = sqrt(1 + diff(u,x)^2 + diff(u,y)^2);
G = functionalDerivative(f,u)
G(x, y) = 

-y u(x,y)22x2 u(x,y)+2x2 u(x,y)+σ122y2 u(x,y)-2y σ1y u(x,y)σ1+2y2 u(x,y)σ12+y u(x,y)2+13/2where  σ1=x u(x,y)-((diff(u(x, y), y))^2*diff(u(x, y), x, 2) + diff(u(x, y), x, 2) + diff(u(x, y), x)^2*diff(u(x, y), y, 2) - 2*diff(diff(u(x, y), x), y)*diff(u(x, y), y)*diff(u(x, y), x) + diff(u(x, y), y, 2))/(diff(u(x, y), x)^2 + (diff(u(x, y), y))^2 + 1)^sym(3/2)

結果は、u(x,y) で定義される 3 次元表面の極小表面を表す方程式 G です。この方程式の解は、シャボン玉のような 3 次元空間の極小表面を示しています。

入力引数

すべて折りたたむ

汎関数の被積分。シンボリック変数、シンボリック関数、またはシンボリック式として指定します。引数 f は汎関数の密度を表します。

微分関数。シンボリック関数、あるいはシンボリック関数からなるベクトル、行列または多次元配列で指定します。引数 y は、1 つ以上の独立変数の関数の場合があります。y がシンボリック関数のベクトルの場合、functionalDerivativey の関数に対する汎関数微分のベクトルを返します。ここで、y のすべての関数は同じ独立変数に従属する必要があります。

出力引数

すべて折りたたむ

シンボリック関数またはシンボリック関数からなるベクトルとして返された汎関数微分。入力 y がベクトルの場合、G はベクトルです。

詳細

すべて折りたたむ

汎関数微分

次の汎関数を考えます。

S[y]=abf[x,y(x),y'(x),...,y(n)(x)]dx,

ここで、x 空間における a から b までの経路は任意であるとします。

経路 y(x) の微小な変動に対して、変化を δy(x)=εϕ(x) として定義します。ここで、ϕ(x) は任意のテスト関数です。汎関数 S の変化は次のようになります。

DS[y]=limε0S[y+εϕ]S[y]ε=abδSδy(x)ϕ(x)dx.

δSδy(x) は y に対する S の汎関数微分です。線形汎関数 DS[y] は、汎関数 S の第 1 変分またはガトー微分としても知られています。

汎関数微分を計算する 1 つの方法は、ε についての方程式 S[y + εϕ] にテイラー展開を適用することです。1 次項は ε のままで、部分ごとに積分を実行し、境界条件 ϕ(a) = ϕ(b) = ϕ'(a) = ϕ'(b) = ... = 0 を選択すると、汎関数微分は次のようになります。

δSδy(x)=fyddxfy'+d2dx2fy''...+(1)ndndxn(fy(n))=i=0n(1)ididxi(fy(i)).

R2015a で導入