最優控制:從變分法到龐特里亞金原理

典型問題

根據系統的建模可以劃分為:

  • 線性系統: x ˙ = A x + B u \mathbf{\dot{x}} = \boldsymbol{A}\mathbf{x}+\boldsymbol{B}\mathbf{u} x˙=Ax+Bu
  • 非線性系統 x ˙ ( t ) = f ( x ( t ) , u ( t ) , t ) \dot{\mathbf{x}}(t) = \mathbf{f}(\mathbf{x}(t), \mathbf{u}(t), t) x˙(t)=f(x(t),u(t),t)
    • 可以通過一些手段進行線性化

根據約束類型可以劃分為:

  • 控制約束: u ( t ) ∈ U ? R m \mathbf{u}(t) \in \mathbb{U} \subseteq \mathbb{R}^m u(t)U?Rm
  • 狀態約束: f ( x ) ≤ 0 \mathbf{f}(\mathbf{x}) \le 0 f(x)0 or g ( x ) = 0 \mathbf{g}(\mathbf{x}) = 0 g(x)=0

其實無論是線性系統/非線性系統,控制約束/狀態約束,使用最優化方法解決時都是約束,都需要使用龐特里亞金極小值原理解決

一個最優控制的典型問題形式如下:

  • 被控系統(動態約束): x ˙ ( t ) = f ( x ( t ) , u ( t ) , t ) , x ( t 0 ) = x 0 \dot{\mathbf{x}}(t) = \mathbf{f}(\mathbf{x}(t), \mathbf{u}(t), t), \quad \mathbf{x}(t_0) = \mathbf{x}_0 x˙(t)=f(x(t),u(t),t),x(t0?)=x0?
  • 目標函數: J = Φ [ x ( t f ) ] + ∫ t 0 t f L [ x ( t ) , u ( t ) , t ] d t J = \varPhi \left[ \boldsymbol{x}(t_f) \right] + \int_{t_0}^{t_f} L \left[ \boldsymbol{x}(t), \boldsymbol{u}(t), t \right] \mathrm{d}t J=Φ[x(tf?)]+t0?tf??L[x(t),u(t),t]dt
    • 尋找最優控制 u ? ( t ) \mathbf{u}^*(t) u?(t) 和最優軌跡 x ? ( t ) \mathbf{x}^*(t) x?(t),使 J J J 最小化(或最大化),同時滿足狀態方程和控制約束 u ( t ) ∈ U \mathbf{u}(t) \in \mathbb{U} u(t)U
  • 約束條件:
    • 輸入約束: u ( t ) ∈ U ? R m \mathbf{u}(t) \in \mathbb{U} \subseteq \mathbb{R}^m u(t)U?Rm
    • 狀態約束,末尾狀態也可以設定為一個約束

典型方法

變分法

