方程式好讀版:https://www.notion.so/Tangent-linear-model-and-adjoint-model-0b0387dc19c2482fbdd4c4610738c483
(把充滿式子的東西複製過來果然還是有點勉強啊)
直接先上AMS Glossary的解釋:
A model, comprising tangent linear equations, that maps a perturbation vector, δx(t1) = Lδx(t0), from initial time t0 to forecast time t1.
Here, L is the tangent linear operator and x is the model state vector. A TLM provides a first-order approximation to the evolution of perturbations in a nonlinear forecast trajectory.
簡單來說就是一個非線性的模式,其微小誤差在一定時間內隨時間的發展可以用泰勒展開的一次項做線性的近似。
更白話一點說,TLM 可以用來計算初始值(或其他任何時間開始)的一個微小誤差隨著時間會怎麼發展,但這個計算是用線性近似的假設,所以如果非線性模式積分很長時間估計值就會不准。
以Lorenz 63模式為例,方程式組如下圖左邊的式子
x, y, z 為隨時間變化的變數,σ, r, b為係數,t為時間。假設x, y, z 的初始值分別有微小誤差δx, δ y, δ z,則方程式可以寫成下面右邊的樣子
上面右邊的式子展開然後減掉左邊原本的方程組,並忽略高次項(δ x, δ z等)可以得到右邊的方程式。
此方程組即為Lorenz 63 model的TLM方程組。寫成時間差分的樣子的話可以寫成 (使用簡單的前方差分) 下面的樣子
t和t+1為時間,上面的式子的意思即為t=t+1時間的微小誤差可以寫成t=t時間的微小誤差加上一些有的沒的(積分的過程)。
把上面的式子稍微整理一下如右,可以更明顯的看到時間 t=t+1 的 δ x, δ y, δ z為 t=t 時的 δ x, δ y, δ z 乘上 Δt (時間間距)和時間t=t 時的 x, y, z 的組合。
另外如果把模式寫成矩陣運算的表示方式的話,可以寫成右邊的樣子
下標 t、t+1表示時間,上式的意思為 t=t+1 時間的狀態變數 X(t+1) 可以表示成 t=t 時間的狀態變數 X(t)乘上一組東西(M),M表示模式積分的過程。
Adjoint model 呢,中文叫做伴隨模式,adjoint在數學上的定義為 <g, Af>=<A*g, f>,<>符號表示積分,g, f為兩個函數,A和A*互為adjoint。
一般來說在資料同化或數值模擬的世界中,ADJ通常應該是指TLM的adjoint。
如果說TLM是表示一個微小誤差隨著時間向前積分的變化的話,ADJ就是相反地表示一個微小誤差往回推到前面的時間時該有的樣子。
換句話說如果現在時間 t=t 時有一微小誤差 δX(t),那麼 t=t-1 時的微小誤差可以表示為 δX(t-1) = M^T δX(t),其中 M^T 即為ADJ。
得到ADJ的過程非~常簡單,就是把上面TLM那個矩陣轉置就好了。以上面的Lorenz 63 model的TLM矩陣為例的話,其ADJ即為
把矩陣乘開就是以下的式子
以上的方程組即為Lorenz 63 模式的 adjoint model。
以上以Lorenz 63 model 為例介紹了得到Tangent linear model (TLM)和Adjoint model (ADJ)的過程及他們的意義,這兩個model在資料同化的應用主要為4DVAR方法裡的使用,簡單說就是4DVAR會去計算同化窗區裡模式狀態變數跟觀測的差距(可視為上面推導過程中的 δX),並把此差距用ADJ 往回積分到初始時間,去計算初始時間的模式狀態變數應該怎麼修改才能讓這個窗區裡的誤差減到最小。
然而實際的大氣模式(或是其他領域的應用模式)常常都很複雜,並不能上面那樣把式子一項一項寫出來、轉成矩陣再轉置,並且根據code的寫法、積分的方式不同,真正的ADJ 也會不同,如果直接拿上面的式子去寫成code的話往回積分並不會得到原本的值,所以實際上在製作TLM和ADJ時會把原本模式的code 一行一行拿出來,把每一行code 轉換成TLM的形式,然後寫成矩陣再轉置成ADJ,這部分寫起來也蠻長的,就改天再另外寫一篇吧。
adjoint code的寫法請見:https://sites.google.com/view/pys-study-note/datassimilation/writeadjoint