Try   HackMD

2025q1 Homework5 (assessment)

contributed by < Mike1117 >

閱讀〈因為自動飲料機而延畢的那一年〉的啟發以及修課心得

閱讀啟發

閱讀此篇回顧,不禁令我回想起大學時的畢業專題。因為大學時是電機系,所以畢業專題主題是 IoT 相關的,最後選定的題目是結合行動裝置之雷射雕刻機。也就是透過手機端的 APP ,來操控雷射雕刻機進行雕刻。
而這個題目與自動飲料機類似,都需要高度的軟硬體整合。但是閱讀完全文,再回想自己的專題,唯有自愧不如可以形容。不管是在軟體還是硬體,我的專題最終的完成度都遠遠低於自動飲料機。
首先是與人合作方面,作者找到了對應工作的合適人選,且後續能合理的進行分工,這是我在專題期間沒有做到的。雖然專題時組員並不是由我選擇,但我在後續並沒有為每個人分配合適的工作,這是值得我檢討與深思的事情。而我在小組合作的專案中,也時常習慣一個人單幹,獨攬大部分工作,這是一個不好的行為。

修課心得

截止目前,我自認為在這門課上付出了一定的心力,但從作業的完成度上來看,很難說是問心無愧。且因實驗室的事務與其他課業的壓力纏身,從四月中開始,我的作業進度就停滯不前,實屬慚愧。
回顧目前已經完成的作業,我認為我只有在 lab0 算是有一定的完成度,同時也覺得自己從 lab0 學習到了很多東西。不論是 GitHub 、 Graphviz 的使用, Commit Message 的撰寫,對熵的認識及理解。前述很多東西都是以前從來沒有接觸過,從零開始學習,到現在對他們有一個基本的認知及了解,整體算得上是小有收穫。
在一開始寫 lab0 時,我就時常覺得窒礙難行,這是由於我的先備知識嚴重不足,所以我會反覆閱讀教材及作業要求,將問題再細分為更小的子問題,查閱資料以及詢問 LLM ,雖然耗費了大量時間,但也是有一定的成效。在後續的作業中,我同樣時常卡住,在第三份作業 kxo 時尤為明顯,光是為了看懂 Source Code 的功能,就耗費了我大量時間,結果就是直至五月底六月初,才開始真正動手完成作業要求。
而針對重做的一些 quiz ,我在遇到需要 效能評比 的延伸問題時,我就會不知從何下手,往往會卡在 如何設計 以及 我設計的方法是否真實有效 兩個方面。我認為導致這個問題的原因是我仍然沒有真正意義上理解需要評比的方法的原理,也在效能評比方面缺乏經驗,後續可能要再多詳讀教材,完善作業。

開發記錄連結

Homework 1
Homework 2
Homework 3
Homework 4
Homework 5
期末專題

第 1 到第 6 週「課程教材」和 CS:APP 3/e 之心得和提問

問題一: 為什麼在 dudect 中,只有第一次呼叫 dudect_main 時才做 prepare_percentiles

以下截取自 dudect.h

if (first_time) {
// throw away the first batch of measurements.
// this helps warming things up.
prepare_percentiles(ctx);
} else {
update_statistics(ctx);
ret = report(ctx);
}

而在 lab0 的 PR #283 中,更新 percentiles 的操作是 Dynamic 的。
寫下這個問題時發現在後續 Commit a51c643 中,更新 percentile 的實作又改為了僅在第一次時計算。
我的問題是為何第一次運行被稱作是 Warm-up , 卻可以拿來當做劃分 percentile 的依據。

課堂問答

Q1: Assume x is a single precision floating point (i.e., “float”) and always >= 1. Calculate square root of x without FPU.

int my_sqrtf(float x) {
    int low = 1;
    int high = (int)x;
    int mid;

    while (low <= high) {
        mid = low + (high - low) / 2;

        if (mid <= x / mid) {
            low = mid + 1;
        } else {
            high = mid - 1;
        }
    }

    return high;
}

使用老師教材中提及的 二分逼近法 ,每次檢查 highlow 的中間值之平方是否有比 input 大,直至 low <= high

