西安網(wǎng)站建設(shè)首選那家2345電腦版網(wǎng)址導(dǎo)航
Lecture 2
θ
和它的導(dǎo)數(shù)符號(hào)是通過(guò) Julia 中的變量命名方式實(shí)現(xiàn)的
-
變量
θ
的輸入:- 在 Julia 中,
θ
是一個(gè)合法的變量名,就像普通的字母x
或y
一樣。 - 要輸入
θ
,可以使用以下方法:- 在 Jupyter Notebook 或 Julia REPL 中直接鍵入
\theta
,然后按 Tab 鍵,Julia 會(huì)自動(dòng)將其轉(zhuǎn)化為θ
。 - 這是 Julia 支持的 Unicode 字符的一部分,可以直接作為變量名。
- 在 Jupyter Notebook 或 Julia REPL 中直接鍵入
- 在 Julia 中,
-
變量
θ?
的輸入:θ?
是帶點(diǎn)的變量(表示導(dǎo)數(shù)),它也是 Julia 的一個(gè)合法變量名。- 鍵入
\theta
,后按 Tab 鍵,鍵入\dot
,后按 Tab 鍵
-
變量
θ?
的輸入:θ?
是加速度(帶兩個(gè)點(diǎn)的變量名)。- 鍵入
\theta
,后按 Tab 鍵,鍵入\ddot
,后按 Tab 鍵
θ
和θ?
是 Julia 中的 Unicode 變量名,可以通過(guò)快捷輸入實(shí)現(xiàn)。- 在代碼中,這些符號(hào)只是普通變量名,它們的含義通過(guò)上下文和賦值來(lái)表達(dá):
θ
是角度。θ?
是角速度。θ?
是角加速度,計(jì)算公式是 ? ( g / l ) sin ? ( θ ) -(g/l) \sin(θ) ?(g/l)sin(θ)。
.
使得操作符能夠逐個(gè)元素地應(yīng)用于整個(gè)數(shù)組或集合,而不需要顯式地使用循環(huán)
在 Julia 中,等號(hào)前面的 .
是一個(gè) 廣播(broadcasting) 操作符,它的作用是讓一個(gè)操作應(yīng)用于整個(gè)數(shù)組或容器,而不僅僅是單一的元素。這是 Julia 中非常常見和強(qiáng)大的特性。
x_hist[:,1] .= x0
x_hist[:,1]
:這是對(duì)x_hist
數(shù)組的訪問(wèn),表示提取x_hist
的第一列(所有行,第一列)。.=
:這是廣播賦值操作符。它表示對(duì)x_hist[:,1]
的每個(gè)元素執(zhí)行賦值操作,等價(jià)于逐元素地把x0
的每個(gè)值賦給x_hist[:,1]
的每個(gè)元素。x0
:這是一個(gè)向量,通常是初始狀態(tài)向量,比如[0.1; 0]
,表示擺的初始角度和角速度。
示例
假設(shè) x0
是 [0.1, 0]
,而 x_hist[:,1]
是一個(gè)長(zhǎng)度為 2 的列向量(例如 [0, 0]
),那么:
-
無(wú)廣播(普通賦值):
如果直接使用=
(沒有點(diǎn)操作符),會(huì)發(fā)生維度不匹配的錯(cuò)誤,因?yàn)槟悴荒軐⒁粋€(gè)列向量直接賦值給數(shù)組的某一列。x_hist[:,1] = x0 # 這會(huì)報(bào)錯(cuò)
-
使用廣播賦值:
使用.=
后,x0
的每個(gè)元素都會(huì)依次賦值給x_hist[:,1]
的每個(gè)元素:x_hist[:,1] .= x0 # 正確:x0 的每個(gè)元素逐個(gè)賦值給 x_hist[:,1]
總結(jié)
.
操作符使得賦值操作可以應(yīng)用到整個(gè)數(shù)組或容器的每個(gè)元素,而不僅僅是簡(jiǎn)單的元素賦值。.=
用于廣播賦值,使得多個(gè)值可以逐元素地賦給目標(biāo)數(shù)組或集合。
這種廣播機(jī)制使得在 Julia 中處理數(shù)組和矩陣時(shí)更加簡(jiǎn)潔高效。
解釋匿名函數(shù) x -> fd_pendulum_rk4(x, 0.1)
在 Julia 中,匿名函數(shù)是一種無(wú)需命名的函數(shù),通常用于臨時(shí)計(jì)算。形式為:
x -> expression
其中,x
是輸入?yún)?shù),expression
是處理該參數(shù)的表達(dá)式。
代碼部分
x -> fd_pendulum_rk4(x, 0.1)
這是一個(gè)匿名函數(shù),具體含義如下:
-
輸入?yún)?shù):
x
是匿名函數(shù)的輸入?yún)?shù),代表當(dāng)前狀態(tài)變量,通常為一個(gè)向量。例如,對(duì)于擺動(dòng)系統(tǒng),x
可能是 x = [ angle ; angular?velocity ] x = [\text{angle}; \text{angular velocity}] x=[angle;angular?velocity](角度和角速度)。
-
調(diào)用
fd_pendulum_rk4
:- 匿名函數(shù)內(nèi)部調(diào)用了
fd_pendulum_rk4
函數(shù),這是一個(gè)實(shí)現(xiàn)四階龍格-庫(kù)塔(RK4)積分方法的函數(shù)。 fd_pendulum_rk4(x, 0.1)
的兩個(gè)參數(shù):x
: 當(dāng)前狀態(tài)(例如 x = [ 角度 ; 角速度 ] x = [\text{角度}; \text{角速度}] x=[角度;角速度])。0.1
: 時(shí)間步長(zhǎng) h h h,表示模擬的離散時(shí)間間隔。
- 匿名函數(shù)內(nèi)部調(diào)用了
-
輸出結(jié)果:
- 函數(shù)返回 RK4 方法計(jì)算的狀態(tài)更新結(jié)果,即從狀態(tài) x x x 經(jīng)一步積分后的新狀態(tài) x n + 1 x_{n+1} xn+1?。
- 該結(jié)果是一個(gè)新的狀態(tài)向量,表示在給定時(shí)間步長(zhǎng)下,系統(tǒng)從狀態(tài) x x x 演化到的下一個(gè)狀態(tài)。
用途
匿名函數(shù) x -> fd_pendulum_rk4(x, 0.1)
的核心作用是:
- 將輸入狀態(tài) x x x(如擺的當(dāng)前角度和角速度)映射為通過(guò) RK4 方法計(jì)算得到的下一個(gè)狀態(tài)。
- 在調(diào)用
ForwardDiff.jacobian
時(shí),匿名函數(shù)為ForwardDiff
提供了所需的輸入-輸出關(guān)系。
示例
假設(shè):
- 初始狀態(tài)為 x = [ π / 4 ; 0 ] x = [\pi/4; 0] x=[π/4;0](角度 π / 4 \pi/4 π/4,角速度 0)。
- 時(shí)間步長(zhǎng) h = 0.1 h = 0.1 h=0.1。
匿名函數(shù)的計(jì)算流程如下:
# 定義匿名函數(shù)
f = x -> fd_pendulum_rk4(x, 0.1)# 調(diào)用匿名函數(shù)
new_state = f([pi/4; 0])
結(jié)果 new_state
是通過(guò) RK4 積分計(jì)算出的下一步狀態(tài)(新的角度和角速度)。
為什么使用匿名函數(shù)?
-
簡(jiǎn)潔性:
- 不需要顯式定義一個(gè)新函數(shù),而是直接將
fd_pendulum_rk4
封裝成滿足特定需求的函數(shù)(固定步長(zhǎng)為 0.1)。
- 不需要顯式定義一個(gè)新函數(shù),而是直接將
-
靈活性:
- 匿名函數(shù)可以動(dòng)態(tài)封裝不同的參數(shù)和邏輯。例如,步長(zhǎng)可以通過(guò)匿名函數(shù)靈活指定。
-
與
ForwardDiff.jacobian
配合:ForwardDiff.jacobian
需要輸入一個(gè)函數(shù),該函數(shù)的輸入是狀態(tài) x x x,輸出是對(duì)應(yīng)的更新結(jié)果。匿名函數(shù)很好地滿足這一要求。
總結(jié)
- 匿名函數(shù)
x -> fd_pendulum_rk4(x, 0.1)
將狀態(tài)變量 x x x 映射為通過(guò) RK4 方法計(jì)算得到的下一個(gè)狀態(tài)。 - 它的主要作用是為
ForwardDiff.jacobian
提供輸入-輸出映射關(guān)系,以計(jì)算狀態(tài)更新過(guò)程的雅可比矩陣。
Lecture 3
?r \ r
表示 矩陣左除
在 Julia 中,表達(dá)式 ?r \ r
表示 矩陣左除,也就是 求解線性方程組 的一種簡(jiǎn)潔方式。
線性方程組的求解
線性方程組的一般形式是:
A ? x = b A \cdot x = b A?x=b
其中:
- A A A 是系數(shù)矩陣(這里對(duì)應(yīng)
?r
)。 - x x x 是未知量向量(這里對(duì)應(yīng) Δ x \Delta x Δx)。
- b b b 是右側(cè)的已知向量(這里對(duì)應(yīng)
r
)。
A \ x
的含義是 求解 x x x 的值,即:
x = A ? 1 ? b x = A^{-1} \cdot b x=A?1?b
- 這相當(dāng)于將 A A A 的逆矩陣 A ? 1 A^{-1} A?1 左乘到 b b b 上,求解 x x x 的值。
但是,顯式求逆(即 A ? 1 A^{-1} A?1)的計(jì)算代價(jià)很高,且可能會(huì)引入數(shù)值不穩(wěn)定性。因此,?r \ r
使用了一種數(shù)值高效的方式解決這個(gè)問(wèn)題。
Julia 的 \
運(yùn)算符
- 在 Julia 中,
A \ b
是求解線性方程組 A ? x = b A \cdot x = b A?x=b 的符號(hào),表示“將矩陣 A A A 左除向量 b b b”。 - 實(shí)現(xiàn)時(shí),Julia 使用優(yōu)化的數(shù)值線性代數(shù)方法(如 LU 分解、QR 分解或 Cholesky 分解)來(lái)高效求解,而不是直接計(jì)算矩陣的逆。
數(shù)值計(jì)算的優(yōu)勢(shì)
- 高效性: 求解 A ? x = b A \cdot x = b A?x=b 的方法通常比顯式逆矩陣的計(jì)算更高效。
- 數(shù)值穩(wěn)定性: 顯式計(jì)算逆矩陣可能會(huì)導(dǎo)致數(shù)值不穩(wěn)定性(尤其當(dāng)矩陣接近奇異時(shí)),而直接求解方程組能夠減少誤差。
- 靈活性: Julia 的
\
運(yùn)算符會(huì)自動(dòng)選擇最適合的分解算法(如 LU、QR 或其他方法)來(lái)解決問(wèn)題,適用于稠密矩陣或稀疏矩陣。
梯度和雅可比矩陣在 Julia 中的使用規(guī)則
- 梯度 (
gradient
): 用于標(biāo)量值函數(shù),返回一個(gè)列向量。 - 雅可比矩陣 (
jacobian
): 用于矢量值函數(shù),返回一個(gè)矩陣。 - 在實(shí)際使用中,必須明確函數(shù)的輸入和輸出維度,誤用可能導(dǎo)致報(bào)錯(cuò)。
1. 梯度(gradient)
梯度是用于標(biāo)量值函數(shù)的,它返回的是一個(gè)列向量。
例子
using ForwardDiff# 定義一個(gè)標(biāo)量函數(shù)
f(x) = x[1]^2 + x[2]^2 + x[3]^2# 對(duì) f 求梯度
x = [1.0, 2.0, 3.0]
grad = ForwardDiff.gradient(f, x)
println("梯度: ", grad)
輸出
- 解析:
- 函數(shù) f ( x ) = x 1 2 + x 2 2 + x 3 2 f(x) = x_1^2 + x_2^2 + x_3^2 f(x)=x12?+x22?+x32?。
- 梯度為 ? f = [ ? f ? x 1 , ? f ? x 2 , ? f ? x 3 ] T = [ 2 x 1 , 2 x 2 , 2 x 3 ] T \nabla f = [\frac{\partial f}{\partial x_1}, \frac{\partial f}{\partial x_2}, \frac{\partial f}{\partial x_3}]^T = [2x_1, 2x_2, 2x_3]^T ?f=[?x1??f?,?x2??f?,?x3??f?]T=[2x1?,2x2?,2x3?]T。
- 結(jié)果為
[2.0, 4.0, 6.0]
。
2. 雅可比矩陣(Jacobian)
雅可比矩陣用于矢量值函數(shù),返回的是一個(gè)矩陣。
例子
using ForwardDiff# 定義一個(gè)矢量值函數(shù)
g(x) = [x[1]^2, x[1]*x[2], x[2]^2]# 對(duì) g 求雅可比矩陣
x = [1.0, 2.0]
jacobian = ForwardDiff.jacobian(g, x)
println("雅可比矩陣: ")
println(jacobian)
輸出
- 解析:
-
函數(shù) g ( x ) = [ x 1 2 , x 1 x 2 , x 2 2 ] g(x) = [x_1^2, x_1 x_2, x_2^2] g(x)=[x12?,x1?x2?,x22?]。
-
雅可比矩陣為:
J = [ ? g 1 ? x 1 ? g 1 ? x 2 ? g 2 ? x 1 ? g 2 ? x 2 ? g 3 ? x 1 ? g 3 ? x 2 ] J = \begin{bmatrix} \frac{\partial g_1}{\partial x_1} & \frac{\partial g_1}{\partial x_2} \\ \frac{\partial g_2}{\partial x_1} & \frac{\partial g_2}{\partial x_2} \\ \frac{\partial g_3}{\partial x_1} & \frac{\partial g_3}{\partial x_2} \end{bmatrix} J= ??x1??g1???x1??g2???x1??g3????x2??g1???x2??g2???x2??g3??? ?= [ 2 x 1 0 x 2 x 1 0 2 x 2 ] \begin{bmatrix} 2x_1 & 0 \\ x_2 & x_1 \\ 0 & 2x_2 \end{bmatrix} ?2x1?x2?0?0x1?2x2?? ?
-
在 x = [ 1.0 , 2.0 ] x = [1.0, 2.0] x=[1.0,2.0] 時(shí),結(jié)果為:
[ 2.0 0.0 2.0 1.0 0.0 4.0 ] \begin{bmatrix} 2.0 & 0.0 \\ 2.0 & 1.0 \\ 0.0 & 4.0 \end{bmatrix} ?2.02.00.0?0.01.04.0? ?
-
3. 錯(cuò)誤調(diào)用的情況
錯(cuò)誤調(diào)用 gradient
對(duì)矢量值函數(shù)
如果嘗試對(duì)矢量值函數(shù)調(diào)用 gradient
會(huì)導(dǎo)致報(bào)錯(cuò),因?yàn)樘荻戎贿m用于標(biāo)量值函數(shù)。
例子
g(x) = [x[1]^2, x[1]*x[2], x[2]^2]
x = [1.0, 2.0]
grad = ForwardDiff.gradient(g, x) # 錯(cuò)誤
報(bào)錯(cuò)信息
- 原因:
gradient
只能對(duì)標(biāo)量值函數(shù)使用,而這里的 g ( x ) g(x) g(x) 是矢量值函數(shù)。
錯(cuò)誤調(diào)用 jacobian
對(duì)標(biāo)量值函數(shù)
如果嘗試對(duì)標(biāo)量值函數(shù)調(diào)用 jacobian
,理論上應(yīng)返回梯度的轉(zhuǎn)置,但通常會(huì)導(dǎo)致報(bào)錯(cuò)。
例子
f(x) = x[1]^2 + x[2]^2
x = [1.0, 2.0]
jacobian = ForwardDiff.jacobian(f, x) # 錯(cuò)誤
報(bào)錯(cuò)信息
- 原因:
jacobian
期望輸入是矢量值函數(shù),而這里的 f ( x ) f(x) f(x) 是標(biāo)量值函數(shù)。
Lecture 4
Kronecker 積(Kronecker Product)
Kronecker 積的定義
給定兩個(gè)矩陣 A ∈ R m × n A \in \mathbb{R}^{m \times n} A∈Rm×n 和 B ∈ R p × q B \in \mathbb{R}^{p \times q} B∈Rp×q,它們的 Kronecker 積 A ? B A \otimes B A?B 是一個(gè)大小為 ( m p ) × ( n q ) (mp) \times (nq) (mp)×(nq) 的矩陣。具體構(gòu)造規(guī)則如下:
- A ? B A \otimes B A?B 將矩陣 A A A 的每個(gè)元素 a i j a_{ij} aij? 替換為該元素與矩陣 B B B 的乘積 a i j B a_{ij}B aij?B。
數(shù)學(xué)表達(dá)為:
A ? B = [ a 11 B a 12 B … a 1 n B a 21 B a 22 B … a 2 n B ? ? ? a m 1 B a m 2 B … a m n B ] A \otimes B = \begin{bmatrix} a_{11} B & a_{12} B & \dots & a_{1n} B \\ a_{21} B & a_{22} B & \dots & a_{2n} B \\ \vdots & \vdots & & \vdots \\ a_{m1} B & a_{m2} B & \dots & a_{mn} B \\ \end{bmatrix} A?B= ?a11?Ba21?B?am1?B?a12?Ba22?B?am2?B?………?a1n?Ba2n?B?amn?B? ?
Kronecker 積的計(jì)算方法
假設(shè):
A = [ 1 2 3 4 ] , B = [ 0 5 6 7 ] A = \begin{bmatrix} 1 & 2 \\ 3 & 4 \\ \end{bmatrix}, \quad B = \begin{bmatrix} 0 & 5 \\ 6 & 7 \\ \end{bmatrix} A=[13?24?],B=[06?57?]
計(jì)算 A ? B A \otimes B A?B:
A ? B = [ 1 ? B 2 ? B 3 ? B 4 ? B ] = [ [ 0 5 6 7 ] [ 0 10 12 14 ] [ 0 15 18 21 ] [ 0 20 24 28 ] ] A \otimes B = \begin{bmatrix} 1 \cdot B & 2 \cdot B \\ 3 \cdot B & 4 \cdot B \\ \end{bmatrix}= \begin{bmatrix} \begin{bmatrix} 0 & 5 \\ 6 & 7 \\ \end{bmatrix} & \begin{bmatrix} 0 & 10 \\ 12 & 14 \\ \end{bmatrix} \\ \begin{bmatrix} 0 & 15 \\ 18 & 21 \\ \end{bmatrix} & \begin{bmatrix} 0 & 20 \\ 24 & 28 \\ \end{bmatrix} \\ \end{bmatrix} A?B=[1?B3?B?2?B4?B?]= ?[06?57?][018?1521?]?[012?1014?][024?2028?]? ?
最終結(jié)果為:
A ? B = [ 0 5 0 10 6 7 12 14 0 15 0 20 18 21 24 28 ] A \otimes B = \begin{bmatrix} 0 & 5 & 0 & 10 \\ 6 & 7 & 12 & 14 \\ 0 & 15 & 0 & 20 \\ 18 & 21 & 24 & 28 \\ \end{bmatrix} A?B= ?06018?571521?012024?10142028? ?
Kronecker 積的性質(zhì)
- 尺寸:
如果 A A A 是 m × n m \times n m×n, B B B 是 p × q p \times q p×q,那么 A ? B A \otimes B A?B 的大小為 ( m p ) × ( n q ) (mp) \times (nq) (mp)×(nq)。 - 分布律:
( A + C ) ? B = A ? B + C ? B (A + C) \otimes B = A \otimes B + C \otimes B (A+C)?B=A?B+C?B - 結(jié)合律:
( A ? B ) ? C = A ? ( B ? C ) (A \otimes B) \otimes C = A \otimes (B \otimes C) (A?B)?C=A?(B?C) - 與標(biāo)量的關(guān)系:
( α A ) ? B = A ? ( α B ) (\alpha A) \otimes B = A \otimes (\alpha B) (αA)?B=A?(αB)
Kronecker 積的應(yīng)用
-
生成重復(fù)矩陣:
- 在 Julia 中,
kron(ones(m), A)
會(huì)生成一個(gè)矩陣,其中矩陣 A A A 的每一行重復(fù) m m m 次。 - 類似地,
kron(ones(m)', A)
會(huì)生成一個(gè)矩陣,其中矩陣 A A A 的每一列重復(fù) m m m 次。
- 在 Julia 中,
-
向量化操作:
- Kronecker 積常用于將向量化表達(dá)與矩陣展開結(jié)合。比如,將矩陣 A A A 的每一項(xiàng)與另一個(gè)矩陣 B B B 關(guān)聯(lián)。
-
量子計(jì)算:
- Kronecker 積在量子力學(xué)中用于描述復(fù)合量子系統(tǒng)的狀態(tài)和操作,比如計(jì)算張量積態(tài)。
-
系統(tǒng)理論和信號(hào)處理:
- Kronecker 積用于構(gòu)造大規(guī)模系統(tǒng)矩陣,特別是在多維信號(hào)處理中的應(yīng)用。
在 Julia 中的實(shí)現(xiàn)
在 Julia 中,kron
函數(shù)用于計(jì)算 Kronecker 積,語(yǔ)法為:
C = kron(A, B)
在equality-constraints.ipynb代碼中的作用
在 plot_landscape
函數(shù)中,Kronecker 積被用來(lái)生成網(wǎng)格點(diǎn):
kron(ones(Nsamp), LinRange(-4, 4, Nsamp)')
:- 生成一個(gè)矩陣,其中每一行是從 ? 4 -4 ?4 到 4 4 4 的序列,表示 x x x 坐標(biāo)。
kron(ones(Nsamp)', LinRange(-4, 4, Nsamp))
:- 生成一個(gè)矩陣,其中每一列是從 ? 4 -4 ?4 到 4 4 4 的序列,表示 y y y 坐標(biāo)。
這樣,通過(guò) Kronecker 積可以快速構(gòu)造二維網(wǎng)格,用于繪制等高線圖。