Main Content

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

functionalDerivative

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

説明

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

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

すべて折りたたむ

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

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

symsy(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 ] = b a ( u 2 ( x ) d v ( x ) d x + v ( x ) d 2 u ( x ) d x 2 ) d x の関数 u および v に対する汎関数微分を求めます。ここで、被積分は f [ u ( x ) , v ( x ) , u ( x ) , v ( x ) ] = u 2 d v d x + v d 2 u d x 2 です。

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

symsu(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) =

( 2 x 2 v ( x ) + 2 u ( x ) x v ( x ) 2 x 2 u ( x ) - 2 u ( 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を定義します。ラグランジュ関数は、運動エネルギーと位置エネルギーの差です。

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

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

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

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

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

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

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

dsolveを使用して、eqnの解を求めます。質量mとバネ定数kは正であると仮定します。振動振幅の初期条件を x ( 0 ) = 1 0 に、重りの初期速度を 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 =

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

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

assume([k m],'clear')

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

t = a b 1 + y 2 2 g y d x .

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

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

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

2 y ( x ) 2 x 2 y ( x ) + x y ( x ) 2 = - 1 2*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 ) = C 2 - x i y ( x ) = C 3 + x i σ 1 = C 4 + x σ 1 = C 5 - x C 1 + y ( x ) y ( x ) = 0 ) where σ 1 = C 1 atan ( - C 1 y ( x ) - 1 ) - y ( x ) - C 1 y ( 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 =

C 1 atan ( - C 1 y ( x ) - 1 ) - y ( x ) - C 1 y ( x ) - 1 = C 4 + x C1*atan(sqrt(- C1/y(x) - 1)) - y(x)*sqrt(- C1/y(x) - 1) == C4 + x

solCycloid2 = sols(4)
solCycloid2 =

C 1 atan ( - C 1 y ( x ) - 1 ) - y ( x ) - C 1 y ( x ) - 1 = C 5 - x C1*atan(sqrt(- C1/y(x) - 1)) - y(x)*sqrt(- C1/y(x) - 1) == C5 - x

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

solStraight =简化(溶胶(5))
solStraight =
                       
                        
                         
                          
                           
                            
                             
                              
                               
                                C
                              
                              
                               
                                1
                              
                             
                             
                              +
                             
                              
                               
                                y
                              
                              
                               
                                (
                               
                                
                                 
                                  x
                                
                               
                               
                                )
                              
                             
                            
                           
                           
                            =
                           
                            0
                          
                         
                         
                          C1 + 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 つの未知の係数 C 1 C 5 があります。vpasolveを使用して、係数の数値解を求めます。それらの解をsolCycloid2に代入します。

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

- 6.4199192418473511250705556729108 atan ( 6.4199192418473511250705556729108 y ( x ) - 1 ) - y ( x ) 6.4199192418473511250705556729108 y ( 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は、 x y ( 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 ] = y 1 y 2 x 1 x 2 f [ x , y ( x ) , u ( x , y ) , u x , u y ] d x d y = y 1 y 2 x 1 x 2 1 + u x 2 + u y 2 d x d y

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

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

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

- y u ( x , y ) 2 2 x 2 u ( x , y ) + 2 x 2 u ( x , y ) + σ 1 2 2 y 2 u ( x , y ) - 2 y σ 1 y u ( x , y ) σ 1 + 2 y 2 u ( x , y ) σ 1 2 + y u ( x , y ) 2 + 1 3 / 2 where σ 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 ] = a b f [ x , y ( x ) , y ' ( x ) , ... , y ( n ) ( x ) ] d x ,

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

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

D S [ y ] = lim ε 0 S [ y + ε ϕ ] S [ y ] ε = a b δ S δ y ( x ) ϕ ( x ) d x .

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

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

δ S δ y ( x ) = f y d d x f y ' + d 2 d x 2 f y ' ' ... + ( 1 ) n d n d x n ( f y ( n ) ) = i = 0 n ( 1 ) i d i d x i ( f y ( i ) ) .

R2015a で導入