Q2: RLC

RLC 電路簡介

RLC 電路是一種由電阻電感電容三種元件所組成的線性二階網路。根據元件的連接方式,可分為串聯 RLC 電路並聯 RLC 電路,在電子濾波、阻尼振盪與共振調諧等領域中具有重要應用。


1. RLC 電路的組成
  • 電阻 R:將電能轉換為熱能,提供阻尼效果。
  • 電感 L:儲存磁能,阻抗隨頻率增加而增加。
  • 電容 C:儲存電能,阻抗隨頻率增加而減小。
    Image Not Showing Possible Reasons
    • The image was uploaded to a note which you don't have access to
    • The note which the image was originally uploaded to has been deleted
    Learn More →

2. 串聯 RLC 的微分方程

對於串聯 RLC 電路,施加輸入電壓

Vin(t),依照基爾霍夫電壓定律:

Vin(t)=Ri(t)+Ldi(t)dt+1Ci(t)dt

對上式兩邊微分,可得二階微分方程:

Ld2i(t)dt2+Rdi(t)dt+1Ci(t)=dVin(t)dt


3. 頻率響應與共振
  • 阻抗
    Z(jω)=R+j(ωL1ωC)
  • 共振頻率
    ω0=1LC
  • 品質因素 Q
    Q=ω0LR=1RLC

在共振頻率附近,電路的響應峰值明顯,適用於濾波與調諧電路。


4. 時域特性
  • 欠阻尼 (Q>1/2):阻尼振盪,響應具有衰減的正弦波。
  • 臨界阻尼 (Q=1/2):最短時間達到穩態,無振盪。
  • 過阻尼 (Q<1/2):無振盪,但響應較慢。

對於單位階躍輸入

Vin(t)=Vout(t),可由二階系統解析出電流或輸出電壓隨時間的變化曲線。


5. 應用範例
  1. 濾波器:高通、低通、帶通濾波器中常見。
  2. 諧振腔:射頻 (RF) 應用中的頻率選擇元件。
  3. 振盪器:LC 振盪器利用 RLC 電路建立穩定振盪。
  4. 阻尼控制:電力系統與機械振動阻尼設計。

Q3: 為何不同大小 (dimension) 的矩陣不能相乘?

在線性代數的視角中,一個矩陣代表著一次線性變換。
線性變換是一種特殊的函數,它將一個向量空間中的向量映射到另一個(或同一個)向量空間,並且在過程中保持網格線的平行與等距分佈。

一個

m×n 的矩陣
A
就代表了一個從
n
維實數空間(記作
Rn
)到
m
維實數空間(記作
Rm
)的線性變換
TA

TA:RnRm

這裡,矩陣的維度有著至關重要的幾何意義:
縱行數 (n):決定了輸入空間(定義域, domain )的維度。一個

m×n 的矩陣只能作用於
n
維向量。

橫列數 (m):決定了輸出空間(對應域, codomain )的維度。無論輸入的

n 維向量是什麼,經過
A
變換後的結果都將是一個
m
維向量。

當我們將矩陣

A 左乘一個向量
x
(此處
x
必須是一個
n×1
的縱行向量),得到
Ax
,這個過程在幾何上就相當於對向量
x
施加了
TA
這個線性變換。

例如,一個

2×2 的矩陣可以將二維平面上的所有向量進行旋轉、縮放、剪切或反射等操作。

而矩陣乘法的幾何意義是一種複合變換(composition of transformations)。

假設矩陣

A 代表線性變換
T
,矩陣
B
代表線性變換
U
。那麼,矩陣乘積
AB
就代表了一個新的複合變換
TU
,這個符號的讀法與函數複合
f(g(x))
完全一致,是從右向左執行的 。
也就是說,
TU
的意義是:對於任意一個向量
x
,先對其施加變換
U
,然後再對得到的結果施加變換
T

(TU)(x)=T(U(x))

在矩陣的語言中,這對應著

(AB)x=A(Bx)

綜上所述,矩陣乘法不僅有方向性,也有其對應的幾何意義,因此不同大小的矩陣不能相乘。