將問題理解為求代價泛函 J [ y ] J[y] J[y]極小值函數 y y y,一般用于無約束問題,如果遇見約束問題,需要構建拉格朗日函數,將原問題的約束條件 “嵌入” 到新構造的增廣代價泛函中,從而將有約束的優化問題轉化為無約束的極值問題。
變分法基礎
變分法研究泛函的極值,泛函以函數為自變量(如曲線長度、物理作用量)。通過變分 δ y ( x ) \delta y(x) δy(x),函數的微小擾動),將泛函極值轉化為微分方程求解。

  • 泛函示例: J [ y ] = ∫ x 1 x 2 F ( x , y , y ′ ) d x J[y] = \int_{x_1}^{x_2} F(x, y, y') dx J[y]=x1?x2??F(x,y,y)dx其中 $ y(x)$ 是函數, y ′ = d y / d x y' = dy/dx y=dy/dx,求函數 y ? ( x ) y^*(x) y?(x)使得泛函取得最極值。
  • 變分:泛函的自變量(函數)的微小變化稱為變分,記作 δ y \delta y δy
  • 變分與微分/積分滿足可交換性: δ ( d y d x ) = d d x ( δ y ) , δ ∫ L d x = ∫ δ L d x \delta\left(\frac{dy}{dx}\right)=\frac{d}{dx}(\delta y),\delta\int Ldx = \int\delta Ldx δ(dxdy?)=dxd?(δy),δLdx=δLdx
  • 變分滿足鏈式法則, δ F = ? F ? x δ x + ? F ? y δ y + ? F ? y ˙ δ y ˙ \delta F = \frac{\partial F}{\partial x} \delta x + \frac{\partial F}{\partial y} \delta y + \frac{\partial F}{\partial \dot{y}} \delta \dot{y} δF=?x?F?δx+?y?F?δy+?y˙??F?δy˙?,其中根據變分與微分的交換律: δ y ˙ = d d x ( δ y ) \delta \dot{y} = \frac{d}{dx} (\delta y) δy˙?=dxd?(δy) ,自變量x的變分 δ x = 0 \delta x = 0 δx=0

歐拉-拉格朗日(E-L)方程

E-L 方程描述了極值曲線在函數空間中的 “駐點”,即沿任何變分方向的泛函變化率為零,類似于函數極值的一階導數為零。
E-L方程是泛函極值的必要條件,推導如下:

  • 鄰近曲線:設 y ( x ) = y ( x ) + ? δ y ( x ) y(x) = y(x) + \epsilon\delta y(x) y(x)=y(x)+?δy(x) δ \delta δ就是變分,需要任意可微,為了固定邊界確保端點不變還需要滿足 δ ( x 1 ) = δ ( x 2 ) = 0 \delta(x_1)=\delta(x_2)=0 δ(x1?)=δ(x2?)=0 ? → 0 \epsilon \to 0 ?0
  • 此時泛函可寫做: J ( y ) = ∫ x 1 x 2 F ( x , y + ? δ y , y ′ + ? δ y ′ ) d x J(y) = \int_{x_1}^{x_2} F(x, y + \epsilon \delta y, y' + \epsilon \delta y') \, dx J(y)=x1?x2??F(x,y+?δy,y+y)dx
  • 泛函導數:對 J [ ? ] J[\epsilon] J[?] 求導并令 ? = 0 \epsilon=0 ?=0,分部積分后得: ∫ δ ( ? F ? y ? d d x ( ? F ? y ′ ) ) d x = 0 \int \delta \left( \frac{\partial F}{\partial y} - \frac{d}{dx}\left(\frac{\partial F}{\partial y'}\right) \right) dx = 0 δ(?y?F??dxd?(?y?F?))dx=0
    • 推導:利用萊布尼茲法則,對 ? \epsilon ?求導保留線性部分: δ J ( ? ) = ∫ x 1 x 2 ( ? F ? ( y + ? δ y ) ? δ y + ? F ? ( y ′ + ? δ y ′ ) ? δ y ′ ) d x \delta J(\epsilon) = \int_{x_1}^{x_2} \left( \frac{\partial F}{\partial (y + \epsilon \delta y)} \cdot \delta y + \frac{\partial F}{\partial (y' + \epsilon \delta y')} \cdot \delta y' \right) dx δJ(?)=x1?x2??(?(y+?δy)?F??δy+?(y+y)?F??δy)dx
    • 根據變分定義,令 ? = 0 \epsilon = 0 ?=0,得到泛函在 y ( x ) y(x) y(x)處沿 η ( x ) \eta(x) η(x) 方向的變分導數: δ J = ∫ x 1 x 2 ( ? F ? y δ + ? F ? y ′ δ y ′ ) d x \delta J = \int_{x_1}^{x_2} \left( \frac{\partial F}{\partial y} \delta + \frac{\partial F}{\partial y'} \delta y' \right) dx δJ=x1?x2??(?y?F?δ+?y?F?δy)dx
    • 然后取出后半部分進行分部積分以消除 δ y ′ \delta y' δy ∫ x 1 x 2 ? F ? y ′ δ y ′ d x = [ ? F ? y ′ δ y ] x 1 x 2 ? ∫ x 1 x 2 d d x ( ? F ? y ′ ) δ y d x \int_{x_1}^{x_2} \frac{\partial F}{\partial y'} \delta y' \, dx = \left[ \frac{\partial F}{\partial y'} \delta y \right]_{x_1}^{x_2} - \int_{x_1}^{x_2} \frac{d}{dx}\left( \frac{\partial F}{\partial y'} \right) \delta y \, dx x1?x2???y?F?δydx=[?y?F?δy]x1?x2???x1?x2??dxd?(?y?F?)δydx
    • 由于 δ y ( x 1 ) = δ y ( x 2 ) = 0 \delta y(x_1) = \delta y(x_2) = 0 δy(x1?)=δy(x2?)=0,帶入后化簡可得: δ J = ∫ x 1 x 2 ( ? F ? y ? d d x ( ? F ? y ′ ) ) δ y d x = 0 \delta J = \int_{x_1}^{x_2} \left( \frac{\partial F}{\partial y} - \frac{d}{dx}\left( \frac{\partial F}{\partial y'} \right) \right) \delta y \, dx = 0 δJ=x1?x2??(?y?F??dxd?(?y?F?))δydx=0
  • 由于 δ \delta δ任意,根據變分引理則被積函數必恒為零。故 E ? L 方程 E-L方程 E?L方程 ? F ? y ? d d x ( ? F ? y ′ ) = 0 \frac{\partial F}{\partial y} - \frac{d}{dx}\left(\frac{\partial F}{\partial y'}\right) = 0 ?y?F??dxd?(?y?F?)=0
    • 變分引理:若連續函數 G ( x ) G(x) G(x)對于任意 η ∈ C 2 ( [ x 1 , x 2 ] ) \eta \in C^2([x_1,x_2]) ηC2([x1?,x2?])滿足 ∫ G η d x = 0 \int G\eta dx = 0 Gηdx=0,則 G ( x ) ≡ 0 G(x) \equiv 0 G(x)0

求解E-L方程就可以得到極值處的函數 y ? ( x ) y^*(x) y?(x),這個過程可以結合導數的概念來理解,,函數空間中一個點 y ( x ) y(x) y(x),臨近曲線 y ( x ) + ? δ y y(x) + \epsilon\delta y y(x)+?δy就是在這個點附近的點,且 ? → 0 \epsilon \to 0 ?0,泛函對 ? \epsilon ?求導得到的就是 y ( x ) y(x) y(x)這個點在 δ y ( x ) \delta y(x) δy(x)這個方向的導數,滿足朝向任何方向 δ y ( x ) \delta y(x) δy(x)上的導數都為0的點自然就是極值點。最優控制的龐特里亞金原理中的哈密頓函數,本質是變分法在動態系統的擴展(含協態變量的E-L方程推廣)。

  • 如果F含高階導數,則E-L方程也要擴展, ? F ? y ? d d x ( ? F ? y ′ ) + d 2 d x 2 ( ? F ? y ′ ′ ) ? ? = 0 \frac{\partial F}{\partial y}-\frac{d}{dx}\left(\frac{\partial F}{\partial y^{\prime}}\right)+\frac{d^2}{dx^2}\left(\frac{\partial F}{\partial y^{\prime\prime}}\right)-\cdots=0 ?y?F??dxd?(?y?F?)+dx2d2?(?y′′?F?)??=0
  • 如果存在約束,則需要使用拉格朗日乘子構造增廣泛函

拉格朗日函數(Lagrange Function)

拉格朗日函數(Lagrange Function)是數學優化理論中的核心工具,用于求解帶有約束條件的極值問題。它通過引入拉格朗日乘數(Lagrange Multiplier),將原問題轉化為無約束的極值問題,從而利用微積分中的求導方法求解。以下是詳細介紹:
假設我們需要優化(最大化或最小化)一個目標函數 f ( x ) f(\mathbf{x}) f(x),同時滿足若干等式約束 g i ( x ) = 0 ( i = 1 , 2 , … , m ) g_i(\mathbf{x}) = 0( i = 1, 2, \dots, m ) gi?(x)=0i=1,2,,m
拉格朗日函數的核心思想是:通過引入拉格朗日乘數 λ i \lambda_i λi?,將約束條件與目標函數“合并”為一個新的函數,使得原問題的極值可以通過求解新函數的無約束極值得到。
設目標函數為 f ( x ) f(\mathbf{x}) f(x),約束條件為 m m m 個等式約束 g i ( x ) = 0 , ( x ∈ R n ) g_i(\mathbf{x}) = 0 ,( \mathbf{x} \in \mathbb{R}^n) gi?(x)=0,(xRn),且 m < n m < n m<n
拉格朗日函數定義為:
L ( x , λ 1 , λ 2 , … , λ m ) = f ( x ) ? ∑ i = 1 m λ i g i ( x ) L(\mathbf{x}, \lambda_1, \lambda_2, \dots, \lambda_m) = f(\mathbf{x}) - \sum_{i=1}^m \lambda_i g_i(\mathbf{x}) L(x,λ1?,λ2?,,λm?)=f(x)?i=1m?λi?gi?(x)
其中:

  • x = ( x 1 , x 2 , … , x n ) \mathbf{x} = (x_1, x_2, \dots, x_n) x=(x1?,x2?,,xn?)是優化變量,
  • λ i \lambda_i λi?是拉格朗日乘數(可以是常數,也可以是函數,取決于優化變量,如果優化變量是一個函數,那拉格朗日乘數就也是個變量,此時的拉格朗日乘數被稱為協態,拉格朗日函數稱作動態拉格朗日函數,也叫哈密頓函數)。
  • 拉格朗日函數基于對偶原理—— 將原始問題的約束轉化為對偶變量(乘子 / 協態)的優化條件,從而在增廣空間中消除顯式約束。

求解原問題的極值等價于求解拉格朗日函數 L L L的無約束極值。根據微積分理論,極值點處的梯度(各偏導數)必須為零,即:

  • 對優化變量 x i x_i xi? 求偏導并令其為零:
    ? L ? x j = ? f ? x j ? ∑ i = 1 m λ i ? g i ? x j = 0 ( j = 1 , 2 , … , n ) \frac{\partial L}{\partial x_j} = \frac{\partial f}{\partial x_j} - \sum_{i=1}^m \lambda_i \frac{\partial g_i}{\partial x_j} = 0 \quad (j = 1, 2, \dots, n) ?xj??L?=?xj??f??i=1m?λi??xj??gi??=0(j=1,2,,n)
  • 對拉格朗日乘數 λ i \lambda_i λi? 求偏導并令其為零(自動滿足約束條件):
    ? L ? λ i = ? g i ( x ) = 0 ( i = 1 , 2 , … , m ) \frac{\partial L}{\partial \lambda_i} = -g_i(\mathbf{x}) = 0 \quad (i = 1, 2, \dots, m) ?λi??L?=?gi?(x)=0(i=1,2,,m)

這組方程(共 m + n m+n m+n個)稱為KKT條件(對等式約束情形,KKT條件退化為拉格朗日乘數法的條件),其解 ( x ? , λ ? ) (\mathbf{x}^*, \lambda^*) (x?,λ?)即為原問題的候選極值點。
若約束條件包含不等式約束 h i ( x ) ≤ 0 h_i(\mathbf{x}) \leq 0 hi?(x)0,則需要使用擴展的拉格朗日函數和KKT條件,此時拉格朗日函數為:
L ( x , λ , μ ) = f ( x ) ? ∑ i = 1 m λ i g i ( x ) ? ∑ j = 1 k μ j h j ( x ) L(\mathbf{x}, \lambda, \mu) = f(\mathbf{x}) - \sum_{i=1}^m \lambda_i g_i(\mathbf{x}) - \sum_{j=1}^k \mu_j h_j(\mathbf{x}) L(x,λ,μ)=f(x)?i=1m?λi?gi?(x)?j=1k?μj?hj?(x)
其中 μ j ≥ 0 \mu_j \geq 0 μj?0 是對應不等式約束的拉格朗日乘數,且需滿足互補松弛條件:
μ j h j ( x ) = 0 \mu_j h_j(\mathbf{x}) = 0 \quad μj?hj?(x)=0(即約束 active 時 h j = 0 h_j = 0 hj?=0,否則 μ j = 0 \mu_j = 0 μj?=0)

Pontryagin 極小值原理(龐特里亞金極小值原理)

龐特里亞金極小值原理(Pontryagin’s Minimum Principle)是最優控制理論中的核心定理之一,由蘇聯數學家列夫·龐特里亞金(Lev Pontryagin)及其團隊在20世紀50年代提出。用于求解帶有約束的動態系統最優控制問題,尤其適用于控制變量存在不等式約束(如幅值限制)的場景,是變分法的擴展和推廣,也被稱為現代變分法。它通過構造哈密頓函數,將最優控制問題轉化為一組微分方程(正則方程)的求解,并給出控制變量的最優條件。

核心推導

問題描述
代價泛函: J a = ∫ t 0 t f L ( x , u , t ) d t + Φ ( x ( t f ) ) J_a = \int_{t_0}^{t_f} L(x, u, t) dt + \Phi(x(t_f)) Ja?=t0?tf??L(x,u,t)dt+Φ(x(tf?))
系統約束: x ˙ = f ( x , u , t ) \mathbf{\dot{x}} = \mathbf{f}(\mathbf{x}, \mathbf{u}, t) x˙=f(x,u,t)
首末約束: x ( t 0 ) = x 0 \mathbf{x}(t_0) = \mathbf{x_0} x(t0?)=x0?

  1. 構造哈密頓函數(Hamiltonian)
    引入協態變量(伴隨變量) λ ( t ) ∈ R n \boldsymbol{\lambda}(t) \in \mathbb{R}^n λ(t)Rn(與狀態變量維數相同),定義哈密頓函數: H ( x , u , λ , t ) = L ( x , u , t ) + λ T f ( x , u , t ) H(\mathbf{x}, \mathbf{u}, \boldsymbol{\lambda}, t) = L(\mathbf{x}, \mathbf{u}, t) + \boldsymbol{\lambda}^T \mathbf{f}(\mathbf{x}, \mathbf{u}, t) H(x,u,λ,t)=L(x,u,t)+λTf(x,u,t)
    • 協態變量 λ ( t ) \boldsymbol{\lambda}(t) λ(t) 的物理意義可理解為狀態變量的“影子價格”或“邊際代價”。
    • 如果有狀態約束,還需要再加一項,變成: H ( x , u , λ , t ) = L ( x , u , t ) + λ T f ( x , u , t ) + η T ( x ? x m ) H(\mathbf{x}, \mathbf{u}, \boldsymbol{\lambda}, t) = L(\mathbf{x}, \mathbf{u}, t) + \boldsymbol{\lambda}^T \mathbf{f}(\mathbf{x}, \mathbf{u}, t)+\boldsymbol{\eta}^T(\mathbf{x}-\mathbf{x_m}) H(x,u,λ,t)=L(x,u,t)+λTf(x,u,t)+ηT(x?xm?)
  2. 正則方程(協態方程與狀態方程)
    根據極小值原理,最優解需滿足以下正則方程:
  • 狀態方程(與原系統一致): ? H ? λ = f ( x , u , t ) = x ˙ ( t ) \frac{\partial H}{\partial \boldsymbol{\lambda}} = \mathbf{f}(\mathbf{x}, \mathbf{u}, t) = \dot{\mathbf{x}}(t) ?λ?H?=f(x,u,t)=x˙(t)
    • λ \lambda λ求變分分析推導出來
  • 協態方程(伴隨方程): ? ? H ? x = ? [ ? L ? x + ( ? f ? x ) T λ ] = λ ˙ ( t ) -\frac{\partial H}{\partial \mathbf{x}} = -\left[ \frac{\partial L}{\partial \mathbf{x}} + \left(\frac{\partial \mathbf{f}}{\partial \mathbf{x}}\right)^T \boldsymbol{\lambda} \right] = \dot{\boldsymbol{\lambda}}(t) ??x?H?=?[?x?L?+(?x?f?)Tλ]=λ˙(t)
    • 根據變分和積分的交換律,代價函數的變分 δ J = ∫ t 0 t f δ L ( x , u , t ) d t = ∫ t 0 t f ( ? L ? x δ x + ? L ? u δ u ) d t \delta J = \int_{t_0}^{t_f} \delta L(x, u, t) dt = \int_{t_0}^{t_f} \left( \frac{\partial L}{\partial x} \delta x + \frac{\partial L}{\partial u} \delta u \right) dt δJ=t0?tf??δL(x,u,t)dt=t0?tf??(?x?L?δx+?u?L?δu)dt
    • 構造增廣代價泛函: J a = ∫ t 0 t f [ L ( x , u , t ) + λ T ( t ) f ( x , u , t ) ] d t + Φ ( x ( t f ) ) J_a = \int_{t_0}^{t_f} \left[ L(\mathbf{x}, \mathbf{u}, t) + \lambda^T(t) \mathbf{f}(\mathbf{x}, \mathbf{u}, t) \right] dt + \Phi(\mathbf{x}(t_f)) Ja?=t0?tf??[L(x,u,t)+λT(t)f(x,u,t)]dt+Φ(x(tf?))
    • 將其中的 λ T x ˙ \lambda^T \dot{x} λTx˙部分進行分部積分得: J a = ∫ t 0 t f [ L + λ T f + λ ˙ T x ] d t ? λ T ( t f ) x ( t f ) + λ T ( t 0 ) x ( t 0 ) + Φ ( x ( t f ) ) J_a = \int_{t_0}^{t_f} \left[ L + \boldsymbol{\lambda}^T f + \dot{\boldsymbol{\lambda}}^T x \right] dt - \boldsymbol{\lambda}^T(t_f) x(t_f) + \boldsymbol{\lambda}^T(t_0) x(t_0)+ \Phi(x(t_f)) Ja?=t0?tf??[L+λTf+λ˙Tx]dt?λT(tf?)x(tf?)+λT(t0?)x(t0?)+Φ(x(tf?))
    • 帶入哈密頓函數得: J a = ∫ t 0 t f [ H + λ ˙ T x ] d t ? λ T ( t f ) x ( t f ) + λ T ( t 0 ) x ( t 0 ) + Φ ( x ( t f ) ) J_a = \int_{t_0}^{t_f} \left[ H + \dot{\boldsymbol{\lambda}}^T x \right] dt - \boldsymbol{\lambda}^T(t_f) x(t_f) + \boldsymbol{\lambda}^T(t_0) x(t_0)+ \Phi(x(t_f)) Ja?=t0?tf??[H+λ˙Tx]dt?λT(tf?)x(tf?)+λT(t0?)x(t0?)+Φ(x(tf?))
    • 對增廣泛函進行變分: δ J a = ∫ t 0 t f [ ? H ? x δ x + ? H ? u δ u + λ ˙ T δ x ] d t + [ ? λ T ( t f ) δ x ( t f ) + ? Φ ? x ( t f ) δ x ( t f ) ] = 0 \delta J_a = \int_{t_0}^{t_f} \left[ \frac{\partial H}{\partial x} \delta x + \frac{\partial H}{\partial u} \delta u + \dot{\lambda}^T \delta x \right] dt + \left[ -\lambda^T(t_f) \delta x(t_f) + \frac{\partial \Phi}{\partial x(t_f)} \delta x(t_f) \right] = 0 δJa?=t0?tf??[?x?H?δx+?u?H?δu+λ˙Tδx]dt+[?λT(tf?)δx(tf?)+?x(tf?)?Φ?δx(tf?)]=0
    • 分離變分項
      • 狀態變分 δ x \delta x δx ∫ t 0 t f ( ? H ? x + λ ˙ T ) δ x d t + [ ( ? λ T ( t f ) + ? Φ ? x ( t f ) ) δ x ( t f ) ] = 0 \int_{t_0}^{t_f} \left( \frac{\partial H}{\partial x} + \dot{\lambda}^T \right) \delta x \, dt + \left[ \left( -\lambda^T(t_f) + \frac{\partial \Phi}{\partial x(t_f)} \right) \delta x(t_f) \right] = 0 t0?tf??(?x?H?+λ˙T)δxdt+[(?λT(tf?)+?x(tf?)?Φ?)δx(tf?)]=0
      • 控制變分 δ u \delta u δu ∫ t 0 t f ? H ? u δ u d t = 0 \int_{t_0}^{t_f} \frac{\partial H}{\partial u} \delta u \, dt = 0 t0?tf???u?H?δudt=0
    • 對任意 δ x \delta x δx ,變分 δ J a = 0 \delta J_a = 0 δJa?=0 需滿足以下條件:
      • 積分項為0: ? H ? x + λ ˙ T = 0 ? λ ˙ = ? ( ? H ? x ) T \frac{\partial H}{\partial x} + \dot{\lambda}^T = 0 \quad \Rightarrow \quad \dot{\lambda} = -\left( \frac{\partial H}{\partial x} \right)^T ?x?H?+λ˙T=0?λ˙=?(?x?H?)T這就是協態方程
      • 剩余項為0: ? λ ( t f ) + ? Φ ? x ( t f ) = 0 ? λ ( t f ) = ? Φ ? x ( t f ) -\lambda(t_f) + \frac{\partial \Phi}{\partial x(t_f)} = 0 \quad \Rightarrow \quad \lambda(t_f) = \frac{\partial \Phi}{\partial x(t_f)} ?λ(tf?)+?x(tf?)?Φ?=0?λ(tf?)=?x(tf?)?Φ?
    • 對任意 δ u \delta u δu,變分 δ J a = 0 \delta J_a = 0 δJa?=0 需滿足以下條件:
      • ? H ? u = 0 (無約束時) 或 u ? = arg ? min ? u ∈ U H (有約束時) \frac{\partial H}{\partial u} = 0 \quad \text{(無約束時)} \quad \text{或} \quad u^* = \arg \min_{u \in U} H \quad \text{(有約束時)} ?u?H?=0(無約束時)u?=arguUmin?H(有約束時)即:無約束時直接求導為0,有約束時必須是最優控制曲線, u ? u^* u?為函數空間中的 “駐點”,即沿任何變分方向的泛函變化率為零。
  1. 終端條件
    根據終端狀態是否固定,終端條件分為:
    • 終端狀態固定( x ( t f ) = x f \mathbf{x}(t_f) = \mathbf{x}_f x(tf?)=xf? 已知): λ ( t f ) = ? ? ? x ( t f ) \boldsymbol{\lambda}(t_f) = \frac{\partial \phi}{\partial \mathbf{x}(t_f)} λ(tf?)=?x(tf?)???
      • 推導見上方協態方程部分
    • 終端狀態自由:
      λ ( t f ) = ? ? ? x ( t f ) , H ( t f ) = ? ? ? ? t f ( 若? t f 自由 ) \boldsymbol{\lambda}(t_f) = \frac{\partial \phi}{\partial \mathbf{x}(t_f)}, \quad H(t_f) = -\frac{\partial \phi}{\partial t_f} \quad (\text{若 } t_f \text{ 自由}) λ(tf?)=?x(tf?)???,H(tf?)=??tf????(?tf??自由)
  2. 極小值條件(核心條件)
    對于所有 t ∈ [ t 0 , t f ] t \in [t_0, t_f] t[t0?,tf?] u ( t ) ∈ U \mathbf{u}(t) \in \mathbb{U} u(t)U,最優控制 u ? ( t ) \mathbf{u}^*(t) u?(t) 需滿足: H ( x ? ( t ) , u ? ( t ) , λ ? ( t ) , t ) = min ? u ∈ U H ( x ? ( t ) , u , λ ? ( t ) , t ) H(\mathbf{x}^*(t), \mathbf{u}^*(t), \boldsymbol{\lambda}^*(t), t) = \min_{\mathbf{u} \in \mathbb{U}} H(\mathbf{x}^*(t), \mathbf{u}, \boldsymbol{\lambda}^*(t), t) H(x?(t),u?(t),λ?(t),t)=uUmin?H(x?(t),u,λ?(t),t)
    即哈密頓函數在最優控制處取得極小值(若目標為最大化 J J J,則取極大值)。這一條件體現了控制約束 u ∈ U \mathbf{u} \in \mathbb{U} uU 的作用,當控制無約束時,可通過求導 ? H ? u = 0 \frac{\partial H}{\partial \mathbf{u}} = \mathbf{0} ?u?H?=0 直接求解。

步驟總結

  1. 構造哈密頓函數 H H H,包含狀態、控制、伴隨變量和時間。
  2. 建立正則方程:
  • 解狀態方程 x ˙ = ? H ? λ \dot{\mathbf{x}} = \frac{\partial H}{\partial \boldsymbol{\lambda}} x˙=?λ?H?
  • 解協態方程 λ ˙ = ? ? H ? x \dot{\boldsymbol{\lambda}} = -\frac{\partial H}{\partial \mathbf{x}} λ˙=??x?H?
  1. 確定終端條件:根據終端狀態和時間是否固定,設定 λ ( t f ) \boldsymbol{\lambda}(t_f) λ(tf?) t f t_f tf? 的條件。
  2. 求解極小值條件:利用 H H H u \mathbf{u} u 的極小化(或極大化),結合控制約束 U \mathbb{U} U,求出 u ? ( t ) \mathbf{u}^*(t) u?(t)
  3. 聯立方程求解:將 u ? ( t ) \mathbf{u}^*(t) u?(t) 代入正則方程,解兩點邊值問題(BVP)得到 x ? ( t ) \mathbf{x}^*(t) x?(t) λ ? ( t ) \boldsymbol{\lambda}^*(t) λ?(t)

簡單示例:最速降線問題

以下將通過一個典型的雙積分器系統最短時間控制問題,詳細講解如何運用龐特里亞金極小值原理求解最優控制問題。我們將從問題建模、哈密頓函數構造、協態方程推導、控制律求解到最優軌跡分析逐步展開,并使用$$環境呈現公式。

問題設定:雙積分器系統的最短時間控制
考慮如下二階線性系統(雙積分器): { x ˙ 1 = x 2 , x ˙ 2 = u , \begin{cases} \dot{x}_1 = x_2, \\ \dot{x}_2 = u, \end{cases} {x˙1?=x2?,x˙2?=u,?
其中:

  • x 1 ( t ) , x 2 ( t ) x_1(t), x_2(t) x1?(t),x2?(t) 為狀態變量(位置和速度),
  • u ( t ) u(t) u(t) 為控制輸入,滿足幅值約束 ∣ u ( t ) ∣ ≤ 1 |u(t)| \leq 1 u(t)1
  • 目標:從初始狀態 ( x 10 , x 20 ) (x_{10}, x_{20}) (x10?,x20?) 轉移到終端狀態 ( 0 , 0 ) (0, 0) (0,0),且時間最短

系統狀態方程建模為:
[ x 1 ˙ x 2 ˙ ] = [ 0 1 0 0 ] [ x 1 x 2 ] + [ 0 1 ] u \begin{bmatrix} \dot{x_1}\\\dot{x_2} \end{bmatrix}=\begin{bmatrix}0 & 1\\0 & 0\end{bmatrix}\begin{bmatrix}x_1 \\x_2\end{bmatrix}+\begin{bmatrix}0 \\1\end{bmatrix}u [x1?˙?x2?˙??]=[00?10?][x1?x2??]+[01?]u

性能指標為:
J = min ? u ∫ 0 T 1 d t = T (最小化時間) . J = \min_u \int_0^T 1 \, dt = T \quad \text{(最小化時間)}. J=umin?0T?1dt=T(最小化時間).

第一步:構造哈密頓函數
根據龐特里亞金極小值原理,定義哈密頓函數 H H H 為:
H = L + λ T x ˙ = λ 1 x ˙ 1 + λ 2 x ˙ 2 + L \begin{aligned} H &= L + \boldsymbol{\lambda}^T\dot{x} \\ &= \lambda_1 \dot{x}_1 + \lambda_2 \dot{x}_2 + L \end{aligned} H?=L+λTx˙=λ1?x˙1?+λ2?x˙2?+L?
其中:

  • λ 1 ( t ) , λ 2 ( t ) \lambda_1(t), \lambda_2(t) λ1?(t),λ2?(t) 為協態變量(伴隨變量),
  • L L L 為性能指標的被積函數(此處 L = 1 L = 1 L=1)。

代入狀態方程 x ˙ 1 = x 2 \dot{x}_1 = x_2 x˙1?=x2? x ˙ 2 = u \dot{x}_2 = u x˙2?=u,得:
H = λ 1 x 2 + λ 2 u + 1. H = \lambda_1 x_2 + \lambda_2 u + 1. H=λ1?x2?+λ2?u+1.
第二步:推導協態方程
根據PMP,協態變量的導數滿足:
λ ˙ i = ? ? H ? x i ( i = 1 , 2 ) . \dot{\lambda}_i = -\frac{\partial H}{\partial x_i} \quad (i=1,2). λ˙i?=??xi??H?(i=1,2).
計算偏導數:

  • x 1 x_1 x1? ? H ? x 1 = 0 \frac{\partial H}{\partial x_1} = 0 ?x1??H?=0,故 λ ˙ 1 = 0 \dot{\lambda}_1 = 0 λ˙1?=0,即 λ 1 \lambda_1 λ1? 為常數,記為 λ 1 = c 1 \lambda_1 = c_1 λ1?=c1?
  • x 2 x_2 x2? ? H ? x 2 = λ 1 \frac{\partial H}{\partial x_2} = \lambda_1 ?x2??H?=λ1?,故 λ ˙ 2 = ? λ 1 = ? c 1 \dot{\lambda}_2 = -\lambda_1 = -c_1 λ˙2?=?λ1?=?c1?

因此,協態變量 λ 2 ( t ) \lambda_2(t) λ2?(t) 是關于時間的線性函數:
λ 2 ( t ) = ? c 1 t + c 2 , \lambda_2(t) = -c_1 t + c_2, λ2?(t)=?c1?t+c2?,
其中 c 1 , c 2 c_1, c_2 c1?,c2? 為常數,由邊界條件確定。
第三步:利用極小值條件求解控制律
PMP要求控制輸入 u ( t ) u(t) u(t) 在每時刻 t t t 最大化哈密頓函數 H H H,即:
u ? ( t ) = arg ? min ? ∣ u ∣ ≤ 1 H = arg ? min ? ∣ u ∣ ≤ 1 ( λ 2 u + 其他 ) . u^*(t) = \arg\min_{|u| \leq 1} H = \arg\min_{|u| \leq 1} \left( \lambda_2 u + \text{其他} \right). u?(t)=argu1min?H=argu1min?(λ2?u+其他).
由于 λ 2 \lambda_2 λ2? 是線性函數,最大化 H H H 等價于取 u u u λ 2 \lambda_2 λ2? 同號。因此:
u ? ( t ) = sign ( λ 2 ( t ) ) = { + 1 , λ 2 ( t ) < 0 , ? 1 , λ 2 ( t ) > 0. u^*(t) = \text{sign}(\lambda_2(t)) = \begin{cases} +1, & \lambda_2(t) < 0, \\ -1, & \lambda_2(t) > 0. \end{cases} u?(t)=sign(λ2?(t))={+1,?1,?λ2?(t)<0,λ2?(t)>0.?
λ 2 ( t ) = 0 \lambda_2(t) = 0 λ2?(t)=0 時,可能存在切換點,此時控制輸入發生翻轉。

第四步:分析協態變量與切換特性
由于 λ 2 ( t ) = ? c 1 t + c 2 \lambda_2(t) = -c_1 t + c_2 λ2?(t)=?c1?t+c2? 是線性函數,其符號最多改變一次,因此最優控制 u ? ( t ) u^*(t) u?(t) 最多切換一次,屬于Bang-Bang控制。分兩種情況討論:

  1. 無切換(直接Bang):若 λ 2 ( t ) \lambda_2(t) λ2?(t) 始終非負或非正,則 u ? ( t ) u^*(t) u?(t) 保持 + 1 +1 +1 ? 1 -1 ?1 不變;
  2. 一次切換(Bang-Bang):若 λ 2 ( t ) \lambda_2(t) λ2?(t) 由正變負或由負變正,則存在唯一切換時刻 τ \tau τ,使得:
    u ? ( t ) = { + 1 , t < τ , ? 1 , t ≥ τ 或 { ? 1 , t < τ , + 1 , t ≥ τ . u^*(t) = \begin{cases} +1, & t < \tau, \\ -1, & t \geq \tau \end{cases} \quad \text{或} \quad \begin{cases} -1, & t < \tau, \\ +1, & t \geq \tau. \end{cases} u?(t)={+1,?1,?t<τ,tτ?{?1,+1,?t<τ,tτ.?

第五步:利用終端條件求解常數
終端狀態固定為 ( 0 , 0 ) (0, 0) (0,0),終端時間 T T T 自由。根據PMP,終端時刻的橫截條件為: H ( T ) = 0. H(T) = 0. H(T)=0.代入 H H H 的表達式:
H ( T ) = λ 1 x 2 ( T ) + λ 2 ( T ) u ( T ) + 1 = 0. H(T) = \lambda_1 x_2(T) + \lambda_2(T) u(T) + 1 = 0. H(T)=λ1?x2?(T)+λ2?(T)u(T)+1=0.
由于 x 2 ( T ) = 0 x_2(T) = 0 x2?(T)=0(終端速度為0),化簡得:
λ 2 ( T ) u ( T ) + 1 = 0. \lambda_2(T) u(T) + 1 = 0. λ2?(T)u(T)+1=0.
又因 u ( T ) = sign ( λ 2 ( T ) ) u(T) = \text{sign}(\lambda_2(T)) u(T)=sign(λ2?(T)),故:
∣ λ 2 ( T ) ∣ = 1 ? λ 2 ( T ) = ± 1. |\lambda_2(T)| = 1 \quad \Rightarrow \quad \lambda_2(T) = \pm 1. λ2?(T)=1?λ2?(T)=±1.
結合 λ 2 ( t ) = ? c 1 t + c 2 \lambda_2(t) = -c_1 t + c_2 λ2?(t)=?c1?t+c2?,可得:
λ 2 ( T ) = ? c 1 T + c 2 = ± 1. \lambda_2(T) = -c_1 T + c_2 = \pm 1. λ2?(T)=?c1?T+c2?=±1.

第六步:求解狀態軌跡與最優控制
先正后負切換(+1→-1為例,假設切換時刻為 τ \tau τ,則:

  • t ∈ [ 0 , τ ] t \in [0, \tau] t[0,τ] 時, u = + 1 u = +1 u=+1,狀態方程積分得:
    { x 1 ( t ) = x 10 + x 20 t + 1 2 t 2 , x 2 ( t ) = x 20 + t . \begin{cases} x_1(t) = x_{10} + x_{20} t + \frac{1}{2} t^2, \\ x_2(t) = x_{20} + t. \end{cases} {x1?(t)=x10?+x20?t+21?t2,x2?(t)=x20?+t.?
  • t ∈ [ τ , T ] t \in [\tau, T] t[τ,T] 時, u = ? 1 u = -1 u=?1,狀態方程積分得:
    { x 1 ( t ) = x 1 ( τ ) + x 2 ( τ ) ( t ? τ ) ? 1 2 ( t ? τ ) 2 , x 2 ( t ) = x 2 ( τ ) ? ( t ? τ ) . \begin{cases} x_1(t) = x_1(\tau) + x_2(\tau)(t-\tau) - \frac{1}{2}(t-\tau)^2, \\ x_2(t) = x_2(\tau) - (t-\tau). \end{cases} {x1?(t)=x1?(τ)+x2?(τ)(t?τ)?21?(t?τ)2,x2?(t)=x2?(τ)?(t?τ).?
    終端條件 x 1 ( T ) = 0 , x 2 ( T ) = 0 x_1(T) = 0, x_2(T) = 0 x1?(T)=0,x2?(T)=0 給出方程組,可解出 τ \tau τ T T T

第七步:相平面分析與開關曲線
最優軌跡在相平面 ( x 1 , x 2 ) (x_1, x_2) (x1?,x2?) 上的形狀由開關曲線決定。開關曲線 Γ \Gamma Γ 分為上下兩支:
Γ = Γ + ∪ Γ ? , \Gamma = \Gamma^+ \cup \Gamma^-, Γ=Γ+Γ?,
其中:

  • Γ + \Gamma^+ Γ+(對應 u = ? 1 u=-1 u=?1 直接到達原點): x 1 = ? 1 2 x 2 2 x_1 = -\frac{1}{2} x_2^2 x1?=?21?x22?(當 x 2 ≤ 0 x_2 \leq 0 x2?0),
  • Γ ? \Gamma^- Γ?(對應 u = + 1 u=+1 u=+1 直接到達原點): x 1 = 1 2 x 2 2 x_1 = \frac{1}{2} x_2^2 x1?=21?x22?(當 x 2 ≥ 0 x_2 \geq 0 x2?0)。

若初始狀態在 Γ \Gamma Γ 上方,則最優控制為先 + 1 +1 +1 ? 1 -1 ?1;若在下方,則為先 ? 1 -1 ?1 + 1 +1 +1;若在 Γ \Gamma Γ 上,則無需切換。
在這里插入圖片描述
具體實現代碼:

import numpy as np
import matplotlib.pyplot as pltplt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = Falsedef solve_min_time_control(x10, x20):"""求解雙積分器系統的最短時間控制參數(切換時間τ和總時間T)參數:x10: 初始位置x20: 初始速度返回:τ: 切換時間T: 總時間u_seq: 控制序列(分段函數)"""# 開關曲線判斷:x1 = 0.5*x22(上支)或x1 = -0.5*x22(下支)# 初始狀態在開關曲線上方時(x10 > 0.5*x202),切換策略為 -1 → +1(先制動后加速)if (x20 > 0 and x10 > -0.5 * x20**2) or (x20 < 0 and x10 > 0.5 * x20**2):# 推導方程:τ2 - 2x20τ + (0.5x202 - x10) = 0(詳細推導見說明)a = 1b = -2 * x20c = 0.5 * x20**2 - x10discriminant = b**2 - 4*a*cif discriminant < 0:raise ValueError("無實數解,初始狀態無法到達原點")τ = ( -b + np.sqrt(discriminant) ) / (2*a)  # 取較大的根(保證物理意義)T = 2*τ - x20  # 由x2(T)=0推導得到# 定義分段控制律:前τ時間用-1,之后用+1def u(t):if t < τ:return -1.0else:return 1.0return τ, T, u# 初始狀態在開關曲線下方時(x10 < -0.5*x202),切換策略為 +1 → -1(先加速后制動)elif (x20 > 0 and x10 < -0.5 * x20**2) or (x20 < 0 and x10 < 0.5 * x20**2):# 推導方程:τ2 + 2x20τ + (x10 + 0.5x202) = 0a = 1b = 2 * x20c = x10 + 0.5 * x20**2discriminant = b**2 - 4*a*cif discriminant < 0:raise ValueError("無實數解,初始狀態無法到達原點")τ = (-b - np.sqrt(discriminant)) / (2*a)  # 取較小的根T = 2*τ + x20  # 由x2(T)=0推導得到def u(t):if t < τ:return 1.0else:return -1.0return τ, T, u# 初始狀態在開關曲線上(無需切換)else:if x20 >= 0:# 上開關曲線(x1=0.5x22)且速度非負時,直接用-1制動T = x20 + np.sqrt(x20**2 - 2*x10)  # 推導自x2(T)=0和x1(T)=0def u(t):return -1.0else:# 下開關曲線(x1=-0.5x22)且速度負時,直接用+1加速T = -x20 + np.sqrt(x20**2 + 2*x10)def u(t):return 1.0return 0, T, udef simulate_trajectory(x10, x20, τ, T, u):"""模擬狀態軌跡(分切換前后兩段積分)"""t1 = np.linspace(0, τ, 100)t2 = np.linspace(τ, T, 100)t_total = np.concatenate([t1, t2])# 切換前控制(u=-1或+1)if u(0) == -1:  # 上開關曲線場景:先-1制動x1_1 = x10 + x20*t1 - 0.5*t1**2x2_1 = x20 - t1else:  # 下開關曲線場景:先+1加速x1_1 = x10 + x20*t1 + 0.5*t1**2x2_1 = x20 + t1# 切換后控制(u=+1或-1)x1_τ = x1_1[-1]  # 切換時刻的x1x2_τ = x2_1[-1]  # 切換時刻的x2dt = t2 - τif u(τ+1e-3) == 1:  # 切換后為+1x1_2 = x1_τ + x2_τ*dt + 0.5*dt**2x2_2 = x2_τ + dtelse:  # 切換后為-1x1_2 = x1_τ + x2_τ*dt - 0.5*dt**2x2_2 = x2_τ - dtx1_total = np.concatenate([x1_1, x1_2])x2_total = np.concatenate([x2_1, x2_2])return t_total, x1_total, x2_totaldef visualize_results(x10, x20, τ, T, t_total, x1_total, x2_total, u):"""可視化相平面軌跡和時間響應"""plt.figure(figsize=(12, 6))# 相平面軌跡(x1 vs x2)plt.subplot(1, 2, 1)plt.plot(x2_total, x1_total, 'b-', label='最優軌跡')plt.scatter(x20, x10, c='r', marker='o', label='初始狀態')plt.scatter(0, 0, c='g', marker='s', label='終點(原點)')x2_upper = np.linspace(-5, 0, 100)x2_lower = np.linspace(0, 5, 100)x1_switch_upper = 0.5 * x2_upper**2x1_switch_lower = -0.5 * x2_lower**2plt.plot(x2_upper, x1_switch_upper, 'b--', label='上切換曲線u=1')plt.plot(x2_lower, x1_switch_lower, 'r--', label='下切換曲線u=-1')plt.xlabel('速度 $x_2$')plt.ylabel('位置 $x_1$')plt.title('相平面軌跡')plt.legend()plt.grid(True)# 時間響應(x1(t), x2(t), u(t))plt.subplot(1, 2, 2)plt.plot(t_total, x1_total, 'r-', label='$x_1(t)$')plt.plot(t_total, x2_total, 'g-', label='$x_2(t)$')u_values = [u(t) for t in t_total]plt.step(t_total, u_values, 'b--', label='$u(t)$', where='post')plt.xlabel('時間 $t$')plt.ylabel('狀態/控制')plt.title('時間響應曲線')plt.legend()plt.grid(True)plt.tight_layout()plt.show()# 主程序運行(示例初始狀態)
if __name__ == "__main__":x10, x20 = 2.0, 4.0  # 初始狀態(位置=2,速度=1)τ, T, u = solve_min_time_control(x10, x20)t_total, x1_total, x2_total = simulate_trajectory(x10, x20, τ, T, u)print(f"切換時間 τ = {τ:.2f}s,總時間 T = {T:.2f}s")visualize_results(x10, x20, τ, T, t_total, x1_total, x2_total, u)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/81739.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/81739.shtml
英文地址,請注明出處:http://en.pswp.cn/web/81739.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

DeepSeek 提示詞大全

目錄 前言一、提示詞基礎理論 什么是提示詞提示詞的類型提示詞的基本結構 二、提示詞設計原則 明確指令結構化表達情境化需求漸進式引導邊界與限制 三、場景化提示詞模板 寫作創作類角色扮演類信息提取類代碼編程類教育學習類商業營銷類生活助手類 四、提示詞優化技巧 迭代式優…

安科瑞Acrelcloud-6200系統:智慧路燈安全用電監控平臺架構解析

安科瑞顧強———Acrelgq 智慧路燈作為智慧城市與新基建的核心載體&#xff0c;集成了大量異元異構電子設備&#xff0c;其供電安全與能效管理面臨電壓多樣、權屬分散、擴展性不足等挑戰。本文提出一種融合統一供電、分路計量、智能防護與遠程監控的解決方案&#xff0c;通過構…

DMBOK對比知識點對比(1)

1.CDGP各章活動 章節一級

css設置動態數值:clamp函數

CSS 的 clamp() 函數是一個強大的工具&#xff0c;用于創建響應式且范圍可控的動態值。它結合了min() 和max() 的邏輯&#xff0c;允許你定義一個值在最小值和最大值之間動態調整。 語法為&#xff1a; clamp(最小值, 首選值, 最大值)&#xff1b; 工作原理&#xff1a; 當 …

數值計算與數據相關參數剖析:保障模型訓練穩定與準確

一、計算類型&#xff1a;以BF16為例 1.1 核心作用 BF16 是一種計算方式&#xff0c;它能讓模型訓練更快&#xff0c;還省內存。比如訓練模型時&#xff0c;用普通方式可能很慢&#xff0c;占內存也多&#xff0c;而 BF16 就像給模型開了 “加速鍵”&#xff0c;訓練起來更高…

數據庫讀寫分離解決方案

數據庫讀寫分離解決方案 一、讀寫分離核心概念 讀寫分離(Read/Write Splitting)是通過將數據庫的讀操作和寫操作分離到不同的數據庫節點來提升系統整體性能的架構模式。 核心原則:寫操作集中在主庫(Master),讀操作分散到從庫(Slave),通過數據復制保持主從一致性 二、技術實…

小白的進階之路系列之七----人工智能從初步到精通pytorch自動微分優化以及載入和保存模型

本文將介紹Pytorch的以下內容 自動微分函數 優化 模型保存和載入 好了,我們首先介紹一下關于微分的內容。 在訓練神經網絡時,最常用的算法是反向傳播算法。在該算法中,根據損失函數相對于給定參數的梯度來調整參數(模型權重)。 為了計算這些梯度,PyTorch有一個內置…

【圖像處理基石】立體匹配的經典算法有哪些?

1. 立體匹配的經典算法有哪些&#xff1f; 立體匹配是計算機視覺中從雙目圖像中獲取深度信息的關鍵技術&#xff0c;其經典算法按技術路線可分為以下幾類&#xff0c;每類包含若干代表性方法&#xff1a; 1.1 基于區域的匹配算法&#xff08;Local Methods&#xff09; 通過…

《Map 到底適合用哪個?HashMap、TreeMap、LinkedHashMap 對比實戰》

大家好呀&#xff01;今天我們來聊聊Java中超級重要的Map集合家族 &#x1f3a2;。Map就像是一個神奇的魔法口袋&#xff0c;可以幫我們把東西&#xff08;值&#xff09;和標簽&#xff08;鍵&#xff09;一一對應存放起來。不管你是Java新手還是老司機&#xff0c;掌握Map都是…

TencentOSTiny

開放原子開源基金會 騰訊物聯網終端操作系統 _物聯網操作系統_物聯網OS_TencentOS tiny-騰訊云 GitHub - OpenAtomFoundation/TobudOS: 開放原子開源基金會孵化的物聯網操作系統&#xff0c;捐贈前為騰訊物聯網終端操作系統TencentOS Tiny 項目簡介 TencentOS Tiny 是騰訊…

使用 Selenium 進行自動化測試:入門指南

在現代軟件開發中&#xff0c;自動化測試已經成為不可或缺的一部分。它不僅提高了測試效率&#xff0c;還減少了人為錯誤的可能性。Selenium 是一個強大的開源工具&#xff0c;廣泛用于 Web 應用程序的自動化測試。本文將詳細介紹如何使用 Selenium 進行自動化測試&#xff0c;…

C54-動態開辟內存空間

1.malloc 原型&#xff1a;void* malloc(size_t size);&#xff08;位于 <stdlib.h> 頭文件中&#xff09; 作用&#xff1a;分配一塊連續的、未初始化的內存塊&#xff0c;大小為 size 字節。 返回值&#xff1a; 成功&#xff1a;返回指向分配內存首地址的 void* 指針…

ELK服務搭建-0-1搭建記錄

ELK搭建 需要準備一臺linux服務器&#xff08;最好是CentOS7&#xff09;,內存至少4G以上&#xff08;三個組件都比較占用內存&#xff09; 演示基于ElasticSearch采用的是8.5.0版本 1、 Docker安裝Elasticsearch 創建一個網絡 因為我們還需要部署kibana容器、logstash容器&am…

調參指南:如何有效優化模型訓練效果

?? 調參指南:如何有效優化模型訓練效果(深度學習實戰) 模型跑通不難,調得好才是本事。本篇文章將系統講解如何在訓練過程中有效調參,從學習率到網絡結構,從損失函數到正則化,讓你的模型效果“飛升”。 ?? 一、為什么需要調參? 初學者常常以為模型訓練完就“任務完…

laya3的2d相機與2d區域

2d相機和2d區域都繼承自Sprite。 2d相機必須作為2d區域的子節點&#xff0c;且2d相機必須勾選isMain才能正常使用。 2d區域下如果沒有主相機&#xff0c;則他和Sprite無異&#xff0c;他的主要操作皆是針對主相機。 2d相機可以調整自己的移動范圍&#xff0c;是否緊密跟隨&a…

【保姆級教程】Windows部署LibreTV+cpolar實現遠程影音庫訪問全步驟

文章目錄 前言1.關于LibreTV2.docker部署LibreTV3.簡單使用LibreTV4.安裝cpolar內網穿透5.配置ward公網地址6.配置固定公網地址總結 前言 當周末的閑暇時光來臨時&#xff0c;您是否也習慣性地癱倒在沙發上&#xff0c;渴望通過影視作品緩解一周的疲憊&#xff1f;然而在準備點…

Windows安裝Docker部署dify,接入阿里云api-key進行rag測試

一、安裝docker 1.1 傻瓜式安裝docker Get Docker | Docker Docs Docker原理&#xff08;圖解秒懂史上最全&#xff09;-CSDN博客 官網選擇好windows的安裝包下載&#xff0c;傻瓜式安裝。如果出現下面的報錯&#xff0c;說明主機沒有安裝WSL 1.2 解決辦法 安裝 WSL | Mic…

Cursor 與DeepSeek的完美契合

這兩天在看清華大學最近出的一個關于deepseek入門的官方視頻中&#xff0c;看了幾個deepseek的應用場景還是能夠感覺到它的強大之處的&#xff0c;例如根據需求生成各種markdown格式的代碼&#xff0c;再結合市面上已有的一些應用平臺生成非常好看的流程圖&#xff0c;PPT,報表…

【深度學習】13. 圖神經網絡GCN,Spatial Approach, Spectral Approach

圖神經網絡 圖結構 vs 網格結構 傳統的深度學習&#xff08;如 CNN 和 RNN&#xff09;在處理網格結構數據&#xff08;如圖像、語音、文本&#xff09;時表現良好&#xff0c;因為這些數據具有固定的空間結構。然而&#xff0c;真實世界中的很多數據并不遵循網格結構&#x…

[Python] 避免 PyPDF2 寫入 PDF 出現黑框問題:基于語言自動匹配系統字體的解決方案

在使用 Python 操作 PDF 文件時,尤其是在處理中文、日語等非拉丁字符語言時,常常會遇到一個令人頭疼的問題——文字變成“黑框”或“方塊”,這通常是由于缺少合適的字體支持所致。本文將介紹一種自動選擇系統字體的方式,結合 PyPDF2 模塊解決此類問題。 一、問題背景:黑框…