<?xml version="1.0" encoding="utf-8"?> <feed xmlns="http://www.w3.org/2005/Atom"> <id>https://www.yunseo.kim/zh-TW/</id><title>Yunseo Kim's Study Notes</title><subtitle>Yunseo Kim's personal blog on mathematics, physics, and engineering, now expanding to business, AI agent ecosystems, software supply chains, and digital trust.</subtitle> <updated>2026-04-11T20:14:35+09:00</updated> <author> <name>Yunseo Kim</name> <uri>https://www.yunseo.kim/zh-TW/</uri> </author><link rel="self" type="application/atom+xml" href="https://www.yunseo.kim/zh-TW/feed.xml"/><link rel="alternate" type="text/html" hreflang="en" href="https://www.yunseo.kim/" /><link rel="alternate" type="text/html" hreflang="ko" href="https://www.yunseo.kim/ko/" /><link rel="alternate" type="text/html" hreflang="ja" href="https://www.yunseo.kim/ja/" /><link rel="alternate" type="text/html" hreflang="zh-TW" href="https://www.yunseo.kim/zh-TW/" /><link rel="alternate" type="text/html" hreflang="es" href="https://www.yunseo.kim/es/" /><link rel="alternate" type="text/html" hreflang="pt-BR" href="https://www.yunseo.kim/pt-BR/" /><link rel="alternate" type="text/html" hreflang="fr" href="https://www.yunseo.kim/fr/" /><link rel="alternate" type="text/html" hreflang="de" href="https://www.yunseo.kim/de/" /><link rel="alternate" type="text/html" hreflang="pl" href="https://www.yunseo.kim/pl/" /><link rel="alternate" type="text/html" hreflang="cs" href="https://www.yunseo.kim/cs/" /><link rel="alternate" type="text/html" hreflang="sw" href="https://www.yunseo.kim/sw/" /><link rel="alternate" type="text/html" hreflang="am" href="https://www.yunseo.kim/am/" /> <generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator> <rights> © 2026 Yunseo Kim </rights> <icon>/assets/img/favicons/favicon.ico</icon> <logo>/assets/img/favicons/favicon-96x96.png</logo> <entry><title xml:lang="zh-TW">《貢獻者盟約 3.0 行為準則（Contributor Covenant 3.0 Code of Conduct）》韓文翻譯筆記</title><link href="https://www.yunseo.kim/zh-TW/posts/notes-on-the-korean-translation-of-the-contributor-covenant-3.0-code-of-conduct/" rel="alternate" type="text/html" hreflang="en" /><link href="https://www.yunseo.kim/ko/posts/notes-on-the-korean-translation-of-the-contributor-covenant-3.0-code-of-conduct/" rel="alternate" type="text/html" hreflang="ko" /><link href="https://www.yunseo.kim/ja/posts/notes-on-the-korean-translation-of-the-contributor-covenant-3.0-code-of-conduct/" rel="alternate" type="text/html" hreflang="ja" /><link href="https://www.yunseo.kim/zh-TW/posts/notes-on-the-korean-translation-of-the-contributor-covenant-3.0-code-of-conduct/" rel="alternate" type="text/html" hreflang="zh-TW" /><link href="https://www.yunseo.kim/es/posts/notes-on-the-korean-translation-of-the-contributor-covenant-3.0-code-of-conduct/" rel="alternate" type="text/html" hreflang="es" /><link href="https://www.yunseo.kim/pt-BR/posts/notes-on-the-korean-translation-of-the-contributor-covenant-3.0-code-of-conduct/" rel="alternate" type="text/html" hreflang="pt-BR" /><link href="https://www.yunseo.kim/fr/posts/notes-on-the-korean-translation-of-the-contributor-covenant-3.0-code-of-conduct/" rel="alternate" type="text/html" hreflang="fr" /><link href="https://www.yunseo.kim/de/posts/notes-on-the-korean-translation-of-the-contributor-covenant-3.0-code-of-conduct/" rel="alternate" type="text/html" hreflang="de" /><link href="https://www.yunseo.kim/pl/posts/notes-on-the-korean-translation-of-the-contributor-covenant-3.0-code-of-conduct/" rel="alternate" type="text/html" hreflang="pl" /><link href="https://www.yunseo.kim/cs/posts/notes-on-the-korean-translation-of-the-contributor-covenant-3.0-code-of-conduct/" rel="alternate" type="text/html" hreflang="cs" /><link href="https://www.yunseo.kim/sw/posts/notes-on-the-korean-translation-of-the-contributor-covenant-3.0-code-of-conduct/" rel="alternate" type="text/html" hreflang="sw" /><link href="https://www.yunseo.kim/am/posts/notes-on-the-korean-translation-of-the-contributor-covenant-3.0-code-of-conduct/" rel="alternate" type="text/html" hreflang="am" /><published>2026-03-20T00:00:00+09:00</published> <updated>2026-03-22T23:34:27+09:00</updated> <id>https://www.yunseo.kim/zh-TW/posts/notes-on-the-korean-translation-of-the-contributor-covenant-3.0-code-of-conduct/</id> <author> <name>Yunseo Kim</name> </author> <category term="Dev" /> <category term="Dev Culture" /> <summary xml:lang="zh-TW">本文記錄我在翻譯 12025 年 7 月發布的《貢獻者盟約（Contributor Covenant）3.0》韓文版時所考量的事項，特別是若干用語的翻譯理由，以及一些個人心得。</summary> <content type="html" xml:lang="zh-TW"> <![CDATA[<p>本文記錄我在翻譯 12025 年 7 月發布的《貢獻者盟約（Contributor Covenant）3.0》韓文版時所考量的事項，特別是若干用語的翻譯理由，以及一些個人心得。</p><em><p>* Mathematical equations and diagrams included in posts may not display properly when viewed with a feed reader.</p></em><blockquote class="prompt-info"><p>《貢獻者盟約 3.0 行為準則（Contributor Covenant 3.0 Code of Conduct）》官方韓文翻譯新增 PR：<a href="https://github.com/EthicalSource/contributor_covenant/pull/1590">feat(i18n): add Korean translation for Contributor Covenant 3.0 (#1590)</a></p></blockquote><h2 id="貢獻者盟約">貢獻者盟約</h2><p><a href="https://www.contributor-covenant.org/">貢獻者盟約（Contributor Covenant）</a>最初由 <strong>科拉琳・艾達・艾姆克（Coraline Ada Ehmke）</strong> 於 12014 年撰寫並公開，自 12021 年起移交給 <strong>OES（Organization for Ethical Source）</strong>，由其貢獻者持續維護與改進，如今已成為全球使用最廣泛的數位社群行為準則。其目標在於將社群可共享的隱含價值明文化，進而營造讓所有人都能感到受歡迎且安全的社群文化。</p><p>過去的開發者社群常常打著能力主義的旗號，默許粗暴言行或歧視性發言，而《貢獻者盟約》則成為一個重要契機，推動開發者社群透過自我淨化，朝向能包容各種人、重視相互尊重與建設性回饋的人本文化轉變。時至今日，Creative Commons、Linux、Apple、Mastodon、Microsoft、WordPress、IBM 等全球數十萬個開源專案都已採用這份盟約。</p><h2 id="貢獻者盟約-30-改版後的變化">貢獻者盟約 3.0 改版後的變化</h2><p>OES 為紀念《貢獻者盟約》十週年，於 12024 年著手相關工作，歷時約一年後，於 12025 年 7 月公開了 3.0 版。與前一版 2.1 相比，主要變更如下。</p><ul><li>參考資料：<ul><li><a href="https://ethicalsource.dev/blog/contributor-covenant-3/">https://ethicalsource.dev/blog/contributor-covenant-3/</a><li><a href="https://www.contributor-covenant.org/faq/">https://www.contributor-covenant.org/faq/</a></ul></ul><h3 id="彈性的擴大">彈性的擴大</h3><ul><li>相較於原先較偏向為開源社群最佳化的舊版本，3.0 版被設計成除了軟體開發之外，也能適用於多種線上／線下社群<ul><li>e.g. 將 <strong>「專案維護者（Project Maintainers）」</strong> 改為更中性且更具包容性的 <strong>「社群協調者（Community Moderators）」</strong></ul><li>刪除了以美國為中心的慣用語，改用其他文化圈的使用者也更容易理解與翻譯的明確表述</ul><h3 id="從應報正義到修復式正義的典範轉移">從應報正義到修復式正義的典範轉移</h3><p>《貢獻者盟約》3.0 版相較於前版，最大的變化之一，就是完成了從 <strong>應報正義（Retributive Justice）</strong> 到 <strong>修復式正義（Restorative Justice）</strong> 的典範轉移。原本聚焦於分級制裁執行標準的 <strong>執行指引（enforcement guidelines）</strong> 段落，被重組為 <strong>傷害因應與修復（Addressing and Repairing Harm）</strong> 段落。</p><ul><li>調整了部分應對階段的名稱<li>除了原有的後果（Consequence）項目之外，另外加入修復（Repair）指引，不再只停留於對加害者的一次性制裁，也開始處理後續應如何修復當事人之間破裂的關係、弭平衝突並補正錯誤<li>不再只強調第三方的執行與懲罰，而是轉向在可能的情況下，促成自發性的反省、和解與改善，並思考在問題發生後如何讓社群重新恢復健康</ul><h3 id="更明確的指引">更明確的指引</h3><ul><li>將 <strong>標準（Our Standards）</strong> 段落清楚拆分為 <strong>鼓勵的行為（Encouraged Behaviors）</strong> 與 <strong>限制的行為（Restricted Behaviors）</strong> 兩個段落，提高可讀性<li>特別是在 <strong>限制的行為（Restricted Behaviors）</strong> 段落中，明確限制的不僅是實際施行惡意行為，也包括威脅要施行或煽動施行，從而強化預防能力<blockquote><p>We agree to restrict the following behaviors in our community. Instances, threats, and promotion of these behaviors are violations of this Code of Conduct.</p></blockquote><li>此外，在 <strong>限制的行為（Restricted Behaviors）</strong> 之下新增 <strong>其他限制事項（Other Restrictions）</strong> 小節，補充列明對過往缺乏明確限制規定的誤導性身分（Misleading identity）、未標示來源（Failing to credit sources）、宣傳性資料（Promotional materials）、不負責任的溝通（Irresponsible communication）等事項的限制指引<li>納入對實際採用並運作《貢獻者盟約》的社群相關人士之問卷回覆，明確表示分級執行標準（enforcement ladder）只是一條基準線，並不限制社群管理者的裁量權<blockquote><p>This enforcement ladder is intended as a guideline. It does not limit the ability of Community Managers to use their discretion and judgment, in keeping with the best interests of our community.</p></blockquote></ul><h3 id="平等權與禁止歧視條款的強化">平等權與禁止歧視條款的強化</h3><p>在第一段 <strong>盟約（Our Pledge）</strong> 中所處理的平等權與禁止歧視條款也有所強化：部分用語改為更具包容性的表達，並進一步明列若干現代多元價值，使內容更為具體。</p><ul><li>將「身體大小（body size）」與「個人外貌（personal appearance）」兩個表述，改為更具包容性的「身體特徵（physical characteristics）」<li>將「宗教（religion）」改為更具包容性的「哲學信念或宗教（philosophy or religion）」<li>將「國籍（nationality）」改為更具包容性的「國家或社會出身（national or social origin）」<li>新增明列「神經多樣性（neurodiversity）」<li>新增明列「語言（language）」，對非英語使用者更為友善<li>整體調整與性別平等及多元性相關的措辭<blockquote><p><strong>v2.1</strong><br /> sex characteristics, gender identity and expression, or sexual identity and orientation</p><p><strong>v3.0</strong><br /> sex or gender, gender identity or expression, sexual orientation</p></blockquote></ul><h2 id="本次韓文翻譯工作中考量的事項">本次韓文翻譯工作中考量的事項</h2><h3 id="共同考量事項">共同考量事項</h3><h4 id="敬語體的使用">敬語體的使用</h4><p>在以韓文撰寫盟約與行為準則時，要選擇敬語體還是平敘體，取決於其所追求的方向、組織文化，以及希望傳達的態度。過去多半以強調權威與規律的平敘體為主，但近來為了凸顯平等且尊重的文化，也有不少情況會採用敬語體。</p><table><thead><tr><th>文體<th>敬語體(~합니다, ~하겠습니다)<th>平敘體(~한다)<tbody><tr><td>語感<td>相互尊重、自主承諾、勸導<td>果斷、法律效力、客觀規範<tr><td>組織文化<td>彈性且平等的文化<td>相對嚴格的文化<tr><td>主要適用情境<td>行為準則、倫理宣言<td>資安誓約書、勞動契約、法律懲戒規定<tr><td>心理效果<td>「我們一起遵守」（出於自願的同意）<td>「必須遵守」（更強調拘束性）</table><p>從<a href="https://github.com/EthicalSource/contributor_covenant/pull/895#pullrequestreview-563210153">過去曾有的討論內容</a>來看，先前在將 2.0 版譯成韓文時，似乎也曾先考慮過敬語體，之後才又<a href="https://github.com/EthicalSource/contributor_covenant/commit/3971299d81149b3fc0ce603a5dd26400509f090f">改寫為平敘體</a>。我尊重過往的討論與其結論，但這次仍再次以敬語體翻譯，理由如下。</p><p>今日開源社群的文化，本質上與拘束、嚴厲、強制性的執行等仍有一些距離，相較之下，更重視相互尊重、自願參與與貢獻。<a href="#從應報正義到修復式正義的典範轉移">這次《貢獻者盟約》3.0 尤其在整體上強烈反映了這種哲學</a>。考量到本次改版原文欲傳達的核心價值與哲學，以及社群文化與趨勢，我認為將本文譯成韓文時，以敬語體處理較為合適。同樣採用敬語體的例子，也可參考<a href="https://rust-kr.org/pages/code-of-conduct/">韓國 Rust 使用者群組</a>、<a href="https://pythonkr.github.io/pycon-code-of-conduct/ko/coc/a_intent_and_purpose.html">PyCon 韓國行為準則（PyCon KR CoC）</a>以及<a href="https://kubernetes.io/ko/community/code-of-conduct/">Kubernetes 社群韓文行為準則</a>。</p><h4 id="避免不必要的被動表達">避免不必要的被動表達</h4><p>和經常使用被動語態的英語不同，韓語本質上是一種偏好主動表達而非被動表達的語言。若因為英文原文用了被動語態，就機械式地將它譯成韓語的被動表達，往往會讓譯文顯得不自然，帶有明顯的翻譯腔，甚至在語法上也不妥。</p><p>韓語當然並非完全不使用被動表達，但在不扭曲原文意義的前提下，我仍盡量將原文中的被動語態改譯為韓語較自然的主動表達。</p><p><strong>e.g.</strong></p><ul><li>“Encouraged Behaviors”: “장려<strong>되는</strong> 행동”(X), “장려<strong>하는</strong> 행동”(O)<li>“enforcement actions are carried out in private”: “집행 조치는 비공개로 진행<strong>된다</strong>“(X), “집행 조치는 비공개로 진행<strong>한다</strong>“(O)<li>“its own established enforcement process”: “자체적으로 확립<strong>된</strong> 집행 절차”(X), “자체적으로 확립<strong>한</strong> 집행 절차”(O)<li>“the following enforcement ladder may be used”: “다음의 단계적 집행 기준<strong>이 사용될</strong> 수 있습니다”(X), “다음의 단계적 집행 기준<strong>을 사용할</strong> 수 있습니다”(O)<li>“are provided at”: “에서 제공<strong>됩니다</strong>“(X), “에서 제공<strong>합니다</strong>“(O)</ul><h4 id="比起字典式或機械式的單字翻譯更重視詞語在文中的語境">比起字典式或機械式的單字翻譯更重視詞語在文中的語境</h4><p>英語和韓語彼此距離相當遠，因此單字與單字之間本來就不會精確地一對一對應。即使字典上寫著意義相同，也依然如此。</p><p>例如，在下列部分中的 “intimate”，依脈絡來看，意思不是「親密的」，而是「帶有性意味的」。</p><blockquote><p><strong>Sexualization.</strong> Behaving in a way that would generally be considered inappropriately <u>intimate</u> in the context or purpose of the community.</p></blockquote><p>另外，在下列部分中，若把 “process” 按字典義譯成 “처리할”，就會顯得不自然。依文章脈絡，此處將 “process” 譯為 “추스를” 才較為妥當。</p><blockquote><p>… give the community members involved time to <u>process</u> the incident.</p></blockquote><blockquote class="prompt-tip"><p>(<a href="https://stdict.korean.go.kr/">표준국어대사전</a> 표제어 중)</p><p><strong>추스르다「3」</strong>: 일이나 생각 따위를 수습하여 처리하다.</p></blockquote><p>另一方面，也有一些外來語很難找到恰當的固有詞對應。以 “community” 為例，若要譯成韓語固有詞，或許可以譯作 “공동체”，但我認為英文中的 “community” 所帶的語感，和韓語裡 “공동체” 這個詞的語感之間其實有不小差異。因此，我會盡可能將外來語轉寫為固有語，但若判斷這樣做很可能扭曲原文的語意或語感，便會像 “커뮤니티” 這樣直接保留。</p><p>基於這些考量，我並不是在做字典式、機械式的單字置換，而是希望選擇最貼近原文語意與脈絡的韓語表達來進行翻譯。</p><h4 id="其他韓語語文規範的遵循">其他韓語語文規範的遵循</h4><p>我也盡可能準確遵守韓文拼寫法、標準語規定等韓語語文規範。</p><h3 id="서약our-pledge-段落">“서약(Our Pledge)” 段落</h3><h4 id="小標題">小標題</h4><p>“Our Pledge” 若直譯，會變成「我們的誓言」，但考量到<a href="https://www.contributor-covenant.org/ko/version/2/1/code_of_conduct/">既有韓文譯文</a>已將其譯為 “서약”，且從文章自然度來看也完全在可接受範圍內，因此這次也維持譯作 “서약”。</p><h4 id="caste-詞語的翻譯">“caste” 詞語的翻譯</h4><p>在<a href="https://www.contributor-covenant.org/ko/version/2/1/code_of_conduct/">既有 2.1 版的韓文譯文</a>中，這個詞被直接譯作 “카스트 제도”。由於 caste 這個詞也確實具有<u>泛指世界各地精細且僵化的身分秩序制度</u>之學術性普通名詞意義，因此倒也不能單純說是誤譯。不過，在沒有提供這些詳細背景資訊的情況下，韓語日常使用中一提到 “카스트 제도”，大多數人首先會理解成「源自《摩奴法典》等、印度印度教徒特有的身分制度」，因此我考量原文脈絡後，將其譯為 “계급”。此處的 “caste” 應解讀為不侷限於特定國家（印度）或宗教（印度教），而是泛指各種類型與形式的身分制度及其所伴隨的階級，才較為妥當。</p><h4 id="不使用-성별-而使用-성-這一表達">不使用 “성별” 而使用 “성” 這一表達</h4><blockquote><p>We are committed to fostering an environment that respects and promotes the dignity, rights, and contributions of all individuals, regardless of … sex or gender, gender identity or expression, sexual orientation … or other status.</p></blockquote><p>考量原文欲傳達的價值與脈絡，此處所說的 “sex”、”gender”、”sexual orientation” 等，應該不會是在指基於男女二分法的區分。因此，我沒有使用隱含男女二分區分意義的 “성별”，而改用 “성” 這個詞，並盡可能保留人文社會學上 sex、gender、sexuality 三者之間的意義差異，譯為如下：</p><blockquote><p>… 생물학적 또는 사회적 성, 성 정체성 또는 성 표현, 성적 지향…</p></blockquote><h3 id="장려하는-행동encouraged-behaviors-및-제한하는-행동restricted-behaviors-段落">“장려하는 행동(Encouraged Behaviors)” 및 “제한하는 행동(Restricted Behaviors)” 段落</h3><h4 id="移除冒號">移除冒號(<code class="language-plaintext highlighter-rouge">:</code>)</h4><blockquote><p>With these considerations in mind, we agree to behave mindfully toward each other and act in ways that center our shared values, including:</p><ol><li>Respecting the <strong>purpose of our community</strong>, our activities, and our ways of gathering.<li>Engaging <strong>kindly and honestly</strong> with others. …</ol></blockquote><p>英文原文中，常會像上面這樣在一個完整句子之後用冒號列出例示清單；但現代韓語的語文規範中，冒號的用法主要限於標題之後列舉對應項目或補充說明等偏條列式的表達。因此，除非整篇文章本身就是用條列體來寫，否則像下面這樣寫會非常不自然，也很容易讓人覺得這是用機器翻譯或 LLM 草率處理出來的結果。這其實也是我個人對<a href="https://www.contributor-covenant.org/ko/version/2/1/code_of_conduct/">2.1 版韓文譯本</a>感到很可惜的地方之一。</p><blockquote><p>이러한 점을 유념하며, 우리는 서로를 사려 깊게 대하고 우리가 공유하는 다음 가치를 중심으로 행동할 것에 동의합니다:</p><ol><li>우리 <strong>공동체의 목적</strong>, 활동 및 모임 방식을 존중합니다.<li><strong>친절하고 정직하게</strong> 다른 사람들과 소통합니다. …</ol></blockquote><p>因此，為了符合韓語用法，我沒有把原文使用冒號的地方 그대로譯成雙點，而是改寫成句號(<code class="language-plaintext highlighter-rouge">.</code>)，讓文章讀起來更自然。</p><h4 id="that-would-generally-be-considered-inappropriately-表達的翻譯">“that would generally be considered inappropriately” 表達的翻譯</h4><p>此處與其把 “generally” 直譯為 “일반적으로”，我認為依照脈絡譯成 “대부분의 사람들에게” 會更自然。</p><blockquote><p>…<u>대부분의 사람들이</u> 부적절하다고 간주할 만한…</p></blockquote><h3 id="act-on-表達的翻譯">“act on” 表達的翻譯</h3><p>一開始我曾考慮是否要把 “act on” 簡單譯成 “이용하다”，但依脈絡來看，它更接近於禁止一切<u>基於他人身分相關資訊或個人資訊而進行的</u>行為，不論其主觀意圖為何。若只譯成 “이용하다”，感覺會把原意縮小，因此最後譯為如下：</p><blockquote><p><strong>비밀 침해.</strong> 타인의 신상 관련 정보 또는 개인적인 정보를 당사자의 허락 없이 공유하거나, 그 정보<u>를 바탕으로 행하는</u> 모든 행위.</p></blockquote><h3 id="문제-신고reporting-an-issue-段落">“문제 신고(Reporting an Issue)” 段落</h3><ul><li>“this Code of Conduct <strong>reinforces</strong> encouraged behaviors and norms that …”: 譯為 “본 행동 강령은 …는 권장 행동 방식과 규범을 <strong>증진합니다</strong>”<li>“in a timely manner”: 譯為 “적시에”<li>“while prioritizing safety and confidentiality”: 譯為 “안전과 비밀 유지를 우선시한다는 전제 하에”<li>“In order to <strong>honor</strong> these values”: 譯為 “이들 가치를 <strong>지키기</strong> 위해”<blockquote class="prompt-tip"><p>(<a href="https://www.oxfordlearnersdictionaries.com/">Oxford Learner’s Dictionaries</a> 표제어 중)</p><p><a href="https://www.oxfordlearnersdictionaries.com/definition/english/honor_2"><strong>honor</strong></a> <em>verb</em><br /> <u>keep promise</u> 3. <strong>honor something</strong> <em>(formal)</em> to do what you have agreed or promised to do</p></blockquote></ul><h3 id="피해-대응-및-교정addressing-and-repairing-harm-段落">“피해 대응 및 교정(Addressing and Repairing Harm)” 段落</h3><ul><li>“Addressing”: 譯為 “대응”<li>“Repairing”: 譯為 “교정”</ul><h4 id="event-consequence-repair-的翻譯"><code class="language-plaintext highlighter-rouge">Event:</code>, <code class="language-plaintext highlighter-rouge">Consequence:</code>, <code class="language-plaintext highlighter-rouge">Repair:</code> 的翻譯</h4><p>這部分在譯成韓語時其實讓我猶豫了不少。若直譯為「事件」、「結果」、「矯正」，整體會相當不自然。</p><p>為了讓文章讀起來自然，同時盡可能完整傳達<a href="#從應報正義到修復式正義的典範轉移">原文的哲學</a>，我反覆思考後做了以下處理。</p><ul><li>“Event”: 譯為 “적용 상황”<li>“Consequence”: 譯為 “대응 조치”<li>“Repair”: 一開始曾考慮譯為 “회복 조치”，但 “조치” 這種表達較偏向由他者介入執行，而不是當事人自發反省與改善，與原文旨趣不符，因此捨棄。最終譯為 “교정 노력”</ul><h4 id="seeking-clarification-on-expectations-表達的翻譯">“seeking clarification on expectations” 表達的翻譯</h4><p>“expectations” 也可以直譯為 “기대 사항”，這樣在意義上並非不通，但為了讓文章更順，我將其譯為 “준수 사항”。</p><blockquote class="prompt-tip"><p>(<a href="https://www.oxfordlearnersdictionaries.com/">Oxford Learner’s Dictionaries</a> 표제어 중)</p><p><a href="https://www.oxfordlearnersdictionaries.com/definition/english/expectation"><strong>expectation</strong></a> <em>noun</em><br /> 3. [countable, usually plural] a strong belief about the way something should happen or how somebody should behave</p></blockquote><p>“seeking clarification” 也可以譯成要求 “clarification”（說明）之類的意思，但依脈絡來看，在 교정 노력（Repair）項目中，寫的是引發問題的人在事後應採取的理想行動與態度，因此若把 clarification、seeking 分別譯成「說明」「要求」，整體意思就會變得奇怪。此處我認為最適合的理解，是將其譯為：為了自己反省、避免重蹈覆轍，主動努力把 “준수 사항”(expectations) 釐清並確實理解。</p><blockquote class="prompt-tip"><p>(<a href="https://www.oxfordlearnersdictionaries.com/">Oxford Learner’s Dictionaries</a> 표제어 중)</p><p><a href="https://www.oxfordlearnersdictionaries.com/definition/english/seek"><strong>seek</strong></a> <em>verb</em><br /> 2. [transitive] to ask somebody for something; to try to obtain or achieve something</p><p><a href="https://www.oxfordlearnersdictionaries.com/definition/english/clarification"><strong>clarification</strong></a> <em>noun</em><br /> [uncountable, countable] (formal)<br /> the act or process of making something clearer or easier to understand</p><ul><li><em>I am <strong>seeking clarification of</strong> the regulations.</em></ul></blockquote><h4 id="cooldown-表達的翻譯">“cooldown” 表達的翻譯</h4><p>按字典意義來看，它可以指冷卻、（運動後的）緩和運動、冷靜等；在這裡依脈絡最接近的是「平復情緒」的意思，也就是比較接近韓語裡說 “머리 좀 식혀라.” 時的 “식히다” 那種用法。</p><p>不過，若把 “time-limited cooldown period” 譯成 “한시적 진정 기간”，讀起來又有些不自然，因此這次韓文翻譯中，我將 “cooldown period” 譯成 “자숙 기간”。</p><h4 id="time-to-process-the-incident-表達的翻譯">“time to process the incident” 表達的翻譯</h4><p><a href="#比起字典式或機械式的單字翻譯更重視詞語在文中的語境">如前所述</a>，我將其譯為 “해당 일을 추스를 시간”。</p><h4 id="suspension-及-ban-表達的翻譯">“suspension” 及 “ban” 表達的翻譯</h4><p>在<a href="https://www.contributor-covenant.org/ko/version/2/1/code_of_conduct/">既有 2.1 版韓文譯文</a>中，”ban” 被譯為 “제재”，但所謂 제재 是一個涵蓋性很強的詞，包含警告、暫時限制活動等對違規行為可採取的各種措施，因此它所指為何並不明確。而英文單字 “ban” 的意思本就很清楚，就是禁止、停用；此外，像「（帳號等）永久停用」這類說法在韓語裡本來也相當自然、常見，因此我認為沒有特地避開而改用意譯的必要。</p><p>“suspension” 也是同樣的道理，它本來就明確帶有停職、停學等「停止」的意思，並不需要硬要意譯。</p><p>因此，我將 “Temporary Suspension”、”Permanent Ban” 分別譯為 “일시적 정지”、”영구 정지”。</p><h4 id="this-enforcement-ladder-is-intended-as-a-guideline-句子的翻譯">“This enforcement ladder is intended as a guideline.” 句子的翻譯</h4><p>“enforcement ladder” 我將其譯為 “단계적 집행 기준”。此外，這句話的脈絡是在說，上述分級執行標準終究只是眾多可能選項中的一種，用來保障社群管理者的裁量與決定權，因此我把冠詞 “a” 譯為 “하나의”。所以譯文如下：</p><blockquote><p><u>이 단계적 집행 기준은 하나의 기준선으로 마련한 것입니다.</u> 이는 커뮤니티의 최선의 이익에 부합하는 커뮤니티 관리자의 재량권과 판단 권한을 제한하지 않습니다.</p></blockquote><h2 id="結語">結語</h2><p>這類具有公益性質的文件與專案，有相當多都會由志工與貢獻者翻譯成多種語言。然而可惜的是，韓文翻譯的情況常常是要嘛因為沒有貢獻者而根本不存在譯本，要嘛即使有，也帶著明顯機械翻譯痕跡、讀起來非常彆扭，以至於即使身為韓國人，也會忍不住想著『還不如直接看英文算了』，然後切回英文頁面。這種經驗我其實遇過不少次。</p><p>這次決定投入韓文翻譯時，我心裡想的是：既然要做，就要盡量拿出一份讓讀者即使把它當成韓文作者一開始就直接用韓文寫成，也不會感到違和的高品質譯文。我一直努力想理解並呈現原文所承載的哲學與細微脈絡，尤其是相較既有 2.1 版，這次 3.0 版在哪些表達上做了調整，以及原作者們為什麼會做出那樣的選擇。</p><p>由於自然語言的特性，翻譯並不是說把同一份原文輸入進去，就會像函數一樣吐出完全相同的結果。不同譯者多少都會給出不同版本；這固然和譯者的能力有關，但更本質的原因在於，翻譯乃至寫作本來就不存在唯一的標準答案。近來我在幾乎所有工作中都會輔助性地使用 AI，甚至連這個部落格的文章，也接上 LLM API 做多語自動翻譯與發布。不過，唯獨這一次的工作，我是真的想拿出架式，好好做出一份我所能做到的最佳翻譯。我親自反覆檢視每一個表達，思考用什麼措辭才能最少扭曲、最完整而自然地傳達原意，最後交出的是一份帶有我主觀判斷、但也是我盡最大努力後的詮釋成果。在如今人人都在使用 AI 的時代，我認為至少像這種盟約、行為準則之類的重要文件翻譯，若不能比「把原文直接丟給 AI 叫它翻譯」的結果更好，那它作為譯本也就失去價值了。至少以 12026 年 3 月這個時間點來看，我有自信地說，機器翻譯或 LLM 難以完整保存的原文細微語感與脈絡，在<a href="https://github.com/EthicalSource/contributor_covenant/pull/1590">本次譯本</a>中都已盡可能完整保留下來。</p><p>以 12026 年 3 月 20 日這個時間點來看，《貢獻者盟約》3.0 版除了英文原文與我這次提交的韓文譯本之外，目前僅完成了孟加拉語、德語與中國大陸中文共 3 種語言的翻譯，而若查看<a href="https://github.com/EthicalSource/contributor_covenant/pulls">目前開放中的 PR 清單</a>，也能看到有不少語言雖然已提交翻譯初稿 PR，卻因缺少審閱者而尚未獲得最終批准。甚至別說 3.0 版了，仍停留在 1.4 版的語言也還不少。若有任何非韓語語者因任何原因讀到了這篇文章，由於<a href="https://github.com/EthicalSource/contributor_covenant?tab=contributing-ov-file#translators-and-native-speakers">參與方式並不複雜</a>，若願意在某個週末抽出一天左右的時間來貢獻，對 OES 與該語言的使用者而言，想必都會是很大的幫助。我自己也是第一次參與這類翻譯工作、第一次從頭到尾仔細讀完一份行為準則全文，但我認為這確實是一件很值得花上幾個小時的事情。韓國相較其總人口數，在 GitHub 等開源社群中活躍的開發者比例其實算相當高；既然如此，這次翻譯並提交的《貢獻者盟約 3.0 行為準則》<a href="https://github.com/EthicalSource/contributor_covenant/pull/1590">韓文譯本</a>若也能有更多其他韓國人參與審閱，而且最好還能被更多人於各處有用地採納與活用，我會很高興。</p><p>正如 <a href="https://ethicalsource.dev/blog/contributor-covenant-3/">OES 的部落格文章</a>中引用的 <strong>納森・施奈德（Nathan Schneider）</strong> 教授所說，《貢獻者盟約（Contributor Covenant）》作為建立負責任且透明社群的重要基礎，發揮了不可或缺的作用，實際上也確實有助於化解衝突。照慣例，很多人在 GitHub 等平台上可能只是按下 “Add a code of conduct” 按鈕後把模板貼上，但 GitHub 自動提供的模板不知為何自 2.0 版之後就一直沒有更新。由於 3.0 版相較於前面的 2.0、2.1 版已有相當大的變化與改善，因此若可以的話，我會建議透過<a href="https://www.contributor-covenant.org/adopt/">官方頁面</a>採用最新版。反正內容其實也不算長，若能趁這個過程至少完整從頭讀過一遍，我想會更有意義。希望大家能多多關注《貢獻者盟約 3.0 行為準則》以及這次製作的<a href="https://github.com/EthicalSource/contributor_covenant/pull/1590">韓文譯本</a>，就先寫到這裡。</p>]]> </content> </entry> <entry><title xml:lang="zh-TW">IR 資料撰寫方法（How to Prepare IR Materials）</title><link href="https://www.yunseo.kim/zh-TW/posts/how-to-prepare-ir-materials/" rel="alternate" type="text/html" hreflang="en" /><link href="https://www.yunseo.kim/ko/posts/how-to-prepare-ir-materials/" rel="alternate" type="text/html" hreflang="ko" /><link href="https://www.yunseo.kim/ja/posts/how-to-prepare-ir-materials/" rel="alternate" type="text/html" hreflang="ja" /><link href="https://www.yunseo.kim/zh-TW/posts/how-to-prepare-ir-materials/" rel="alternate" type="text/html" hreflang="zh-TW" /><link href="https://www.yunseo.kim/es/posts/how-to-prepare-ir-materials/" rel="alternate" type="text/html" hreflang="es" /><link href="https://www.yunseo.kim/pt-BR/posts/how-to-prepare-ir-materials/" rel="alternate" type="text/html" hreflang="pt-BR" /><link href="https://www.yunseo.kim/fr/posts/how-to-prepare-ir-materials/" rel="alternate" type="text/html" hreflang="fr" /><link href="https://www.yunseo.kim/de/posts/how-to-prepare-ir-materials/" rel="alternate" type="text/html" hreflang="de" /><link href="https://www.yunseo.kim/pl/posts/how-to-prepare-ir-materials/" rel="alternate" type="text/html" hreflang="pl" /><link href="https://www.yunseo.kim/cs/posts/how-to-prepare-ir-materials/" rel="alternate" type="text/html" hreflang="cs" /><link href="https://www.yunseo.kim/sw/posts/how-to-prepare-ir-materials/" rel="alternate" type="text/html" hreflang="sw" /><link href="https://www.yunseo.kim/am/posts/how-to-prepare-ir-materials/" rel="alternate" type="text/html" hreflang="am" /><published>2026-01-11T00:00:00+09:00</published> <updated>2026-01-11T00:00:00+09:00</updated> <id>https://www.yunseo.kim/zh-TW/posts/how-to-prepare-ir-materials/</id> <author> <name>Yunseo Kim</name> </author> <category term="Startup" /> <category term="IR" /> <summary xml:lang="zh-TW">整理 IR 資料的定義，以及為成功募資而必須納入優質 IR 資料的核心內容與結構重點。</summary> <content type="html" xml:lang="zh-TW"> <![CDATA[<p>整理 IR 資料的定義，以及為成功募資而必須納入優質 IR 資料的核心內容與結構重點。</p><em><p>* Mathematical equations and diagrams included in posts may not display properly when viewed with a feed reader.</p></em><h2 id="什麼是-ir-資料">什麼是 IR 資料？</h2><p><strong>IR</strong> 是 <strong>Investor Relations</strong> 的縮寫，指的是面向投資人說明並宣傳公司、建立關係並吸引投資所需的一切資料與活動的總稱。一般所說的 IR 資料，多半是指公司為了募資而向投資人介紹公司的文件。</p><h2 id="ir-資料應包含的內容">IR 資料應包含的內容</h2><p>由於 IR 資料的目標是募資，因此需要從投資人的角度，具說服力地呈現「為什麼應該投資這家公司」。因此，內容應涵蓋服務摘要、市場環境、產品／服務說明、競爭環境、成果、商業模式、未來成長計畫、團隊組成等整體營運面向。</p><ul><li><strong>Pitch Deck（簡報型簡介）</strong>：<ul><li>目的在於以 <strong>短而有力</strong> 的方式，對廣泛的潛在投資人留下 <strong>正向的第一印象</strong><li>用於早期階段募資<li>約 10–15 張投影片，以精簡且偏視覺化的內容為主</ul><li><strong>IR Deck（完整 IR 簡報）</strong>：<ul><li>提供公司的 <strong>更深入的財務資訊與長期策略</strong><li>提供給已開始展現興趣、即將做決策的專業投資人<li>讓投資人能做出 <strong>更深入的評估與判斷</strong><li>約 20–30 張投影片，提供更具體的 <strong>財務規劃、市場分析、團隊組成、競品分析</strong> 等詳細資訊</ul></ul><h3 id="使命願景missionvision">使命／願景（Mission/Vision）</h3><ul><li>我們要提供的本質價值是什麼？</ul><blockquote class="prompt-tip"><p>這可視為公司的核心身份。在 IR 資料的最前段，建議將公司的使命與願景各用一句話，簡潔且清楚地表達出來。</p></blockquote><h3 id="服務摘要">服務摘要</h3><h4 id="問題problem">問題（Problem）</h4><ul><li>這個服務想解決市面上的什麼問題？<li>消費者對這個問題的不便感有多強？<li>為什麼這個問題很重要？<li>是否存在解決該問題的需求？目標族群是誰？</ul><h4 id="解決方案solution">解決方案（Solution）</h4><ul><li>將如何具體解決上述問題？<li>相較既有方式，消費者與最終使用者能獲得哪些好處？</ul><blockquote class="prompt-tip"><p>投資人很多時候並不是該領域的專家，因此建議以非開發者、偏消費者的視角來說明服務；技術細節可待後續有提問時再個別回應。</p></blockquote><h3 id="市場規模market-size">市場規模（Market Size）</h3><p>若以金額直接定義市場規模，會因計算方式與各種變數而使結果差異很大，也較容易引發不同意見。 改以潛在使用者數、交易次數／頻率等其他指標來呈現，通常更安全也更有效。</p><ul><li><strong>TAM（Total Addressable Market，整體市場）</strong>：假設排除所有競爭者並達成全球市佔 100% 的理想情境；當產品或服務面向全球提供時，理論上可觸及的最大市場規模<li><strong>SAM（Service Available Market，有效市場）</strong>：考量地理、基礎設施、法規等限制條件後，現實中可提供服務、且公司實際追求範圍內的市場規模<li><strong>SOM（Service Obtainable Market，可取得市場／收益市場）</strong>：考量競爭情況、公司能力、行銷策略等後，即便在 SAM 之內，初期實際可占有的市場規模</ul><blockquote class="prompt-tip"><p>估算市場規模時，常見做法是：對整體市場或有效市場引用第三方市調資料，提供具體數字與指標；但對於新創而言當下真正重要的「收益市場」規模，則用「若在該市場達到市佔 X%，即可達成 Y 的營收」的方式說明。坦白說，我在準備創業時，最初內部撰寫的 IR 資料草稿也曾這樣寫。</p><p>但這樣做的問題是：從投資人角度來看，對「要拿下市場的幾 %」這種計畫很難完全信任。服務上線並不代表就能輕易取得市佔；更何況泛泛地以市場所有成員為對象，宣稱要達成某個市佔比例，說服力不足。</p><p>因此，除了要證明你鎖定的整體市場與有效市場足夠大之外，更重要的是提出邏輯：你如何定義 <strong>初期客群（Immediate Market）</strong>，以及接下來會如何分階段擴展到哪些客群，進而把收益市場做大。</p></blockquote><blockquote class="prompt-tip"><p><strong>商業時機（Timing）</strong></p><ul><li>商業上「時機」也非常重要<li>必須能向投資人說明：為什麼現在這個生意有機會做成、為什麼現在該投資<li>需提出此刻適合執行的理由，例如技術可行性、人們行為模式的改變、社會趨勢、環境變化等</ul></blockquote><h3 id="產品服務說明product">產品／服務說明（Product）</h3><ul><li>產品／服務的主要特點與功能是什麼？<li>具體運作方式、示例是什麼？</ul><h3 id="商業模式business-model">商業模式（Business Model）</h3><ul><li>要怎麼賺錢？<li>誰會付錢？（最終使用者與付費客戶不一定總是同一群，因此必須明確指出實際帶來營收的是誰）<li>哪些部分要收費？如何定價？</ul><h3 id="競爭環境competition">競爭環境（Competition）</h3><ul><li>主要競爭對手是誰？<li><strong>從客戶角度</strong> 看，相較競品／競爭服務，我們的產品／服務在哪些方面更優、有哪些優勢？<li>哪些服務要定義為競爭服務？哪些客群要作為主要目標？</ul><blockquote class="prompt-tip"><p>只有把競爭者分析清楚，才能有效向投資人展現你確實掌握市場現況。</p></blockquote><h3 id="成果與市場進入策略go-to-market-strategy">成果與市場進入策略（Go-to Market Strategy）</h3><ul><li>對商業成功最關鍵的核心指標是什麼？<ul><li>e.g. 訂單數、月活躍使用者（MAU）、月交易金額等</ul><li>以該指標為主，已取得哪些成果？<li>公司的主要行銷手段與渠道是什麼？<li>新客獲取方式與成本是多少？<li>*<strong>客戶終身價值（LTV）</strong>是多少？</ul><blockquote class="prompt-info"><p>*<strong>客戶終身價值（Customer Lifetime Value, LTV）</strong>：將單一使用者在使用該服務的整段期間內，總共能帶來多少利益以數值方式量化</p></blockquote><blockquote class="prompt-tip"><p>建議排除核心指標以外的次要指標。</p></blockquote><blockquote class="prompt-tip"><p><strong>若是仍無營收的超早期新創</strong></p><ul><li>設定並呈現欲提供服務的 <strong>損益兩平點</strong><li>此時不要誇大收益相關指標，應以保守觀點、務實地設定<li>提出開始產生營收的第一年收益情境，並附上未來數年的營收規劃，讓人相信能持續成長<ul><li>1 年短期預測<li>3 年中期預測<li>5 年長期預測</ul><li>積極利用圖表與表格，讓內容能一眼掌握<li>納入 <strong>假設驗證投影片</strong>，說明為何要這樣設定核心指標與營收情境，以提升論據的可信度<ul><li>需透過多次實驗與假設驗證，建立對預期營收情境的扎實根據</ul></ul></blockquote><h3 id="團隊組成the-team">團隊組成（The Team）</h3><ul><li>與其介紹所有人，不如以包含代表本人在內、負責關鍵角色的核心成員為主<li>經歷、技術重點建議控制在 2–3 項，並搭配 Logo 等方式提升可讀性<li>若有曾提供或正在提供關鍵協助的投資人／顧問，也可以一併納入</ul><h3 id="未來成長計畫milestones">未來成長計畫（Milestones）</h3><ul><li>依時間點、階段提出欲達成的目標<li>一般會設定「下一輪募資前」的目標（例如種子輪就設定到 Series A 前，Series A 就設定到 Series B 前）<li>提出希望募資金額與使用計畫<li>與其把區間拉到半年以上過長，不如切成約 2 個月的單位來呈現</ul><h3 id="財務規劃financials">財務規劃（Financials）</h3><p>若是 IR Deck，應包含財務規劃。</p><ul><li>未來 3–5 年的財務規劃表<li><strong>單位經濟（Unit Economics）</strong>：以單一客戶單位計算的收入與成本<li><strong>燒錢速度（Burn rate）</strong>：新創以現金支出的創業成本、研發費、其他費用等的消耗速度／比率<li>總收入與總成本<li>EBITDA 或現金流量表等</ul><blockquote class="prompt-warning"><ul><li>請注意不要提出過度不切實際的財務規劃<li>預估營收常被高估、所需成本常被低估，因此估算預期營收規模時務必謹慎<li>所需成本應考量產品／服務開發費與營運費等，盡可能精準推估</ul></blockquote><h2 id="各投資階段應強調的重點">各投資階段應強調的重點</h2><h3 id="種子輪seed">種子輪（Seed）</h3><ul><li>開發 MVP、確認市場反應、驗證商業模式可行性的階段<li>應著重強調：初期假設與商業模式的驗證結果、MVP 實驗結果，以及其所帶來的營收（若有）</ul><h3 id="pre-a">Pre-A</h3><ul><li>需證明成長潛力，並 확보（取得）產品開發、行銷、招募等所需的追加資金的階段<li>需說明商業的核心指標是什麼、透過哪些活動成長得多好，以及未來的成長可能性</ul><h3 id="a-輪series-a">A 輪（Series A）</h3><ul><li>進入正式成長並提升企業價值的階段<li>由於此時通常應已完成假設驗證，需以可量化的成果來取得投資人信任</ul><h2 id="一些小技巧">一些小技巧</h2><ul><li>前五張投影片尤其要用心，確保能留下正向的第一印象<li>第一張的使命／願景也可以在最後一張再放一次<li>全部內容用「先講結論」的方式傳達<li>投資的對象是 <strong>公司</strong>，因此在 IR 資料中，公司名應優先於服務名<li>閱讀 IR 資料的潛在投資人未必是產業從業者，因此盡量用淺顯詞彙解釋；不可避免使用專業術語時，請補上說明<li>不要把市場問題與解決方案混在一起，務必分開<li>文字以關鍵字為主；使用圖片時避免截圖式圖片，以提升可讀性<li>用精準且具體的數據表或圖表呈現<li>注意不要漏掉團隊介紹、希望募資金額與使用計畫<li>若能一併提出資金回收（Exit）策略會更好<li>即使未必完美，也應簡要提出股東結構比例的規劃<li>不要在正文塞入過多資料，必要時拆成附錄<li>最後一張投影片寫上聯絡方式（Email、電話、姓名）<li>字體也很重要，建議使用如 <a href="https://cactus.tistory.com/306">Pretendard</a> 等可讀性高的字體，並以 PDF 準備以避免跑版或亂碼</ul><h2 id="參考資料">參考資料</h2><h3 id="企業公告渠道-kind">企業公告渠道 KIND</h3><p><a href="https://kind.krx.co.kr/corpgeneral/irschedule.do?method=searchIRScheduleMain&amp;gubun=iRMaterials">https://kind.krx.co.kr/corpgeneral/irschedule.do?method=searchIRScheduleMain&amp;gubun=iRMaterials</a></p><ul><li>韓國交易所營運的企業公告渠道<li>提供在 KOSPI、KOSDAQ、KONEX 上市公司的公告資訊<li>可查看上市公司的 IR 資料，用於參考近期其他 IR 資料的結構與組成方式</ul>]]> </content> </entry> <entry><title xml:lang="zh-TW">密碼學的基本概念</title><link href="https://www.yunseo.kim/zh-TW/posts/basic-concepts-of-cryptography/" rel="alternate" type="text/html" hreflang="en" /><link href="https://www.yunseo.kim/ko/posts/basic-concepts-of-cryptography/" rel="alternate" type="text/html" hreflang="ko" /><link href="https://www.yunseo.kim/ja/posts/basic-concepts-of-cryptography/" rel="alternate" type="text/html" hreflang="ja" /><link href="https://www.yunseo.kim/zh-TW/posts/basic-concepts-of-cryptography/" rel="alternate" type="text/html" hreflang="zh-TW" /><link href="https://www.yunseo.kim/es/posts/basic-concepts-of-cryptography/" rel="alternate" type="text/html" hreflang="es" /><link href="https://www.yunseo.kim/pt-BR/posts/basic-concepts-of-cryptography/" rel="alternate" type="text/html" hreflang="pt-BR" /><link href="https://www.yunseo.kim/fr/posts/basic-concepts-of-cryptography/" rel="alternate" type="text/html" hreflang="fr" /><link href="https://www.yunseo.kim/de/posts/basic-concepts-of-cryptography/" rel="alternate" type="text/html" hreflang="de" /><link href="https://www.yunseo.kim/pl/posts/basic-concepts-of-cryptography/" rel="alternate" type="text/html" hreflang="pl" /><link href="https://www.yunseo.kim/cs/posts/basic-concepts-of-cryptography/" rel="alternate" type="text/html" hreflang="cs" /><link href="https://www.yunseo.kim/sw/posts/basic-concepts-of-cryptography/" rel="alternate" type="text/html" hreflang="sw" /><link href="https://www.yunseo.kim/am/posts/basic-concepts-of-cryptography/" rel="alternate" type="text/html" hreflang="am" /><published>2025-11-26T00:00:00+09:00</published> <updated>2025-11-26T00:00:00+09:00</updated> <id>https://www.yunseo.kim/zh-TW/posts/basic-concepts-of-cryptography/</id> <author> <name>Yunseo Kim</name> </author> <category term="Dev" /> <category term="Cryptography" /> <summary xml:lang="zh-TW">說明什麼是密碼學，介紹對稱式與非對稱式密碼學、Kerckhoffs 原則等核心概念，幫助理解現代加密系統與通訊協定安全的基礎。</summary> <content type="html" xml:lang="zh-TW"> <![CDATA[<p>說明什麼是密碼學，介紹對稱式與非對稱式密碼學、Kerckhoffs 原則等核心概念，幫助理解現代加密系統與通訊協定安全的基礎。</p><em><p>* Mathematical equations and diagrams included in posts may not display properly when viewed with a feed reader.</p></em><h2 id="什麼是-암호학">什麼是 암호학</h2><p><strong>密碼學（cryptography）</strong>本質上是科學的一個分支，目標是保護各種<strong>通訊協定（protocol）</strong>不受敵對行為的攻擊。</p><p>這裡所說的「協定」，是指一個或多個人為了達成某個目的而必須遵守的一連串步驟清單。舉例來說，若想在多台裝置間共享剪貼簿，下面的流程就可以視為用於剪貼簿共享的協定：</p><ol><li>若某台裝置的剪貼簿內容發生變更，就將該內容複製並上傳到伺服器。<li>伺服器偵測到共享剪貼簿有變更時，通知其餘裝置。<li>其餘裝置收到通知後，自伺服器下載更新後的共享剪貼簿內容。</ol><p>不過這並不是一個良好的協定：如果剪貼簿內容在上傳及下載時都以明文形式傳輸，那麼在通訊過程中，路途中介入的人，或是伺服器一方，都可能偷看剪貼簿內容。此時若考慮到企圖竊取剪貼簿內容的敵手，並試圖加以防禦，這正是密碼學要處理的工作。</p><h2 id="對稱式密碼學">對稱式密碼學</h2><h3 id="對稱式加密">對稱式加密</h3><blockquote><p>想像一個情境：愛麗絲（Alice）必須寫一封信給鮑勃（Bob）。她為了將機密資訊傳給鮑勃，命令一位信差（messenger）把信送去。 但是愛麗絲並不完全信任這位信差，希望傳遞中的訊息能對包括信差在內的所有人保密，只讓鮑勃一人得知。</p></blockquote><p>為了應付這種情況而在很久以前就被發明出來的密碼學演算法，就是<strong>對稱式加密演算法（symmetric encryption algorithm）</strong>。</p><blockquote class="prompt-info"><p><strong>原語（primitive）</strong><br /> primitive 這個單字在字典上有「原始的」、「原始事物」之意。 在密碼學中也經常使用 primitive 這個詞，指的是構成整個密碼系統的最小單位的函式或演算法。 可以把它想成「基本構件」、「基礎邏輯」之類的概念。</p></blockquote><p>考慮一個提供下列兩個函式的原語：</p><ul><li><code class="language-plaintext highlighter-rouge">ENCRYPT</code>：輸入<strong>祕密金鑰（secret key）</strong>（通常是很大的數）與<strong>訊息（message）</strong>，輸出一串數字序列作為加密後的訊息<li><code class="language-plaintext highlighter-rouge">DECRYPT</code>：為 <code class="language-plaintext highlighter-rouge">ENCRYPT</code> 的反函式，輸入相同的祕密金鑰與加密後的訊息，輸出原始訊息</ul><p>若要利用這樣的加密原語，使包括信差在內的第三者無法讀取愛麗絲的訊息，就必須先由愛麗絲與鮑勃事先碰面，約定好要使用哪一把祕密金鑰。之後愛麗絲便可使用 <code class="language-plaintext highlighter-rouge">ENCRYPT</code> 函式與事先約定的祕密金鑰將訊息加密，再透過信差將密文交給鮑勃。鮑勃則使用相同的祕密金鑰與 <code class="language-plaintext highlighter-rouge">DECRYPT</code> 函式還原出原始訊息。</p><p>像這樣使用祕密金鑰把目標加密，使其在表面上與毫無意義的雜訊無法區分，正是密碼學中保護協定的典型方法。</p><p>對稱式加密屬於更大一類的密碼學演算法——<strong>對稱式密碼學（symmetric cryptography）</strong>或<strong>祕密金鑰密碼學（secret key cryptography）</strong>，在某些情況下，實際使用的金鑰甚至可能不只一把。</p><h2 id="kerckhoffs-原則">Kerckhoffs 原則</h2><p>今天我們使用的通訊手段，比紙本信件強大得多——電腦與網際網路讓我們幾乎可以即時溝通。但換個角度看，這也意味著惡意的「信差」變得更強大了：可能是咖啡廳等場所的非安全公共 Wi-Fi，也可能是電信業者（ISP）、構成網際網路並轉送訊息的各式通訊設備與伺服器、政府機構，甚至就藏在執行演算法的那台裝置裡。敵手可以即時觀察大量訊息，並在不被察覺的情況下，以奈秒為單位竄改、竊聽或審查訊息。</p><p>在漫長的試誤過程中，密碼學界總結出一條建立可信安全性的根本準則：<u>必須公開讓大家分析這些原語</u>。與此相對的做法可以稱為<strong>以模糊性為基礎的安全性（security by obscurity）</strong>，其侷限相當明顯，因而在今日已幾乎被淘汰。</p><p>這條根本準則最早由荷蘭語言學家兼密碼學家奧古斯特·克爾克霍夫斯（Auguste Kerckhoffs）於 11883 年提出，被稱為<strong>克爾克霍夫斯原則（Kerckhoffs’s principle）</strong>。美國數學家、電腦科學家、密碼學家，同時也是資訊理論之父的克勞德·香農（Claude Shannon），也以「敵人知道這套系統（The enemy knows the system）」這句話描述了同一原則，即「在設計任何系統時，都必須假設敵人終究會搞清楚這個系統的運作方式」，這句話則被稱為<strong>香農箴言（Shannon’s maxim）</strong>。</p><p>一套密碼體系的安全性必須<strong>只依賴金鑰的祕密性</strong>，就算密碼體系本身被公開也不該有問題，反而應該積極公開，像 AES 的例子那樣，讓眾多<strong>密碼分析師（cryptanalyst）</strong>可以加以驗證。任何祕密都有外洩風險，因此都是潛在的失敗點；從防禦者的角度來看，需要保密的部分越少越有利。像密碼體系這樣龐大而複雜的整個系統，要長期保密極為困難；相較之下，只維持金鑰的祕密性要容易得多。而且就算祕密真的外洩，與其整套更換整個密碼體系，只替換外洩的金鑰為新的金鑰，成本要低得多。</p><h2 id="非對稱式密碼學">非對稱式密碼學</h2><p>許多實際運作的協定確實是建立在對稱式密碼學之上，但這種作法隱含一個前提：參與的雙方必須至少有一次可以私下碰面，來約定金鑰。因此事前應如何決定金鑰並安全地分享，就成為一項問題，稱為<strong>金鑰分配（key distribution）</strong>。金鑰分配問題長期以來都是難題，直到 11970 年代後期，出現了一類稱為<strong>非對稱式密碼學（asymmetric cryptography）</strong>或<strong>公開金鑰密碼學（public key cryptography）</strong>的演算法，才終於獲得解決。</p><p>典型的非對稱式密碼學原語包括：<strong>金鑰交換（key exchange）</strong>、<strong>非對稱式加密（asymmetric encryption）</strong>與<strong>數位簽章（digital signature）</strong>等。</p><h3 id="金鑰交換">金鑰交換</h3><p><strong>金鑰交換</strong>的大致流程如下：</p><ol><li>愛麗絲與鮑勃同意使用某個共同的參數集合 $G$<li>愛麗絲與鮑勃各自選出要使用的<strong>私鑰（private key）</strong> $a, b$<li>愛麗絲與鮑勃把最初約定好的共同參數 $G$ 與各自的私鑰 $a$、$b$ 結合，計算出<strong>公開金鑰（public key）</strong> $A = f(G,a)$、$B = f(G,b)$，並公開交換<li>愛麗絲利用鮑勃的公開金鑰 $B = f(G,b)$ 與自己的私鑰 $a$ 計算 $f(B,a) = f(f(G,b),a)$；鮑勃則同樣利用愛麗絲的公開金鑰 $A = f(G,a)$ 與自己的私鑰 $b$ 計算 $f(A,b) = f(f(G,a),b)$<li>若選擇的 $f$ 具有 $f(f(G,a),b) = f(f(G,b),a)$ 這樣的性質，那麼最終愛麗絲與鮑勃便共享同一個祕密；而第三者雖然知道 $G$ 以及公開金鑰 $A = f(G,a)$、$B = f(G,b)$，卻無法僅憑這些資訊求出 $f(A,b)$，因此無法得知這個祕密</ol><p>通常會將這樣取得的共享祕密，拿來作為<a href="#對稱-加密">對稱式加密</a>中的祕密金鑰，之後用來加密雙方要交換的其他訊息。</p><p>史上第一個公開發表、也是最具代表性的金鑰交換演算法，是以其兩位發明者姓氏命名的 Diffie–Hellman 金鑰交換演算法（發明者為迪菲（Diffie）與赫爾曼（Hellman））。</p><p>然而 Diffie–Hellman 金鑰交換也有其侷限。想像有個攻擊者在公開金鑰交換的階段，攔截了交換中的公開金鑰 $A = f(G,a)$ 與 $B = f(G,b)$，並將它們替換成自己的公開金鑰 $M = f(G,m)$ 再分別轉交給愛麗絲與鮑勃。此時愛麗絲與攻擊者會共享一個假的祕密 $f(M, a) = f(A, m)$，鮑勃與攻擊者則共享另一個假的祕密 $f(M, b) = f(B, m)$。於是攻擊者便能對愛麗絲假裝自己是鮑勃，對鮑勃則假裝自己是愛麗絲。這種情況就稱為<u><strong>中間人攻擊（man-in-the-middle, MITM）成功攻破了這個協定</strong></u>。因此，金鑰交換本身並不能解決「信任誰」的問題，只是在參與者眾多時，能大幅簡化流程。</p><h3 id="非對稱式加密">非對稱式加密</h3><p>在 Diffie–Hellman 金鑰交換演算法問世後，很快地又有後續發明問世，其中最著名的便是以三位發明者姓氏命名的 <strong>RSA 演算法（RSA algorithm）</strong>：羅納德·李維斯特（Ronald Rivest）、阿迪·沙米爾（Adi Shamir）、雷納德·阿德爾曼（Leonard Adleman）。RSA 同時提供公開金鑰加密（非對稱式加密）與數位簽章兩種原語，兩者皆屬於非對稱式密碼學的一部分。</p><p>對於<strong>非對稱式加密</strong>來說，其基本目標——透過加密來確保機密性——與<a href="#對稱-加密">對稱式加密</a>類似。不過，與在加密與解密兩側都使用同一把對稱金鑰的對稱式加密不同，非對稱式加密具備以下特徵：</p><ul><li>依賴兩種金鑰：公開金鑰與私鑰<li>任何人都可以用公開金鑰加密，但只有持有私鑰的人才能解密</ul><p>可以想像成這樣的比喻：</p><ol><li>存在一個打開的盒子（公開金鑰），任何人都能把訊息放進去並鎖上；但一旦鎖上，就只能用鮑勃手上的那把鑰匙（私鑰）打開。<li>愛麗絲將要傳遞的訊息放入盒中並鎖上（加密），然後交給鮑勃。<li>鮑勃收到上鎖的盒子（加密後的訊息）後，用自己持有的鑰匙（私鑰）打開盒子，取出訊息（解密）。</ol><h3 id="數位簽章">數位簽章</h3><p>RSA 不僅能提供非對稱式加密，還能實作<strong>數位簽章</strong>。這個數位簽章原語在建立愛麗絲與鮑勃之間的信任關係上，帶來了極大的幫助。簽署訊息時，簽署者會使用自己的私鑰；而其他人要驗證該簽章的真偽時，則會同時使用被簽署的訊息、簽章本身，及簽署者的公開金鑰來進行驗證。</p><h2 id="密碼學的效用">密碼學的效用</h2><p>既然密碼學的目標是保護協定不受敵對行為的影響，那麼該協定想達成什麼目的，就決定了密碼學能發揮何種效用。大多數密碼學原語與協定，至少具備下列其中一種性質：</p><ul><li><strong>機密性（confidentiality）</strong>：對不應得知資訊的人隱藏或保護部分資訊<li><strong>認證（authentication）</strong>：識別通訊對象（例如確認收到的訊息是否真的是由愛麗絲發送）</ul><h2 id="密碼學生態系">密碼學生態系</h2><pre><code class="language-mermaid">flowchart TD
    Alice[密碼學研究者]-- 發明原語 --&gt;Primitive(提出新的原語)
    Alice-- 發明協定 --&gt;Protocol(提出新的協定)
    Alice-. 舉辦競賽 .-&gt;C(演算法競賽)

    David[民間產業界]-. 資金支援 .-&gt;Alice
    David-. 舉辦競賽 .-&gt;C

    Eve[政府機關]-. 資金支援 .-&gt;Alice
    Eve-. 舉辦競賽 .-&gt;C

    Primitive --&gt; t1{"能否實作？"}
    t1-- 是 --&gt;Protocol
    t1-- 否 --&gt;term1@{ shape: framed-circle, label: "停止" }

    Protocol-- 參加競賽 --&gt;C
    Protocol-- 標準化 --&gt;Standard(標準)
    Protocol-- 申請專利 --&gt;Patent(專利到期)
    Protocol-- 實作 --&gt;Library(函式庫)
    
    C-- 競賽獲勝 --&gt;Standard
    C-- 淘汰 --&gt;term2@{ shape: framed-circle, label: "停止" }

    Standard-- 實作 --&gt;Library
    Standard-- 淘汰 --&gt;term3@{ shape: framed-circle, label: "停止" }

    Patent-- 淘汰 --&gt;term2@{ shape: framed-circle, label: "停止" }
    Patent-- 標準化 --&gt;Standard
    Patent-- 實作 --&gt;Library

    Library-- 標準化 --&gt;Standard
    Library-- 安全性被攻破 --&gt;term4@{ shape: framed-circle, label: "停止" }
</code></pre>]]> </content> </entry> <entry><title xml:lang="zh-TW">線性變換、零空間與像</title><link href="https://www.yunseo.kim/zh-TW/posts/linear-transformation-nullspace-and-image/" rel="alternate" type="text/html" hreflang="en" /><link href="https://www.yunseo.kim/ko/posts/linear-transformation-nullspace-and-image/" rel="alternate" type="text/html" hreflang="ko" /><link href="https://www.yunseo.kim/ja/posts/linear-transformation-nullspace-and-image/" rel="alternate" type="text/html" hreflang="ja" /><link href="https://www.yunseo.kim/zh-TW/posts/linear-transformation-nullspace-and-image/" rel="alternate" type="text/html" hreflang="zh-TW" /><link href="https://www.yunseo.kim/es/posts/linear-transformation-nullspace-and-image/" rel="alternate" type="text/html" hreflang="es" /><link href="https://www.yunseo.kim/pt-BR/posts/linear-transformation-nullspace-and-image/" rel="alternate" type="text/html" hreflang="pt-BR" /><link href="https://www.yunseo.kim/fr/posts/linear-transformation-nullspace-and-image/" rel="alternate" type="text/html" hreflang="fr" /><link href="https://www.yunseo.kim/de/posts/linear-transformation-nullspace-and-image/" rel="alternate" type="text/html" hreflang="de" /><link href="https://www.yunseo.kim/pl/posts/linear-transformation-nullspace-and-image/" rel="alternate" type="text/html" hreflang="pl" /><link href="https://www.yunseo.kim/cs/posts/linear-transformation-nullspace-and-image/" rel="alternate" type="text/html" hreflang="cs" /><link href="https://www.yunseo.kim/sw/posts/linear-transformation-nullspace-and-image/" rel="alternate" type="text/html" hreflang="sw" /><link href="https://www.yunseo.kim/am/posts/linear-transformation-nullspace-and-image/" rel="alternate" type="text/html" hreflang="am" /><published>2025-09-18T00:00:00+09:00</published> <updated>2025-09-18T00:00:00+09:00</updated> <id>https://www.yunseo.kim/zh-TW/posts/linear-transformation-nullspace-and-image/</id> <author> <name>Yunseo Kim</name> </author> <category term="Mathematics" /> <category term="Linear Algebra" /> <summary xml:lang="zh-TW">探討線性變換（linear transformation）的定義，並介紹兩個關鍵子空間——零空間（null space）與像（image）——以及它們的維度（nullity、rank）與相關定理（維度定理、單射與滿射的判別等）。</summary> <content type="html" xml:lang="zh-TW"> <![CDATA[<p>探討線性變換（linear transformation）的定義，並介紹兩個關鍵子空間——零空間（null space）與像（image）——以及它們的維度（nullity、rank）與相關定理（維度定理、單射與滿射的判別等）。</p><em><p>* Mathematical equations and diagrams included in posts may not display properly when viewed with a feed reader.</p></em><h2 id="prerequisites">Prerequisites</h2><ul><li><a href="/zh-TW/posts/vectors-and-linear-combinations/">向量與線性組合</a><li><a href="/zh-TW/posts/vector-spaces-subspaces-and-matrices/">向量空間、子空間，以及矩陣</a><li><a href="posts/linear-dependence-and-independence-basis-and-dimension/">線性相依與線性獨立、基底與維度</a><li>單射、滿射</ul><h2 id="線性變換">線性變換</h2><p>保留向量空間結構的特殊函數稱為<strong>線性變換（linear transformation）</strong>，此概念在純數學、應用數學、社會科學、自然科學與工程中極為常見且重要。</p><blockquote class="prompt-info"><p><strong>定義</strong><br /> 設 $\mathbb{V}$ 與 $\mathbb{W}$ 為 $F$-向量空間。對所有 $\mathbf{x}, \mathbf{y} \in \mathbb{V}$ 與 $c \in F$，若函數 $T: \mathbb{V} \to \mathbb{W}$ 滿足下列兩條件，則稱 $T$ 為由 $\mathbb{V}$ 到 $\mathbb{W}$ 的<strong>線性變換（linear transformation）</strong>。</p><ol><li>$T(\mathbf{x}+\mathbf{y}) = T(\mathbf{x}) + T(\mathbf{y})$<li>$T(c\mathbf{x}) = cT(\mathbf{x})$</ol></blockquote><p>稱 $T$ 是線性變換時，亦簡稱 $T$ 是<strong>線性（linear）</strong>。線性變換 $T: \mathbb{V} \to \mathbb{W}$ 具有下列四個性質。</p><blockquote class="prompt-info"><ol><li>$T$ 線性 $\quad \Rightarrow \quad $ $T(\mathbf{0}) = \mathbf{0}$<li>$T$ 線性 $\quad \Leftrightarrow \quad $ $T(c\mathbf{x} + \mathbf{y}) = cT(\mathbf{x}) + T(\mathbf{y}) \; \forall \, \mathbf{x}, \mathbf{y} \in \mathbb{V},\, c \in F$<li>$T$ 線性 $\quad \Rightarrow \quad $ $T(\mathbf{x} - \mathbf{y}) = T(\mathbf{x}) - T(\mathbf{y}) \; \forall \, \mathbf{x}, \mathbf{y} \in \mathbb{V}$<li>$T$ 線性 $\quad \Leftrightarrow \quad $ $T\left( \sum_{i=1}^n a_i \mathbf{x}_i \right) = \sum_{i=1}^n a_i T(\mathbf{x}_i)$</ol></blockquote><blockquote class="prompt-tip"><p>要證明一個函數為線性時，通常使用第 2 點性質最為便利。</p></blockquote><blockquote class="prompt-tip"><p>線性代數在幾何中的應用極廣，原因在於許多重要的幾何變換都是線性的。特別是三大典型幾何變換：<strong>旋轉</strong>、<strong>對稱</strong>、<strong>投影</strong>皆屬線性變換。</p></blockquote><p>以下兩個線性變換尤為常見。</p><blockquote class="prompt-info"><p><strong>恆等變換與零變換</strong><br /> 對 $F$-向量空間 $\mathbb{V}, \mathbb{W}$：</p><ul><li><strong>恆等變換（identity transformation）</strong>：對所有 $\mathbf{x} \in \mathbb{V}$ 定義 $I_\mathbb{V}(\mathbf{x}) = \mathbf{x}$ 的函數 $I_\mathbb{V}: \mathbb{V} \to \mathbb{V}$<li><strong>零變換（zero transformation）</strong>：對所有 $\mathbf{x} \in \mathbb{V}$ 定義 $T_0(\mathbf{x}) = \mathbf{0}$ 的函數 $T_0: \mathbb{V} \to \mathbb{W}$</ul></blockquote><p>除此之外，還有許多概念可表為線性變換。</p><blockquote class="prompt-tip"><p><strong>線性變換的例子</strong></p><ul><li>旋轉<li>對稱<li>投影<li><a href="/zh-TW/posts/vector-spaces-subspaces-and-matrices/#轉置矩陣對稱矩陣斜對稱矩陣">轉置</a><li>可微函數的微分<li>連續函數的積分</ul></blockquote><h2 id="零空間與像">零空間與像</h2><h3 id="零空間與像的定義">零空間與像的定義</h3><blockquote class="prompt-info"><p><strong>定義</strong><br /> 對向量空間 $\mathbb{V}, \mathbb{W}$ 與線性變換 $T: \mathbb{V} \to \mathbb{W}$：</p><ul><li><p><strong>零空間（null space）</strong>或<strong>核（kernel）</strong>：由滿足 $T(\mathbf{x}) = \mathbf{0}$ 的 $\mathbf{x} \in \mathbb{V}$ 所成的集合，記作 $\mathrm{N}(T)$</p>\[\mathrm{N}(T) = \{ \mathbf{x} \in \mathbb{V}: T(\mathbf{x}) = \mathbf{0} \}\]<li><p><strong>值域（range）</strong>或<strong>像（image）</strong>：$T$ 的所有函數值所成的 $\mathbb{W}$ 的子集，記作 $\mathrm{R}(T)$</p>\[\mathrm{R}(T) = \{ T(\mathbf{x}): \mathbf{x} \in \mathbb{V} \}\]</ul></blockquote><blockquote class="prompt-tip"><p><strong>e.g.</strong> 對向量空間 $\mathbb{V}, \mathbb{W}$、恆等變換 $I: \mathbb{V} \to \mathbb{V}$ 與零變換 $T_0: \mathbb{V} \to \mathbb{W}$，有：</p><ul><li>$\mathrm{N}(I) = \{\mathbf{0}\}$<li>$\mathrm{R}(I) = \mathbb{V}$<li>$\mathrm{N}(T_0) = \mathbb{V}$<li>$\mathrm{R}(T_0) = \{\mathbf{0}\}$</ul></blockquote><p>以下將反覆用到：線性變換的零空間與像是向量空間的<a href="/zh-TW/posts/vector-spaces-subspaces-and-matrices/#子空間">子空間</a>。</p><blockquote class="prompt-info"><p><strong>定理 1</strong><br /> 對向量空間 $\mathbb{V}, \mathbb{W}$ 與線性變換 $T: \mathbb{V} \to \mathbb{W}$，$\mathrm{N}(T), \mathrm{R}(T)$ 分別為 $\mathbb{V}, \mathbb{W}$ 的子空間。</p><p><strong>證明</strong><br /> 記 $\mathbb{V}, \mathbb{W}$ 的零向量分別為 $\mathbf{0}_\mathbb{V}, \mathbf{0}_\mathbb{W}$。</p><p>因 $T(\mathbf{0}_\mathbb{V}) = \mathbf{0}_\mathbb{W}$，故 $\mathbf{0}_\mathbb{V} \in \mathrm{N}(T)$。又對 $\mathbf{x}, \mathbf{y} \in \mathrm{N}(T),\ c \in F$ 有</p>\[\begin{align*} T(\mathbf{x} + \mathbf{y}) &amp;= T(\mathbf{x}) + T(\mathbf{y}) = \mathbf{0}_\mathbb{W} + \mathbf{0}_\mathbb{W} = \mathbf{0}_\mathbb{W}, \\ T(c\mathbf{x}) &amp;= cT(\mathbf{x}) = c\mathbf{0}_\mathbb{W} = \mathbf{0}_\mathbb{W}. \end{align*}\]<p>$\therefore$ <a href="/zh-TW/posts/vector-spaces-subspaces-and-matrices/#子空間">由於 $\mathbf{0}_\mathbb{V} \in \mathrm{N}(T),\ \mathbf{x} + \mathbf{y} \in \mathrm{N}(T),\ c\mathbf{x} \in \mathrm{N}(T)$，$\mathrm{N}(T)$ 為 $\mathbb{V}$ 的子空間</a>。</p><p>同理，因 $T(\mathbf{0}_\mathbb{V}) = \mathbf{0}_\mathbb{W}$，故 $\mathbf{0}_\mathbb{W} \in \mathrm{R}(T)$；且對所有 $\mathbf{x}, \mathbf{y} \in \mathrm{R}(T),\ c \in F$，存在 $\mathbf{v}, \mathbf{w} \in \mathbb{V}$ 使得 $(T(\mathbf{v}) = \mathbf{x}\ \wedge \ T(\mathbf{w}) = \mathbf{y})$，因此</p>\[\begin{align*} T(\mathbf{v} + \mathbf{w}) &amp;= T(\mathbf{v}) + T(\mathbf{w}) = \mathbf{x} + \mathbf{y}, \\ T(c\mathbf{v}) &amp;= cT(\mathbf{v}) = c\mathbf{x}. \end{align*}\]<p>$\therefore$ <a href="/zh-TW/posts/vector-spaces-subspaces-and-matrices/#子空間">由於 $\mathbf{0}_\mathbb{W} \in \mathrm{R}(T),\ \mathbf{x} + \mathbf{y} \in \mathrm{R}(T),\ c\mathbf{x} \in \mathrm{R}(T)$，$\mathrm{R}(T)$ 為 $\mathbb{W}$ 的子空間</a>。$\blacksquare$</p></blockquote><p>另一方面，對向量空間 $\mathbb{V}, \mathbb{W}$ 與線性變換 $T: \mathbb{V} \to \mathbb{W}$，若知 $\mathbb{V}$ 的<a href="/zh-TW/posts/linear-dependence-and-independence-basis-and-dimension/#基底">基底</a> $\beta = \{\mathbf{v}_1, \mathbf{v}_2, \dots, \mathbf{v}_n \}$，可如下找出像 $\mathrm{R}(T)$ 的<a href="/zh-TW/posts/vectors-and-linear-combinations/#生成">生成集</a>。</p><blockquote class="prompt-info"><p><strong>定理 2</strong><br /> 對向量空間 $\mathbb{V}, \mathbb{W}$ 與線性變換 $T: \mathbb{V} \to \mathbb{W}$、以及 $\mathbb{V}$ 的<a href="/zh-TW/posts/linear-dependence-and-independence-basis-and-dimension/#基底">基底</a> $\beta = \{\mathbf{v}_1, \mathbf{v}_2, \dots, \mathbf{v}_n \}$，有</p>\[\mathrm{R}(T) = \mathrm{span}(\{T(\mathbf{v}): \mathbf{v} \in \beta \}) = \mathrm{span}(\{T(\mathbf{v}_1), T(\mathbf{v}_2), \dots, T(\mathbf{v}_n) \})\]<p><strong>證明</strong></p>\[T(\mathbf{v}_i) \in \mathrm{R}(T) \quad \forall \mathbf{v}_i \in \beta.\]<p>由於 $\mathrm{R}(T)$ 為子空間，依<a href="/zh-TW/posts/vector-spaces-subspaces-and-matrices/#子空間">向量空間、子空間，以及矩陣</a>的<strong>定理 2</strong>可得</p>\[\mathrm{span}(\{T(\mathbf{v}_1), T(\mathbf{v}_2), \dots, T(\mathbf{v}_n) \}) = \mathrm{span}(\{T(\mathbf{v}_i): \mathbf{v}_i \in \beta \}) \subseteq \mathrm{R}(T).\]<p>且</p>\[\forall \mathbf{w} \in \mathrm{R}(T) \ (\exists \mathbf{v} \in \mathbb{V} \ (\mathbf{w} = T(\mathbf{v}))).\]<p>由 $\beta$ 為 $\mathbb{V}$ 的基底，得</p>\[\mathbf{v} = \sum_{i=1}^n a_i \mathbf{v}_i \quad \text{（其中 } a_1, a_2, \dots, a_n \in F \text{）}.\]<p>因 $T$ 為線性，故</p>\[\mathbf{w} = T(\mathbf{v}) = \sum_{i=1}^n a_i T(\mathbf{v}_i) \in \mathrm{span}(\{T(\mathbf{v}_i): \mathbf{v}_i \in \beta \})\] \[\mathrm{R}(T) \subseteq \mathrm{span}(\{T(\mathbf{v}_i): \mathbf{v}_i \in \beta \}) = \mathrm{span}(\{T(\mathbf{v}_1), T(\mathbf{v}_2), \dots, T(\mathbf{v}_n) \}).\]<p>$\therefore$ 由 $\mathrm{R}(T) \supseteq \mathrm{span}({T(\mathbf{v}_i): \mathbf{v}_i \in \beta })$ 且同時 $\mathrm{R}(T) \subseteq \mathrm{span}({T(\mathbf{v}_i): \mathbf{v}_i \in \beta })$，得 $\mathrm{R}(T) = \mathrm{span}({T(\mathbf{v}): \mathbf{v} \in \beta })$。$\blacksquare$</p></blockquote><p>此定理在基底 $\beta$ 為無限集時亦成立。</p><h3 id="維度定理">維度定理</h3><p>零空間與像是非常重要的子空間，因此也特別為其<a href="/zh-TW/posts/linear-dependence-and-independence-basis-and-dimension/#維度">維度</a>命名。</p><blockquote class="prompt-info"><p>對向量空間 $\mathbb{V}, \mathbb{W}$ 與線性變換 $T: \mathbb{V} \to \mathbb{W}$，若 $\mathrm{N}(T), \mathrm{R}(T)$ 為有限維，則</p><ul><li><strong>零空間的維度（nullity）</strong>：$\mathrm{N}(T)$ 的維度，記作 $\mathrm{nullity}(T)$<li><strong>秩（rank）</strong>：$\mathrm{R}(T)$ 的維度，記作 $\mathrm{rank}(T)$</ul></blockquote><p>在線性變換中，零空間的維度越大，秩越小；反之亦然。</p><blockquote class="prompt-info"><p><strong>定理 3：維度定理（dimension theorem）</strong><br /> 對向量空間 $\mathbb{V}, \mathbb{W}$ 與線性變換 $T: \mathbb{V}\to \mathbb{W}$，若 $\mathbb{V}$ 為有限維，則</p>\[\mathrm{nullity}(T) + \mathrm{rank}(T) = \dim(\mathbb{V})\]</blockquote><h4 id="證明">證明</h4><p>設 $\dim(\mathbb{V}) = n$, $\mathrm{nullity}(T) = \dim(\mathrm{N}(T)) = k$，並令 $\mathrm{N}(T)$ 的基底為 $\{\mathbf{v}_1, \mathbf{v}_2, \dots, \mathbf{v}_k \}$。</p><p>依<a href="/zh-TW/posts/linear-dependence-and-independence-basis-and-dimension/#子空間的維度">「線性相依與線性獨立、基底與維度」的<strong>推論 6-1</strong></a>，可將 $\{\mathbf{v}_1, \mathbf{v}_2, \dots, \mathbf{v}_k \}$ 擴張為 $\mathbb{V}$ 的基底 $\beta = \{\mathbf{v}_1, \mathbf{v}_2, \dots, \mathbf{v}_n \}$。</p><p>以下將證明 $S = \{T(\mathbf{v}_{k+1}), T(\mathbf{v}_{k+2}), \dots, T(\mathbf{v}_n) \}$ 是 $\mathrm{R}(T)$ 的基底。首先，當 $1 \leq i \leq k$ 時有 $T(\mathbf{v}_i) = 0$，故依<a href="#零空間與像的定義"><strong>定理 2</strong></a></p>\[\begin{align*} \mathrm{R}(T) &amp;= \mathrm{span}(\{T(\mathbf{v}_1), T(\mathbf{v}_2), \dots, T(\mathbf{v}_n) \}) \\ &amp;= \mathrm{span}(\{T(\mathbf{v}_{k+1}), T(\mathbf{v}_{k+2}), \dots, T(\mathbf{v}_n) \}) \\ &amp;= \mathrm{span}(S). \end{align*}\]<p>亦即 $S$ 為 $\mathrm{R}(T)$ 的生成集。現依<a href="/zh-TW/posts/linear-dependence-and-independence-basis-and-dimension/#維度"><strong>替換定理的推論 5-2</strong></a>，只要證明 $S$ 線性獨立，即可得 $S$ 為 $\mathrm{R}(T)$ 的基底。</p><p>若 $\sum_{i=k+1}^n b_i T(\mathbf{v}_i) = 0$（其中 $b_{k+1}, b_{k+2}, \dots, b_n \in F$），因 $T$ 線性，有</p>\[\sum_{i=k+1}^n b_i T(\mathbf{v}_i) = 0 \Leftrightarrow T\left(\sum_{i=k+1}^n b_i \mathbf{v}_i \right) = 0 \Leftrightarrow \sum_{i=k+1}^n b_i \mathbf{v}_i \in \mathrm{N}(T).\]<p>因此，</p>\[\begin{align*} &amp;\exists c_1, c_2, \dots, c_k \in F, \\ &amp;\sum_{i=k+1}^n b_i \mathbf{v}_i = \sum_{i=1}^k c_i \mathbf{v}_i \\ \Leftrightarrow &amp;\sum_{i=1}^k (-c_i)\mathbf{v}_i + \sum_{i=k+1}^n b_i \mathbf{v}_i = 0. \end{align*}\]<p>由 $\beta$ 為 $\mathbb{V}$ 的基底，$\sum_{i=1}^k (-c_i)\mathbf{v}_i + \sum_{i=k+1}^n b_i \mathbf{v}_i = 0$ 的唯一解為</p>\[c_1 = c_2 = \cdots = c_k = b_{k+1} = b_{k+2} = \cdots = b_n = 0\]<p>據此可得</p>\[\sum_{i=k+1}^n b_i T(\mathbf{v}_i) = 0 \quad \Rightarrow \quad b_i = 0.\]<p>故 $S$ 線性獨立，亦即為 $\mathrm{R}(T)$ 的基底。</p>\[\therefore \mathrm{rank}(T) = n - k = \dim{\mathbb{V}} - \mathrm{nullity}(T). \blacksquare\]<h3 id="線性變換與單射滿射">線性變換與單射、滿射</h3><p>在線性變換中，單射（injection）與滿射（surjection）與秩、零空間的維度密切相關。</p><blockquote class="prompt-info"><p><strong>定理 4</strong><br /> 對向量空間 $\mathbb{V}, \mathbb{W}$ 與線性變換 $T: \mathbb{V} \to \mathbb{W}$，</p>\[T\text{ 為單射} \quad \Leftrightarrow \quad \mathrm{N}(T) = \{\mathbf{0}\}.\]</blockquote><blockquote class="prompt-info"><p><strong>定理 5</strong><br /> 當有限維向量空間 $\mathbb{V}, \mathbb{W}$ 的維度相同，對線性變換 $T: \mathbb{V} \to \mathbb{W}$，以下四命題互為同值。</p><ol><li>$T$ 為單射。<li>$\mathrm{nullity}(T) = 0$<li>$\mathrm{rank}(T) = \dim(\mathbb{V})$<li>$T$ 為滿射。</ol></blockquote><p>可利用<a href="#維度定理">維度定理</a>、<a href="#線性變換">線性變換的性質 1、3</a>、以及<a href="/zh-TW/posts/linear-dependence-and-independence-basis-and-dimension/#子空間的維度">「線性相依與線性獨立、基底與維度」的<strong>定理 6</strong></a>證明<strong>定理 4</strong>與<strong>定理 5</strong>。</p><p>此二定理有助於判斷給定的線性變換是否為單射或滿射。</p><blockquote class="prompt-warning"><p>對無限維向量空間 $\mathbb{V}$ 與線性變換 $T: \mathbb{V} \to \mathbb{V}$ 而言，單射與滿射並不等價。</p></blockquote><p>當某線性變換為單射時，有時下述定理可用來判斷給定向量空間的子集是否線性獨立。</p><blockquote class="prompt-info"><p><strong>定理 6</strong><br /> 對向量空間 $\mathbb{V}, \mathbb{W}$、單射的線性變換 $T: \mathbb{V} \to \mathbb{W}$ 與 $\mathbb{V}$ 的子集 $S$，有</p>\[S\text{ 線性獨立} \quad \Leftrightarrow \quad \{T(\mathbf{v}): \mathbf{v} \in S \}\text{ 線性獨立。}\]</blockquote><h2 id="線性變換與基底">線性變換與基底</h2><p>線性變換的一項關鍵特徵是：其在基底上的作用決定了變換的全部行為。</p><blockquote class="prompt-info"><p><strong>定理 7</strong><br /> 對 $F$-向量空間 $\mathbb{V}, \mathbb{W}$、$\mathbb{V}$ 的基底 $\{\mathbf{v}_1, \mathbf{v}_2, \dots, \mathbf{v}_n \}$，以及向量 $\mathbf{w}_1, \mathbf{w}_2, \dots, \mathbf{w}_n \in \mathbb{W}$，存在且僅存在一個線性變換 $T: \mathbb{V} \to \mathbb{W}$ 滿足</p>\[i = 1, 2, \dots, n \text{ 時 } T(\mathbf{v}_i) = \mathbf{w}_i\]<p><strong>證明</strong><br /> 對 $\mathbf{x} \in \mathbb{V}$，其線性組合表示唯一：</p>\[\mathbf{x} = \sum_{i=1}^n a_i \mathbf{v}_i \text{ （}a_1, a_2, \dots, a_n \in F \text{）}\]<p>定義線性變換 $T: \mathbb{V} \to \mathbb{W}$ 為</p>\[T(\mathbf{x}) = T\left( \sum_{i=1}^n a_i \mathbf{v}_i \right) = \sum_{i=1}^n a_i \mathbf{w}_i\]<p>則有</p><p>i) 對 $i = 1, 2, \dots, n$，$T(\mathbf{v}_i) = \mathbf{w}_i$。</p><p>ii)</p><p>若另一線性變換 $U: \mathbb{V} \to \mathbb{W}$ 亦滿足對 $i = 1, 2, \dots, n$ 有 $U(\mathbf{v}_i) = \mathbf{w}_i$，則對 $\mathbf{x} = \sum_{i=1}^n a_i \mathbf{v}_i \in \mathbb{V}$，</p>\[U(\mathbf{x}) = \sum_{i=1}^n a_i U(\mathbf{v}_i) = \sum_{i=1}^n a_i \mathbf{w}_i = T(\mathbf{x}_i)\] \[\therefore U = T.\]<p>由 i)、ii) 得知，滿足 $i = 1, 2, \dots, n$ 且 $T(\mathbf{v}_i) = \mathbf{w}_i$ 的線性變換唯一定義為</p>\[T(\mathbf{x}) = T\left( \sum_{i=1}^n a_i \mathbf{v}_i \right) = \sum_{i=1}^n a_i \mathbf{w}_i 。\ \blacksquare\]<p><strong>推論 7-1</strong><br /> 對兩向量空間 $\mathbb{V}, \mathbb{W}$，若 $\mathbb{V}$ 含有限基底 $\{\mathbf{v}_1, \mathbf{v}_2, \dots, \mathbf{v}_n \}$，且兩線性變換 $U, T: \mathbb{V} \to \mathbf{W}$ 對 $i = 1, 2, \dots, n$ 皆滿足 $U(\mathbf{v}_i) = T(\mathbf{v}_i)$，則 $U = T$。<br /> 亦即，<u>在基底上的函數值相同，則為同一個線性變換</u>。</p></blockquote>]]> </content> </entry> <entry><title xml:lang="zh-TW">線性相依與線性獨立、基底與維度</title><link href="https://www.yunseo.kim/zh-TW/posts/linear-dependence-and-independence-basis-and-dimension/" rel="alternate" type="text/html" hreflang="en" /><link href="https://www.yunseo.kim/ko/posts/linear-dependence-and-independence-basis-and-dimension/" rel="alternate" type="text/html" hreflang="ko" /><link href="https://www.yunseo.kim/ja/posts/linear-dependence-and-independence-basis-and-dimension/" rel="alternate" type="text/html" hreflang="ja" /><link href="https://www.yunseo.kim/zh-TW/posts/linear-dependence-and-independence-basis-and-dimension/" rel="alternate" type="text/html" hreflang="zh-TW" /><link href="https://www.yunseo.kim/es/posts/linear-dependence-and-independence-basis-and-dimension/" rel="alternate" type="text/html" hreflang="es" /><link href="https://www.yunseo.kim/pt-BR/posts/linear-dependence-and-independence-basis-and-dimension/" rel="alternate" type="text/html" hreflang="pt-BR" /><link href="https://www.yunseo.kim/fr/posts/linear-dependence-and-independence-basis-and-dimension/" rel="alternate" type="text/html" hreflang="fr" /><link href="https://www.yunseo.kim/de/posts/linear-dependence-and-independence-basis-and-dimension/" rel="alternate" type="text/html" hreflang="de" /><link href="https://www.yunseo.kim/pl/posts/linear-dependence-and-independence-basis-and-dimension/" rel="alternate" type="text/html" hreflang="pl" /><link href="https://www.yunseo.kim/cs/posts/linear-dependence-and-independence-basis-and-dimension/" rel="alternate" type="text/html" hreflang="cs" /><link href="https://www.yunseo.kim/sw/posts/linear-dependence-and-independence-basis-and-dimension/" rel="alternate" type="text/html" hreflang="sw" /><link href="https://www.yunseo.kim/am/posts/linear-dependence-and-independence-basis-and-dimension/" rel="alternate" type="text/html" hreflang="am" /><published>2025-09-16T00:00:00+09:00</published> <updated>2025-10-25T21:21:39+09:00</updated> <id>https://www.yunseo.kim/zh-TW/posts/linear-dependence-and-independence-basis-and-dimension/</id> <author> <name>Yunseo Kim</name> </author> <category term="Mathematics" /> <category term="Linear Algebra" /> <summary xml:lang="zh-TW">整理線性相依與線性獨立，並系統介紹向量空間的基底、標準基底與維度（替換定理與推論）等核心觀念。</summary> <content type="html" xml:lang="zh-TW"> <![CDATA[<p>整理線性相依與線性獨立，並系統介紹向量空間的基底、標準基底與維度（替換定理與推論）等核心觀念。</p><em><p>* Mathematical equations and diagrams included in posts may not display properly when viewed with a feed reader.</p></em><h2 id="prerequisites">Prerequisites</h2><ul><li><a href="/zh-TW/posts/vectors-and-linear-combinations/">向量與線性組合</a><li><a href="/zh-TW/posts/vector-spaces-subspaces-and-matrices/">向量空間、子空間，以及矩陣</a></ul><h2 id="線性相依與線性獨立">線性相依與線性獨立</h2><p>對某個<a href="/zh-TW/posts/vector-spaces-subspaces-and-matrices/#向量空間">向量空間</a> $\mathbb{V}$ 與其<a href="/zh-TW/posts/vector-spaces-subspaces-and-matrices/#子空間">子空間</a> $\mathbb{W}$，想要找到生成<a href="/zh-TW/posts/vectors-and-linear-combinations/#線性組合-cmathbfv--dmathbfw">生成</a> $\mathbb{W}$ 的可能最小有限子集 $S$。</p><p>設 $S = \{\mathbf{u}_1, \mathbf{u}_2, \mathbf{u}_3, \mathbf{u}_4 \}$ 且 $\mathrm{span}(S) = \mathbb{W}$。要判斷是否存在生成 $\mathbb{W}$ 的 $S$ 的真子集，等價於判斷 $S$ 中某向量是否可由其餘向量的<a href="/zh-TW/posts/vectors-and-linear-combinations/#向量的線性組合">線性組合</a>表出。例：欲以其餘三向量線性組合表出 $\mathbf{u}_4$ 的充要條件，是存在純量 $a_1, a_2, a_3$ 使下式成立： \(\mathbf{u}_4 = a_1\mathbf{u}_1 + a_2\mathbf{u}_2 + a_3\mathbf{u}_3\)</p><p>然而對 $\mathbf{u}_1$, $\mathbf{u}_2$, $\mathbf{u}_3$, $\mathbf{u}_4$ 各自重複此聯立一次方程的判斷相當繁瑣，不妨改寫為 \(a_1\mathbf{u}_1 + a_2\mathbf{u}_2 + a_3\mathbf{u}_3 + a_4\mathbf{u}_4 = \mathbf{0}\)</p><p>若 $S$ 中某向量可由其他向量線性組合得到，則上式存在至少一個係數 $a_1, a_2, a_3, a_4$ 非零的表示法。其逆亦真：若存在至少一個係數非零，卻能將零向量表為 $S$ 的線性組合，則 $S$ 中有向量可由其餘向量線性組合。</p><p>推而廣之，定義如下的<strong>線性相依</strong>與<strong>線性獨立</strong>。</p><blockquote class="prompt-info"><p><strong>定義</strong><br /> 對向量空間 $\mathbb{V}$ 的子集 $S$，若存在有限多個彼此不同的向量 $\mathbf{u}_1, \mathbf{u}_2, \dots, \mathbf{u}_n \in S$ 與至少一個不為 $0$ 的純量 $a_1, a_2, \dots, a_n$，使 $a_1\mathbf{u}_1 + a_2\mathbf{u}_2 + \cdots + a_n\mathbf{u}_n = \mathbf{0}$，則稱集合 $S$ 與其中向量<strong>線性相依（linearly dependent）</strong>。否則稱為<strong>線性獨立（linearly independent）</strong>。</p></blockquote><p>對任意向量 $\mathbf{u}_1, \mathbf{u}_2, \dots, \mathbf{u}_n$，當 $a_1 = a_2 = \cdots = a_n = 0$ 時，必有 $a_1\mathbf{u}_1 + a_2\mathbf{u}_2 + \cdots + a_n\mathbf{u}_n = \mathbf{0}$。此稱為<strong>零向量的平凡表示（trivial representation of $\mathbf{0}$）</strong>。</p><p>關於線性獨立的集合，以下三個命題在所有向量空間中恆為真，尤其是<strong>命題 3</strong>對判斷有限集合是否線性獨立非常實用。</p><blockquote class="prompt-info"><ul><li><strong>命題 1</strong>：空集合為線性獨立。要使某集合線性相依，該集合必須非空。<li><strong>命題 2</strong>：由一個非零向量組成的集合是線性獨立的。<li><strong>命題 3</strong>：某集合線性獨立的充要條件是，將 $\mathbf{0}$ 表為該集合線性組合的方式僅有平凡表示一種。</ul></blockquote><p>此外，以下定理亦很重要。</p><blockquote class="prompt-info"><p><strong>定理 1</strong><br /> 設 $\mathbb{V}$ 為向量空間且 $S_1 \subseteq S_2 \subseteq \mathbb{V}$。若 $S_1$ 線性相依，則 $S_2$ 亦線性相依。</p><p><strong>推論 1-1</strong><br /> 設 $\mathbb{V}$ 為向量空間且 $S_1 \subseteq S_2 \subseteq \mathbb{V}$。若 $S_2$ 線性獨立，則 $S_1$ 亦線性獨立。</p></blockquote><blockquote class="prompt-info"><p><strong>定理 2</strong><br /> 設 $\mathbb{V}$ 為向量空間，$S$ 為其中線性獨立的子集。對不屬於 $S$ 的向量 $\mathbf{v} \in \mathbb{V}$，$S \cup \{\mathbf{v}\}$ 線性相依的充要條件為 $\mathbf{v} \in \mathrm{span}(S)$。</p><p>換言之，<strong>若 $S$ 的任一真子集都無法生成與 $S$ 相同的空間，則 $S$ 線性獨立。</strong></p></blockquote><h2 id="基底與維度">基底與維度</h2><h3 id="基底">基底</h3><p>對<a href="#線性相依與線性獨立">線性獨立</a>的 $\mathbb{W}$ 的生成集 $S$，有一個特別的性質：$\mathbb{W}$ 中的每個向量都必可表示為 $S$ 的線性組合，且此表示是唯一的（<strong>定理 3</strong>）。因此，對某向量空間的線性獨立生成集，特別定義為<strong>基底（basis）</strong>如下。</p><blockquote class="prompt-info"><p><strong>基底的定義</strong><br /> 對向量空間 $\mathbb{V}$ 與其子集 $\beta$，若 $\beta$ 線性獨立且能生成 $\mathbb{V}$，則稱 $\beta$ 為 $\mathbb{V}$ 的<strong>基底（basis）</strong>。此時，$\beta$ 中的向量形成 $\mathbb{V}$ 的基底。</p></blockquote><blockquote class="prompt-tip"><p>因為 $\mathrm{span}(\emptyset) = \{\mathbf{0}\}$ 且 $\emptyset$ 線性獨立，因此 $\emptyset$ 為點空間的基底。</p></blockquote><p>特別地，下述 $F^n$ 的特殊基底稱為 $F^n$ 的<strong>標準基底（standard basis）</strong>。</p><blockquote class="prompt-info"><p><strong>標準基底的定義</strong><br /> 對向量空間 $F^n$，考慮下列向量：</p>\[\mathbf{e}_1 = (1,0,0,\dots,0),\ \mathbf{e}_2 = (0,1,0,\dots,0),\ \dots, \mathbf{e}_n = (0,0,0,\dots,1)\]<p>則集合 $\{\mathbf{e}_1, \mathbf{e}_2, \dots, \mathbf{e}_n \}$ 是 $F^n$ 的基底，稱為 $F^n$ 的<strong>標準基底（standard basis）</strong>。</p></blockquote><blockquote class="prompt-info"><p><strong>定理 3</strong><br /> 設 $\mathbb{V}$ 為向量空間，$\mathbf{u}_1, \mathbf{u}_2, \dots, \mathbf{u}_n \in \mathbb{V}$ 彼此不同。集合 $\beta = \{\mathbf{u}_1, \mathbf{u}_2, \dots, \mathbf{u}_n \}$ 成為 $\mathbb{V}$ 的基底的充要條件是：「任意向量 $\mathbf{v} \in \mathbb{V}$ 可且僅可唯一地表示為 $\beta$ 中向量的線性組合」。亦即，存在唯一的純量 $n$-有序組 $(a_1, a_2, \dots, a_n)$ 使得</p>\[\mathbf{v} = a_1\mathbf{u}_1 + a_2\mathbf{u}_2 + \cdots + a_n\mathbf{u}_n\]</blockquote><p>依據<strong>定理 3</strong>，若互異的 $n$ 個向量 $\mathbf{u}_1, \mathbf{u}_2, \dots, \mathbf{u}_n$ 形成向量空間 $\mathbb{V}$ 的基底，則在該空間中，給定向量 $\mathbf{v}$ 便唯一對應到純量 $n$-有序組 $(a_1, a_2, \dots, a_n)$；反之，給定純量 $n$-有序組也唯一決定對應的向量 $\mathbf{v}$。日後在學習<strong>可逆性</strong>與<strong>同構</strong>時會再整理；在此情形下，向量空間 $\mathbb{V}$ 與 $F^n$ <u>本質上相同</u>。</p><blockquote class="prompt-info"><p><strong>定理 4</strong><br /> 若有限集合 $S$ 滿足 $\mathrm{span}(S) = \mathbb{V}$，則 $S$ 的某個子集是 $\mathbb{V}$ 的基底。亦即，此時 $\mathbb{V}$ 的基底為有限集。</p></blockquote><blockquote><p>許多向量空間屬於<strong>定理 4</strong>的適用對象，但未必一概如此。<u>基底也可能不是有限集</u>。{: .prompt-tip }</p></blockquote><h3 id="維度">維度</h3><blockquote class="prompt-info"><p><strong>定理 5：替換定理（replacement theorem）</strong><br /> 設集合 $G$ 含 $n$ 個向量且 $\mathrm{span}(G) = \mathbb{V}$。若 $L$ 是由 $m$ 個線性獨立向量所成的 $\mathbb{V}$ 的子集，則 $m \leq n$。此外，存在 $H \subseteq G$，其含有 $n-m$ 個向量，並滿足 $\mathrm{span}(L \cup H) = \mathbb{V}$。</p></blockquote><p>由此可得兩個極為重要的推論。</p><blockquote class="prompt-info"><p><strong>替換定理的推論 5-1</strong><br /> 假設向量空間 $\mathbb{V}$ 含有有限集基底，則 $\mathbb{V}$ 的所有基底皆為有限集，且含有相同數目的向量。</p></blockquote><p>因此，構成 $\mathbb{V}$ 基底的向量個數是 $\mathbb{V}$ 不隨改變的本質性質，稱為<strong>維度（dimension）</strong>。</p><blockquote class="prompt-info"><p><strong>維度的定義</strong><br /> 具有有限集基底的向量空間稱為<strong>有限維（finite dimension）</strong>；此時基底元素個數 $n$ 稱為該向量空間的<strong>維度（dimension）</strong>，記作 $\dim(\mathbb{V})$。非有限維的向量空間稱為<strong>無限維（infinite dimension）</strong>。</p></blockquote><blockquote class="prompt-tip"><ul><li>$\dim(\{\mathbf{0}\}) = 0$<li>$\dim(F^n) = n$<li>$\dim(\mathcal{M}_{m \times n}(F)) = mn$</ul></blockquote><blockquote class="prompt-tip"><p>向量空間的維度會因所處的體而異。</p><ul><li>在複數體 $\mathbb{C}$ 上，複數向量空間的維度為 1，基底為 $\{1\}$<li>在實數體 $\mathbb{R}$ 上，複數向量空間的維度為 2，基底為 $\{1,i\}$</ul></blockquote><p>在有限維向量空間 $\mathbb{V}$ 中，含有比 $\dim(\mathbb{V})$ 更多向量的子集不可能是線性獨立的。</p><blockquote class="prompt-info"><p><strong>替換定理的推論 5-2</strong><br /> 設 $\mathbb{V}$ 為維度為 $n$ 的向量空間。</p><ol><li>任何生成 $\mathbb{V}$ 的有限集合必含至少 $n$ 個向量，而由 $n$ 個向量組成的 $\mathbb{V}$ 的生成集即為 $\mathbb{V}$ 的基底。<li>線性獨立且含 $n$ 個向量的 $\mathbb{V}$ 子集是 $\mathbb{V}$ 的基底。 3. 可將線性獨立的 $\mathbb{V}$ 子集擴張為基底。亦即，若 $L \subseteq \mathbb{V}$ 線性獨立，則存在 $\mathbb{V}$ 的基底 $\beta$ 使得 $\beta \supseteq L$。</ol></blockquote><h3 id="子空間的維度">子空間的維度</h3><blockquote class="prompt-info"><p><strong>定理 6</strong><br /> 對有限維向量空間 $\mathbb{V}$，其子空間 $\mathbb{W}$ 亦為有限維，且 $\dim(\mathbb{W}) \leq \dim(\mathbb{V})$。特別地，若 $\dim(\mathbb{W}) = \dim(\mathbb{V}) \quad \Rightarrow \quad \mathbb{V} = \mathbb{W}.$</p><p><strong>推論 6-1</strong><br /> 對有限維向量空間 $\mathbb{V}$ 的子空間 $\mathbb{W}$，可將 $\mathbb{W}$ 的任一基底擴張為 $\mathbb{V}$ 的基底。</p></blockquote><p>依<strong>定理 6</strong>，$\mathbb{R}^3$ 的子空間之維度可能為 $0,1,2,3$。</p><ul><li>0 維：僅包含原點（$\mathbf{0}$）的點空間 $\{\mathbf{0}\}$<li>1 維：通過原點（$\mathbf{0}$）的直線<li>2 維：包含原點（$\mathbf{0}$）的平面<li>3 維：整個三維歐幾里得空間</ul>]]> </content> </entry> <entry><title xml:lang="zh-TW">向量空間、子空間，以及矩陣</title><link href="https://www.yunseo.kim/zh-TW/posts/vector-spaces-subspaces-and-matrices/" rel="alternate" type="text/html" hreflang="en" /><link href="https://www.yunseo.kim/ko/posts/vector-spaces-subspaces-and-matrices/" rel="alternate" type="text/html" hreflang="ko" /><link href="https://www.yunseo.kim/ja/posts/vector-spaces-subspaces-and-matrices/" rel="alternate" type="text/html" hreflang="ja" /><link href="https://www.yunseo.kim/zh-TW/posts/vector-spaces-subspaces-and-matrices/" rel="alternate" type="text/html" hreflang="zh-TW" /><link href="https://www.yunseo.kim/es/posts/vector-spaces-subspaces-and-matrices/" rel="alternate" type="text/html" hreflang="es" /><link href="https://www.yunseo.kim/pt-BR/posts/vector-spaces-subspaces-and-matrices/" rel="alternate" type="text/html" hreflang="pt-BR" /><link href="https://www.yunseo.kim/fr/posts/vector-spaces-subspaces-and-matrices/" rel="alternate" type="text/html" hreflang="fr" /><link href="https://www.yunseo.kim/de/posts/vector-spaces-subspaces-and-matrices/" rel="alternate" type="text/html" hreflang="de" /><link href="https://www.yunseo.kim/pl/posts/vector-spaces-subspaces-and-matrices/" rel="alternate" type="text/html" hreflang="pl" /><link href="https://www.yunseo.kim/cs/posts/vector-spaces-subspaces-and-matrices/" rel="alternate" type="text/html" hreflang="cs" /><link href="https://www.yunseo.kim/sw/posts/vector-spaces-subspaces-and-matrices/" rel="alternate" type="text/html" hreflang="sw" /><link href="https://www.yunseo.kim/am/posts/vector-spaces-subspaces-and-matrices/" rel="alternate" type="text/html" hreflang="am" /><published>2025-09-13T00:00:00+09:00</published> <updated>2025-10-28T18:44:54+09:00</updated> <id>https://www.yunseo.kim/zh-TW/posts/vector-spaces-subspaces-and-matrices/</id> <author> <name>Yunseo Kim</name> </author> <category term="Mathematics" /> <category term="Linear Algebra" /> <summary xml:lang="zh-TW">以向量空間與子空間的定義為核心，介紹典型例子：矩陣空間與函數空間。並特別聚焦於矩陣空間，系統整理能構成重要子空間的對稱／斜對稱矩陣、上／下三角矩陣與對角矩陣。</summary> <content type="html" xml:lang="zh-TW"> <![CDATA[<p>以向量空間與子空間的定義為核心，介紹典型例子：矩陣空間與函數空間。並特別聚焦於矩陣空間，系統整理能構成重要子空間的對稱／斜對稱矩陣、上／下三角矩陣與對角矩陣。</p><em><p>* Mathematical equations and diagrams included in posts may not display properly when viewed with a feed reader.</p></em><h2 id="tldr">TL;DR</h2><blockquote class="prompt-info"><ul><li><strong>矩陣（matrix）</strong><ul><li>矩陣 $A$ 的第 $i$ 行第 $j$ 列元素記為 $A_{ij}$ 或 $a_{ij}$<li><strong>對角元素（diagonal entry）</strong>：滿足 $i=j$ 的元素 $a_{ij}$<li>元素 $a_{i1}, a_{i2}, \dots, a_{in}$ 稱為此矩陣的第 $i$ 個<strong>行（row）</strong><ul><li>矩陣的每一行可視為 $F^n$ 的向量<li>進一步地，$F^n$ 的行向量也可視為一個 $1 \times n$ 的矩陣</ul><li>元素 $a_{1j}, a_{2j}, \dots, a_{mj}$ 稱為此矩陣的第 $j$ 個<strong>列（column）</strong><ul><li>矩陣的每一列可視為 $F^m$ 的向量<li>進一步地，$F^m$ 的列向量也可視為一個 $m \times 1$ 的矩陣</ul><li><strong>零矩陣（zero matrix）</strong>：所有元素皆為 $0$ 的矩陣，記作 $O$<li><strong>方陣（square matrix）</strong>：行數與列數相同的矩陣<li>對兩個 $m \times n$ 矩陣 $A, B$，若對所有 $1 \leq i \leq m$, $1 \leq j \leq n$ 皆有 $A_{ij} = B_{ij}$（即對應元素逐一相等），則定義兩矩陣<strong>相等</strong>（$A=B$）<li><strong>轉置矩陣（transpose matrix）</strong>：對 $m \times n$ 矩陣 $A$，將其行與列互換所得的 $n \times m$ 矩陣 $A^T$<li><strong>對稱矩陣（symmetric matrix）</strong>：滿足 $A^T = A$ 的方陣 $A$<li><strong>斜對稱矩陣（skew-symmetric matrix）</strong>：滿足 $B^T = -B$ 的方陣 $B$<li><strong>三角矩陣（triangular matrix）</strong><ul><li><strong>上三角矩陣（upper triangular matrix）</strong>：對角線以下元素全為 $0$（即 $i&gt;j \Rightarrow A_{ij}=0$），常記作 $U$<li><strong>下三角矩陣（lower triangular matrix）</strong>：對角線以上元素全為 $0$（即 $i&lt;j \Rightarrow A_{ij}=0$），常記作 $L$</ul><li><strong>對角矩陣（diagonal matrix）</strong>：除對角線元素外，其餘皆為 $0$ 的方陣（即 $i \neq j \Rightarrow M_{ij}=0$ 的 $n \times n$ 矩陣），常記作 $D$</ul><li>代表性的向量空間<ul><li><strong>$n$ 維有序組 $F^n$</strong>：<ul><li>由體 $F$ 的元素作為分量之所有 $n$ 維有序組的集合<li>記作 $F^n$，是 $F$-向量空間</ul><li><strong>矩陣空間（matrix space）</strong>：<ul><li>所有分量屬於體 $F$ 的 $m \times n$ 矩陣之集合<li>記作 $\mathcal{M}_{m \times n}(F)$，為向量空間</ul><li><strong>函數空間（function space）</strong>：<ul><li>對體 $F$ 上的非空集合 $S$，由 $S$ 到 $F$ 的所有函數之集合<li>記作 $\mathcal{F}(S,F)$，為向量空間</ul></ul><li><strong>子空間（subspace）</strong><ul><li>當 $F$-向量空間 $\mathbb{V}$ 的子集 $\mathbb{W}$，在沿用 $\mathbb{V}$ 的加法與純量乘法之下仍構成 $F$-向量空間，則稱 $\mathbb{W}$ 為 $\mathbb{V}$ 的<strong>子空間（subspace）</strong><li>對任意向量空間 $\mathbb{V}$，$\mathbb{V}$ 本身與 $\{0\}$ 皆為其子空間，特別地，$\{0\}$ 稱為<strong>零子空間（zero subspace）</strong><li>若某子集含有零向量，且對<a href="/zh-TW/posts/vectors-and-linear-combinations/#向量的線性組合">線性組合</a>封閉（即 $\mathrm{span}(\mathbb{W})=\mathbb{W}$），則該集合為子空間</ul></ul></blockquote><h2 id="prerequisites">Prerequisites</h2><ul><li><a href="/zh-TW/posts/vectors-and-linear-combinations/">向量與線性組合</a></ul><h2 id="向量空間">向量空間</h2><p>如同在<a href="/zh-TW/posts/vectors-and-linear-combinations/#廣義的向量向量空間的元素">向量與線性組合</a>中稍作提及，作為代數結構之向量與向量空間的定義如下。</p><blockquote class="prompt-info"><p><strong>定義</strong><br /> 定義在體 $F$ 上的<strong>向量空間（vector space）</strong>或<strong>線性空間（linear space）</strong> $\mathbb{V}$，是配備兩種運算——<strong>加法</strong>與<strong>純量乘法</strong>——且滿足下列八項公理的集合。體 $F$ 的元素稱為<strong>純量（scalar）</strong>，向量空間 $\mathbb{V}$ 的元素稱為<strong>向量（vector）</strong>。</p><ul><li><strong>加法（sum）</strong>：對 $\mathbb{V}$ 的任意兩元素 $\mathbf{x}, \mathbf{y}$，對應到唯一元素 $\mathbf{x} + \mathbf{y} \in \mathbb{V}$。此時 $\mathbf{x} + \mathbf{y}$ 稱為 $\mathbf{x}$ 與 $\mathbf{y}$ 的<strong>和</strong>。<li><strong>純量乘法（scalar multiplication）</strong>：對體 $F$ 的元素 $a$ 與向量空間 $\mathbb{V}$ 的元素 $\mathbf{x}$，對應到唯一元素 $a\mathbf{x} \in \mathbb{V}$。此時 $a\mathbf{x}$ 稱為 $\mathbf{x}$ 的<strong>純量倍（scalar multiple）</strong>。</ul><ol><li>對所有 $\mathbf{x},\mathbf{y} \in \mathbb{V}$，有 $\mathbf{x} + \mathbf{y} = \mathbf{y} + \mathbf{x}$。（加法的交換律）<li>對所有 $\mathbf{x},\mathbf{y},\mathbf{z} \in \mathbb{V}$，有 $(\mathbf{x}+\mathbf{y})+\mathbf{z} = \mathbf{x}+(\mathbf{y}+\mathbf{z})$。（加法的結合律）<li>對所有 $\mathbf{x} \in \mathbb{V}$，存在 $\mathbf{0} \in \mathbb{V}$ 使得 $\mathbf{x} + \mathbf{0} = \mathbf{x}$。（零向量，加法的單位元）<li>對每個 $\mathbf{x} \in \mathbb{V}$，存在 $\mathbf{y} \in \mathbb{V}$ 使得 $\mathbf{x}+\mathbf{y}=\mathbf{0}$。（加法的逆元）<li>對每個 $\mathbf{x} \in \mathbb{V}$，有 $1\mathbf{x} = \mathbf{x}$。（乘法的單位元）<li>對所有 $a,b \in F$ 與所有 $\mathbf{x} \in \mathbb{V}$，有 $(ab)\mathbf{x} = a(b\mathbf{x})$。（純量乘法的結合律）<li>對所有 $a \in F$ 與所有 $\mathbf{x},\mathbf{y} \in \mathbb{V}$，有 $a(\mathbf{x}+\mathbf{y}) = a\mathbf{x} + a\mathbf{y}$。（對加法的純量乘法分配律 1）<li>對所有 $a,b \in F$ 與所有 $\mathbf{x},\mathbf{y} \in \mathbb{V}$，有 $(a+b)\mathbf{x} = a\mathbf{x} + b\mathbf{x}$。（對加法的純量乘法分配律 2）</ol></blockquote><p>嚴格而言應寫作「$F$-向量空間 $\mathbb{V}$」，但在討論向量空間時，體 $F$ 通常不是重點；若不致混淆，便省略 $F$ 而直接稱作「向量空間 $\mathbb{V}$」。</p><h3 id="矩陣空間">矩陣空間</h3><h4 id="行向量與列向量">行向量與列向量</h4><p>由體 $F$ 的元素作為分量之所有 $n$ 維有序組的集合，記作 $F^n$。令 $u = (a_1, a_2, \dots, a_n) \in F^n$, $v = (b_1, b_2, \dots, b_n) \in F^n$，若定義加法與純量乘法如下，則 $F^n$ 為 $F$-向量空間。</p>\[\begin{align*} u + v &amp;= (a_1+b_1, a_2+b_2, \dots, a_n+b_n), \\ cu &amp;= (ca_1, ca_2, \dots, ca_n) \end{align*}\]<p>$F^n$ 的向量在單獨書寫時，通常不寫作<strong>行向量（row vector）</strong> $(a_1, a_2, \dots, a_n)$，而更常寫作<strong>列向量（column vector）</strong></p>\[\begin{pmatrix} a_1 \\ a_2 \\ \vdots \\ a_n \end{pmatrix}\]<blockquote class="prompt-tip"><p>但此種列向量表示較佔版面，故亦常利用<a href="#轉置矩陣對稱矩陣斜對稱矩陣">轉置</a>寫作 $(a_1, a_2, \dots, a_n)^T$。</p></blockquote><h4 id="矩陣與矩陣空間">矩陣與矩陣空間</h4><p>另一方面，分量屬於 $F$ 的 $m \times n$ <strong>矩陣（matrix）</strong>是一個如下的長方形陣列，通常以斜體大寫字母（$A, B, C$ 等）表示。</p>\[\begin{pmatrix} a_{11} &amp; a_{12} &amp; \cdots &amp; a_{1n} \\ a_{21} &amp; a_{22} &amp; \cdots &amp; a_{2n} \\ \vdots &amp; \vdots &amp; &amp; \vdots \\ a_{m1} &amp; a_{m2} &amp; \cdots &amp; a_{mn} \end{pmatrix}\]<ul><li>矩陣 $A$ 的第 $i$ 行第 $j$ 列元素記為 $A_{ij}$ 或 $a_{ij}$。<li>所有 $a_{ij}$（$1 \leq i \leq m$, $1 \leq j \leq n$）皆為 $F$ 的元素。<li>滿足 $i=j$ 的元素 $a_{ij}$ 稱為此矩陣的<strong>對角元素（diagonal entry）</strong>。<li>元素 $a_{i1}, a_{i2}, \dots, a_{in}$ 稱為此矩陣的第 $i$ 個<strong>行（row）</strong>。矩陣的每一行可視為 $F^n$ 的向量；進一步地，$F^n$ 的行向量也可視為 $1 \times n$ 的另一個矩陣。<li>元素 $a_{1j}, a_{2j}, \dots, a_{mj}$ 稱為此矩陣的第 $j$ 個<strong>列（column）</strong>。矩陣的每一列可視為 $F^m$ 的向量；進一步地，$F^m$ 的列向量也可視為 $m \times 1$ 的另一個矩陣。<li>所有元素皆為 $0$ 的 $m \times n$ 矩陣稱為<strong>零矩陣（zero matrix）</strong>，記作 $O$。<li>行數與列數相同的矩陣稱為<strong>方陣（square matrix）</strong>。<li>對兩個 $m \times n$ 矩陣 $A, B$，若對所有 $1 \leq i \leq m$, $1 \leq j \leq n$ 皆有 $A_{ij} = B_{ij}$（即對應元素逐一相等），則定義兩矩陣<strong>相等</strong>（$A=B$）。</ul><p>分量屬於體 $F$ 的所有 $m \times n$ 矩陣的集合記作 $\mathcal{M}_{m \times n}(F)$。對 $\mathbf{A},\mathbf{B} \in \mathcal{M}_{m \times n}(F)$ 與 $c \in F$，若定義加法與純量乘法如下，則 $\mathcal{M}_{m \times n}(F)$ 構成向量空間，稱為<strong>矩陣空間（matrix space）</strong>。</p>\[\begin{align*} (\mathbf{A}+\mathbf{B})_{ij} &amp;= \mathbf{A}_{ij} + \mathbf{B}_{ij}, \\ (c\mathbf{A})_{ij} &amp;= c\mathbf{A}_{ij} \\ \text{（其中 }1 \leq i \leq &amp;m, 1 \leq j \leq n \text{）} \end{align*}\]<p>此即將在 $F^n$ 與 $F^m$ 上定義的運算，自然地擴張至矩陣的情形。</p><h3 id="函數空間">函數空間</h3><p>對體 $F$ 的非空集合 $S$，$\mathcal{F}(S,F)$ 表示所有由 $S$ 到 $F$ 的函數之集合。在 $\mathcal{F}(S,F)$ 中，若對所有 $s \in S$ 皆有 $f(s) = g(s)$，則稱兩函數 $f, g$ <strong>相等</strong>（$f=g$）。</p><p>對 $f,g \in \mathcal{F}(S,F)$、$c \in F$、$s \in S$，若定義加法與純量乘法如下，則 $\mathcal{F}(S,F)$ 構成向量空間，稱為<strong>函數空間（function space）</strong>。</p>\[\begin{align*} (f + g)(s) &amp;= f(s) + g(s), \\ (cf)(s) &amp;= c[f(s)] \end{align*}\]<h2 id="子空間">子空間</h2><blockquote class="prompt-info"><p><strong>定義</strong><br /> 若 $F$-向量空間 $\mathbb{V}$ 的子集 $\mathbb{W}$，在沿用 $\mathbb{V}$ 的加法與純量乘法之下仍構成 $F$-向量空間，則稱 $\mathbb{W}$ 為 $\mathbb{V}$ 的<strong>子空間（subspace）</strong>。</p></blockquote><p>對任意向量空間 $\mathbb{V}$，$\mathbb{V}$ 本身與 $\{0\}$ 皆為其子空間，特別地，$\{0\}$ 稱為<strong>零子空間（zero subspace）</strong>。</p><p>判別某子集是否為子空間，可用下述定理。</p><blockquote class="prompt-info"><p><strong>定理 1</strong><br /> 對向量空間 $\mathbb{V}$ 與其子集 $\mathbb{W}$，$\mathbb{W}$ 為 $\mathbb{V}$ 的子空間之必要且充分條件，是滿足下列三項（運算沿用 $\mathbb{V}$ 的定義）：</p><ol><li>$\mathbf{0} \in \mathbb{W}$<li>$\mathbf{x}+\mathbf{y} \in \mathbb{W} \quad \forall\ \mathbf{x} \in \mathbb{W},\ \mathbf{y} \in \mathbb{W}$<li>$c\mathbf{x} \in \mathbb{W} \quad \forall\ c \in F,\ \mathbf{x} \in \mathbb{W}$</ol><p>簡言之，若其包含零向量，且對<a href="/zh-TW/posts/vectors-and-linear-combinations/#向量的線性組合">線性組合</a>封閉（$\mathrm{span}(\mathbb{W})=\mathbb{W}$），則為子空間。</p></blockquote><p>此外，下列定理亦成立。</p><blockquote class="prompt-info"><p><strong>定理 2</strong></p><ul><li><p>對向量空間 $\mathbb{V}$ 的任意子集 $S$，其生成空間 $\mathrm{span}(S)$ 是包含 $S$ 的 $\mathbb{V}$ 的子空間。</p>\[S \subset \mathrm{span}(S) \leq \mathbb{V} \quad \forall\ S \subset \mathbb{V}.\]<li><p>任何包含 $S$ 的 $\mathbb{V}$ 的子空間，必然包含 $S$ 的生成空間。</p>\[\mathbb{W}\supset \mathrm{span}(S) \quad \forall\ S \subset \mathbb{W} \leq \mathbb{V}.\]</ul></blockquote><blockquote class="prompt-info"><p><strong>定理 3</strong><br /> 對向量空間 $\mathbb{V}$ 的諸子空間，其任意交集仍為 $\mathbb{V}$ 的子空間。</p></blockquote><h3 id="轉置矩陣對稱矩陣斜對稱矩陣">轉置矩陣、對稱矩陣、斜對稱矩陣</h3><p>$m \times n$ 矩陣 $A$ 的<strong>轉置矩陣（transpose matrix）</strong> $A^T$，是將 $A$ 的行與列互換所得之 $n \times m$ 矩陣。</p>\[(A^T)_{ij} = A_{ji}\] \[\begin{pmatrix} 1 &amp; 2 &amp; 3 \\ 4 &amp; 5 &amp; 6 \end{pmatrix}^T = \begin{pmatrix} 1 &amp; 4 \\ 2 &amp; 5 \\ 3 &amp; 6 \end{pmatrix}\]<p>滿足 $A^T = A$ 的矩陣 $A$ 稱為<strong>對稱矩陣（symmetric matrix）</strong>；滿足 $B^T = -B$ 的矩陣 $B$ 稱為<strong>斜對稱矩陣（skew-symmetric matrix）</strong>。對稱與斜對稱矩陣必為方陣。</p><p>分別以 $\mathbb{W}_1, \mathbb{W}_2$ 表示 $\mathcal{M}_{n \times n}(F)$ 中所有對稱矩陣、斜對稱矩陣所成之集合，則 $\mathbb{W}_1, \mathbb{W}_2$ 皆為 $\mathcal{M}_{n \times n}(F)$ 的子空間。亦即，對加法與純量乘法封閉。</p><h3 id="三角矩陣對角矩陣">三角矩陣、對角矩陣</h3><p>下述兩類矩陣尤為重要，合稱為<strong>三角矩陣（triangular matrix）</strong>。</p><ul><li><strong>上三角矩陣（upper triangular matrix）</strong>：對角線以下元素全為 $0$（即 $i&gt;j \Rightarrow A_{ij}=0$），常記作 $U$<li><strong>下三角矩陣（lower triangular matrix）</strong>：對角線以上元素全為 $0$（即 $i&lt;j \Rightarrow A_{ij}=0$），常記作 $L$</ul><p>除對角線元素外，其餘皆為 $0$ 的方陣，即滿足 $i \neq j \Rightarrow M_{ij}=0$ 的 $n \times n$ 矩陣，稱為<strong>對角矩陣（diagonal matrix）</strong>，常記作 $D$。對角矩陣同時屬於上三角與下三角。</p><p>上三角矩陣的集合、下三角矩陣的集合、對角矩陣的集合，皆為 $\mathcal{M}_{m \times n}(F)$ 的子空間。</p>]]> </content> </entry> <entry><title xml:lang="zh-TW">內積與範數</title><link href="https://www.yunseo.kim/zh-TW/posts/inner-product-and-norm/" rel="alternate" type="text/html" hreflang="en" /><link href="https://www.yunseo.kim/ko/posts/inner-product-and-norm/" rel="alternate" type="text/html" hreflang="ko" /><link href="https://www.yunseo.kim/ja/posts/inner-product-and-norm/" rel="alternate" type="text/html" hreflang="ja" /><link href="https://www.yunseo.kim/zh-TW/posts/inner-product-and-norm/" rel="alternate" type="text/html" hreflang="zh-TW" /><link href="https://www.yunseo.kim/es/posts/inner-product-and-norm/" rel="alternate" type="text/html" hreflang="es" /><link href="https://www.yunseo.kim/pt-BR/posts/inner-product-and-norm/" rel="alternate" type="text/html" hreflang="pt-BR" /><link href="https://www.yunseo.kim/fr/posts/inner-product-and-norm/" rel="alternate" type="text/html" hreflang="fr" /><link href="https://www.yunseo.kim/de/posts/inner-product-and-norm/" rel="alternate" type="text/html" hreflang="de" /><link href="https://www.yunseo.kim/pl/posts/inner-product-and-norm/" rel="alternate" type="text/html" hreflang="pl" /><link href="https://www.yunseo.kim/cs/posts/inner-product-and-norm/" rel="alternate" type="text/html" hreflang="cs" /><link href="https://www.yunseo.kim/sw/posts/inner-product-and-norm/" rel="alternate" type="text/html" hreflang="sw" /><link href="https://www.yunseo.kim/am/posts/inner-product-and-norm/" rel="alternate" type="text/html" hreflang="am" /><published>2025-09-10T00:00:00+09:00</published> <updated>2025-10-15T05:48:53+09:00</updated> <id>https://www.yunseo.kim/zh-TW/posts/inner-product-and-norm/</id> <author> <name>Yunseo Kim</name> </author> <category term="Mathematics" /> <category term="Linear Algebra" /> <summary xml:lang="zh-TW">認識向量內積（inner product）與點積（dot product）的定義，進一步定義向量的長度/範數與兩向量的夾角，並整理柯西－施瓦茲不等式與三角不等式等基本性質。</summary> <content type="html" xml:lang="zh-TW"> <![CDATA[<p>認識向量內積（inner product）與點積（dot product）的定義，進一步定義向量的長度/範數與兩向量的夾角，並整理柯西－施瓦茲不等式與三角不等式等基本性質。</p><em><p>* Mathematical equations and diagrams included in posts may not display properly when viewed with a feed reader.</p></em><h2 id="先備知識">先備知識</h2><ul><li><a href="/zh-TW/posts/vectors-and-linear-combinations/">向量與線性組合</a></ul><h2 id="內積">內積</h2><p>一般的 $F$-向量空間中的<strong>內積(inner product)</strong>定義如下。</p><blockquote class="prompt-info"><p><strong>內積(inner product)與內積空間(inner product space)的定義</strong><br /> 考慮 $F$-向量空間 $\mathbb{V}$。$\mathbb{V}$ 上的<strong>內積(inner product)</strong> $\langle \mathbf{x},\mathbf{y} \rangle$定義為一個函數，將 $\mathbb{V}$ 中任意兩個向量 $\mathbf{x}$ 與 $\mathbf{y}$ 的有序對對應到 $F$ 中的一個純量，並滿足下列條件：</p><p>對任意 $\mathbf{x},\mathbf{y},\mathbf{z} \in \mathbb{V}$ 與任意 $c \in F$，</p><ol><li>$\langle \mathbf{x}+\mathbf{z}, \mathbf{y} \rangle = \langle \mathbf{x}, \mathbf{y} \rangle + \langle \mathbf{z}, \mathbf{y} \rangle$<li>$\langle c\mathbf{x}, \mathbf{y} \rangle = c \langle \mathbf{x}, \mathbf{y} \rangle$<li>$\overline{\langle \mathbf{x}, \mathbf{y} \rangle} = \langle \mathbf{y}, \mathbf{x} \rangle$（$\overline{\mathbf{z}}$ 為 $\mathbf{z}$ 的共軛複數）<li>當 $\mathbf{x} \neq \mathbf{0}$ 時，$\langle \mathbf{x}, \mathbf{x} \rangle$ 為正數。</ol><p>具備內積的 $F$-向量空間 $\mathbb{V}$ 稱為<strong>內積空間(inner product space)</strong>。特別地，當 $F=\mathbb{C}$ 時稱為<strong>複內積空間(complex inner product space)</strong>，當 $F=\mathbb{R}$ 時稱為<strong>實內積空間(real inner product space)</strong>。</p></blockquote><p>特別地，下述內積稱為<strong>標準內積(standard inner product)</strong>。可驗證標準內積滿足上述四項條件。</p><blockquote class="prompt-info"><p><strong>標準內積(standard inner product)的定義</strong><br /> 對 $F^n$ 中的兩個向量 $\mathbf{x}=(a_1, a_2, \dots, a_n)$、$\mathbf{y}=(b_1, b_2, \dots, b_n)$，$F^n$ 的<strong>標準內積(standard inner product)</strong>定義為</p>\[\langle \mathbf{x}, \mathbf{y} \rangle = \sum_{i=1}^n a_i \overline{b_i}\]</blockquote><p>此處若 $F=\mathbb{R}$，因為實數的共軛複數即其本身，此時的標準內積為 $\sum_{i=1}^n a_i b_i$。特別地，在此情形常以 $\mathbf{x} \cdot \mathbf{y}$ 表記標準內積，並稱為<strong>點積(dot product)</strong>或<strong>純量積(scalar product)</strong>。</p><blockquote class="prompt-info"><p><strong>點積(dot product)/純量積(scalar product)的定義</strong><br /> 對 $\mathbb{R}^n$ 中的 $\mathbf{v}=(v_1, v_2, \dots, v_n)$、$\mathbf{w}=(w_1, w_2, \dots, w_n)$，$\mathbb{R}^n$ 的<strong>點積(dot product)</strong>或<strong>純量積(scalar product)</strong>定義為</p>\[\mathbf{v} \cdot \mathbf{w} = \sum_{i=1}^n v_i w_i = v_1 w_1 + v_2 w_2 + \cdots + v_n w_n\]</blockquote><blockquote class="prompt-warning"><p>此處所稱的「純量積（scalar product）」是向量與向量之間的運算；而在<a href="/zh-TW/posts/vectors-and-linear-combinations/">向量與線性組合</a>中討論的、標量與向量之間的運算「純量乘法（scalar multiplication）」則是另一種不同的運算。由於英文表述也相近，且<a href="https://www.kms.or.kr/mathdict/list.html?key=kname&amp;keyword=%EC%8A%A4%EC%B9%BC%EB%9D%BC%EA%B3%B1">依據大韓數學會的韓語術語標準，兩者的韓文譯名甚至完全相同</a>，因此請留意不要混淆。</p><p>為避免混淆，下文將儘量以<strong>點積(dot product)</strong>稱呼之。</p></blockquote><blockquote class="prompt-tip"><p>在歐幾里得空間中的內積(inner product)即為點積(dot product)，因此在語境不致混淆時，亦常直接以內積稱呼點積。不過嚴格來說，內積是包含點積在內的更一般概念。</p></blockquote><pre><code class="language-mermaid">flowchart TD
    A["內積（Inner Product）"] --&gt;|包含| B["標準內積（Standard Inner Product）"]
    B --&gt;|"F = R（實數體）時"| C["點積/純量積（Dot/Scalar Product）"]

    %% 包含（包含關係）標記
    C -. 被包含 .-&gt; B
    B -. 被包含 .-&gt; A
</code></pre><h2 id="向量的長度範數">向量的長度/範數</h2><p>對 $\mathbb{R}^n$ 中的向量 $\mathbf{v}=(v_1, v_2, \dots, v_n)$，$\mathbf{v}$ 的歐幾里得長度可由點積定義如下：</p>\[\| \mathbf{v} \| = \sqrt{\mathbf{v} \cdot \mathbf{v}} = \left[ \sum_{i=1}^n |v_i|^2 \right]^{1/2} = \sqrt{v_1^2 + v_2^2 + \cdots + v_n^2}\]<p>更一般地，在任意內積空間中，向量的<strong>長度(length)</strong>或<strong>範數(norm)</strong>定義為</p>\[\| \mathbf{x} \| = \sqrt{\langle \mathbf{x}, \mathbf{x} \rangle}\]<p>在一般內積空間中，向量範數滿足下列重要性質。</p><blockquote class="prompt-info"><p><strong>定理</strong><br /> 對 $F$-內積空間 $\mathbb{V}$、任意向量 $\mathbf{x}, \mathbf{y} \in \mathbb{V}$ 以及純量 $c \in F$，有：</p><ol><li>$\|c\mathbf{x}\| = |c| \cdot \|\mathbf{x}\|$<li>下列兩式成立：<ul><li>$\|\mathbf{x}\| = 0 \iff \mathbf{x}=\mathbf{0}$<li>$\|\mathbf{x}\| \geq 0 \ \forall \mathbf{x}$</ul><li><strong>柯西－施瓦茲不等式(Cauchy-Schwarz inequality)</strong>：$| \langle \mathbf{x}, \mathbf{y} \rangle | \leq \|\mathbf{x}\| \cdot \|\mathbf{y}\|$（等號當且僅當 $\mathbf{x}$ 與 $\mathbf{y}$ 之一是另一者的純量倍）<li><strong>三角不等式(triangle inequality)</strong>：$\| \mathbf{x} + \mathbf{y} \| \leq \|\mathbf{x}\| + \|\mathbf{y}\|$（等號當且僅當 $\mathbf{x}$ 與 $\mathbf{y}$ 之一是另一者的純量倍，且兩者方向相同）</ol></blockquote><h2 id="向量間的夾角與單位向量">向量間的夾角與單位向量</h2><p>長度為 1 的向量稱為<strong>單位向量(unit vector)</strong>。此外，對 $\mathbb{R}^n$ 中的兩個向量 $\mathbf{v}=(v_1, v_2, \dots, v_n)$、$\mathbf{w}=(w_1, w_2, \dots, w_n)$，有 $\mathbf{v} \cdot \mathbf{w} = \|\mathbf{v}\| \cdot \|\mathbf{w}\| \cos\theta$，據此可求出 $\mathbf{v}$ 與 $\mathbf{w}$ 之間的夾角 $\theta$（$0 \leq \theta \leq \pi$）。</p>\[\theta = \arccos{\frac{\mathbf{v} \cdot \mathbf{w}}{\|\mathbf{v}\| \cdot \|\mathbf{w}\|}}\]<p>當 $\mathbf{v} \cdot \mathbf{w} = 0$ 時，稱兩向量<strong>垂直(perpendicular)</strong>或<strong>正交(orthogonal)</strong>。</p><blockquote class="prompt-tip"><p>當兩向量 $\mathbf{v}$ 與 $\mathbf{w}$ 垂直時，</p>\[\begin{align*} \| \mathbf{v} + \mathbf{w} \|^2 &amp;= (\mathbf{v} + \mathbf{w}) \cdot (\mathbf{v} + \mathbf{w}) \\ &amp;= \mathbf{v} \cdot \mathbf{v} + \mathbf{v} \cdot \mathbf{w} + \mathbf{w} \cdot \mathbf{v} + \mathbf{w} \cdot \mathbf{w} \\ &amp;= \mathbf{v} \cdot \mathbf{v} + \mathbf{w} \cdot \mathbf{w} \\ &amp;= \|\mathbf{v}\|^2 + \|\mathbf{w}\|^2. \end{align*}\]</blockquote><p>將其推廣至任意內積空間如下。</p><blockquote class="prompt-info"><p><strong>定義</strong><br /> 考慮內積空間 $\mathbb{V}$。對 $\mathbb{V}$ 中的向量 $\mathbf{x}, \mathbf{y}$，若 $\langle \mathbf{x}, \mathbf{y} \rangle = 0$，則稱兩向量<strong>正交(orthogonal)</strong>或<strong>垂直(perpendicular)</strong>。此外，</p><ol><li>對 $\mathbb{V}$ 的子集 $S$，若 $S$ 中任意兩個彼此不同的向量皆相互正交，則稱 $S$ 為<strong>正交集(orthogonal set)</strong>。<li>對 $\|\mathbf{x}\|=1$ 的向量 $\mathbf{x} \in \mathbb{V}$，稱為<strong>單位向量(unit vector)</strong>。<li>若 $\mathbb{V}$ 的子集 $S$ 為正交集，且元素全為單位向量，則稱 $S$ 為<strong>正交歸一集(orthonormal set)</strong>。</ol></blockquote><p>集合 $S = { \mathbf{v}_1, \mathbf{v}_2, \dots }$ 為正交歸一集的充要條件為 $\langle \mathbf{v}_i, \mathbf{v}_j \rangle = \delta_{ij}$。對向量乘以非零純量不影響正交性。</p><p>對任意非零向量 $\mathbf{x}$，$\cfrac{\mathbf{x}}{\|\mathbf{x}\|}$ 為單位向量。如此將非零向量乘以其長度的倒數以得到單位向量的過程稱為<strong>正規化(normalizing)</strong>。</p>]]> </content> </entry> <entry><title xml:lang="zh-TW">向量與線性組合</title><link href="https://www.yunseo.kim/zh-TW/posts/vectors-and-linear-combinations/" rel="alternate" type="text/html" hreflang="en" /><link href="https://www.yunseo.kim/ko/posts/vectors-and-linear-combinations/" rel="alternate" type="text/html" hreflang="ko" /><link href="https://www.yunseo.kim/ja/posts/vectors-and-linear-combinations/" rel="alternate" type="text/html" hreflang="ja" /><link href="https://www.yunseo.kim/zh-TW/posts/vectors-and-linear-combinations/" rel="alternate" type="text/html" hreflang="zh-TW" /><link href="https://www.yunseo.kim/es/posts/vectors-and-linear-combinations/" rel="alternate" type="text/html" hreflang="es" /><link href="https://www.yunseo.kim/pt-BR/posts/vectors-and-linear-combinations/" rel="alternate" type="text/html" hreflang="pt-BR" /><link href="https://www.yunseo.kim/fr/posts/vectors-and-linear-combinations/" rel="alternate" type="text/html" hreflang="fr" /><link href="https://www.yunseo.kim/de/posts/vectors-and-linear-combinations/" rel="alternate" type="text/html" hreflang="de" /><link href="https://www.yunseo.kim/pl/posts/vectors-and-linear-combinations/" rel="alternate" type="text/html" hreflang="pl" /><link href="https://www.yunseo.kim/cs/posts/vectors-and-linear-combinations/" rel="alternate" type="text/html" hreflang="cs" /><link href="https://www.yunseo.kim/sw/posts/vectors-and-linear-combinations/" rel="alternate" type="text/html" hreflang="sw" /><link href="https://www.yunseo.kim/am/posts/vectors-and-linear-combinations/" rel="alternate" type="text/html" hreflang="am" /><published>2025-09-07T00:00:00+09:00</published> <updated>2025-10-28T20:47:49+09:00</updated> <id>https://www.yunseo.kim/zh-TW/posts/vectors-and-linear-combinations/</id> <author> <name>Yunseo Kim</name> </author> <category term="Mathematics" /> <category term="Linear Algebra" /> <summary xml:lang="zh-TW">認識什麼是向量與其基本運算（純量乘法、加法），並在此基礎上理解向量的線性組合與生成空間（span）的概念。</summary> <content type="html" xml:lang="zh-TW"> <![CDATA[<p>認識什麼是向量與其基本運算（純量乘法、加法），並在此基礎上理解向量的線性組合與生成空間（span）的概念。</p><em><p>* Mathematical equations and diagrams included in posts may not display properly when viewed with a feed reader.</p></em><h2 id="tldr">TL;DR</h2><blockquote class="prompt-info"><ul><li><strong>向量的定義</strong><ul><li><strong>狹義的向量（歐幾里得向量）</strong>：同時具有大小與方向的物理量<li><strong>廣義、線性代數中的向量</strong>：向量空間的元素</ul><li><strong>向量的表示法</strong><ul><li><strong>箭號表示法</strong>：以箭頭長度表示大小、箭頭方向表示方向。易於視覺化且直觀，但對四維以上的高維向量或非歐幾里得向量不易表達。<li><strong>分量表示法</strong>：將向量的起點置於座標空間的原點，以終點的座標來表示向量。</ul><li><strong>向量的基本運算</strong><ul><li><strong>加法</strong>：$(a_1, a_2, \cdots, a_n) + (b_1, b_2, \cdots, b_n) := (a_1+b_1, a_2+b_2, \cdots, a_n+b_n)$<li><strong>純量乘法</strong>：$c(a_1, a_2, \cdots, a_n) := (ca_1, ca_2, \cdots, ca_n)$</ul><li><strong>向量的線性組合</strong><ul><li>對有限個向量 $\mathbf{u}_1, \mathbf{u}_2, \dots, \mathbf{u}_n$ 與純量 $a_1, a_2, \dots, a_n$，若 $\mathbf{v} = a_1\mathbf{u}_1 + a_2\mathbf{u}_2 + \cdots + a_n\mathbf{u}_n$，則稱向量 $\mathbf{v}$ 為 $\mathbf{u}_1, \mathbf{u}_2, \dots, \mathbf{u}_n$ 的<strong>線性組合（linear combination）</strong><li>此時 $a_1, a_2, \dots, a_n$ 稱為此線性組合的<strong>係數（coefficient）</strong></ul></ul></blockquote><blockquote><ul><li><strong>生成空間（span）</strong><ul><li>對向量空間 $\mathbb{V}$ 的非空子集 $S$，由 $S$ 中的向量所作的所有線性組合所成的集合 $\mathrm{span}(S)$<li>定義 $\mathrm{span}(\emptyset) = { \mathbf{0} }$<li>若向量空間 $\mathbb{V}$ 的子集 $S$ 滿足 $\mathrm{span}(S) = \mathbb{V}$，則稱 $S$ 生成（generate 或 span）$\mathbb{V}$</ul></ul></blockquote><h2 id="prerequisites">Prerequisites</h2><ul><li>座標平面／座標空間<li>體（field）</ul><h2 id="什麼是向量">什麼是向量？</h2><h3 id="狹義的向量歐幾里得向量">狹義的向量：歐幾里得向量</h3><blockquote class="prompt-info"><p>力、速度、加速度等許多物理量不僅具有大小，還包含方向資訊。如此同時擁有大小與方向的物理量稱為<strong>向量（vector）</strong>。</p></blockquote><p>上述定義是物理學的力學或高中程度數學所處理的向量定義。如此強調「有向線段的大小與方向」之幾何意涵，基於物理直覺的狹義向量，嚴格地稱為<strong>歐幾里得向量（Euclidean vector）</strong>。</p><h3 id="廣義的向量向量空間的元素">廣義的向量：向量空間的元素</h3><p>在線性代數中，向量被定義為較上述歐幾里得向量更廣、更抽象的代數結構，如下所示。</p><blockquote class="prompt-info"><p><strong>定義</strong><br /> 定義在體 $F$ 上的<strong>向量空間（vector space）</strong>或<strong>線性空間（linear space）</strong> $\mathbb{V}$ 是一個集合，配備兩種運算：<strong>加法</strong>與<strong>純量乘法</strong>，並滿足下列八個條件。體 $F$ 的元素稱為<strong>純量（scalar）</strong>，向量空間 $\mathbb{V}$ 的元素稱為<strong>向量（vector）</strong>。</p><ul><li><strong>加法（sum）</strong>：對 $\mathbb{V}$ 的任意兩元素 $\mathbf{x}, \mathbf{y}$，對應到唯一的元素 $\mathbf{x} + \mathbf{y} \in \mathbb{V}$。此時 $\mathbf{x} + \mathbf{y}$ 稱為 $\mathbf{x}$ 與 $\mathbf{y}$ 的<strong>和</strong>。<li><strong>純量乘法（scalar multiplication）</strong>：對體 $F$ 的元素 $a$ 與向量空間 $\mathbb{V}$ 的元素 $\mathbf{x}$，對應到唯一的元素 $a\mathbf{x} \in \mathbb{V}$。此時 $a\mathbf{x}$ 稱為 $\mathbf{x}$ 的<strong>純量倍（scalar multiple）</strong>。</ul><ol><li>對所有 $\mathbf{x},\mathbf{y} \in \mathbb{V}$，有 $\mathbf{x} + \mathbf{y} = \mathbf{y} + \mathbf{x}$。（加法的交換律）<li>對所有 $\mathbf{x},\mathbf{y},\mathbf{z} \in \mathbb{V}$，有 $(\mathbf{x}+\mathbf{y})+\mathbf{z} = \mathbf{x}+(\mathbf{y}+\mathbf{z})$。（加法的結合律）<li>對所有 $\mathbf{x} \in \mathbb{V}$，存在 $\mathbf{0} \in \mathbb{V}$ 使得 $\mathbf{x} + \mathbf{0} = \mathbf{x}$。（零向量，加法的單位元）<li>對每個 $\mathbf{x} \in \mathbb{V}$，存在 $\mathbf{y} \in \mathbb{V}$ 使得 $\mathbf{x}+\mathbf{y}=\mathbf{0}$。（加法的逆元）<li>對每個 $\mathbf{x} \in \mathbb{V}$，有 $1\mathbf{x} = \mathbf{x}$。（乘法的單位元）<li>對所有 $a,b \in F$ 與所有 $\mathbf{x} \in \mathbb{V}$，有 $(ab)\mathbf{x} = a(b\mathbf{x})$。（純量乘法的結合律）<li>對所有 $a \in F$ 與所有 $\mathbf{x},\mathbf{y} \in \mathbb{V}$，有 $a(\mathbf{x}+\mathbf{y}) = a\mathbf{x} + a\mathbf{y}$。（對加法的純量乘法分配律 1）<li>對所有 $a,b \in F$ 與所有 $\mathbf{x},\mathbf{y} \in \mathbb{V}$，有 $(a+b)\mathbf{x} = a\mathbf{x} + b\mathbf{x}$。（對加法的純量乘法分配律 2）</ol></blockquote><p>此線性代數中的向量定義涵蓋了先前提及的<a href="#狹義的向量-歐幾里得向量">歐幾里得向量</a>，屬於更廣的範疇。<a href="#狹義的向量-歐幾里得向量">歐幾里得向量</a>亦可驗證滿足上述八項性質。</p><p>向量的起源與發展，與物理學中一系列實用問題密切相關，例如對力、物體運動、轉動、場等概念的定量描述。為了以數學方式表述自然現象，最初提出了<a href="#狹義的向量-歐幾里得向量">歐幾里得向量</a>的概念；其後數學在將這些物理概念一般化與理論化的過程中，建立了向量空間、內積、外積等形式結構，形成今日的向量定義。換言之，向量是物理學的需求與數學的建構所共同促成的概念，與其說是純數學的產物，不如說是數學界與物理學界密切交流下的跨領域成果。</p><p>經典力學處理的<a href="#狹義的向量-歐幾里得向量">歐幾里得向量</a>，可以用數學上<a href="#廣義的向量-向量空間的元素">更一般化的框架</a>來表達；而在今日的物理學中，不僅<a href="#狹義的向量-歐幾里得向量">歐幾里得向量</a>，連同向量空間、函數空間等更抽象的數學概念也被廣泛運用並賦予物理意義。因此，將兩種定義簡單對應為「物理學的定義」與「數學的定義」並不恰當。</p><p>關於向量空間我們之後再深入，先聚焦於在座標空間中可幾何表徵的狹義向量——歐幾里得向量。先熟悉直觀的歐幾里得向量例子，對日後推廣到其他類型的向量也有幫助。</p><h2 id="向量的表示法">向量的表示法</h2><h3 id="箭號表示法">箭號表示法</h3><p>這是最能保留幾何直觀、也最常見的表示法。向量的大小用箭頭的長度表示，向量的方向用箭頭的方向表示。</p><p><img src="https://upload.wikimedia.org/wikipedia/commons/9/95/Vector_from_A_to_B.svg" alt="Euclidean Vector from A to B" width="972" /></p><blockquote><p><em>圖片來源</em></p><ul><li>作者：維基百科用戶 <a href="https://en.wikipedia.org/wiki/User:Nguyenthephuc">Nguyenthephuc</a><li>授權條款：<a href="https://creativecommons.org/licenses/by-sa/3.0/deed.en">CC BY-SA 3.0</a></ul></blockquote><p>此表示法雖直觀，但對四維以上的高維向量，其箭號表示法的侷限明顯。此外，日後我們還會處理原本就難以以幾何圖形表達的非歐幾里得向量，因此有必要熟悉下述的分量表示法。</p><h3 id="分量表示法">分量表示法</h3><p>不論向量位於何處，只要大小與方向相同，便視為相同的向量。因此當給定一個座標空間時，若將向量的起點固定在該座標空間的原點，則<u>$n$ 維向量對應到 $n$ 維空間中的任意一個點</u>；此時即可用終點的座標來表示向量。這種方法稱為向量的<strong>分量表示法</strong>。</p>\[(a_1, a_2, \cdots, a_n) \in \mathbb{R}^n \text{ or } \mathbb{C}^n\]<p><img src="https://upload.wikimedia.org/wikipedia/commons/5/5d/Position_vector.svg" alt="Position vector" /></p><blockquote><p><em>圖片來源</em></p><ul><li>作者：維基共享資源用戶 <a href="https://commons.wikimedia.org/wiki/User:Acdx">Acdx</a><li>授權條款：<a href="https://creativecommons.org/licenses/by-sa/3.0/deed.en">CC BY-SA 3.0</a></ul></blockquote><h2 id="向量的基本運算">向量的基本運算</h2><p>向量的基本運算有兩種：<strong>加法</strong>與<strong>純量乘法</strong>。所有向量運算皆可由此二者的組合來表達。</p><h3 id="向量的加法">向量的加法</h3><p>兩個向量的和仍為向量，而其分量等於兩向量的對應分量逐一相加。</p>\[(a_1, a_2, \cdots, a_n) + (b_1, b_2, \cdots, b_n) := (a_1+b_1, a_2+b_2, \cdots, a_n+b_n)\]<h3 id="向量的純量乘法">向量的純量乘法</h3><p>向量可以被放大或縮小，這以在向量上乘以常數（純量）的純量乘法來表示。對任一向量做常數倍，其結果等同於對每個分量皆做相同的常數倍。</p>\[c(a_1, a_2, \cdots, a_n) := (ca_1, ca_2, \cdots, ca_n)\]<p><img src="https://upload.wikimedia.org/wikipedia/commons/1/1b/Scalar_multiplication_of_vectors2.svg" alt="Scalar multiplication of vectors" /></p><blockquote><p><em>圖片來源</em></p><ul><li>作者：維基百科用戶 <a href="https://en.wikipedia.org/wiki/User:Silly_rabbit">Silly rabbit</a><li>授權條款：<a href="https://creativecommons.org/licenses/by-sa/3.0/deed.en">CC BY-SA 3.0</a></ul></blockquote><h2 id="向量的線性組合">向量的線性組合</h2><p>如同微積分從數 $x$ 與函數 $f(x)$ 出發，線性代數則從向量 $\mathbf{v}, \mathbf{w}, \dots$ 與線性組合 $c\mathbf{v} + d\mathbf{w} + \cdots$ 出發。而所有向量的線性組合皆由上述兩種基本運算——<a href="#向量的加法">加法</a>與<a href="#向量的純量乘法">純量乘法</a>——的組合構成。</p><blockquote class="prompt-info"><p>對有限個向量 $\mathbf{u}_1, \mathbf{u}_2, \dots, \mathbf{u}_n$ 與純量 $a_1, a_2, \dots, a_n$，若下式成立，則稱向量 $\mathbf{v}$ 為 $\mathbf{u}_1, \mathbf{u}_2, \dots, \mathbf{u}_n$ 的<strong>線性組合（linear combination）</strong>。</p>\[\mathbf{v} = a_1\mathbf{u}_1 + a_2\mathbf{u}_2 + \cdots + a_n\mathbf{u}_n\]<p>此時，$a_1, a_2, \dots, a_n$ 稱為此線性組合的<strong>係數（coefficient）</strong>。</p></blockquote><p>那麼，線性組合為何重要？請考慮如下情形：<strong>在 $m$ 維空間上的 $n$ 個向量，構成一個 $m \times n$ 矩陣的 $n$ 個列</strong>。</p>\[\begin{gather*} \mathbf{v}_1 = (a_{11}, a_{21}, \dots, a_{m1}), \\ \mathbf{v}_2 = (a_{12}, a_{22}, \dots, a_{m2}), \\ \vdots \\ \mathbf{v}_n = (a_{1n}, a_{2n}, \dots, a_{mn}) \\ \\ A = \Bigg[ \mathbf{v}_1 \quad \mathbf{v}_2 \quad \cdots \quad \mathbf{v}_n \Bigg] \end{gather*}\]<p>此處的關鍵有兩點：</p><ol><li><strong>寫出所有可能的線性組合 $Ax = x_1\mathbf{v}_1 + x_2\mathbf{v}_2 + \cdots + x_n\mathbf{v}_n$。</strong> 它構成了什麼？<li>找出能產生期望輸出向量 $Ax = b$ 的<strong>數 $x_1, x_2, \dots, x_n$</strong>。</ol><p>第二個問題的答案我們稍後再談；先專注於第一個問題。為了簡化討論，先以非零的二維（$m=2$）向量兩個（$n=2$）為例。</p><h3 id="線性組合-cmathbfv--dmathbfw">線性組合 $c\mathbf{v} + d\mathbf{w}$</h3><p>二維空間中的向量 $\mathbf{v}$ 具有兩個分量。對所有純量 $c$，<u>向量 $c\mathbf{v}$ 與原先的 $\mathbf{v}$ 平行，並在通過原點的 $xy$ 平面上形成一條無限長的直線。</u></p><p>若第二個給定向量 $\mathbf{w}$ 不在這條直線上（亦即 $\mathbf{v}$ 與 $\mathbf{w}$ 不平行），那麼向量 $d\mathbf{w}$ 又形成另一條直線。將這兩條直線加以組合，可知<strong>線性組合 $c\mathbf{v} + d\mathbf{w}$ 形成一個包含原點的平面</strong>。</p><p><img src="https://upload.wikimedia.org/wikipedia/commons/6/6f/Linjcomb.png" alt="Linear combinations of two vectors" /></p><blockquote><p><em>圖片來源</em></p><ul><li>作者：維基共享資源用戶 <a href="https://commons.wikimedia.org/wiki/User:Svjo">Svjo</a><li>授權條款：<a href="https://creativecommons.org/licenses/by-sa/4.0/deed.en">CC BY-SA 4.0</a></ul></blockquote><h3 id="生成">生成</h3><p>如此，向量們的線性組合便構成向量空間，這稱為空間的<strong>生成（span）</strong>。</p><blockquote class="prompt-info"><p><strong>定義</strong><br /> 對於向量空間 $\mathbb{V}$ 的非空子集 $S$，由 $S$ 中向量所有線性組合所成的集合稱為 $S$ 的<strong>生成空間（span）</strong>，記為 $\mathrm{span}(S)$。但定義 $\mathrm{span}(\emptyset) = { \mathbf{0} }$。</p></blockquote><blockquote class="prompt-info"><p><strong>定義</strong><br /> 若向量空間 $\mathbb{V}$ 的子集 $S$ 滿足 $\mathrm{span}(S) = \mathbb{V}$，則稱 $S$<strong>生成（generate 或 span）</strong>$\mathbb{V}$。</p></blockquote><p>雖然我們尚未探討子空間、基底等概念，但記住此例，有助於理解向量空間的概念。</p>]]> </content> </entry> <entry><title xml:lang="zh-TW">Kaggle「Pandas」課程內容整理（2）— Lesson 4–6</title><link href="https://www.yunseo.kim/zh-TW/posts/summary-of-kaggle-pandas-course-2/" rel="alternate" type="text/html" hreflang="en" /><link href="https://www.yunseo.kim/ko/posts/summary-of-kaggle-pandas-course-2/" rel="alternate" type="text/html" hreflang="ko" /><link href="https://www.yunseo.kim/ja/posts/summary-of-kaggle-pandas-course-2/" rel="alternate" type="text/html" hreflang="ja" /><link href="https://www.yunseo.kim/zh-TW/posts/summary-of-kaggle-pandas-course-2/" rel="alternate" type="text/html" hreflang="zh-TW" /><link href="https://www.yunseo.kim/es/posts/summary-of-kaggle-pandas-course-2/" rel="alternate" type="text/html" hreflang="es" /><link href="https://www.yunseo.kim/pt-BR/posts/summary-of-kaggle-pandas-course-2/" rel="alternate" type="text/html" hreflang="pt-BR" /><link href="https://www.yunseo.kim/fr/posts/summary-of-kaggle-pandas-course-2/" rel="alternate" type="text/html" hreflang="fr" /><link href="https://www.yunseo.kim/de/posts/summary-of-kaggle-pandas-course-2/" rel="alternate" type="text/html" hreflang="de" /><link href="https://www.yunseo.kim/pl/posts/summary-of-kaggle-pandas-course-2/" rel="alternate" type="text/html" hreflang="pl" /><link href="https://www.yunseo.kim/cs/posts/summary-of-kaggle-pandas-course-2/" rel="alternate" type="text/html" hreflang="cs" /><link href="https://www.yunseo.kim/sw/posts/summary-of-kaggle-pandas-course-2/" rel="alternate" type="text/html" hreflang="sw" /><link href="https://www.yunseo.kim/am/posts/summary-of-kaggle-pandas-course-2/" rel="alternate" type="text/html" hreflang="am" /><published>2025-08-24T00:00:00+09:00</published> <updated>2025-08-24T00:00:00+09:00</updated> <id>https://www.yunseo.kim/zh-TW/posts/summary-of-kaggle-pandas-course-2/</id> <author> <name>Yunseo Kim</name> </author> <category term="AI & Data" /> <category term="Machine Learning" /> <summary xml:lang="zh-TW">整理用於資料清理與處理的 pandas 函式庫實務用法；摘要 Kaggle「Pandas」公開課程並視需要補充。本文涵蓋課程後半部（Lesson 4–6）：分組與排序、資料型別與缺失值、重新命名與資料合併。</summary> <content type="html" xml:lang="zh-TW"> <![CDATA[<p>整理用於資料清理與處理的 pandas 函式庫實務用法；摘要 Kaggle「Pandas」公開課程並視需要補充。本文涵蓋課程後半部（Lesson 4–6）：分組與排序、資料型別與缺失值、重新命名與資料合併。</p><em><p>* Mathematical equations and diagrams included in posts may not display properly when viewed with a feed reader.</p></em><p>透過 Kaggle 的 <a href="https://www.kaggle.com/learn/pandas">Pandas</a> 課程學習後，將所學整理於此。<br /> 由於篇幅頗長，分成兩篇。</p><ul><li><a href="/zh-TW/posts/summary-of-kaggle-pandas-course-1/">第 1 篇：Lesson 1–3</a><li>第 2 篇：Lesson 4–6（本文）</ul><p><img src="/assets/img/kaggle-pandas/certificate.png" alt="結業證書" /></p><h2 id="lesson-4-grouping-and-sorting">Lesson 4. Grouping and Sorting</h2><p>有時需要先將資料分組，針對各組做彙整或操作，或依特定準則進行排序。</p><h3 id="分組分析">分組分析</h3><p>使用 <a href="https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.groupby.html"><code class="language-plaintext highlighter-rouge">groupby()</code></a> 方法可把某欄值相同的資料歸為一組，之後對各組進行摘要或操作。</p><p>前面看過<a href="/zh-TW/posts/summary-of-kaggle-pandas-course-1/#檢視資料概要">《<code class="language-plaintext highlighter-rouge">value_counts()</code> 方法》</a>，同樣的操作也可以用 <code class="language-plaintext highlighter-rouge">groupby()</code> 如下實作：</p><div class="language-python highlighter-rouge"><div class="highlight">class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre><td class="rouge-code"><pre><span class="n">reviews</span><span class="p">.</span><span class="nf">groupby</span><span class="p">(</span><span class="sh">'</span><span class="s">taster_name</span><span class="sh">'</span><span class="p">).</span><span class="nf">size</span><span class="p">()</span>
</pre></div></div><ol><li>以 <code class="language-plaintext highlighter-rouge">taster_name</code> 欄把 <code class="language-plaintext highlighter-rouge">reviews</code> 資料框分組<li>回傳每組的大小（筆數）為一個序列</ol><p>或是：</p><div class="language-python highlighter-rouge"><div class="highlight">class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre><td class="rouge-code"><pre><span class="n">reviews</span><span class="p">.</span><span class="nf">groupby</span><span class="p">(</span><span class="sh">'</span><span class="s">taster_name</span><span class="sh">'</span><span class="p">).</span><span class="n">taster_name</span><span class="p">.</span><span class="nf">count</span><span class="p">()</span>
</pre></div></div><ol><li>以 <code class="language-plaintext highlighter-rouge">taster_name</code> 欄把 <code class="language-plaintext highlighter-rouge">reviews</code> 資料框分組<li>對各組選取 <code class="language-plaintext highlighter-rouge">taster_name</code> 欄<li>回傳各組中非缺失值的數量為序列</ol><p>也就是說，<code class="language-plaintext highlighter-rouge">value_counts()</code> 其實是上述動作的速記。除了 <a href="https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.count.html"><code class="language-plaintext highlighter-rouge">count()</code></a> 以外，其他各種摘要函式也能這麼用。比如要從葡萄酒資料中查各評分的最低價：</p><div class="language-python highlighter-rouge"><div class="highlight">class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre><td class="rouge-code"><pre><span class="n">reviews</span><span class="p">.</span><span class="nf">groupby</span><span class="p">(</span><span class="sh">'</span><span class="s">points</span><span class="sh">'</span><span class="p">).</span><span class="n">price</span><span class="p">.</span><span class="nf">min</span><span class="p">()</span>
</pre></div></div><div class="language-plaintext highlighter-rouge"><div class="highlight">class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
</pre><td class="rouge-code"><pre>points
80      5.0
81      5.0
       ... 
99     44.0
100    80.0
Name: price, Length: 21, dtype: float64
</pre></div></div><ol><li>以 <code class="language-plaintext highlighter-rouge">points</code> 欄把 <code class="language-plaintext highlighter-rouge">reviews</code> 分組<li>對各組選取 <code class="language-plaintext highlighter-rouge">price</code> 欄<li>回傳最小值為序列</ol><p>也可以同時以多個欄位分組。若要挑出各「國家 × 省」中評分最高的葡萄酒資料：</p><div class="language-python highlighter-rouge"><div class="highlight">class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre><td class="rouge-code"><pre><span class="n">reviews</span><span class="p">.</span><span class="nf">groupby</span><span class="p">([</span><span class="sh">'</span><span class="s">country</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">province</span><span class="sh">'</span><span class="p">]).</span><span class="nf">apply</span><span class="p">(</span><span class="k">lambda</span> <span class="n">df</span><span class="p">:</span> <span class="n">df</span><span class="p">.</span><span class="n">loc</span><span class="p">[</span><span class="n">df</span><span class="p">.</span><span class="n">points</span><span class="p">.</span><span class="nf">idxmax</span><span class="p">()])</span>
</pre></div></div><p>另一個值得知道的 DataFrameGroupBy 物件方法是 <a href="https://pandas.pydata.org/docs/reference/api/pandas.core.groupby.DataFrameGroupBy.agg.html"><code class="language-plaintext highlighter-rouge">agg()</code></a>。使用它可以在分組後，對各組同時執行多個函式。</p><blockquote class="prompt-tip"><p>可傳入的引數包括：</p><ul><li>函式<li>函式名稱字串<li>函式或函式名稱的列表<li>字典（鍵為軸標籤、值為要套用於該軸的函式或函式列表）</ul><p>其中函式必須</p><ul><li>能以資料框為輸入，或<li>能作為<a href="/zh-TW/posts/summary-of-kaggle-pandas-course-1/#映射maps">前面談過的</a> <a href="https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.apply.html"><code class="language-plaintext highlighter-rouge">DataFrame.apply()</code></a> 的參數</ul><p>以上為補充說明，原 Kaggle 課程未詳述，據 pandas 官方文件增補。</p></blockquote><p>例如計算各國價格的統計量：</p><div class="language-python highlighter-rouge"><div class="highlight">class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre><td class="rouge-code"><pre><span class="n">reviews</span><span class="p">.</span><span class="nf">groupby</span><span class="p">([</span><span class="sh">'</span><span class="s">country</span><span class="sh">'</span><span class="p">]).</span><span class="n">price</span><span class="p">.</span><span class="nf">agg</span><span class="p">([</span><span class="nb">len</span><span class="p">,</span> <span class="nb">min</span><span class="p">,</span> <span class="nb">max</span><span class="p">])</span>
</pre></div></div><blockquote class="prompt-tip"><p>這裡的 <code class="language-plaintext highlighter-rouge">len</code> 指的是 Python 內建函式 <a href="https://docs.python.org/3/library/functions.html#len"><code class="language-plaintext highlighter-rouge">len()</code></a>。此例中用來輸出各分組（以 <code class="language-plaintext highlighter-rouge">country</code> 分）之價格（<code class="language-plaintext highlighter-rouge">price</code>）資料筆數，且會<u>包含缺失值</u>。因它能以資料框或序列為輸入，故可直接使用。</p><p>pandas 提供的 <a href="https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.count.html"><code class="language-plaintext highlighter-rouge">count()</code></a> 方法則<u>只計數非缺失值</u>，行為不同。</p><p>以上為補充說明，原 Kaggle 課程未詳述，據 Python 與 pandas 官方文件增補。</p></blockquote><h3 id="多重索引">多重索引</h3><p>使用 <code class="language-plaintext highlighter-rouge">groupby()</code> 進行加工分析時，常會得到具有多層級、多標籤的多重索引資料框。</p><div class="language-python highlighter-rouge"><div class="highlight">class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
</pre><td class="rouge-code"><pre><span class="n">countries_reviewed</span> <span class="o">=</span> <span class="n">reviews</span><span class="p">.</span><span class="nf">groupby</span><span class="p">([</span><span class="sh">'</span><span class="s">country</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">province</span><span class="sh">'</span><span class="p">]).</span><span class="n">description</span><span class="p">.</span><span class="nf">agg</span><span class="p">([</span><span class="nb">len</span><span class="p">])</span>
<span class="n">countries_reviewed</span>
</pre></div></div><table><tr><th><th><th>len<tr><th>Country<th>province<th><tr><td rowspan="2">Argentina<td>Mendoza Province<td>3264<tr><td>Other<td>536<tr><td>...<td>...<td>...<tr><td rowspan="2">Uruguay<td>San Jose<td>3<tr><td>Uruguay<td>24</table><div class="language-python highlighter-rouge"><div class="highlight">class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
</pre><td class="rouge-code"><pre><span class="n">mi</span> <span class="o">=</span> <span class="n">countries_reviewed</span><span class="p">.</span><span class="n">index</span>
<span class="nf">type</span><span class="p">(</span><span class="n">mi</span><span class="p">)</span>
</pre></div></div><div class="language-plaintext highlighter-rouge"><div class="highlight">class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre><td class="rouge-code"><pre>pandas.core.indexes.multi.MultiIndex
</pre></div></div><p>多重索引具備一些單層索引沒有、用來處理層級結構的便利方法。更完整的使用方式與指引可見 <a href="https://pandas.pydata.org/pandas-docs/stable/user_guide/advanced.html">pandas 使用者指南的 MultiIndex / advanced indexing 章節</a>。</p><p>不過，最常用的大概是把它還原成一般索引的 <a href="https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.reset_index.html"><code class="language-plaintext highlighter-rouge">reset_index()</code></a>。</p><div class="language-python highlighter-rouge"><div class="highlight">class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre><td class="rouge-code"><pre><span class="n">countries_reviewed</span><span class="p">.</span><span class="nf">reset_index</span><span class="p">()</span>
</pre></div></div><table><thead><tr><th> <th>country<th>province<th>len<tbody><tr><td>0<td>Argentina<td>Mendoza Province<td>3264<tr><td>1<td>Argentina<td>Other<td>536<tr><td>…<td>…<td>…<td>…<tr><td>423<td>Uruguay<td>San Jose<td>3<tr><td>424<td>Uruguay<td>Uruguay<td>24</table><h3 id="排序">排序</h3><p>回頭看我們一直用的 <code class="language-plaintext highlighter-rouge">countries_reviewed</code>，會發現分組後的結果是依索引順序回傳。也就是說，<code class="language-plaintext highlighter-rouge">groupby</code> 結果的列順序由索引值決定，而非資料內容。</p><p>需要其他排序方式時，可用 <a href="https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.sort_values.html"><code class="language-plaintext highlighter-rouge">sort_values()</code></a> 很方便。例如以下可依資料筆數（’len’）對國家與省份資訊做遞增排序：</p><div class="language-python highlighter-rouge"><div class="highlight">class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
</pre><td class="rouge-code"><pre><span class="n">countries_reviewed</span> <span class="o">=</span> <span class="n">countries_reviewed</span><span class="p">.</span><span class="nf">reset_index</span><span class="p">()</span>
<span class="n">countries_reviewed</span><span class="p">.</span><span class="nf">sort_values</span><span class="p">(</span><span class="n">by</span><span class="o">=</span><span class="sh">'</span><span class="s">len</span><span class="sh">'</span><span class="p">)</span>
</pre></div></div><table><thead><tr><th> <th>country<th>province<th>len<tbody><tr><td>179<td>Greece<td>Muscat of Kefallonian<td>1<tr><td>192<td>Greece<td>Sterea Ellada<td>1<tr><td>…<td>…<td>…<td>…<tr><td>415<td>US<td>Washington<td>8639<tr><td>392<td>US<td>California<td>36247</table><p><code class="language-plaintext highlighter-rouge">sort_values()</code> 預設為遞增（由小到大），若加上選項即可改為遞減：</p><div class="language-python highlighter-rouge"><div class="highlight">class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre><td class="rouge-code"><pre><span class="n">countries_reviewed</span><span class="p">.</span><span class="nf">sort_values</span><span class="p">(</span><span class="n">by</span><span class="o">=</span><span class="sh">'</span><span class="s">len</span><span class="sh">'</span><span class="p">,</span> <span class="n">ascending</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
</pre></div></div><table><thead><tr><th> <th>country<th>province<th>len<tbody><tr><td>392<td>US<td>California<td>36247<tr><td>415<td>US<td>Washington<td>8639<tr><td>…<td>…<td>…<td>…<tr><td>63<td>Chile<td>Coelemu<td>1<tr><td>149<td>Greece<td>Beotia<td>1</table><p>若要依索引排序則使用 <a href="https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.sort_index.html"><code class="language-plaintext highlighter-rouge">sort_index()</code></a>。其引數與預設排序方向（內減序）與 <code class="language-plaintext highlighter-rouge">sort_values()</code> 相同，用法一致。</p><div class="language-python highlighter-rouge"><div class="highlight">class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre><td class="rouge-code"><pre><span class="n">countries_reviewed</span><span class="p">.</span><span class="nf">sort_index</span><span class="p">()</span>
</pre></div></div><table><thead><tr><th> <th>country<th>province<th>len<tbody><tr><td>0<td>Argentina<td>Mendoza Province<td>3264<tr><td>1<td>Argentina<td>Other<td>536<tr><td>…<td>…<td>…<td>…<tr><td>423<td>Uruguay<td>San Jose<td>3<tr><td>424<td>Uruguay<td>Uruguay<td>24</table><p>最後，也可以一次以多個欄位作為排序鍵：</p><div class="language-python highlighter-rouge"><div class="highlight">class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre><td class="rouge-code"><pre><span class="n">countries_reviewed</span><span class="p">.</span><span class="nf">sort_values</span><span class="p">(</span><span class="n">by</span><span class="o">=</span><span class="p">[</span><span class="sh">'</span><span class="s">country</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">len</span><span class="sh">'</span><span class="p">])</span>
</pre></div></div><h2 id="lesson-5-data-types-and-missing-values">Lesson 5. Data Types and Missing Values</h2><p>真實世界的資料很少一開始就乾淨齊整，更多時候是欄位型別需轉換、或夾雜缺失值而必須適當處理。資料加工分析時，最大的難關往往就在這一步。</p><h3 id="資料型別">資料型別</h3><p>資料框某欄（或序列）的型別稱為該欄的 dtype。可以由 <code class="language-plaintext highlighter-rouge">dtype</code> 屬性檢視資料框特定欄位的型別。以下例子檢視 <code class="language-plaintext highlighter-rouge">reviews</code> 的 <code class="language-plaintext highlighter-rouge">price</code> 欄之 <code class="language-plaintext highlighter-rouge">dtype</code>：</p><div class="language-python highlighter-rouge"><div class="highlight">class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre><td class="rouge-code"><pre><span class="n">reviews</span><span class="p">.</span><span class="n">price</span><span class="p">.</span><span class="n">dtype</span>
</pre></div></div><div class="language-plaintext highlighter-rouge"><div class="highlight">class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre><td class="rouge-code"><pre>dtype('float64')
</pre></div></div><p>或以 <code class="language-plaintext highlighter-rouge">dtypes</code> 屬性一次性檢視整個資料框所有欄位的 <code class="language-plaintext highlighter-rouge">dtype</code>：</p><div class="language-python highlighter-rouge"><div class="highlight">class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre><td class="rouge-code"><pre><span class="n">reviews</span><span class="p">.</span><span class="n">dtypes</span>
</pre></div></div><div class="language-plaintext highlighter-rouge"><div class="highlight">class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
</pre><td class="rouge-code"><pre>country        object
description    object
                ...  
variety        object
winery         object
Length: 13, dtype: object
</pre></div></div><p><code class="language-plaintext highlighter-rouge">dtype</code> 表示 pandas 內部如何存放資料。例如 <code class="language-plaintext highlighter-rouge">float64</code> 表 64 位元浮點數，<code class="language-plaintext highlighter-rouge">int64</code> 表 64 位元整數。</p><p>一個特別之處是，純字串欄位不具獨立型別，而被視作物件（<code class="language-plaintext highlighter-rouge">object</code>）。</p><p>使用 <a href="https://pandas.pydata.org/docs/reference/api/pandas.Series.astype.html"><code class="language-plaintext highlighter-rouge">astype()</code></a> 可將某欄由一種型別轉為另一種。例如把先前 <code class="language-plaintext highlighter-rouge">int64</code> 的 <code class="language-plaintext highlighter-rouge">points</code> 欄轉成 <code class="language-plaintext highlighter-rouge">float64</code>：</p><div class="language-python highlighter-rouge"><div class="highlight">class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre><td class="rouge-code"><pre><span class="n">reviews</span><span class="p">.</span><span class="n">points</span><span class="p">.</span><span class="nf">astype</span><span class="p">(</span><span class="sh">'</span><span class="s">float64</span><span class="sh">'</span><span class="p">)</span>
</pre></div></div><div class="language-plaintext highlighter-rouge"><div class="highlight">class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
</pre><td class="rouge-code"><pre>0         87.0
1         87.0
          ... 
129969    90.0
129970    90.0
Name: points, Length: 129971, dtype: float64
</pre></div></div><p>資料框或序列的索引同樣具有型別：</p><div class="language-python highlighter-rouge"><div class="highlight">class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre><td class="rouge-code"><pre><span class="n">reviews</span><span class="p">.</span><span class="n">index</span><span class="p">.</span><span class="n">dtype</span>
</pre></div></div><div class="language-plaintext highlighter-rouge"><div class="highlight">class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre><td class="rouge-code"><pre>dtype('int64')
</pre></div></div><p>此外，pandas 也支援外部型別，例如類別型（categorical）或時間序列型（datetime 等）。</p><h3 id="缺失值">缺失值</h3><p>沒有值、空白的項目會被指定為 <code class="language-plaintext highlighter-rouge">NaN</code>（“Not a Number”的縮寫）。基於技術原因，<code class="language-plaintext highlighter-rouge">NaN</code> 總是 <code class="language-plaintext highlighter-rouge">float64</code> 型別。</p><p>pandas 內建多個處理缺失值的函式。<a href="/zh-TW/posts/summary-of-kaggle-pandas-course-1/#條件式選取">之前也稍微看過類似的內容</a>：除了方法之外，pandas 也提供獨立函式 <a href="https://pandas.pydata.org/docs/reference/api/pandas.isna.html"><code class="language-plaintext highlighter-rouge">pd.isna</code></a> 與 <a href="https://pandas.pydata.org/docs/reference/api/pandas.notna.html"><code class="language-plaintext highlighter-rouge">pd.notna</code></a>。它們會對給定項目回傳布林值或布林陣列，用來表示是否為缺失值，可像下面這樣應用：</p><div class="language-python highlighter-rouge"><div class="highlight">class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre><td class="rouge-code"><pre><span class="n">reviews</span><span class="p">[</span><span class="n">pd</span><span class="p">.</span><span class="nf">isna</span><span class="p">(</span><span class="n">reviews</span><span class="p">.</span><span class="n">country</span><span class="p">)]</span>
</pre></div></div><p>通常我們要先檢查是否存在缺失值，若有則採取適當補值策略。策略很多，其中 <a href="https://pandas.pydata.org/docs/reference/api/pandas.Series.fillna.html"><code class="language-plaintext highlighter-rouge">fillna()</code></a> 可把缺失值替換成合適常數。以下把 <code class="language-plaintext highlighter-rouge">reviews</code> 的 <code class="language-plaintext highlighter-rouge">region_2</code> 欄內所有 <code class="language-plaintext highlighter-rouge">NaN</code> 改成 <code class="language-plaintext highlighter-rouge">"Unknown"</code>：</p><div class="language-python highlighter-rouge"><div class="highlight">class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre><td class="rouge-code"><pre><span class="n">reviews</span><span class="p">.</span><span class="n">region_2</span><span class="p">.</span><span class="nf">fillna</span><span class="p">(</span><span class="sh">"</span><span class="s">Unknown</span><span class="sh">"</span><span class="p">)</span>
</pre></div></div><p>或者，遇缺失值時以前一個或後一個最近的有效值填補（forward fill / backward fill），可分別用 <a href="https://pandas.pydata.org/docs/reference/api/pandas.Series.ffill.html"><code class="language-plaintext highlighter-rouge">ffill()</code></a>、<a href="https://pandas.pydata.org/docs/reference/api/pandas.Series.bfill.html"><code class="language-plaintext highlighter-rouge">bfill()</code></a> 實現。</p><blockquote class="prompt-danger"><p>過去也能在 <code class="language-plaintext highlighter-rouge">fillna()</code> 中以 <code class="language-plaintext highlighter-rouge">method</code> 參數傳入 <code class="language-plaintext highlighter-rouge">'ffill'</code>、<code class="language-plaintext highlighter-rouge">'bfill'</code> 字串；但自 pandas 2.1.0 起該作法已被標註為 deprecated，不再建議使用，請改用情境合適的 <code class="language-plaintext highlighter-rouge">ffill()</code> 或 <code class="language-plaintext highlighter-rouge">bfill()</code> 方法。</p></blockquote><p>另外，有時即便不是缺失值，也可能需要把特定值整批替換成另一值。原 Kaggle 課程用的是某位評論者的 Twitter handle 更名為例。為了更貼近日常情境，我們改用另一個想像案例：</p><p>韓國將京畿道北部劃設為新的行政區，命名為<strong>京畿北道</strong>，並據此更新資料集。此時若有人突發奇想要把<strong>京畿北道</strong>這個好好的名稱改成<strong>平和之路特別自治道</strong>，而且還真的推行了——雖說是假設，但想想差點可能成真的情況也確實令人心驚。那麼我們就得把既有資料集中的 <code class="language-plaintext highlighter-rouge">"Gyeonggibuk-do"</code> 全部替換成新的值，如 <code class="language-plaintext highlighter-rouge">"Pyeonghwanuri State"</code> 或 <code class="language-plaintext highlighter-rouge">"Pyeonghwanuri Special Self-Governing Province"</code>。在 pandas 中可用 <a href="https://pandas.pydata.org/docs/reference/api/pandas.Series.replace.html"><code class="language-plaintext highlighter-rouge">replace()</code></a> 來做這件事。</p><div class="language-python highlighter-rouge"><div class="highlight">class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre><td class="rouge-code"><pre><span class="n">rok_2030_census</span><span class="p">.</span><span class="n">province</span><span class="p">.</span><span class="nf">replace</span><span class="p">(</span><span class="sh">"</span><span class="s">Gyeonggibuk-do</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">Pyeonghwanuri Special Self-Governing Province</span><span class="sh">"</span><span class="p">)</span>
</pre></div></div><p>用上面的範例，便能把 <code class="language-plaintext highlighter-rouge">rok_2030_census</code> 資料集 <code class="language-plaintext highlighter-rouge">province</code> 欄內的所有 <code class="language-plaintext highlighter-rouge">"Gyeonggibuk-do"</code> 一口氣換成那個「很長的名字」。<del>想到現實裡並沒有真的有人必須跑這段程式，仍不禁鬆一口氣。</del></p><p>這類字串替換在缺失值處理與資料清理時也很常見，因為缺失有時不是 <code class="language-plaintext highlighter-rouge">NaN</code>，而是以 <code class="language-plaintext highlighter-rouge">"Unknown"</code>、<code class="language-plaintext highlighter-rouge">"Undisclosed"</code>、<code class="language-plaintext highlighter-rouge">"Invalid"</code> 等字串出現。在將舊公文或表單 OCR 成資料集等現實任務中，反而經常會遇見。</p><h2 id="lesson-6-renaming-and-combining">Lesson 6. Renaming and Combining</h2><p>有時需要更改資料集中特定欄或索引的名稱；也常需要把多個資料框或序列結合起來。</p><h3 id="重新命名">重新命名</h3><p>使用 <a href="https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.rename.html"><code class="language-plaintext highlighter-rouge">rename()</code></a> 可更改資料集中特定欄或索引的名稱。<code class="language-plaintext highlighter-rouge">rename()</code> 支援多種輸入形式，最常見也最方便的是使用 Python 字典。以下在 <code class="language-plaintext highlighter-rouge">reviews</code> 中把 <code class="language-plaintext highlighter-rouge">points</code> 欄改名為 <code class="language-plaintext highlighter-rouge">score</code>，並把索引值 <code class="language-plaintext highlighter-rouge">0</code>、<code class="language-plaintext highlighter-rouge">1</code> 改為 <code class="language-plaintext highlighter-rouge">firstEntry</code>、<code class="language-plaintext highlighter-rouge">secondEntry</code>：</p><div class="language-python highlighter-rouge"><div class="highlight">class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre><td class="rouge-code"><pre><span class="n">reviews</span><span class="p">.</span><span class="nf">rename</span><span class="p">(</span><span class="n">columns</span><span class="o">=</span><span class="p">{</span><span class="sh">'</span><span class="s">points</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">score</span><span class="sh">'</span><span class="p">})</span>
</pre></div></div><div class="language-python highlighter-rouge"><div class="highlight">class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre><td class="rouge-code"><pre><span class="n">reviews</span><span class="p">.</span><span class="nf">rename</span><span class="p">(</span><span class="n">index</span><span class="o">=</span><span class="p">{</span><span class="mi">0</span><span class="p">:</span> <span class="sh">'</span><span class="s">firstEntry</span><span class="sh">'</span><span class="p">,</span> <span class="mi">1</span><span class="p">:</span> <span class="sh">'</span><span class="s">secondEntry</span><span class="sh">'</span><span class="p">})</span>
</pre></div></div><p>實務上比較常改的是欄名，較少改索引值名稱。且若是為此目的，<a href="/zh-TW/posts/summary-of-kaggle-pandas-course-1/#操作索引">如先前所見</a> 通常用 <a href="https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.set_index.html"><code class="language-plaintext highlighter-rouge">set_index()</code></a> 更方便。</p><p>列索引與欄索引本身也有 <code class="language-plaintext highlighter-rouge">name</code> 屬性；使用 <code class="language-plaintext highlighter-rouge">rename_axis()</code> 可更改軸名稱。例如將列索引命名為 <code class="language-plaintext highlighter-rouge">wines</code>、欄軸命名為 <code class="language-plaintext highlighter-rouge">fields</code>：</p><div class="language-python highlighter-rouge"><div class="highlight">class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre><td class="rouge-code"><pre><span class="n">reviews</span><span class="p">.</span><span class="nf">rename_axis</span><span class="p">(</span><span class="sh">"</span><span class="s">wines</span><span class="sh">"</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="sh">'</span><span class="s">index</span><span class="sh">'</span><span class="p">).</span><span class="nf">rename_axis</span><span class="p">(</span><span class="sh">"</span><span class="s">fields</span><span class="sh">"</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="sh">'</span><span class="s">columns</span><span class="sh">'</span><span class="p">)</span>
</pre></div></div><h3 id="合併資料集">合併資料集</h3><p>有時需要把資料框與資料框、或序列與序列合併。pandas 提供三個核心工具，按由簡到繁依序是 <a href="https://pandas.pydata.org/docs/reference/api/pandas.concat.html"><code class="language-plaintext highlighter-rouge">concat()</code></a>、<a href="https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.join.html"><code class="language-plaintext highlighter-rouge">join()</code></a>、<a href="https://pandas.pydata.org/docs/reference/api/pandas.merge.html"><code class="language-plaintext highlighter-rouge">merge()</code></a>。Kaggle 課程指出：<code class="language-plaintext highlighter-rouge">merge()</code> 能做的大多數事，通常用 <code class="language-plaintext highlighter-rouge">join()</code> 更簡單，因此重點放在前兩者。</p><p><code class="language-plaintext highlighter-rouge">concat()</code> 最單純：把多個資料框或序列沿某個軸直接接起來。當待合併的資料框（或序列）擁有相同欄位時特別好用。預設沿索引軸拼接；指定 <code class="language-plaintext highlighter-rouge">axis=1</code> 或 <code class="language-plaintext highlighter-rouge">axis='columns'</code> 則沿欄軸拼接。</p><div class="language-python highlighter-rouge"><div class="highlight">class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
</pre><td class="rouge-code"><pre><span class="o">&gt;&gt;&gt;</span> <span class="n">s1</span> <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="nc">Series</span><span class="p">([</span><span class="sh">'</span><span class="s">a</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">b</span><span class="sh">'</span><span class="p">])</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">s2</span> <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="nc">Series</span><span class="p">([</span><span class="sh">'</span><span class="s">c</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">d</span><span class="sh">'</span><span class="p">])</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">pd</span><span class="p">.</span><span class="nf">concat</span><span class="p">([</span><span class="n">s1</span><span class="p">,</span> <span class="n">s2</span><span class="p">])</span>
<span class="mi">0</span>    <span class="n">a</span>
<span class="mi">1</span>    <span class="n">b</span>
<span class="mi">0</span>    <span class="n">c</span>
<span class="mi">1</span>    <span class="n">d</span>
<span class="n">dtype</span><span class="p">:</span> <span class="nb">object</span>
</pre></div></div><div class="language-python highlighter-rouge"><div class="highlight">class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
</pre><td class="rouge-code"><pre><span class="o">&gt;&gt;&gt;</span> <span class="n">df1</span> <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="nc">DataFrame</span><span class="p">([[</span><span class="sh">'</span><span class="s">a</span><span class="sh">'</span><span class="p">,</span> <span class="mi">1</span><span class="p">],</span> <span class="p">[</span><span class="sh">'</span><span class="s">b</span><span class="sh">'</span><span class="p">,</span> <span class="mi">2</span><span class="p">]],</span>
<span class="p">...</span>                    <span class="n">columns</span><span class="o">=</span><span class="p">[</span><span class="sh">'</span><span class="s">letter</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">number</span><span class="sh">'</span><span class="p">])</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">df1</span>
  <span class="n">letter</span>  <span class="n">number</span>
<span class="mi">0</span>      <span class="n">a</span>       <span class="mi">1</span>
<span class="mi">1</span>      <span class="n">b</span>       <span class="mi">2</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">df2</span> <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="nc">DataFrame</span><span class="p">([[</span><span class="sh">'</span><span class="s">c</span><span class="sh">'</span><span class="p">,</span> <span class="mi">3</span><span class="p">],</span> <span class="p">[</span><span class="sh">'</span><span class="s">d</span><span class="sh">'</span><span class="p">,</span> <span class="mi">4</span><span class="p">]],</span>
<span class="p">...</span>                    <span class="n">columns</span><span class="o">=</span><span class="p">[</span><span class="sh">'</span><span class="s">letter</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">number</span><span class="sh">'</span><span class="p">])</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">df2</span>
  <span class="n">letter</span>  <span class="n">number</span>
<span class="mi">0</span>      <span class="n">c</span>       <span class="mi">3</span>
<span class="mi">1</span>      <span class="n">d</span>       <span class="mi">4</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">pd</span><span class="p">.</span><span class="nf">concat</span><span class="p">([</span><span class="n">df1</span><span class="p">,</span> <span class="n">df2</span><span class="p">])</span>
  <span class="n">letter</span>  <span class="n">number</span>
<span class="mi">0</span>      <span class="n">a</span>       <span class="mi">1</span>
<span class="mi">1</span>      <span class="n">b</span>       <span class="mi">2</span>
<span class="mi">0</span>      <span class="n">c</span>       <span class="mi">3</span>
<span class="mi">1</span>      <span class="n">d</span>       <span class="mi">4</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">df4</span> <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="nc">DataFrame</span><span class="p">([[</span><span class="sh">'</span><span class="s">bird</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">polly</span><span class="sh">'</span><span class="p">],</span> <span class="p">[</span><span class="sh">'</span><span class="s">monkey</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">george</span><span class="sh">'</span><span class="p">]],</span>
<span class="p">...</span>                    <span class="n">columns</span><span class="o">=</span><span class="p">[</span><span class="sh">'</span><span class="s">animal</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">])</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">df4</span>
   <span class="n">animal</span>    <span class="n">name</span>
<span class="mi">0</span>    <span class="n">bird</span>   <span class="n">polly</span>
<span class="mi">1</span>  <span class="n">monkey</span>  <span class="n">george</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">pd</span><span class="p">.</span><span class="nf">concat</span><span class="p">([</span><span class="n">df1</span><span class="p">,</span> <span class="n">df4</span><span class="p">],</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
  <span class="n">letter</span>  <span class="n">number</span>  <span class="n">animal</span>    <span class="n">name</span>
<span class="mi">0</span>      <span class="n">a</span>       <span class="mi">1</span>    <span class="n">bird</span>   <span class="n">polly</span>
<span class="mi">1</span>      <span class="n">b</span>       <span class="mi">2</span>  <span class="n">monkey</span>  <span class="n">george</span>
</pre></div></div><blockquote class="prompt-tip"><p>依<a href="(https://pandas.pydata.org/docs/reference/api/pandas.concat.html)">官方文件</a>，若要把多筆列合成單一資料框，不建議在迴圈中逐列追加；應先把要合併的列收成列表，再用一次 <code class="language-plaintext highlighter-rouge">concat()</code> 合併。</p></blockquote><p><code class="language-plaintext highlighter-rouge">join()</code> 較複雜一些：它會依索引，把另一個資料框接到第一個資料框上。若雙方有重名欄位，須分別用 <code class="language-plaintext highlighter-rouge">lsuffix</code> 與 <code class="language-plaintext highlighter-rouge">rsuffix</code> 指定左右兩邊欄名要加上的後綴，避免衝突。</p><div class="language-python highlighter-rouge"><div class="highlight">class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
</pre><td class="rouge-code"><pre><span class="o">&gt;&gt;&gt;</span> <span class="n">df</span> <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="nc">DataFrame</span><span class="p">({</span><span class="sh">'</span><span class="s">key</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">K0</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">K1</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">K2</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">K3</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">K4</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">K5</span><span class="sh">'</span><span class="p">],</span>
<span class="p">...</span>                    <span class="sh">'</span><span class="s">A</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">A0</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">A1</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">A2</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">A3</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">A4</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">A5</span><span class="sh">'</span><span class="p">]})</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">df</span>
  <span class="n">key</span>   <span class="n">A</span>
<span class="mi">0</span>  <span class="n">K0</span>  <span class="n">A0</span>
<span class="mi">1</span>  <span class="n">K1</span>  <span class="n">A1</span>
<span class="mi">2</span>  <span class="n">K2</span>  <span class="n">A2</span>
<span class="mi">3</span>  <span class="n">K3</span>  <span class="n">A3</span>
<span class="mi">4</span>  <span class="n">K4</span>  <span class="n">A4</span>
<span class="mi">5</span>  <span class="n">K5</span>  <span class="n">A5</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">other</span> <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="nc">DataFrame</span><span class="p">({</span><span class="sh">'</span><span class="s">key</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">K0</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">K1</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">K2</span><span class="sh">'</span><span class="p">],</span>
<span class="p">...</span>                       <span class="sh">'</span><span class="s">B</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">B0</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">B1</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">B2</span><span class="sh">'</span><span class="p">]})</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">other</span>
  <span class="n">key</span>   <span class="n">B</span>
<span class="mi">0</span>  <span class="n">K0</span>  <span class="n">B0</span>
<span class="mi">1</span>  <span class="n">K1</span>  <span class="n">B1</span>
<span class="mi">2</span>  <span class="n">K2</span>  <span class="n">B2</span>
<span class="o">&gt;&gt;&gt;</span> <span class="n">df</span><span class="p">.</span><span class="nf">join</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="n">lsuffix</span><span class="o">=</span><span class="sh">'</span><span class="s">_caller</span><span class="sh">'</span><span class="p">,</span> <span class="n">rsuffix</span><span class="o">=</span><span class="sh">'</span><span class="s">_other</span><span class="sh">'</span><span class="p">)</span>
  <span class="n">key_caller</span>   <span class="n">A</span> <span class="n">key_other</span>    <span class="n">B</span>
<span class="mi">0</span>         <span class="n">K0</span>  <span class="n">A0</span>        <span class="n">K0</span>   <span class="n">B0</span>
<span class="mi">1</span>         <span class="n">K1</span>  <span class="n">A1</span>        <span class="n">K1</span>   <span class="n">B1</span>
<span class="mi">2</span>         <span class="n">K2</span>  <span class="n">A2</span>        <span class="n">K2</span>   <span class="n">B2</span>
<span class="mi">3</span>         <span class="n">K3</span>  <span class="n">A3</span>       <span class="n">NaN</span>  <span class="n">NaN</span>
<span class="mi">4</span>         <span class="n">K4</span>  <span class="n">A4</span>       <span class="n">NaN</span>  <span class="n">NaN</span>
<span class="mi">5</span>         <span class="n">K5</span>  <span class="n">A5</span>       <span class="n">NaN</span>  <span class="n">NaN</span>
</pre></div></div>]]> </content> </entry> <entry><title xml:lang="zh-TW">網頁效能指標（Web Vitals）</title><link href="https://www.yunseo.kim/zh-TW/posts/about-web-vitals/" rel="alternate" type="text/html" hreflang="en" /><link href="https://www.yunseo.kim/ko/posts/about-web-vitals/" rel="alternate" type="text/html" hreflang="ko" /><link href="https://www.yunseo.kim/ja/posts/about-web-vitals/" rel="alternate" type="text/html" hreflang="ja" /><link href="https://www.yunseo.kim/zh-TW/posts/about-web-vitals/" rel="alternate" type="text/html" hreflang="zh-TW" /><link href="https://www.yunseo.kim/es/posts/about-web-vitals/" rel="alternate" type="text/html" hreflang="es" /><link href="https://www.yunseo.kim/pt-BR/posts/about-web-vitals/" rel="alternate" type="text/html" hreflang="pt-BR" /><link href="https://www.yunseo.kim/fr/posts/about-web-vitals/" rel="alternate" type="text/html" hreflang="fr" /><link href="https://www.yunseo.kim/de/posts/about-web-vitals/" rel="alternate" type="text/html" hreflang="de" /><link href="https://www.yunseo.kim/pl/posts/about-web-vitals/" rel="alternate" type="text/html" hreflang="pl" /><link href="https://www.yunseo.kim/cs/posts/about-web-vitals/" rel="alternate" type="text/html" hreflang="cs" /><link href="https://www.yunseo.kim/sw/posts/about-web-vitals/" rel="alternate" type="text/html" hreflang="sw" /><link href="https://www.yunseo.kim/am/posts/about-web-vitals/" rel="alternate" type="text/html" hreflang="am" /><published>2025-08-05T00:00:00+09:00</published> <updated>2025-08-28T18:22:07+09:00</updated> <id>https://www.yunseo.kim/zh-TW/posts/about-web-vitals/</id> <author> <name>Yunseo Kim</name> </author> <category term="Dev" /> <category term="Web Dev" /> <summary xml:lang="zh-TW">整理網頁效能指標（Web Vitals）與 Lighthouse 的量測與評分標準，並說明各指標的意義與最佳化方向，助你提升實際使用者體驗與 SEO。</summary> <content type="html" xml:lang="zh-TW"> <![CDATA[<p>整理網頁效能指標（Web Vitals）與 Lighthouse 的量測與評分標準，並說明各指標的意義與最佳化方向，助你提升實際使用者體驗與 SEO。</p><em><p>* Mathematical equations and diagrams included in posts may not display properly when viewed with a feed reader.</p></em><h2 id="決定網頁效能的要素">決定網頁效能的要素</h2><p>在進行網頁效能最佳化時，影響效能的要素大致可分為「載入效能」與「渲染效能」兩類。</p><h3 id="html-載入效能">HTML 載入效能</h3><ul><li>透過網路向伺服器發出初次頁面請求後，接收 HTML 文件並由瀏覽器開始繪製前的時間<li>決定頁面多快開始出現可見內容<li>透過最小化重新導向、快取 HTML 回應、壓縮資源、妥善運用 CDN 等方式最佳化</ul><h3 id="渲染效能">渲染效能</h3><ul><li>瀏覽器把使用者看到的畫面繪製出來並變得可互動所需的時間<li>決定畫面繪製的流暢度與速度<li>移除不必要的 CSS 與 JS、避免延遲載入字型與縮圖、將沉重計算分離到獨立的 Web Worker 以降低主執行緒（main thread）占用、最佳化動畫等方式進行最佳化</ul><h2 id="網頁效能指標web-vitals">網頁效能指標（Web Vitals）</h2><p>以下以 Google 的 <a href="https://web.dev/performance?hl=zh-TW">web.dev</a> 與 <a href="https://developer.chrome.com/docs/lighthouse/performance/performance-scoring?hl=zh-TW">Chrome 開發人員文件</a>為基準進行說明。除非有特殊理由，不要只聚焦於單一指標，而應以整體改善為目標；找出欲最佳化之頁面中的效能瓶頸所在至關重要。此外，若有實際使用者資料，與其參考前段或平均值，不如關注約略第 1 四分位數（Q1）的低段值，並確認在這些情況下也能達到目標基準再行改善。</p><h3 id="核心網頁生命力core-web-vitals">核心網頁生命力（Core Web Vitals）</h3><p>稍後會介紹 Web Vitals 中的多個指標；其中與使用者體驗最為密切、且可於真實環境量測的三項指標，Google 特別重視，稱為<a href="https://web.dev/articles/vitals?hl=zh-TW#core-web-vitals">核心網頁生命力（Core Web Vitals）</a>。由於 Google 也會在自家搜尋引擎的排名中納入目標網站的核心網頁生命力，對站點經營者而言，這些指標在搜尋引擎最佳化（SEO）上亦須特別留意。</p><ul><li><a href="#lcp最大內容繪製-largest-contentful-paint">最大內容繪製（Largest Contentful Paint, LCP）</a>：反映<em>載入效能</em>，應在 2.5 秒以內<li><a href="https://web.dev/articles/inp?hl=zh-TW">互動到下一次繪製（Interaction to Next Paint, INP）</a>：反映<em>回應性</em>，應在 200ms 以內<li><a href="#cls累積版面位移-cumulative-layout-shift">累積版面位移（Cumulative Layout Shift, CLS）</a>：反映<em>視覺穩定性</em>，應維持在 0.1 以下</ul><p>核心網頁生命力基本上是為真實環境量測而設計，但除了 INP 外，其餘兩者也能在 Chrome 開發人員工具或 Lighthouse 等模擬環境中量測。INP 需要真實使用者輸入才可量測，故無法於模擬環境取得；此時可改參考與 INP 高度相關且類似的指標 <a href="#tbt總封鎖時間-total-blocking-time">TBT</a>，<a href="https://web.dev/articles/vitals?hl=zh-TW#lab_tools_to_measure_core_web_vitals">通常改善 TBT 也會同時改善 INP</a>。</p><h3 id="lighthouse-10-的效能分數權重">Lighthouse 10 的效能分數權重</h3><p><a href="https://developer.chrome.com/docs/lighthouse/performance/performance-scoring?hl=zh-TW">Lighthouse 的效能分數是各量測項目分數的加權平均，權重如下表所示</a>。</p><table><thead><tr><th>量測項目<th>權重<tbody><tr><td><a href="#fcp首次內容繪製-first-contentful-paint">首次內容繪製</a><td>10%<tr><td><a href="#si速度指數-speed-index">速度指數</a><td>10%<tr><td><a href="#lcp最大內容繪製-largest-contentful-paint">最大內容繪製</a><td>25%<tr><td><a href="#tbt總封鎖時間-total-blocking-time">總封鎖時間</a><td>30%<tr><td><a href="#cls累積版面位移-cumulative-layout-shift">累積版面位移</a><td>25%</table><h3 id="fcp首次內容繪製-first-contentful-paint">FCP（首次內容繪製, First Contentful Paint）</h3><ul><li>量測自頁面請求後，至首次繪製 DOM 內容的時間<li>影像、非白色的 <code class="language-plaintext highlighter-rouge">&lt;canvas&gt;</code> 元素、SVG 等皆視為 DOM 內容，但不包含 <code class="language-plaintext highlighter-rouge">iframe</code> 內的內容</ul><blockquote class="prompt-tip"><p>影響 FCP 的重要因素之一是字型載入時間。關於此處的最佳化，<a href="https://developer.chrome.com/docs/lighthouse/performance/first-contentful-paint/?hl=zh-TW">Chrome 開發人員文件</a>建議參考<a href="https://developer.chrome.com/docs/lighthouse/performance/font-display?hl=zh-TW">相關文章</a>。</p></blockquote><h4 id="lighthouse-評分基準">Lighthouse 評分基準</h4><p>依<a href="https://developer.chrome.com/docs/lighthouse/performance/first-contentful-paint/?hl=zh-TW">Chrome 開發人員文件</a>，Lighthouse 的評分基準如下。</p><table><thead><tr><th>顏色等級<th>行動版 FCP（秒）<th>桌面版 FCP（秒）<tbody><tr><td>綠色（快）<td>0-1.8<td>0-0.9<tr><td>橘色（中等）<td>1.8-3<td>0.9-1.6<tr><td>紅色（慢）<td>大於 3<td>大於 1.6</table><h3 id="lcp最大內容繪製-largest-contentful-paint">LCP（最大內容繪製, Largest Contentful Paint）</h3><ul><li>以首次開啟網頁時畫面最先可見的視窗（viewport）為基準，量測該區域內面積最大之元素（圖片、文字區塊、影片等）完成繪製所需時間<li>元素在畫面上佔用面積越大，越可能被使用者視為主要內容<li>若 LCP 是圖片，可將耗時區分為四個子階段，找出瓶頸所在相當重要<ol><li>首位元組時間（TTFB, Time to First Byte）：自頁面載入開始至收到 HTML 回應的第一個位元組的時間<li>載入延遲（Load delay）：瀏覽器開始載入 LCP 資源的時間與 TTFB 之間的差<li>載入時間（Load time）：載入 LCP 資源本身所需的時間<li>繪製延遲（Render delay）：自完成載入 LCP 資源至將 LCP 元素完全繪製完成所需的時間</ol></ul><h4 id="lighthouse-評分基準-1">Lighthouse 評分基準</h4><p>依<a href="https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/?hl=zh-TW">Chrome 開發人員文件</a>，Lighthouse 的評分基準如下。</p><table><thead><tr><th>顏色等級<th>行動版 LCP（秒）<th>桌面版 LCP（秒）<tbody><tr><td>綠色（快）<td>0-2.5<td>0-1.2<tr><td>橘色（中等）<td>2.5-4<td>1.2-2.4<tr><td>紅色（慢）<td>大於 4<td>大於 2.4</table><h3 id="tbt總封鎖時間-total-blocking-time">TBT（總封鎖時間, Total Blocking Time）</h3><ul><li>量測網頁無法對滑鼠點擊、觸控、鍵盤輸入等使用者輸入做出反應的總時長<li>在 FCP 與 <a href="https://developer.chrome.com/docs/lighthouse/performance/interactive?hl=zh-TW">TTI（互動時間, Time to Interactive）</a>* 之間，將執行時間超過 50ms 的作業視為<a href="https://web.dev/articles/long-tasks-devtools?hl=zh-TW">長任務</a>。每個長任務超過 50ms 的部分稱為<em>阻塞部分（blocking portion）</em>，而所有阻塞部分的總和即為 TBT</ul><blockquote class="prompt-info"><p>* TTI 本身對於網路回應離群值與長任務過於敏感，導致一致性不足且變異大，因此<a href="https://developer.chrome.com/blog/lighthouse-10-0#scoring-changes">自 Lighthouse 10 起已從評分項目中移除</a>。</p></blockquote><blockquote class="prompt-tip"><p>造成長任務的最常見原因，多半是不必要或低效率的 JavaScript 載入、剖析與執行。<a href="https://developer.chrome.com/docs/lighthouse/performance/lighthouse-total-blocking-time/?hl=zh-TW">Chrome 開發人員文件</a>與 <a href="https://web.dev/articles/long-tasks-devtools#what_is_causing_my_long_tasks?hl=zh-TW">Google 的 web.dev</a>建議運用<a href="https://web.dev/articles/reduce-javascript-payloads-with-code-splitting?hl=zh-TW">程式碼分割（code splitting）</a>以降低 JavaScript 負載，使每段能在 50ms 內執行；必要時可分離到非主執行緒、或獨立的 Service Worker 以多執行緒方式執行。</p></blockquote><h4 id="lighthouse-評分基準-2">Lighthouse 評分基準</h4><p>依<a href="https://developer.chrome.com/docs/lighthouse/performance/lighthouse-total-blocking-time/?hl=zh-TW">Chrome 開發人員文件</a>，Lighthouse 的評分基準如下。</p><table><thead><tr><th>顏色等級<th>行動版 TBT（毫秒）<th>桌面版 TBT（毫秒）<tbody><tr><td>綠色（快）<td>0-200<td>0-150<tr><td>橘色（中等）<td>200-600<td>150-350<tr><td>紅色（慢）<td>大於 600<td>大於 350</table><h3 id="cls累積版面位移-cumulative-layout-shift">CLS（累積版面位移, Cumulative Layout Shift）</h3><p> <video class="embed-video file" controls="" autoplay="" loop=""> <source src="https://web.dev/static/articles/cls/video/web-dev-assets/layout-instability-api/layout-instability2.webm" type="video/webm" /> Your browser does not support the video tag. Here is a <a href="https://web.dev/static/articles/cls/video/web-dev-assets/layout-instability-api/layout-instability2.webm">link to the video file</a> instead. </video> <em>突發版面變動的範例</em></p><blockquote><p>影片來源：<a href="https://web.dev/articles/cls?hl=zh-TW">Cumulative Layout Shift (CLS) | Articles | web.dev</a></p></blockquote><p><del>從游標的動作中感受到滿滿的憤怒</del></p><ul><li>出乎意料的版面變動會讓文字突然移位、造成閱讀斷點，或誤點連結與按鈕等，多種方式傷害使用者體驗<li>CLS 分數的具體計算方式已記載於 <a href="https://web.dev/articles/cls">Google 的 web.dev</a><li>如下圖所示，應以 0.1 以下為目標</ul><p><img src="https://web.dev/static/articles/cls/image/good-cls-values.svg" alt="何謂良好的 CLS 分數？" width="640" height="480" /></p><blockquote><p>圖片來源：<a href="https://web.dev/articles/cls#what-is-a-good-cls-score?hl=zh-TW">Cumulative Layout Shift (CLS) | Articles | web.dev</a></p></blockquote><h3 id="si速度指數-speed-index">SI（速度指數, Speed Index）</h3><ul><li>量測在頁面載入過程中，內容被視覺化呈現的速度<li>Lighthouse 會錄下瀏覽器載入頁面的過程影片，分析各影格的進度，並使用 <a href="https://github.com/paulirish/speedline">Speedline Node.js 模組</a>計算 SI 分數</ul><blockquote class="prompt-tip"><p>先前整理<a href="#fcp首次內容繪製-first-contentful-paint"> FCP</a>、<a href="#lcp最大內容繪製-largest-contentful-paint">LCP</a>、<a href="#tbt總封鎖時間-total-blocking-time">TBT</a>時提到的作法在內，只要能提升頁面載入速度，通常也會正向影響 SI 分數。此指標較偏向反映整體載入過程，而非代表載入中的某個單一步驟。</p></blockquote><h4 id="lighthouse-評分基準-3">Lighthouse 評分基準</h4><p>依<a href="https://developer.chrome.com/docs/lighthouse/performance/speed-index/?hl=zh-TW">Chrome 開發人員文件</a>，Lighthouse 的評分基準如下。</p><table><thead><tr><th>顏色等級<th>行動版 SI（秒）<th>桌面版 SI（秒）<tbody><tr><td>綠色（快）<td>0-3.4<td>0-1.3<tr><td>橘色（中等）<td>3.4-5.8<td>1.3-2.3<tr><td>紅色（慢）<td>大於 5.8<td>大於 2.3</table>]]> </content> </entry> <entry><title xml:lang="zh-TW">重力場與重力位勢</title><link href="https://www.yunseo.kim/zh-TW/posts/gravitational-field-and-potential/" rel="alternate" type="text/html" hreflang="en" /><link href="https://www.yunseo.kim/ko/posts/gravitational-field-and-potential/" rel="alternate" type="text/html" hreflang="ko" /><link href="https://www.yunseo.kim/ja/posts/gravitational-field-and-potential/" rel="alternate" type="text/html" hreflang="ja" /><link href="https://www.yunseo.kim/zh-TW/posts/gravitational-field-and-potential/" rel="alternate" type="text/html" hreflang="zh-TW" /><link href="https://www.yunseo.kim/es/posts/gravitational-field-and-potential/" rel="alternate" type="text/html" hreflang="es" /><link href="https://www.yunseo.kim/pt-BR/posts/gravitational-field-and-potential/" rel="alternate" type="text/html" hreflang="pt-BR" /><link href="https://www.yunseo.kim/fr/posts/gravitational-field-and-potential/" rel="alternate" type="text/html" hreflang="fr" /><link href="https://www.yunseo.kim/de/posts/gravitational-field-and-potential/" rel="alternate" type="text/html" hreflang="de" /><link href="https://www.yunseo.kim/pl/posts/gravitational-field-and-potential/" rel="alternate" type="text/html" hreflang="pl" /><link href="https://www.yunseo.kim/cs/posts/gravitational-field-and-potential/" rel="alternate" type="text/html" hreflang="cs" /><link href="https://www.yunseo.kim/sw/posts/gravitational-field-and-potential/" rel="alternate" type="text/html" hreflang="sw" /><link href="https://www.yunseo.kim/am/posts/gravitational-field-and-potential/" rel="alternate" type="text/html" hreflang="am" /><published>2025-05-17T00:00:00+09:00</published> <updated>2025-11-03T20:50:45+09:00</updated> <id>https://www.yunseo.kim/zh-TW/posts/gravitational-field-and-potential/</id> <author> <name>Yunseo Kim</name> </author> <category term="Physics" /> <category term="Classical Dynamics" /> <summary xml:lang="zh-TW">根據牛頓萬有引力定律了解重力場向量與重力位勢的定義，並以殼層定理和星系旋轉曲線這兩個重要例題來探討相關內容。</summary> <content type="html" xml:lang="zh-TW"> <![CDATA[<p>根據牛頓萬有引力定律了解重力場向量與重力位勢的定義，並以殼層定理和星系旋轉曲線這兩個重要例題來探討相關內容。</p><em><p>* Mathematical equations and diagrams included in posts may not display properly when viewed with a feed reader.</p></em><h2 id="tldr">TL;DR</h2><blockquote class="prompt-info"><ul><li>牛頓萬有引力定律：$\mathbf{F} = -G\cfrac{mM}{r^2}\mathbf{e}_r$<li>連續質量分布且具有大小的物體情況：$\mathbf{F} = -Gm\int_V \cfrac{dM}{r^2}\mathbf{e}_r = -Gm\int_V \cfrac{\rho(\mathbf{r^\prime})\mathbf{e}_r}{r^2} dv^{\prime}$<ul><li>$\rho(\mathbf{r^{\prime}})$：從任意原點到位置向量 $\mathbf{r^{\prime}}$ 處的質量密度<li>$dv^{\prime}$：從任意原點到位置向量 $\mathbf{r^{\prime}}$ 處的體積元素</ul><li><strong>重力場向量（gravitational field vector）</strong>：<ul><li>表示質量 $M$ 的物體所產生的場中，某一粒子每單位質量所受的力的向量<li>$\mathbf{g} = \cfrac{\mathbf{F}}{m} = - G \cfrac{M}{r^2}\mathbf{e}_r = - G \int_V \cfrac{\rho(\mathbf{r^\prime})\mathbf{e}_r}{r^2}dv^\prime$<li>具有<em>每單位質量的力</em>或<em>加速度</em>的量綱</ul><li><strong>重力位勢（gravitational potential）</strong>：<ul><li>$\mathbf{g} \equiv -\nabla \Phi$<li>具有（<em>每單位質量的力</em>）×（<em>距離</em>）或<em>每單位質量的能量</em>的量綱<li>$\Phi = -G\cfrac{M}{r}$<li>重力位勢只有相對差值才有意義，特定值本身沒有意義<li>通常設定 $r \to \infty$ 時 $\Phi \to 0$ 的條件來消除不確定性（ambiguity）<li>$U = m\Phi, \quad \mathbf{F} = -\nabla U$</ul><li><strong>球殼內部與外部的重力位勢（殼層定理）</strong><ul><li>$R&gt;a$ 時：<ul><li>$\Phi(R&gt;a) = -\cfrac{GM}{R}$<li>計算物質球對稱分布（spherical symmetric distribution）對外部某點的重力位勢時，可將該物體視為質點（point mass）來計算</ul><li>$R&lt;b$ 時：<ul><li>$\Phi(R&lt;b) = -2\pi\rho G(a^2 - b^2)$<li>在球對稱質量殼層內，重力位勢與位置無關且為常數，作用的重力為 $0$</ul><li>$b&lt;R&lt;a$ 時：$\Phi(b&lt;R&lt;a) = -4\pi\rho G \left( \cfrac{a^2}{2} - \cfrac{b^3}{3R} - \cfrac{R^2}{6} \right)$</ul></ul></blockquote><h2 id="重力場">重力場</h2><h3 id="牛頓萬有引力定律">牛頓萬有引力定律</h3><p>牛頓在 11666 HE 之前就已經系統化了萬有引力定律並進行了數值驗證。儘管如此，直到 11687 HE 才在著作《原理》（<em>Principia</em>）中發表他的結果，又花了 20 年的時間，原因是無法證明將地球和月球假設為沒有大小的質點（point mass）進行計算的合理性。幸運的是，<a href="#ra-時">使用牛頓後來發明的微積分學，我們可以比當時的牛頓更容易地證明這個問題</a>。</p><p>根據牛頓萬有引力定律（Newton’s law of universal gravitation），<em>每個質量粒子都會吸引宇宙中的其他所有粒子，該力與兩個質量的乘積成正比，與它們之間距離的平方成反比。</em> 數學表示如下：</p>\[\mathbf{F} = -G\frac{mM}{r^2}\mathbf{e}_r \label{eqn:law_of_gravitation}\tag{1}\]<p><img src="https://upload.wikimedia.org/wikipedia/commons/0/0e/NewtonsLawOfUniversalGravitation.svg" alt="Newton's law of universal gravitation" /></p><blockquote><p><em>圖片來源</em></p><ul><li>作者：維基媒體用戶 <a href="https://commons.wikimedia.org/wiki/User:Dna-webmaster">Dennis Nilsson</a><li>授權：<a href="https://creativecommons.org/licenses/by/3.0/">CC BY 3.0</a></ul></blockquote><p>單位向量 $\mathbf{e}_r$ 指向從 $M$ 到 $m$ 的方向，負號表示力為引力。也就是說，$m$ 被拉向 $M$。</p><h3 id="卡文迪許實驗">卡文迪許實驗</h3><p>這個定律的實驗驗證和 $G$ 值的測定是在 11798 HE 由英國物理學家亨利·卡文迪許（Henry Cavendish）完成的。卡文迪許實驗使用扭轉天平，該天平由固定在輕桿兩端的兩個小球組成。這兩個球分別被附近的另外兩個大球吸引。目前得到的官方 $G$ 值為 $6.673 \pm 0.010 \times 10^{-11} \mathrm{N\cdot m^2/kg^2}$。</p><blockquote class="prompt-tip"><p>儘管 $G$ 是最早為人所知的基本常數，但其精確度（precision）卻比 $e$、$c$、$\hbar$ 等大多數其他基本常數要低。即使在今天，仍有許多研究試圖以更高的精確度測定 $G$ 值。</p></blockquote><h3 id="具有大小的物體情況">具有大小的物體情況</h3><p>式 ($\ref{eqn:law_of_gravitation}$) 的定律嚴格來說只能適用於<em>點粒子（point particle）</em>。如果其中一方或雙方都是具有某種大小的物體，則需要額外假設重力場（gravitational force field）是<em>線性場（linear field）</em>來計算力。也就是說，假設質量為 $m$ 的一個粒子從其他多個粒子受到的總重力可以通過各個力的向量相加來求得。對於物質連續分布的物體，將求和改為如下積分：</p>\[\mathbf{F} = -Gm\int_V \frac{dM}{r^2}\mathbf{e}_r = -Gm\int_V \frac{\rho(\mathbf{r^\prime})\mathbf{e}_r}{r^2} dv^{\prime} \label{eqn:integral_form}\tag{2}\]<ul><li>$\rho(\mathbf{r^{\prime}})$：從任意原點到位置向量 $\mathbf{r^{\prime}}$ 處的質量密度<li>$dv^{\prime}$：從任意原點到位置向量 $\mathbf{r^{\prime}}$ 處的體積元素</ul><p>如果質量 $M$ 的物體和質量 $m$ 的物體都具有大小，要求得總重力時還需要對 $m$ 進行第二次體積積分。</p><h3 id="重力場向量">重力場向量</h3><p><strong>重力場向量（gravitational field vector）</strong> $\mathbf{g}$ 定義為質量 $M$ 的物體所產生的場中，某一粒子每單位質量所受的力的向量：</p>\[\mathbf{g} = \frac{\mathbf{F}}{m} = - G \frac{M}{r^2}\mathbf{e}_r \label{eqn:g_vector}\tag{3}\]<p>或</p>\[\boxed{\mathbf{g} = - G \int_V \frac{\rho(\mathbf{r^\prime})\mathbf{e}_r}{r^2}dv^\prime} \tag{4}\]<p>這裡 $\mathbf{e}_r$ 的方向隨 $\mathbf{r^\prime}$ 而變化。</p><p>這個量 $\mathbf{g}$ 具有<em>每單位質量的力</em>或<em>加速度</em>的量綱。地球表面附近的重力場向量 $\mathbf{g}$ 的大小就是我們稱為<strong>重力加速度常數（gravitational acceleration constant）</strong>的量，$|\mathbf{g}| \approx 9.80\mathrm{m/s^2}$。</p><h2 id="重力位勢">重力位勢</h2><h3 id="定義">定義</h3><p>重力場向量 $\mathbf{g}$ 以 $1/r^2$ 變化，因此滿足表示為某個標量函數（位勢）梯度（gradient）的條件（$\nabla \times \mathbf{g} \equiv 0$）。所以可以寫成：</p>\[\mathbf{g} \equiv -\nabla \Phi \label{eqn:gradient_phi}\tag{5}\]<p>這裡 $\Phi$ 稱為<strong>重力位勢（gravitational potential）</strong>，具有（<em>每單位質量的力</em>）×（<em>距離</em>）或<em>每單位質量的能量</em>的量綱。</p><p>由於 $\mathbf{g}$ 只依賴於半徑，$\Phi$ 也隨 $r$ 變化。從式 ($\ref{eqn:g_vector}$) 和 ($\ref{eqn:gradient_phi}$) 得到：</p>\[\nabla\Phi = \frac{d\Phi}{dr}\mathbf{e}_r = G\frac{M}{r^2}\mathbf{e}_r\]<p>積分後得到：</p>\[\boxed{\Phi = -G\frac{M}{r}} \label{eqn:g_potential}\tag{6}\]<p>由於重力位勢只有相對差值才有意義，絕對值的大小沒有意義，所以可以省略積分常數。通常設定 $r \to \infty$ 時 $\Phi \to 0$ 的條件來消除不確定性（ambiguity），式 ($\ref{eqn:g_potential}$) 也滿足這個條件。</p><p>物質連續分布時的重力位勢如下：</p>\[\Phi = -G\int_V \frac{\rho(\mathbf{r\prime})}{r}dv^\prime \label{eqn:g_potential_v}\tag{7}\]<p>質量在薄殼表面分布時：</p>\[\Phi = -G\int_S \frac{\rho_s}{r}da^\prime. \label{eqn:g_potential_s}\tag{8}\]<p>線密度為 $\rho_l$ 的線性質量源情況下可以寫成：</p>\[\Phi = -G\int_\Gamma \frac{\rho_l}{r}ds^\prime. \label{eqn:g_potential_l}\tag{9}\]<h3 id="物理意義">物理意義</h3><p>考慮物體在重力場中移動 $d\mathbf{r}$ 時該物體所做的每單位質量的功 $dW^\prime$：</p>\[\begin{align*} dW^\prime &amp;= -\mathbf{g}\cdot d\mathbf{r} = (\nabla \Phi)\cdot d\mathbf{r} \\ &amp;= \sum_i \frac{\partial \Phi}{\partial x_i}dx_i = d\Phi \label{eqn:work}\tag{10} \end{align*}\]<p>在這個式子中，$\Phi$ 只是位置坐標的函數，表示為 $\Phi=\Phi(x_1, x_2, x_3) = \Phi(x_i)$。因此可以知道，在重力場中將物體從某一點移動到另一點時該物體所做的每單位質量的功等於這兩點的位勢差。</p><p>如果將無限遠處的重力位勢定義為 $0$，則任意點的 $\Phi$ 可以解釋為將該物體從無限遠處移動到該點所需的每單位質量的功。物體的位勢能等於該物體的質量與重力位勢 $\Phi$ 的乘積，所以設 $U$ 為位勢能時：</p>\[U = m\Phi. \label{eqn:potential_e}\tag{11}\]<p>因此，物體受到的重力是該物體位勢能的梯度加上負號得到的：</p>\[\mathbf{F} = -\nabla U \label{eqn:force_and_potential}\tag{12}\]<p>當物體處於某個質量產生的重力場中時，總是會產生某種位勢能。這個位勢能嚴格來說存在於場本身，但習慣上表達為該物體的位勢能。</p><h2 id="例題球殼內部與外部的重力位勢殼層定理">例題：球殼內部與外部的重力位勢（殼層定理）</h2><h3 id="座標設定與用積分式表示重力位勢">座標設定與用積分式表示重力位勢</h3><p>求內半徑為 $b$、外半徑為 $a$ 的均勻球殼（spherical shell）內部和外部的重力位勢。球殼產生的重力也可以通過直接計算場中單位質量受到的力分量來得到，但使用位勢方法更簡單。</p><p><img src="/assets/img/gravitational-field-and-potential/spherical-shell.png" alt="Spherical shell" /></p><p>在上圖中計算距離中心 $R$ 的 $P$ 點的位勢。假設殼層的均勻質量分布，則 $\rho(r^\prime)=\rho$，且相對於連接球心和點 $P$ 的線，對方位角 $\phi$ 對稱，所以：</p>\[\begin{align*} \Phi &amp;= -G\int_V \frac{\rho(r^\prime)}{r}dv^\prime \\ &amp;= -\rho G \int_0^{2\pi} \int_0^\pi \int_b^a \frac{1}{r}(dr^\prime)(r^\prime d\theta)(r^\prime \sin\theta\, d\phi) \\ &amp;= -\rho G \int_0^{2\pi} d\phi \int_b^a {r^\prime}^2 dr^\prime \int_0^\pi \frac{\sin\theta}{r}d\theta \\ &amp;= -2\pi\rho G \int_b^a {r^\prime}^2 dr^\prime \int_0^\pi \frac{\sin\theta}{r}d\theta. \label{eqn:spherical_shell_1}\tag{13} \end{align*}\]<p>根據餘弦定律：</p>\[r^2 = {r^\prime}^2 + R^2 - 2r^\prime R \cos\theta \label{eqn:law_of_cosines}\tag{14}\]<p>由於 $R$ 是常數，對 $r^\prime$ 微分這個式子得到：</p>\[2rdr = 2r^\prime R \sin\theta d\theta\] \[\frac{\sin\theta}{r}d\theta = \frac{dr}{r^\prime R} \tag{15}\]<p>將此代入式 ($\ref{eqn:spherical_shell_1}$) 得到：</p>\[\Phi = -\frac{2\pi\rho G}{R} \int_b^a r^\prime dr^\prime \int_{r_\mathrm{min}}^{r_\mathrm{max}} dr. \label{eqn:spherical_shell_2}\tag{16}\]<p>這裡 $r_\mathrm{max}$ 和 $r_\mathrm{min}$ 根據點 $P$ 的位置確定。</p><h3 id="ra-時">$R&gt;a$ 時</h3>\[\begin{align*} \Phi(R&gt;a) &amp;= -\frac{2\pi\rho G}{R} \int_b^a r^\prime dr^\prime \int_{R-r^\prime}^{R+r^\prime} dr \\ &amp;= - \frac{4\pi\rho G}{R} \int_b^a {r^\prime}^2 dr^\prime \\ &amp;= - \frac{4}{3}\frac{\pi\rho G}{R}(a^3 - b^3). \label{eqn:spherical_shell_outside_1}\tag{17} \end{align*}\]<p>球殼的質量 $M$ 為：</p>\[M = \frac{4}{3}\pi\rho(a^3 - b^3) \label{eqn:mass_of_shell}\tag{18}\]<p>所以位勢為：</p>\[\boxed{\Phi(R&gt;a) = -\frac{GM}{R}} \label{eqn:spherical_shell_outside_2}\tag{19}\]<blockquote class="prompt-info"><p>比較質量為 $M$ 的質點產生的重力位勢式 ($\ref{eqn:g_potential}$) 和剛得到的結果 ($\ref{eqn:spherical_shell_outside_2}$)，可以發現它們相同。這意味著，計算物質球對稱分布（spherical symmetric distribution）對外部某點的重力位勢時，可以認為所有質量都集中在中心。地球或月球等一定大小以上的球形天體大多屬於這種情況，它們可以視為像<a href="https://en.wikipedia.org/wiki/Matryoshka_doll">俄羅斯套娃</a>一樣，由無數個同心但直徑不同的球殼重疊而成。這就是本文開頭提到的<a href="#牛頓萬有引力定律">將地球或月球等天體假設為沒有大小的質點進行計算也是合理的根據</a>。</p></blockquote><h3 id="rb-時">$R&lt;b$ 時</h3>\[\begin{align*} \Phi(R&lt;b) &amp;= -\frac{2\pi\rho G}{R} \int_b^a r^\prime dr^\prime \int_{r^\prime - R}^{r^\prime + R}dr \\ &amp;= -4\pi\rho G \int_b^a r^\prime dr^\prime \\ &amp;= -2\pi\rho G(a^2 - b^2). \label{eqn:spherical_shell_inside}\tag{20} \end{align*}\]<blockquote class="prompt-info"><p>在球對稱質量殼層內，重力位勢與位置無關且為常數，作用的重力為 $0$。</p></blockquote><blockquote class="prompt-tip"><p>這也是代表性偽科學之一「地球空洞說」是胡說八道的主要根據。如果像地球空洞說主張的那樣，地球是球殼形狀且內部是空的，那麼對於該空洞內部的所有物體，地球重力都不會作用。考慮到地球的質量和體積，地球空洞不可能存在，即使存在，那裡的生命體也不會以球殼內側為地面生活，而是像太空站一樣處於無重力狀態漂浮著。<br /> <a href="https://youtu.be/VD6xJq8NguY?si=szgtuLkuk6rPJag3">地下數公里深的地層深處可能有微生物生存</a>，但至少不可能像地球空洞說主張的那種形式。我也很喜歡儒勒·凡爾納的小說《地心遊記》（Voyage au centre de la Terre）和電影《地心歷險記》（Journey to the Center of the Earth），但創作作品就應該當作創作作品來欣賞，不要認真相信。</p></blockquote><h3 id="bra-時">$b&lt;R&lt;a$ 時</h3>\[\begin{align*} \Phi(b&lt;R&lt;a) &amp;= -\frac{4\pi\rho G}{3R}(R^3 - b^3) - 2\pi\rho G(a^2 - R^2) \\ &amp;= -4\pi\rho G \left( \frac{a^2}{2} - \frac{b^3}{3R} - \frac{R^2}{6} \right) \label{eqn:within_spherical_shell}\tag{21} \end{align*}\]<h3 id="結果">結果</h3><p>將前面求得的三個區域的重力位勢 $\Phi$ 以及相應的重力場向量大小 $|\mathbf{g}|$ 作為距離 $R$ 的函數用圖表示如下：</p><p><img src="/physics-visualizations/figs/shell-theorem-gravitational-potential.png" alt="Gravitational Potential as a Function of R" /><br /> <img src="/physics-visualizations/figs/shell-theorem-field-vector.png" alt="Magnitude of the Field Vector as a Function of R" /></p><blockquote><ul><li>Python 視覺化程式碼：<a href="https://github.com/yunseo-kim/physics-visualizations/blob/main/src/shell_theorem.py">yunseo-kim/physics-visualizations 儲存庫</a><li>授權：<a href="https://github.com/yunseo-kim/physics-visualizations?tab=readme-ov-file#license">見此處</a></ul></blockquote><p>可以看出重力位勢和重力場向量的大小是連續的。如果重力位勢在某點不連續，那麼該點的位勢梯度，即重力的大小會變成無限大，這在物理上是不合理的，所以位勢函數在所有點都必須連續。但是重力場向量的<em>微分係數</em>在殼層的內表面和外表面處不連續。</p><h2 id="例題星系旋轉曲線">例題：星系旋轉曲線</h2><p>根據天文觀測，在我們銀河系或仙女座星系等圍繞中心旋轉的許多螺旋星系中，可觀測質量大多集中分布在中心部附近。然而，這些螺旋星系中質量的軌道速度如下圖所示，與從可觀測質量分布理論預測的值有很大差異，在一定距離以上幾乎保持恆定。</p><p><img src="https://upload.wikimedia.org/wikipedia/commons/b/b9/GalacticRotation2.svg" alt="Galactic Rotation" width="972" /></p><blockquote><p><em>圖片來源</em></p><ul><li>作者：維基百科用戶 <a href="https://en.wikipedia.org/wiki/User:PhilHibbs">PhilHibbs</a><li>授權：Public Domain</ul></blockquote><p> <video class="embed-video file" controls="" autoplay="" loop=""> <source src="https://cdn.jsdelivr.net/gh/yunseo-kim/yunseo-kim.github.io/assets/video/gravitational-field-and-potential/Galaxy_rotation_under_the_influence_of_dark_matter.webm" type="video/webm" /> <source src="https://cdn.jsdelivr.net/gh/yunseo-kim/yunseo-kim.github.io/assets/video/gravitational-field-and-potential/Galaxy_rotation_under_the_influence_of_dark_matter.ogg" type="video/ogg" /> Your browser does not support the video tag. Here is a <a href="https://cdn.jsdelivr.net/gh/yunseo-kim/yunseo-kim.github.io/assets/video/gravitational-field-and-potential/Galaxy_rotation_under_the_influence_of_dark_matter.webm">link to the video file</a> instead. </video> <em>左：由可觀測質量所預測的星系旋轉 | 右：實際觀測到的星系旋轉。</em></p><blockquote><p><em>影片來源</em></p><ul><li>原始檔案（Ogg Theora 影片）連結：<a href="https://commons.wikimedia.org/wiki/File:Galaxy_rotation_under_the_influence_of_dark_matter.ogv">https://commons.wikimedia.org/wiki/File:Galaxy_rotation_under_the_influence_of_dark_matter.ogv</a><li>作者：<a href="https://beltoforion.de/en/index.php">Ingo Berg</a><li>授權：<a href="https://creativecommons.org/licenses/by-sa/3.0/deed.en">CC BY-SA 3.0</a><li>所使用的模擬方法與程式碼：<a href="https://beltoforion.de/en/spiral_galaxy_renderer/">https://beltoforion.de/en/spiral_galaxy_renderer/</a></ul></blockquote><blockquote class="prompt-danger"><p>先前嵌入於本頁的圖檔 <code class="language-plaintext highlighter-rouge">Rotation curve of spiral galaxy Messier 33 (Triangulum).png</code>，因被判定為維基媒體用戶 <a href="https://commons.wikimedia.org/wiki/User:Accrama">Mario De Leo</a>未適當引用而抄襲<a href="https://markwhittle.uvacreate.virginia.edu/">維吉尼亞大學 Mark Whittle 教授</a>之非自由著作的衍生作品，<a href="https://commons.wikimedia.org/wiki/Commons:Deletion_requests/File:Rotation_curve_of_spiral_galaxy_Messier_33_(Triangulum).png">已自維基共享資源刪除</a>，因此本頁亦已將其移除，特此說明。</p></blockquote><p>讓我們預測星系質量集中在中心部時隨距離變化的軌道速度，確認該預測值與這種觀測結果不一致，並證明只有當星系中心距離 $R$ 內分布的質量 $M(R)$ 與 $R$ 成正比時才能解釋觀測結果。</p><p>首先，當星系質量 $M$ 集中在中心部時，距離 $R$ 處的軌道速度如下：</p>\[\frac{GMm}{R^2} = \frac{mv^2}{R}\] \[v = \sqrt{\frac{GM}{R}} \propto \frac{1}{\sqrt{R}}.\]<p>這種情況下預測軌道速度會如上述兩個圖中的虛線所示以 $1/\sqrt{R}$ 減少，但根據觀測結果，軌道速度 $v$ 與距離 $R$ 無關幾乎保持恆定，所以預測與觀測結果不一致。這種觀測結果只有在 $M(R)\propto R$ 時才能解釋。</p><p>用比例常數 $k$ 寫成 $M(R) = kR$，則：</p>\[v = \sqrt{\frac{GM(R)}{R}} = \sqrt{Gk}\ \text{（常數）}.\]<p>由此，天體物理學家得出結論：許多星系中必須存在未被發現的「暗物質（dark matter）」，這種暗物質必須佔宇宙質量的 90% 以上。不過暗物質的真面目至今仍未明確揭示，雖然不是主流理論，但也存在修正牛頓動力學（Modified Newtonian Dynamics, MOND）等不假設暗物質存在而試圖解釋觀測結果的嘗試。今天這些研究領域正處於天體物理學的最前沿。</p>]]> </content> </entry> <entry><title xml:lang="zh-TW">待定係數法</title><link href="https://www.yunseo.kim/zh-TW/posts/method-of-undetermined-coefficients/" rel="alternate" type="text/html" hreflang="en" /><link href="https://www.yunseo.kim/ko/posts/method-of-undetermined-coefficients/" rel="alternate" type="text/html" hreflang="ko" /><link href="https://www.yunseo.kim/ja/posts/method-of-undetermined-coefficients/" rel="alternate" type="text/html" hreflang="ja" /><link href="https://www.yunseo.kim/zh-TW/posts/method-of-undetermined-coefficients/" rel="alternate" type="text/html" hreflang="zh-TW" /><link href="https://www.yunseo.kim/es/posts/method-of-undetermined-coefficients/" rel="alternate" type="text/html" hreflang="es" /><link href="https://www.yunseo.kim/pt-BR/posts/method-of-undetermined-coefficients/" rel="alternate" type="text/html" hreflang="pt-BR" /><link href="https://www.yunseo.kim/fr/posts/method-of-undetermined-coefficients/" rel="alternate" type="text/html" hreflang="fr" /><link href="https://www.yunseo.kim/de/posts/method-of-undetermined-coefficients/" rel="alternate" type="text/html" hreflang="de" /><link href="https://www.yunseo.kim/pl/posts/method-of-undetermined-coefficients/" rel="alternate" type="text/html" hreflang="pl" /><link href="https://www.yunseo.kim/cs/posts/method-of-undetermined-coefficients/" rel="alternate" type="text/html" hreflang="cs" /><link href="https://www.yunseo.kim/sw/posts/method-of-undetermined-coefficients/" rel="alternate" type="text/html" hreflang="sw" /><link href="https://www.yunseo.kim/am/posts/method-of-undetermined-coefficients/" rel="alternate" type="text/html" hreflang="am" /><published>2025-04-20T00:00:00+09:00</published> <updated>2025-07-09T19:24:14+09:00</updated> <id>https://www.yunseo.kim/zh-TW/posts/method-of-undetermined-coefficients/</id> <author> <name>Yunseo Kim</name> </author> <category term="Mathematics" /> <category term="Differential Equation" /> <summary xml:lang="zh-TW">本文將探討待定係數法。這是一種在工程學中，針對振動系統、RLC 電路模型等，能簡便地解決特定形式之常係數非齊次線性常微分方程式初值問題的實用解法。</summary> <content type="html" xml:lang="zh-TW"> <![CDATA[<p>本文將探討待定係數法。這是一種在工程學中，針對振動系統、RLC 電路模型等，能簡便地解決特定形式之常係數非齊次線性常微分方程式初值問題的實用解法。</p><em><p>* Mathematical equations and diagrams included in posts may not display properly when viewed with a feed reader.</p></em><h2 id="tldr">TL;DR</h2><blockquote class="prompt-info"><ul><li><strong>待定係數法</strong>的適用對象：<ul><li>具有<strong>常數係數 $a$ 和 $b$</strong><li>且輸入項 $r(x)$ 由指數函數、$x$ 的冪次、$\cos$ 或 $\sin$，或這些函數的和與積所組成<li>的線性常微分方程式 $y^{\prime\prime} + ay^{\prime} + by = r(x)$</ul><li><strong>待定係數法的選擇規則</strong><ul><li><strong>(a) 基本規則(basic rule)</strong>：若方程式 ($\ref{eqn:linear_ode_with_constant_coefficients}$) 中的 $r(x)$ 是下表第一欄中的任一函數，則選擇同一列的 $y_p$。將 $y_p$ 及其導數代入方程式 ($\ref{eqn:linear_ode_with_constant_coefficients}$) 以確定待定係數。<li><strong>(b) 修正規則(modification rule)</strong>：若所選的 $y_p$ 項是方程式 ($\ref{eqn:linear_ode_with_constant_coefficients}$) 對應的齊次常微分方程式 $y^{\prime\prime} + ay^{\prime} + by = 0$ 的解，則將該項乘以 $x$（若該解對應於齊次常微分方程式特徵方程式的重根，則乘以 $x^2$）。<li><strong>(c) 疊加規則(sum rule)</strong>：若 $r(x)$ 是下表第一欄中函數的和，則選擇第二欄對應列中函數的和作為 $y_p$。</ul></ul><table><thead><tr><th style="text-align: left">$r(x)$ 的項<th style="text-align: left">$y_p(x)$ 的選擇<tbody><tr><td style="text-align: left">$ke^{\gamma x}$<td style="text-align: left">$Ce^{\gamma x}$<tr><td style="text-align: left">$kx^n\ (n=0,1,\cdots)$<td style="text-align: left">$K_nx^n + K_{n-1}x^{n-1} + \cdots + K_1x + K_0$<tr><td style="text-align: left">$k\cos{\omega x}$<br />$k\sin{\omega x}$<td style="text-align: left">$K\cos{\omega x} + M\sin{\omega x}$<tr><td style="text-align: left">$ke^{\alpha x}\cos{\omega x}$<br />$ke^{\alpha x}\sin{\omega x}$<td style="text-align: left">$e^{\alpha x}(K\cos{\omega x} + M\sin{\omega x})$</table></blockquote><h2 id="先備知識">先備知識</h2><ul><li><a href="/zh-TW/posts/homogeneous-linear-odes-of-second-order/">二階齊次線性常微分方程式 (Homogeneous Linear ODEs of Second Order)</a><li><a href="/zh-TW/posts/homogeneous-linear-odes-with-constant-coefficients/">常係數二階齊次線性常微分方程式</a><li><a href="/zh-TW/posts/euler-cauchy-equation/">歐拉-柯西方程式</a><li><a href="/zh-TW/posts/wronskian-existence-and-uniqueness-of-solutions/">朗斯基行列式(Wronskian)，解的存在性與唯一性</a><li><a href="/zh-TW/posts/nonhomogeneous-linear-odes-of-second-order/">二階非齊次線性常微分方程式 (Nonhomogeneous Linear ODEs of Second Order)</a><li>向量空間、線性生成 (線性代數)</ul><h2 id="待定係數法">待定係數法</h2><p>考慮 $r(x) \not\equiv 0$ 的二階非齊次線性常微分方程式</p>\[y^{\prime\prime} + p(x)y^{\prime} + q(x)y = r(x) \label{eqn:nonhomogeneous_linear_ode}\tag{1}\]<p>以及與此非齊次常微分方程式對應的齊次常微分方程式</p>\[y^{\prime\prime} + p(x)y^{\prime} + q(x)y = 0 \label{eqn:homogeneous_linear_ode}\tag{2}\]<p>。</p><p>根據先前在 <a href="/zh-TW/posts/nonhomogeneous-linear-odes-of-second-order/">二階非齊次線性常微分方程式 (Nonhomogeneous Linear ODEs of Second Order)</a> 中的探討，為了解決非齊次線性常微分方程式 ($\ref{eqn:nonhomogeneous_linear_ode}$) 的初值問題，我們需要先解齊次常微分方程式 ($\ref{eqn:homogeneous_linear_ode}$) 求得 $y_h$，然後找到方程式 ($\ref{eqn:nonhomogeneous_linear_ode}$) 的一個特解 $y_p$，從而得到通解</p>\[y(x) = y_h(x) + y_p(x) \label{eqn:general_sol}\tag{3}\]<p>。那麼，$y_p$ 該如何尋找呢？尋找 $y_p$ 的一般方法是<strong>參數變異法(method of variation of parameters)</strong>，但在某些情況下，可以應用更為簡單的<strong>待定係數法(method of undetermined coefficients)</strong>。此方法特別適用於振動系統和 RLC 電路模型，因此在工程學中被頻繁使用。</p><p>待定係數法適用於具有<strong>常數係數 $a$ 和 $b$</strong>，且輸入項 $r(x)$ 由指數函數、$x$ 的冪次、$\cos$ 或 $\sin$，或這些函數的和與積所組成的線性常微分方程式</p>\[y^{\prime\prime} + ay^{\prime} + by = r(x) \label{eqn:linear_ode_with_constant_coefficients}\tag{4}\]<p>。這類 $r(x)$ 的導數形式與其自身相似，這是待定係數法的核心思想。應用此方法時，我們選擇一個與 $r(x)$ 形式相似的 $y_p$，但其係數是待定的，這些係數可以通過將 $y_p$ 及其導數代入給定的常微分方程式來確定。對於在工程學中具有實際重要性的 $r(x)$ 形式，選擇適當 $y_p$ 的規則如下。</p><blockquote class="prompt-info"><p><strong>待定係數法的選擇規則</strong><br /> <strong>(a) 基本規則(basic rule)</strong>：若方程式 ($\ref{eqn:linear_ode_with_constant_coefficients}$) 中的 $r(x)$ 是下表第一欄中的任一函數，則選擇同一列的 $y_p$。將 $y_p$ 及其導數代入方程式 ($\ref{eqn:linear_ode_with_constant_coefficients}$) 以確定待定係數。<br /> <strong>(b) 修正規則(modification rule)</strong>：若所選的 $y_p$ 項是方程式 ($\ref{eqn:linear_ode_with_constant_coefficients}$) 對應的齊次常微分方程式 $y^{\prime\prime} + ay^{\prime} + by = 0$ 的解，則將該項乘以 $x$（若該解對應於齊次常微分方程式特徵方程式的重根，則乘以 $x^2$）。<br /> <strong>(c) 疊加規則(sum rule)</strong>：若 $r(x)$ 是下表第一欄中函數的和，則選擇第二欄對應列中函數的和作為 $y_p$。</p><table><thead><tr><th style="text-align: left">$r(x)$ 的項<th style="text-align: left">$y_p(x)$ 的選擇<tbody><tr><td style="text-align: left">$ke^{\gamma x}$<td style="text-align: left">$Ce^{\gamma x}$<tr><td style="text-align: left">$kx^n\ (n=0,1,\cdots)$<td style="text-align: left">$K_nx^n + K_{n-1}x^{n-1} + \cdots + K_1x + K_0$<tr><td style="text-align: left">$k\cos{\omega x}$<br />$k\sin{\omega x}$<td style="text-align: left">$K\cos{\omega x} + M\sin{\omega x}$<tr><td style="text-align: left">$ke^{\alpha x}\cos{\omega x}$<br />$ke^{\alpha x}\sin{\omega x}$<td style="text-align: left">$e^{\alpha x}(K\cos{\omega x} + M\sin{\omega x})$</table></blockquote><p>此方法不僅簡便，還具有自我校正的優點。如果錯誤地選擇了 $y_p$ 或選擇了過少的項，將會導致矛盾；如果選擇了過多的項，不必要的項的係數將變為 $0$，最終仍能得到正確的結果。即使在應用待定係數法時出現錯誤，也能在解題過程中自然地發現，因此只要根據上述選擇規則選擇一個大致適當的 $y_p$，便可以放心地嘗試。</p><h3 id="疊加規則的證明">疊加規則的證明</h3><p>考慮 $r(x) = r_1(x) + r_2(x)$ 形式的非齊次線性常微分方程式</p>\[y^{\prime\prime} + ay^{\prime} + by = r_1(x) + r_2(x)\]<p>。現在，考慮以下兩個具有相同左側但輸入項分別為 $r_1$ 和 $r_2$ 的方程式</p>\[\begin{gather*} y^{\prime\prime} + ay^{\prime} + by = r_1(x) \\ y^{\prime\prime} + ay^{\prime} + by = r_2(x) \end{gather*}\]<p>，並假設它們的解分別為 ${y_p}_1$ 和 ${y_p}_2$。若將給定方程式的左側記為 $L[y]$，根據 $L[y]$ 的線性性質，對於 $y_p = {y_p}_1 + {y_p}_2$，滿足以下關係，因此疊加規則成立。</p>\[L[y_p] = L[{y_p}_1 + {y_p}_2] = L[{y_p}_1] + L[{y_p}_2] = r_1 + r_2 = r. \ \blacksquare\]<h2 id="範例yprimeprime--ayprime--by--kegamma-x">範例：$y^{\prime\prime} + ay^{\prime} + by = ke^{\gamma x}$</h2><p>根據基本規則 (a)，設 $y_p = Ce^{\gamma x}$ 並代入給定方程式 $y^{\prime\prime} + ay^{\prime} + by = ke^{\gamma x}$：</p>\[\gamma^2 Ce^{\gamma x} + \gamma aCe^{\gamma x} + bCe^{\gamma x} = ke^{\gamma x}\] \[C(\gamma^2 + a\gamma + b)e^{\gamma x} = ke^{\gamma x}\] \[C(\gamma^2 + a\gamma + b) = k.\]<h3 id="gamma2--agamma--b-neq-0-的情況">$\gamma^2 + a\gamma + b \neq 0$ 的情況</h3><p>可以如下確定待定係數 $C$ 並求得 $y_p$。</p>\[C = \frac{k}{\gamma^2 + a\gamma + b}\] \[y_p = Ce^{\gamma x} = \frac{k}{\gamma^2 + a\gamma + b} e^{\gamma x}.\]<h3 id="gamma2--agamma--b--0-的情況">$\gamma^2 + a\gamma + b = 0$ 的情況</h3><p>在這種情況下，必須應用修正規則 (b)。首先，利用 $b = -\gamma^2 - a\gamma = -\gamma(a + \gamma)$ 來求齊次常微分方程式 $y^{\prime\prime} + ay^{\prime} + by = 0$ 的特徵方程式的根。</p>\[y^{\prime\prime} + ay^{\prime} - \gamma(a + \gamma)y = 0\] \[\lambda^2 + a\lambda - \gamma(a + \gamma) = 0\] \[(\lambda + (a + \gamma))(\lambda - \gamma) = 0\] \[\lambda = \gamma, -a -\gamma.\]<p>由此得到齊次常微分方程式的基底</p>\[y_1 = e^{\gamma x}, \quad y_2 = e^{(-a - \gamma)x}\]<p>。</p><h4 id="gamma-neq--a-gamma-的情況">$\gamma \neq -a-\gamma$ 的情況</h4><p>所選的 $y_p = Ce^{\gamma x}$ 是對應齊次常微分方程式的非重根解，因此根據修正規則 (b)，將此項乘以 $x$，設 $y_p = Cxe^{\gamma x}$。</p><p>現在，將修正後的 $y_p$ 重新代入給定方程式 $y^{\prime\prime} + ay^{\prime} - \gamma(a + \gamma)y = ke^{\gamma x}$：</p>\[C(2\gamma + \gamma^2 x)e^{\gamma x} + aC(1 + \gamma x)e^{\gamma x} - \gamma(a + \gamma)Cxe^{\gamma x} = ke^{\gamma x}\] \[C \left[\left\{\gamma^2 + a\gamma -\gamma(a + \gamma)\right\}x + 2\gamma + a \right]e^{\gamma x} = ke^{\gamma x}\] \[C(2\gamma + a)e^{\gamma x} = ke^{\gamma x}\] \[C(2\gamma + a) = k\] \[\therefore C = \frac{k}{2\gamma + a}, \quad y_p = Cxe^{\gamma x} = \frac{k}{2\gamma + a}xe^{\gamma x}.\]<h4 id="gamma---a-gamma-的情況">$\gamma = -a-\gamma$ 的情況</h4><p>在這種情況下，所選的 $y_p = Ce^{\gamma x}$ 是對應齊次常微分方程式的重根解，因此根據修正規則 (b)，將此項乘以 $x^2$，設 $y_p = Cx^2 e^{\gamma x}$。</p><p>現在，將修正後的 $y_p$ 重新代入給定方程式 $y^{\prime\prime} - 2\gamma y^{\prime} + \gamma^2 y = ke^{\gamma x}$：</p>\[C(2 + 4\gamma x + \gamma^2 x^2)e^{\gamma x} + C(-4\gamma x - 2\gamma^2 x^2)e^{\gamma x} + C(\gamma^2 x^2)e^{\gamma x} = ke^{\gamma x}\] \[2Ce^{\gamma x} = ke^{\gamma x}\] \[2C = k\] \[\therefore C = \frac{k}{2}, \quad y_p = Cx^2 e^{\gamma x} = \frac{k}{2}x^2 e^{\gamma x}.\]<h2 id="待定係數法的擴展rx-為函數乘積形式">待定係數法的擴展：$r(x)$ 為函數乘積形式</h2><p>考慮 $r(x) = k x^n e^{\alpha x}\cos(\omega x)$ 形式的非齊次線性常微分方程式</p>\[y^{\prime\prime} + ay^{\prime} + by = C x^n e^{\alpha x}\cos(\omega x)\]<p>。若 $r(x)$ 是指數函數 $e^{\alpha x}$、$x$ 的冪次 $x^m$、$\cos{\omega x}$ 或 $\sin{\omega x}$（此處假設為 $\cos$，不失一般性），或這些函數的和與積（即，可以用前述表格第一欄中函數的和與積來表示），我們將證明存在一個方程式的解 $y_p$，它也是同一表格第二欄中函數的和與積。</p><blockquote class="prompt-tip"><p>為求嚴謹證明，部分內容使用線性代數進行描述，並以 * 標示。跳過這些部分，只閱讀其餘內容，亦不影響對大致概念的理解。</p></blockquote><h3 id="定義向量空間-v">定義向量空間 $V$*</h3><p>對於 $r(x)$</p>\[\begin{align*} r(x) &amp;= C_1x^{n_1}e^{\alpha_1 x} \times C_2x^{n_2}e^{\alpha_2 x}\cos(\omega x) \times \cdots \\ &amp;= C x^n e^{\alpha x}\cos(\omega x) \end{align*}\]<p>，我們可以定義一個向量空間 $V$，使得 $r(x) \in V$：</p>\[V = \mathrm{span}\left\{x^k e^{\alpha x}\cos(\omega x), \; x^k e^{\alpha x}\sin(\omega x) \bigm| k=0,1,\dots,n \right\}\]<h3 id="指數函數多項式函數三角函數的導數形式">指數函數、多項式函數、三角函數的導數形式</h3><p>前述表格第一欄中基本函數的導數形式如下：</p><ul><li>指數函數：$\cfrac{d}{dx}e^{\alpha x} = \alpha e^{\alpha x}$<li>多項式函數：$\cfrac{d}{dx}x^m = mx^{m-1}$<li>三角函數：$\cfrac{d}{dx}\cos\omega x = -\omega\sin\omega x, \quad \cfrac{d}{dx}\sin\omega x = \omega\cos\omega x$</ul><p>對這些函數求導得到的導數，同樣可以表示為<u>同類函數的和</u>。</p><p>因此，若函數 $f$ 和 $g$ 是上述函數或其和，對 $r(x) = f(x)g(x)$ 應用乘法法則：</p>\[\begin{align*} (fg)^{\prime} &amp;= f^{\prime}g + fg^{\prime}, \\ (fg)^{\prime\prime} &amp;= f^{\prime\prime}g + 2f^{\prime}g^{\prime} + fg^{\prime\prime} \end{align*}\]<p>其中 $f$, $f^{\prime}$, $f^{\prime\prime}$ 和 $g$, $g^{\prime}$, $g^{\prime\prime}$ 都可以寫成指數函數、多項式函數、三角函數的和或常數倍的形式。因此，$r^{\prime}(x) = (fg)^{\prime}$ 和 $r^{\prime\prime}(x) = (fg)^{\prime\prime}$ 也與 $r(x)$ 一樣，可以表示為這些函數的和與積。</p><h3 id="v-對於微分運算-d-與線性變換-l-的不變性">$V$ 對於微分運算 $D$ 與線性變換 $L$ 的不變性*</h3><p>也就是說，不僅 $r(x)$ 本身，其導數 $r^{\prime}(x)$ 和 $r^{\prime\prime}(x)$ 也都是 $x^k e^{\alpha x}\cos(\omega x)$ 形式項和 $x^k e^{\alpha x}\sin(\omega x)$ 形式項的線性組合，因此</p>\[r(x) \in V \implies r^{\prime}(x) \in V,\ r^{\prime\prime}(x) \in V.\]<p>不限於 $r(x)$，若對先前定義的向量空間 $V$ 的所有元素引入微分算子 $D$，可以更一般地表示為，<em>向量空間 $V$ 在微分運算 $D$ 下是封閉的</em>。因此，若將給定方程式的左側 $y^{\prime\prime} + ay^{\prime} + by$ 記為 $L[y]$，則 <em>$V$ 在 $L$ 下是不變的(invariant)</em>。</p>\[D^2(V)\subseteq V,\quad aD(V)\subseteq V,\quad b\,V\subseteq V \implies L(V)\subseteq V.\]<p>因為 $r(x) \in V$ 且 $V$ 在 $L$ 下不變，所以存在 $V$ 的另一個元素 $y_p$ 滿足 $L[y_p] = r$。</p>\[\exists y_p \in V: L[y_p] = r\]<h3 id="ansatz">Ansatz</h3><p>因此，若使用待定係數 $A_0, A_1, \dots, A_n$ 和 $K, M$ 選擇一個適當的 $y_p$，使其成為所有可能的乘積項之和，如下所示，便可根據基本規則 (a) 和修正規則 (b)，將 $y_p$（或 $xy_p$, $x^2y_p$）及其導數代入給定方程式以確定待定係數。此處的 $n$ 根據 $r(x)$ 中 $x$ 的次數來決定。</p>\[y_p = e^{\alpha x}(A_nx^n + A_{n-1}x^{n-1} + \cdots + A_1x + A_0)(K\cos{\omega x} + M \sin{\omega x}).\]<p>$\blacksquare$</p><blockquote class="prompt-warning"><p>若給定的輸入項 $r(x)$ 包含多個不同的 $\alpha_i$ 和 $\omega_j$ 值，則選擇 $y_p$ 時必須確保涵蓋所有可能的 $x^{k}e^{\alpha_i x}\cos(\omega_j x)$ 和 $x^{k}e^{\alpha_i x}\sin(\omega_j x)$ 形式的項。<br /> 待定係數法的優點在於簡便，因此若假設解(ansatz)變得過於複雜，使其優點黯然失色，那麼採用之後將會介紹的參數變異法可能會是更好的選擇。</p></blockquote><h2 id="待定係數法的擴展歐拉-柯西方程式">待定係數法的擴展：歐拉-柯西方程式</h2><p>不僅是<a href="/zh-TW/posts/homogeneous-linear-odes-with-constant-coefficients/">常係數二階齊次線性常微分方程式</a>，待定係數法也可以應用於<a href="/zh-TW/posts/euler-cauchy-equation/">歐拉-柯西方程式</a></p>\[x^2y^{\prime\prime} + axy^{\prime} + by = r(x) \label{eqn:euler_cauchy}\tag{5}\]<p>。</p><h3 id="變數變換">變數變換</h3><p>透過<a href="/zh-TW/posts/euler-cauchy-equation/#轉換為常係數二階齊次線性常微分方程式">以 $x = e^t$ 進行變換，轉換為常係數二階齊次線性常微分方程式</a>，可得</p>\[\frac{d}{dx} = \frac{1}{x}\frac{d}{dt}, \quad \frac{d^2}{dx^2} = \frac{1}{x^2}\left(\frac{d^2}{dt^2} - \frac{d}{dt} \right)\]<p>，我們之前已經知道，歐拉-柯西方程式可以轉換為以下關於 $t$ 的常係數齊次線性常微分方程式。</p>\[y^{\prime\prime} + (a-1)y^{\prime} + by = r(e^t). \label{eqn:substituted}\tag{6}\]<p>現在，對方程式 ($\ref{eqn:substituted}$) 同樣應用<a href="#待定係數法">前面探討的待定係數法</a>對 $t$ 求解，最後利用 $t = \ln x$ 將解轉換回關於 $x$ 的解即可。</p><h3 id="rx-為-x-的冪次自然對數或這些函數的和與積的情況">$r(x)$ 為 $x$ 的冪次、自然對數或這些函數的和與積的情況</h3><p>特別是當輸入項 $r(x)$ 由 $x$ 的冪次、自然對數或這些函數的和與積組成時，可以根據以下歐拉-柯西方程式專用的選擇規則，直接選擇適當的 $y_p$。</p><blockquote class="prompt-info"><p><strong>待定係數法的選擇規則：歐拉-柯西方程式專用</strong><br /> <strong>(a) 基本規則(basic rule)</strong>：若方程式 ($\ref{eqn:euler_cauchy}$) 中的 $r(x)$ 是下表第一欄中的任一函數，則選擇同一列的 $y_p$。將 $y_p$ 及其導數代入方程式 ($\ref{eqn:euler_cauchy}$) 以確定待定係數。<br /> <strong>(b) 修正規則(modification rule)</strong>：若所選的 $y_p$ 項是方程式 ($\ref{eqn:euler_cauchy}$) 對應的齊次常微分方程式 $x^2y^{\prime\prime} + axy^{\prime} + by = 0$ 的解，則將該項乘以 $\ln{x}$（若該解對應於齊次常微分方程式特徵方程式的重根，則乘以 $(\ln{x})^2$）。<br /> <strong>(c) 疊加規則(sum rule)</strong>：若 $r(x)$ 是下表第一欄中函數的和，則選擇第二欄對應列中函數的和作為 $y_p$。</p><table><thead><tr><th style="text-align: left">$r(x)$ 的項<th style="text-align: left">$y_p(x)$ 的選擇<tbody><tr><td style="text-align: left">$kx^m\ (m=0,1,\cdots)$<td style="text-align: left">$Ax^m$<tr><td style="text-align: left">$kx^m \ln{x}\ (m=0,1,\cdots)$<td style="text-align: left">$x^m(B\ln x + C)$<tr><td style="text-align: left">$k(\ln{x})^s\ (s=0,1,\cdots)$<td style="text-align: left">$D_0 + D_1\ln{x} + \cdots + D_{s-1}(\ln{x})^{s-1} + D_s(\ln{x})^s$<tr><td style="text-align: left">$kx^m (\ln{x})^s$<br />$(m=0,1,\cdots ;\; s=0,1,\cdots)$<td style="text-align: left">$x^m \left( D_0 + D_1\ln{x} + \cdots + D_{s-1}(\ln{x})^{s-1} + D_s(\ln{x})^s \right)$</table></blockquote><p>這樣，對於具有實際重要性的輸入項 $r(x)$，可以比透過<a href="#變數變換">變數變換</a>更快、更簡便地找到與之相同的 $y_p$。將先前探討的<a href="#待定係數法">原始選擇規則</a>中的 $x$ 替換為 $\ln{x}$，即可推導出此歐拉-柯西方程式專用的選擇規則。</p>]]> </content> </entry> <entry><title xml:lang="zh-TW">二階非齊次線性常微分方程式 (Nonhomogeneous Linear ODEs of Second Order)</title><link href="https://www.yunseo.kim/zh-TW/posts/nonhomogeneous-linear-odes-of-second-order/" rel="alternate" type="text/html" hreflang="en" /><link href="https://www.yunseo.kim/ko/posts/nonhomogeneous-linear-odes-of-second-order/" rel="alternate" type="text/html" hreflang="ko" /><link href="https://www.yunseo.kim/ja/posts/nonhomogeneous-linear-odes-of-second-order/" rel="alternate" type="text/html" hreflang="ja" /><link href="https://www.yunseo.kim/zh-TW/posts/nonhomogeneous-linear-odes-of-second-order/" rel="alternate" type="text/html" hreflang="zh-TW" /><link href="https://www.yunseo.kim/es/posts/nonhomogeneous-linear-odes-of-second-order/" rel="alternate" type="text/html" hreflang="es" /><link href="https://www.yunseo.kim/pt-BR/posts/nonhomogeneous-linear-odes-of-second-order/" rel="alternate" type="text/html" hreflang="pt-BR" /><link href="https://www.yunseo.kim/fr/posts/nonhomogeneous-linear-odes-of-second-order/" rel="alternate" type="text/html" hreflang="fr" /><link href="https://www.yunseo.kim/de/posts/nonhomogeneous-linear-odes-of-second-order/" rel="alternate" type="text/html" hreflang="de" /><link href="https://www.yunseo.kim/pl/posts/nonhomogeneous-linear-odes-of-second-order/" rel="alternate" type="text/html" hreflang="pl" /><link href="https://www.yunseo.kim/cs/posts/nonhomogeneous-linear-odes-of-second-order/" rel="alternate" type="text/html" hreflang="cs" /><link href="https://www.yunseo.kim/sw/posts/nonhomogeneous-linear-odes-of-second-order/" rel="alternate" type="text/html" hreflang="sw" /><link href="https://www.yunseo.kim/am/posts/nonhomogeneous-linear-odes-of-second-order/" rel="alternate" type="text/html" hreflang="am" /><published>2025-04-16T00:00:00+09:00</published> <updated>2025-07-09T19:24:14+09:00</updated> <id>https://www.yunseo.kim/zh-TW/posts/nonhomogeneous-linear-odes-of-second-order/</id> <author> <name>Yunseo Kim</name> </author> <category term="Mathematics" /> <category term="Differential Equation" /> <summary xml:lang="zh-TW">本文將探討二階非齊次線性常微分方程式的通解形式，著重於其與對應的齊次線性常微分方程式解之間的關係，並證明通解的存在性與奇異解的不存在性。</summary> <content type="html" xml:lang="zh-TW"> <![CDATA[<p>本文將探討二階非齊次線性常微分方程式的通解形式，著重於其與對應的齊次線性常微分方程式解之間的關係，並證明通解的存在性與奇異解的不存在性。</p><em><p>* Mathematical equations and diagrams included in posts may not display properly when viewed with a feed reader.</p></em><h2 id="tldr">TL;DR</h2><blockquote class="prompt-info"><ul><li>二階非齊次線性常微分方程式 $y^{\prime\prime} + p(x)y^{\prime} + q(x)y = r(x)$ 的<strong>通解(general solution)</strong>：<ul><li>$y(x) = y_h(x) + y_p(x)$<li>$y_h$：對應的齊次常微分方程式 $y^{\prime\prime} + p(x)y^{\prime} + q(x)y = 0$ 的通解 $y_h = c_1y_1 + c_2y_2$<li>$y_p$：該非齊次常微分方程式的特解(particular solution)</ul><li>響應項 $y_p$ 僅由輸入 $r(x)$ 決定，對於相同的非齊次常微分方程式，即使初始條件不同，$y_p$ 也不會改變。非齊次常微分方程式的兩個特解之差，會是對應的齊次常微分方程式的解。<li><strong>通解的存在性</strong>：若非齊次常微分方程式的係數 $p(x)$、$q(x)$ 與輸入函數 $r(x)$ 連續，則其通解必定存在。<li><strong>奇異解的不存在</strong>：通解包含方程式的所有解（即不存在奇異解）。</ul></blockquote><h2 id="先備知識">先備知識</h2><ul><li><a href="/zh-TW/posts/homogeneous-linear-odes-of-second-order/">二階齊次線性常微分方程式 (Homogeneous Linear ODEs of Second Order)</a><li><a href="/zh-TW/posts/wronskian-existence-and-uniqueness-of-solutions/">朗斯基行列式(Wronskian)，解的存在性與唯一性</a></ul><h2 id="二階非齊次線性常微分方程式的通解與特解">二階非齊次線性常微分方程式的通解與特解</h2><p>考慮二階非齊次線性常微分方程式</p>\[y^{\prime\prime} + p(x)y^{\prime} + q(x)y = r(x) \label{eqn:nonhomogeneous_linear_ode}\tag{1}\]<p>，其中 $r(x) \not\equiv 0$。在開放區間 $I$ 上，方程式 ($\ref{eqn:nonhomogeneous_linear_ode}$) 的<strong>通解(general solution)</strong>，是由此非齊次常微分方程式對應的齊次常微分方程式</p>\[y^{\prime\prime} + p(x)y^{\prime} + q(x)y = 0 \label{eqn:homogeneous_linear_ode}\tag{2}\]<p>的通解 $y_h = c_1y_1 + c_2y_2$ 與方程式 ($\ref{eqn:nonhomogeneous_linear_ode}$) 的特解 $y_p$ 的和</p>\[y(x) = y_h(x) + y_p(x) \label{eqn:general_sol}\tag{3}\]<p>所構成。此外，在區間 $I$ 上，方程式 ($\ref{eqn:nonhomogeneous_linear_ode}$) 的<strong>特解(particular solution)</strong>，是透過為 $y_h$ 的任意常數 $c_1$ 和 $c_2$ 指定特定值，從方程式 ($\ref{eqn:general_sol}$) 得到的解。</p><p>也就是說，若在齊次常微分方程式 ($\ref{eqn:homogeneous_linear_ode}$) 中加入僅依賴於自變數 $x$ 的輸入 $r(x)$，則其響應中會增加一個對應的項 $y_p$，而這個增加的響應項 $y_p$ 僅由輸入 $r(x)$ 決定，與初始條件無關。我們稍後將會看到，若求方程式 ($\ref{eqn:nonhomogeneous_linear_ode}$) 的任意兩個解 $y_1$ 和 $y_2$ 的差（即，求對應於兩個不同初始條件的特解之差），與初始條件無關的 $y_p$ 部分會被消去，只剩下 ${y_h}_1$ 和 ${y_h}_2$ 的差，而根據<a href="/zh-TW/posts/homogeneous-linear-odes-of-second-order/#疊加原理">疊加原理</a>，此差值亦為方程式 ($\ref{eqn:homogeneous_linear_ode}$) 的解。</p><h2 id="非齊次常微分方程式的解與其對應的齊次常微分方程式解之間的關係">非齊次常微分方程式的解與其對應的齊次常微分方程式解之間的關係</h2><blockquote class="prompt-info"><p><strong>定理 1：非齊次常微分方程式 ($\ref{eqn:nonhomogeneous_linear_ode}$) 的解與齊次常微分方程式 ($\ref{eqn:homogeneous_linear_ode}$) 的解之間的關係</strong><br /> <strong>(a)</strong> 在某個開放區間 $I$ 上，非齊次常微分方程式 ($\ref{eqn:nonhomogeneous_linear_ode}$) 的解 $y$ 與齊次常微分方程式 ($\ref{eqn:homogeneous_linear_ode}$) 的解 $\tilde{y}$ 的和，同樣是區間 $I$ 上方程式 ($\ref{eqn:nonhomogeneous_linear_ode}$) 的解。特別地，方程式 ($\ref{eqn:general_sol}$) 是區間 $I$ 上方程式 ($\ref{eqn:nonhomogeneous_linear_ode}$) 的解。<br /> <strong>(b)</strong> 在區間 $I$ 上，非齊次常微分方程式 ($\ref{eqn:nonhomogeneous_linear_ode}$) 的兩個解之差，是區間 $I$ 上齊次常微分方程式 ($\ref{eqn:homogeneous_linear_ode}$) 的解。</p></blockquote><h3 id="證明">證明</h3><h4 id="a">(a)</h4><p>將方程式 ($\ref{eqn:nonhomogeneous_linear_ode}$) 與 ($\ref{eqn:homogeneous_linear_ode}$) 的左式記為 $L[y]$。那麼，在區間 $I$ 上，對於方程式 ($\ref{eqn:nonhomogeneous_linear_ode}$) 的任意解 $y$ 與方程式 ($\ref{eqn:homogeneous_linear_ode}$) 的任意解 $\tilde{y}$，下列關係成立。</p>\[L[y + \tilde{y}] = L[y] + L[\tilde{y}] = r + 0 = r.\]<h4 id="b">(b)</h4><p>在區間 $I$ 上，對於方程式 ($\ref{eqn:nonhomogeneous_linear_ode}$) 的任意兩個解 $y$ 與 $y^*$，下列關係成立。</p>\[L[y - y^*] = L[y] - L[y^*] = r - r = 0.\ \blacksquare\]<h2 id="非齊次常微分方程式的通解包含所有解">非齊次常微分方程式的通解包含所有解</h2><p>對於齊次常微分方程式 ($\ref{eqn:homogeneous_linear_ode}$)，我們<a href="/zh-TW/posts/wronskian-existence-and-uniqueness-of-solutions/#通解包含所有解">已知其通解包含所有解</a>。現在我們來證明，對於非齊次常微分方程式 ($\ref{eqn:nonhomogeneous_linear_ode}$)，同樣的結論也成立。</p><blockquote class="prompt-info"><p><strong>定理 2：非齊次常微分方程式的通解包含所有解</strong><br /> 若方程式 ($\ref{eqn:nonhomogeneous_linear_ode}$) 的係數 $p(x)$、$q(x)$ 與輸入函數 $r(x)$ 在某個開放區間 $I$ 上連續，則在區間 $I$ 上，方程式 ($\ref{eqn:nonhomogeneous_linear_ode}$) 的所有解，都可以透過為方程式 ($\ref{eqn:nonhomogeneous_linear_ode}$) 的通解 ($\ref{eqn:general_sol}$) 中的 $y_h$ 的任意常數 $c_1$ 和 $c_2$ 指定適當的值來得到。</p></blockquote><h3 id="證明-1">證明</h3><p>令 $y^*$ 為在 $I$ 上方程式 ($\ref{eqn:nonhomogeneous_linear_ode}$) 的某個解，並令 $x_0$ 為區間 $I$ 內的某個 $x$。根據<a href="/zh-TW/posts/wronskian-existence-and-uniqueness-of-solutions/#通解的存在性">具有連續變數係數的齊次常微分方程式的通解存在性定理</a>，$y_h = c_1y_1 + c_2y_2$ 存在；此外，根據我們稍後將探討的<strong>參數變換法(method of variation of parameters)</strong>，$y_p$ 也存在，因此在區間 $I$ 上，方程式 ($\ref{eqn:nonhomogeneous_linear_ode}$) 的通解 ($\ref{eqn:general_sol}$) 存在。現在，根據前面證明的定理 <a href="#非齊次常微分方程式的解與其對應的齊次常微分方程式解之間的關係">1(b)</a>，$Y = y^* - y_p$ 是在區間 $I$ 上齊次常微分方程式 ($\ref{eqn:homogeneous_linear_ode}$) 的解，且在 $x_0$ 處滿足</p>\[\begin{gather*} Y(x_0) = y^*(x_0) - y_p(x_0) \\ Y^{\prime}(x_0) = {y^*}^{\prime}(x_0) - y_p^{\prime}(x_0) \end{gather*}\]<p>。根據<a href="/zh-TW/posts/wronskian-existence-and-uniqueness-of-solutions/#初始值問題解的存在性與唯一性定理">初始值問題解的存在性與唯一性定理</a>，在區間 $I$ 上，對於上述初始條件，存在一個唯一的特解 $Y$，此解可透過為 $y_h$ 的 $c_1$、$c_2$ 指定適當的值來得到。由於 $y^* = Y + y_p$，我們證明了非齊次常微分方程式 ($\ref{eqn:nonhomogeneous_linear_ode}$) 的任意特解 $y^*$ 都可以從通解 ($\ref{eqn:general_sol}$) 中得到。 $\blacksquare$</p>]]> </content> </entry> <entry><title xml:lang="zh-TW">朗斯基行列式(Wronskian)，解的存在性與唯一性</title><link href="https://www.yunseo.kim/zh-TW/posts/wronskian-existence-and-uniqueness-of-solutions/" rel="alternate" type="text/html" hreflang="en" /><link href="https://www.yunseo.kim/ko/posts/wronskian-existence-and-uniqueness-of-solutions/" rel="alternate" type="text/html" hreflang="ko" /><link href="https://www.yunseo.kim/ja/posts/wronskian-existence-and-uniqueness-of-solutions/" rel="alternate" type="text/html" hreflang="ja" /><link href="https://www.yunseo.kim/zh-TW/posts/wronskian-existence-and-uniqueness-of-solutions/" rel="alternate" type="text/html" hreflang="zh-TW" /><link href="https://www.yunseo.kim/es/posts/wronskian-existence-and-uniqueness-of-solutions/" rel="alternate" type="text/html" hreflang="es" /><link href="https://www.yunseo.kim/pt-BR/posts/wronskian-existence-and-uniqueness-of-solutions/" rel="alternate" type="text/html" hreflang="pt-BR" /><link href="https://www.yunseo.kim/fr/posts/wronskian-existence-and-uniqueness-of-solutions/" rel="alternate" type="text/html" hreflang="fr" /><link href="https://www.yunseo.kim/de/posts/wronskian-existence-and-uniqueness-of-solutions/" rel="alternate" type="text/html" hreflang="de" /><link href="https://www.yunseo.kim/pl/posts/wronskian-existence-and-uniqueness-of-solutions/" rel="alternate" type="text/html" hreflang="pl" /><link href="https://www.yunseo.kim/cs/posts/wronskian-existence-and-uniqueness-of-solutions/" rel="alternate" type="text/html" hreflang="cs" /><link href="https://www.yunseo.kim/sw/posts/wronskian-existence-and-uniqueness-of-solutions/" rel="alternate" type="text/html" hreflang="sw" /><link href="https://www.yunseo.kim/am/posts/wronskian-existence-and-uniqueness-of-solutions/" rel="alternate" type="text/html" hreflang="am" /><published>2025-04-06T00:00:00+09:00</published> <updated>2025-07-11T21:22:11+09:00</updated> <id>https://www.yunseo.kim/zh-TW/posts/wronskian-existence-and-uniqueness-of-solutions/</id> <author> <name>Yunseo Kim</name> </author> <category term="Mathematics" /> <category term="Differential Equation" /> <summary xml:lang="zh-TW">針對具有任意連續變數係數的二階齊次線性常微分方程式，本文將探討其初始值問題解的存在性與唯一性定理，以及利用朗斯基行列式(Wronskian)判斷解的線性相依/線性獨立的方法。此外，我們將證明此類方程式恆有通解，且此通解包含方程式的所有解。</summary> <content type="html" xml:lang="zh-TW"> <![CDATA[<p>針對具有任意連續變數係數的二階齊次線性常微分方程式，本文將探討其初始值問題解的存在性與唯一性定理，以及利用朗斯基行列式(Wronskian)判斷解的線性相依/線性獨立的方法。此外，我們將證明此類方程式恆有通解，且此通解包含方程式的所有解。</p><em><p>* Mathematical equations and diagrams included in posts may not display properly when viewed with a feed reader.</p></em><h2 id="tldr">TL;DR</h2><blockquote class="prompt-info"><p>對於在區間 $I$ 上具有連續的任意變數係數 $p$ 與 $q$ 的二階齊次線性常微分方程式</p>\[y^{\prime\prime} + p(x)y^{\prime} + q(x)y = 0\]<p>與初始條件</p>\[y(x_0)=K_0, \qquad y^{\prime}(x_0)=K_1\]<p>，以下四個定理成立。</p><ol><li><strong>初始值問題解的存在性與唯一性定理</strong>：由給定方程式及初始條件構成的初始值問題，在區間 $I$ 上有唯一的解 $y(x)$。<li><strong>利用朗斯基行列式(Wronskian)判斷解的線性相依/線性獨立</strong>：對於方程式的兩個解 $y_1$ 和 $y_2$，若在區間 $I$ 內存在一點 $x_0$ 使得<strong>朗斯基行列式(Wronskian)</strong> $W(y_1, y_2) = y_1y_2^{\prime} - y_2y_1^{\prime}$ 的值為 $0$，則兩解為線性相依。此外，若在區間 $I$ 內存在一點 $x_1$ 使得 $W\neq 0$，則兩解為線性獨立。<li><strong>通解的存在性</strong>：給定的方程式在區間 $I$ 上有通解。<li><strong>奇異解的不存在</strong>：此通解包含方程式的所有解（即不存在奇異解）。</ol></blockquote><h2 id="先備知識">先備知識</h2><ul><li><a href="/zh-TW/posts/Solution-of-First-Order-Linear-ODE/">一階線性常微分方程的解法</a><li><a href="/zh-TW/posts/homogeneous-linear-odes-of-second-order/">二階齊次線性常微分方程式 (Homogeneous Linear ODEs of Second Order)</a><li><a href="/zh-TW/posts/homogeneous-linear-odes-with-constant-coefficients/">常數係數二階齊次線性常微分方程式</a><li><a href="/zh-TW/posts/euler-cauchy-equation/">歐拉-柯西方程式</a><li>反矩陣與奇異矩陣、行列式</ul><h2 id="具有連續任意變數係數的齊次線性常微分方程式">具有連續任意變數係數的齊次線性常微分方程式</h2><p>先前我們已探討過<a href="/zh-TW/posts/homogeneous-linear-odes-with-constant-coefficients/">常數係數二階齊次線性常微分方程式</a>與<a href="/zh-TW/posts/euler-cauchy-equation/">歐拉-柯西方程式</a>的通解。 本文將把討論擴展到更一般的情況，探討具有任意連續<strong>變數係數(variable coefficient)</strong> $p$ 與 $q$ 的二階齊次線性常微分方程式</p>\[y^{\prime\prime} + p(x)y^{\prime} + q(x)y = 0 \label{eqn:homogeneous_linear_ode_with_var_coefficients}\tag{1}\]<p>的通解之存在性與形式。此外，我們還將探討由常微分方程式 ($\ref{eqn:homogeneous_linear_ode_with_var_coefficients}$) 與下列兩個初始條件</p>\[y(x_0)=K_0, \qquad y^{\prime}(x_0)=K_1 \label{eqn:initial_conditions}\tag{2}\]<p>所構成的<a href="/zh-TW/posts/homogeneous-linear-odes-of-second-order/#初始值問題與初始條件">初始值問題</a>的唯一性。</p><p>若先說結論，本文的核心內容是：具有連續係數的<u>線性</u>常微分方程式，不會有<em>奇異解(singular solution)</em>（無法從通解中得到的解）。</p><h2 id="初始值問題解的存在性與唯一性定理">初始值問題解的存在性與唯一性定理</h2><blockquote class="prompt-info"><p><strong>初始值問題解的存在性與唯一性定理(Existence and Uniqueness Theorem for Initial Value Problems)</strong><br /> 若 $p(x)$ 與 $q(x)$ 在某個開放區間 $I$ 上是連續函數，且 $x_0$ 位於區間 $I$ 內，則由方程式 ($\ref{eqn:homogeneous_linear_ode_with_var_coefficients}$) 與 ($\ref{eqn:initial_conditions}$) 構成的初始值問題，在區間 $I$ 上有唯一的解 $y(x)$。</p></blockquote><p>關於存在性的證明，本文不予討論，僅探討唯一性的證明。一般而言，證明唯一性比證明存在性來得簡單。 若對證明不感興趣，可跳過此部分，直接前往<a href="#解的線性相依與線性獨立">解的線性相依與線性獨立</a>。</p><h3 id="唯一性的證明">唯一性的證明</h3><p>假設由常微分方程式 ($\ref{eqn:homogeneous_linear_ode_with_var_coefficients}$) 與初始條件 ($\ref{eqn:initial_conditions}$) 構成的初始值問題，在區間 $I$ 上有兩個解 $y_1(x)$ 與 $y_2(x)$。若能證明這兩個解的差</p>\[y(x) = y_1(x) - y_2(x)\]<p>在區間 $I$ 上恆為 $0$，即表示在區間 $I$ 上 $y_1 \equiv y_2$，從而證明解的唯一性。</p><p>由於方程式 ($\ref{eqn:homogeneous_linear_ode_with_var_coefficients}$) 是齊次線性常微分方程式，因此 $y_1$ 與 $y_2$ 的線性組合 $y$ 也是在 $I$ 上的解。$y_1$ 與 $y_2$ 滿足相同的初始條件 ($\ref{eqn:initial_conditions}$)，因此 $y$ 滿足條件</p>\[\begin{align*} &amp; y(x_0) = y_1(x_0) - y_2(x_0) = 0, \\ &amp; y^{\prime}(x_0) = y_1^{\prime}(x_0) - y_2^{\prime}(x_0) = 0 \end{align*} \label{eqn:initial_conditions_*}\tag{3}\]<p>。現在考慮函數</p>\[z(x) = y(x)^2 + y^{\prime}(x)^2\]<p>及其導數</p>\[z^{\prime} = 2yy^{\prime} + 2y^{\prime}y^{\prime\prime}\]<p>。從常微分方程式可得</p>\[y^{\prime\prime} = -py^{\prime} - qy\]<p>，將其代入關於 $z^{\prime}$ 的式子中，可得</p>\[z^{\prime} = 2yy^{\prime} - 2p{y^{\prime}}^2 - 2qyy^{\prime} \label{eqn:z_prime}\tag{4}\]<p>。由於 $y$ 與 $y^{\prime}$ 為實數，因此</p>\[(y\pm y^{\prime})^2 = y^2 \pm 2yy^{\prime} + {y^{\prime}}^2 \geq 0\]<p>。從此式與 $z$ 的定義，可得到兩個不等式</p>\[(a)\ 2yy^{\prime} \leq y^2 + {y^{\prime}}^2 = z, \qquad (b)\ 2yy^{\prime} \geq -(y^2 + {y^{\prime}}^2) = -z \label{eqn:inequalities}\tag{5}\]<p>。從這兩個不等式可知 $|2yy^{\prime}|\leq z$，那麼對於式 ($\ref{eqn:z_prime}$) 的最後一項，下列不等式成立。</p>\[\pm2qyy^{\prime} \leq |\pm 2qyy^{\prime}| = |q||2yy^{\prime}| \leq |q|z.\]<p>利用此結果以及 $-p \leq |p|$，並將式 ($\ref{eqn:inequalities}$a) 應用於式 ($\ref{eqn:z_prime}$) 的 $2yy^{\prime}$ 項，可得</p>\[z^{\prime} \leq z + 2|p|{y^{\prime}}^2 + |q|z\]<p>。因為 ${y^{\prime}}^2 \leq y^2 + {y^{\prime}}^2 = z$，由此可得</p>\[z^{\prime} \leq (1 + 2|p| + |q|)z\]<p>，若令括號內的函數為 $h = 1 + 2|p| + |q|$，則</p>\[z^{\prime} \leq hz \quad \forall x \in I \label{eqn:inequality_6a}\tag{6a}\]<p>。同理，從式 ($\ref{eqn:z_prime}$) 與 ($\ref{eqn:inequalities}$) 可得</p>\[\begin{align*} -z^{\prime} &amp;= -2yy^{\prime} + 2p{y^{\prime}}^2 + 2qyy^{\prime} \\ &amp;\leq z + 2|p|z + |q|z = hz \end{align*} \label{eqn:inequality_6b}\tag{6b}\]<p>。這兩個不等式 ($\ref{eqn:inequality_6a}$)、($\ref{eqn:inequality_6b}$) 與下列不等式</p>\[z^{\prime} - hz \leq 0, \qquad z^{\prime} + hz \geq 0 \label{eqn:inequalities_7}\tag{7}\]<p>等價，兩式左邊的<a href="/zh-TW/posts/Solution-of-First-Order-Linear-ODE/#非齊次線性常微分方程">積分因子</a>為</p>\[F_1 = e^{-\int h(x)\ dx} \qquad \text{與} \qquad F_2 = e^{\int h(x)\ dx}\]<p>。因為 $h$ 是連續的，不定積分 $\int h(x)\ dx$ 存在，且 $F_1$ 與 $F_2$ 為正數，故從式 ($\ref{eqn:inequalities_7}$) 可得</p>\[F_1(z^{\prime} - hz) = (F_1 z)^{\prime} \leq 0, \qquad F_2(z^{\prime} + hz) = (F_2 z)^{\prime} \geq 0\]<p>。這表示在區間 $I$ 上，$F_1 z$ 不遞增，而 $F_2 z$ 不遞減。根據式 ($\ref{eqn:initial_conditions_*}$)，$z(x_0) = 0$，因此，</p>\[\begin{cases} \left(F_1 z \geq (F_1 z)_{x_0} = 0\right)\ \&amp; \ \left(F_2 z \leq (F_2 z)_{x_0} = 0\right) &amp; (x \leq x_0) \\ \left(F_1 z \leq (F_1 z)_{x_0} = 0\right)\ \&amp; \ \left(F_2 z \geq (F_2 z)_{x_0} = 0\right) &amp; (x \geq x_0) \end{cases}\]<p>。最後，將不等式兩邊同除以正數 $F_1$ 與 $F_2$，即可如下證明解的唯一性。</p>\[(z \leq 0) \ \&amp; \ (z \geq 0) \quad \forall x \in I\] \[z = y^2 + {y^{\prime}}^2 = 0 \quad \forall x \in I\] \[\therefore y \equiv y_1 - y_2 \equiv 0 \quad \forall x \in I. \ \blacksquare\]<h2 id="解的線性相依與線性獨立">解的線性相依與線性獨立</h2><p>讓我們回顧一下在<a href="/zh-TW/posts/homogeneous-linear-odes-of-second-order/#基底與通解">二階齊次線性常微分方程式</a>中探討過的內容。在開放區間 $I$ 上的通解，是由 $I$ 上的<strong>基底(basis)</strong> $y_1$、$y_2$，即一對線性獨立的解所構成。此處，稱 $y_1$ 與 $y_2$ 在區間 $I$ 上為<strong>線性獨立(linearly independent)</strong>，意指對於區間內所有的 $x$，滿足下列條件。</p>\[k_1y_1(x) + k_2y_2(x) = 0 \Leftrightarrow k_1=0\text{且 }k_2=0 \label{eqn:linearly_independent}\tag{8}\]<p>若不滿足上述條件，而是對於至少一個不為 $0$ 的 $k_1$、$k_2$ 使得 $k_1y_1(x) + k_2y_2(x) = 0$ 成立，則 $y_1$ 與 $y_2$ 在區間 $I$ 上為<strong>線性相依(linearly dependent)</strong>。此時，對於區間 $I$ 內的所有 $x$，</p>\[\text{(a) } y_1 = ky_2 \quad \text{或} \quad \text{(b) } y_2 = ly_1 \label{eqn:linearly_dependent}\tag{9}\]<p>，因此 $y_1$ 與 $y_2$ 成比例。</p><p>現在，讓我們來看看以下判斷解的線性獨立/線性相依的方法。</p><blockquote class="prompt-info"><p><strong>利用朗斯基行列式(Wronskian)判斷解的線性相依/線性獨立</strong><br /> <strong>i.</strong> 若常微分方程式 ($\ref{eqn:homogeneous_linear_ode_with_var_coefficients}$) 在開放區間 $I$ 上具有連續係數 $p(x)$ 與 $q(x)$，則在區間 $I$ 上，方程式 ($\ref{eqn:homogeneous_linear_ode_with_var_coefficients}$) 的兩個解 $y_1$ 與 $y_2$ 為線性相依的充要條件是，這兩個解的<em>朗斯基行列式(Wronski determinant)</em>，簡稱<strong>朗斯基行列式(Wronskian)</strong> 的下列行列式</p>\[W(y_1, y_2) = \begin{vmatrix} y_1 &amp; y_2 \\ y_1^{\prime} &amp; y_2^{\prime} \\ \end{vmatrix} = y_1y_2^{\prime} - y_2y_1^{\prime} \label{eqn:wronskian}\tag{10}\]<p>在區間 $I$ 內的某點 $x_0$ 為 $0$。</p>\[\exists x_0 \in I: W(x_0)=0 \iff y_1 \text{與 } y_2 \text{為線性相依}\]<p><strong>ii.</strong> 若在區間 $I$ 內的一點 $x=x_0$ 上 $W=0$，則在區間 $I$ 內的所有 $x$ 上 $W=0$。</p>\[\exists x_0 \in I: W(x_0)=0 \implies \forall x \in I: W(x)=0\]<p>換言之，若在區間 $I$ 中存在一點 $x_1$ 使得 $W\neq 0$，則在該區間 $I$ 上 $y_1$、$y_2$ 為線性獨立。</p>\[\begin{align*} \exists x_1 \in I: W(x_1)\neq 0 &amp;\implies \forall x \in I: W(x)\neq 0 \\ &amp;\implies y_1 \text{與 } y_2 \text{為線性獨立} \end{align*}\]</blockquote><blockquote class="prompt-tip"><p>朗斯基行列式最初由波蘭數學家約瑟夫·瑪麗亞·赫內-朗斯基(Józef Maria Hoene-Wroński)引入，在他去世後的 11882 HE，由蘇格兰數學家托馬斯·繆爾(Sir Thomas Muir)命名為現在的名稱。</p></blockquote><h3 id="證明">證明</h3><h4 id="i-a">i. (a)</h4><p>假設在區間 $I$ 上 $y_1$ 與 $y_2$ 為線性相依。則在區間 $I$ 上，式 ($\ref{eqn:linearly_dependent}$a) 或 ($\ref{eqn:linearly_dependent}$b) 成立。若式 ($\ref{eqn:linearly_dependent}$a) 成立，則</p>\[W(y_1, y_2) = y_1y_2^{\prime} - y_2y_1^{\prime} = ky_2ky_2^{\prime} - y_2ky_2^{\prime} = 0\]<p>；同理，若式 ($\ref{eqn:linearly_dependent}$b) 成立，則</p>\[W(y_1, y_2) = y_1y_2^{\prime} - y_2y_1^{\prime} = y_1ly_1^{\prime} - ly_1y_1^{\prime} = 0\]<p>，因此可以確認<u>在區間 $I$ 內的所有 $x$</u>，朗斯基行列式 $W(y_1, y_2)=0$。</p><h4 id="i-b">i. (b)</h4><p>反之，假設在某點 $x = x_0$ 上 $W(y_1, y_2)=0$，我們將證明在區間 $I$ 上 $y_1$ 與 $y_2$ 為線性相依。考慮關於未知數 $k_1$、$k_2$ 的線性聯立方程式</p>\[\begin{gather*} k_1y_1(x_0) + k_2y_2(x_0) = 0 \\ k_1y_1^{\prime}(x_0) + k_2y_2^{\prime}(x_0) = 0 \end{gather*} \label{eqn:linear_system}\tag{11}\]<p>。這可以表示為如下的向量方程式形式。</p>\[\left[\begin{matrix} y_1(x_0) &amp; y_2(x_0) \\ y_1^{\prime}(x_0) &amp; y_2^{\prime}(x_0) \end{matrix}\right] \left[\begin{matrix} k_1 \\ k_2 \end{matrix}\right] = 0 \label{eqn:vector_equation}\tag{12}\]<p>此向量方程式的係數矩陣為</p>\[A = \left[\begin{matrix} y_1(x_0) &amp; y_2(x_0) \\ y_1^{\prime}(x_0) &amp; y_2^{\prime}(x_0) \end{matrix}\right]\]<p>，而此矩陣的行列式即為 $W(y_1(x_0), y_2(x_0))$。因為 $\det(A) = W=0$，所以 $A$ 是不存在<strong>反矩陣(inverse matrix)</strong>的<strong>奇異矩陣(singular matrix)</strong>，因此聯立方程式 ($\ref{eqn:linear_system}$) 除了零向量 $(0,0)$ 之外，還有一個解 $(c_1, c_2)$，其中 $k_1$ 與 $k_2$ 至少有一個不為 $0$。現在引入函數</p>\[y(x) = c_1y_1(x) + c_2y_2(x)\]<p>。由於方程式 ($\ref{eqn:homogeneous_linear_ode_with_var_coefficients}$) 是齊次線性的，根據<a href="/zh-TW/posts/homogeneous-linear-odes-of-second-order/#疊加原理">疊加原理</a>，此函數在區間 $I$ 上是 ($\ref{eqn:homogeneous_linear_ode_with_var_coefficients}$) 的解。從式 ($\ref{eqn:linear_system}$) 可知，此解滿足初始條件 $y(x_0)=0$、$y^{\prime}(x_0)=0$。</p><p>另一方面，存在一個滿足相同初始條件 $y^*(x_0)=0$、${y^*}^{\prime}(x_0)=0$ 的自明解 $y^* \equiv 0$。由於方程式 ($\ref{eqn:homogeneous_linear_ode_with_var_coefficients}$) 的係數 $p$ 與 $q$ 是連續的，根據<a href="#初始值問題解的存在性與唯一性定理">初始值問題解的存在性與唯一性定理</a>，解的唯一性得到保證，因此 $y \equiv y^*$。也就是說，在區間 $I$ 上</p>\[c_1y_1 + c_2y_2 \equiv 0\]<p>。因為 $c_1$ 與 $c_2$ 至少有一個不為 $0$，所以不滿足 ($\ref{eqn:linearly_independent}$)，這表示在區間 $I$ 上 $y_1$、$y_2$ 為線性相依。</p><h4 id="ii">ii.</h4><p>若在區間 $I$ 內的某點 $x_0$ 上 $W(x_0)=0$，則根據 <a href="#i-b">i.(b)</a>，在區間 $I$ 上 $y_1$、$y_2$ 為線性相依，那麼根據 <a href="#i-a">i.(a)</a>，$W\equiv 0$。因此，若在區間 $I$ 內存在任何一點 $x_1$ 使得 $W(x_1)\neq 0$，則 $y_1$ 與 $y_2$ 為線性獨立。 $\blacksquare$</p><h2 id="通解包含所有解">通解包含所有解</h2><h3 id="通解的存在性">通解的存在性</h3><blockquote class="prompt-info"><p>若 $p(x)$ 與 $q(x)$ 在開放區間 $I$ 上連續，則方程式 ($\ref{eqn:homogeneous_linear_ode_with_var_coefficients}$) 在區間 $I$ 上有通解。</p></blockquote><h4 id="證明-1">證明</h4><p>根據<a href="#初始值問題解的存在性與唯一性定理">初始值問題解的存在性與唯一性定理</a>，常微分方程式 ($\ref{eqn:homogeneous_linear_ode_with_var_coefficients}$) 在區間 $I$ 上有一個滿足初始條件</p>\[y_1(x_0) = 1, \qquad y_1^{\prime}(x_0) = 0\]<p>的解 $y_1(x)$，以及一個在區間 $I$ 上滿足初始條件</p>\[y_2(x_0) = 0, \qquad y_2^{\prime}(x_0) = 1\]<p>的解 $y_2(x)$。這兩個解的朗斯基行列式在 $x=x_0$ 處的值不為零</p>\[W(y_1(x_0), y_2(x_0)) = y_1(x_0)y_2^{\prime}(x_0) - y_2(x_0)y_1^{\prime}(x_0) = 1\cdot 1 - 0\cdot 0 = 1\]<p>，因此根據<a href="#解的線性相依與線性獨立">利用朗斯基行列式(Wronskian)判斷解的線性相依/線性獨立</a>，在區間 $I$ 上 $y_1$ 與 $y_2$ 為線性獨立。因此，這兩個解在區間 $I$ 上構成了方程式 ($\ref{eqn:homogeneous_linear_ode_with_var_coefficients}$) 的解的基底，且帶有任意常數 $c_1$、$c_2$ 的通解 $y = c_1y_1 + c_2y_2$ 必然在區間 $I$ 上存在。 $\blacksquare$</p><h3 id="奇異解的不存在">奇異解的不存在</h3><blockquote class="prompt-info"><p>若常微分方程式 ($\ref{eqn:homogeneous_linear_ode_with_var_coefficients}$) 在某個開放區間 $I$ 上具有連續係數 $p(x)$ 與 $q(x)$，則在區間 $I$ 上，方程式 ($\ref{eqn:homogeneous_linear_ode_with_var_coefficients}$) 的所有解 $y=Y(x)$ 均為</p>\[Y(x) = C_1y_1(x) + C_2y_2(x) \label{eqn:particular_solution}\tag{13}\]<p>的形式，其中 $y_1$、$y_2$ 是在區間 $I$ 上方程式 ($\ref{eqn:homogeneous_linear_ode_with_var_coefficients}$) 的解的基底，而 $C_1$、$C_2$ 為適當的常數。<br /> 也就是說，方程式 ($\ref{eqn:homogeneous_linear_ode_with_var_coefficients}$) 不具有無法從通解中得到的解，即<strong>奇異解(singular solution)</strong>。</p></blockquote><h4 id="證明-2">證明</h4><p>令 $y=Y(x)$ 為在區間 $I$ 上方程式 ($\ref{eqn:homogeneous_linear_ode_with_var_coefficients}$) 的任意一個解。現在，根據<a href="#通解的存在性">通解的存在性</a>，常微分方程式 ($\ref{eqn:homogeneous_linear_ode_with_var_coefficients}$) 在區間 $I$ 上有通解</p>\[y(x) = c_1y_1(x) + c_2y_2(x) \label{eqn:general_solution}\tag{14}\]<p>。現在，我們必須證明對於任意的 $Y(x)$，存在常數 $c_1$、$c_2$ 使得在區間 $I$ 上 $y(x)=Y(x)$。首先，我們證明可以找到 $c_1$、$c_2$ 的值，使得在區間 $I$ 中任選一點 $x_0$，滿足 $y(x_0)=Y(x_0)$ 且 $y^{\prime}(x_0)=Y^{\prime}(x_0)$。從式 ($\ref{eqn:general_solution}$) 可得</p>\[\begin{gather*} \left[\begin{matrix} y_1(x_0) &amp; y_2(x_0) \\ y_1^{\prime}(x_0) &amp; y_2^{\prime}(x_0) \end{matrix}\right] \left[\begin{matrix} c_1 \\ c_2 \end{matrix}\right] = \left[\begin{matrix} Y(x_0) \\ Y^{\prime}(x_0) \end{matrix}\right] \end{gather*} \label{eqn:vector_equation_2}\tag{15}\]<p>。因為 $y_1$ 與 $y_2$ 是基底，所以係數矩陣的行列式 $W(y_1(x_0), y_2(x_0))\neq 0$，因此方程式 ($\ref{eqn:vector_equation_2}$) 可以對 $c_1$ 與 $c_2$ 求解。令其解為 $(c_1, c_2) = (C_1, C_2)$。將此代入式 ($\ref{eqn:general_solution}$) 可得以下的特解。</p>\[y^*(x) = C_1y_1(x) + C_2y_2(x).\]<p>因為 $C_1$、$C_2$ 是方程式 ($\ref{eqn:vector_equation_2}$) 的解，所以，</p>\[y^*(x_0) = Y(x_0), \qquad {y^*}^{\prime}(x_0) = Y^{\prime}(x_0)\]<p>。根據<a href="#初始值問題解的存在性與唯一性定理">初始值問題解的存在性與唯一性定理</a>的唯一性，在區間 $I$ 內的所有 $x$ 上，$y^* \equiv Y$。 $\blacksquare$</p>]]> </content> </entry> <entry><title xml:lang="zh-TW">歐拉-柯西方程式</title><link href="https://www.yunseo.kim/zh-TW/posts/euler-cauchy-equation/" rel="alternate" type="text/html" hreflang="en" /><link href="https://www.yunseo.kim/ko/posts/euler-cauchy-equation/" rel="alternate" type="text/html" hreflang="ko" /><link href="https://www.yunseo.kim/ja/posts/euler-cauchy-equation/" rel="alternate" type="text/html" hreflang="ja" /><link href="https://www.yunseo.kim/zh-TW/posts/euler-cauchy-equation/" rel="alternate" type="text/html" hreflang="zh-TW" /><link href="https://www.yunseo.kim/es/posts/euler-cauchy-equation/" rel="alternate" type="text/html" hreflang="es" /><link href="https://www.yunseo.kim/pt-BR/posts/euler-cauchy-equation/" rel="alternate" type="text/html" hreflang="pt-BR" /><link href="https://www.yunseo.kim/fr/posts/euler-cauchy-equation/" rel="alternate" type="text/html" hreflang="fr" /><link href="https://www.yunseo.kim/de/posts/euler-cauchy-equation/" rel="alternate" type="text/html" hreflang="de" /><link href="https://www.yunseo.kim/pl/posts/euler-cauchy-equation/" rel="alternate" type="text/html" hreflang="pl" /><link href="https://www.yunseo.kim/cs/posts/euler-cauchy-equation/" rel="alternate" type="text/html" hreflang="cs" /><link href="https://www.yunseo.kim/sw/posts/euler-cauchy-equation/" rel="alternate" type="text/html" hreflang="sw" /><link href="https://www.yunseo.kim/am/posts/euler-cauchy-equation/" rel="alternate" type="text/html" hreflang="am" /><published>2025-03-28T00:00:00+09:00</published> <updated>2025-07-09T19:24:14+09:00</updated> <id>https://www.yunseo.kim/zh-TW/posts/euler-cauchy-equation/</id> <author> <name>Yunseo Kim</name> </author> <category term="Mathematics" /> <category term="Differential Equation" /> <summary xml:lang="zh-TW">本文將根據輔助方程式判別式的正負號，探討在不同情況下，歐拉-柯西方程式的通解會呈現何種形式。</summary> <content type="html" xml:lang="zh-TW"> <![CDATA[<p>本文將根據輔助方程式判別式的正負號，探討在不同情況下，歐拉-柯西方程式的通解會呈現何種形式。</p><em><p>* Mathematical equations and diagrams included in posts may not display properly when viewed with a feed reader.</p></em><h2 id="tldr">TL;DR</h2><blockquote class="prompt-info"><ul><li>歐拉-柯西方程式：$x^2y^{\prime\prime} + axy^{\prime} + by = 0$<li><strong>輔助方程式(auxiliary equation)</strong>：$m^2 + (a-1)m + b = 0$<li>根據輔助方程式的判別式 $(1-a)^2 - 4b$ 的正負號，通解的形式可分為下表三種情況：</ul><table><thead><tr><th style="text-align: center">情況<th style="text-align: center">輔助方程式的解<th style="text-align: center">歐拉-柯西方程式的解的基底<th style="text-align: center">歐拉-柯西方程式的通解<tbody><tr><td style="text-align: center">I<td style="text-align: center">相異實根<br />$m_1$, $m_2$<td style="text-align: center">$x^{m_1}$, $x^{m_2}$<td style="text-align: center">$y = c_1 x^{m_1} + c_2 x^{m_2}$<tr><td style="text-align: center">II<td style="text-align: center">實重根<br /> $m = \cfrac{1-a}{2}$<td style="text-align: center">$x^{(1-a)/2}$, $x^{(1-a)/2}\ln{x}$<td style="text-align: center">$y = (c_1 + c_2 \ln x)x^m$<tr><td style="text-align: center">III<td style="text-align: center">共軛複數根<br /> $m_1 = \cfrac{1}{2}(1-a) + i\omega$, <br /> $m_2 = \cfrac{1}{2}(1-a) - i\omega$<td style="text-align: center">$x^{(1-a)/2}\cos{(\omega \ln{x})}$, <br /> $x^{(1-a)/2}\sin{(\omega \ln{x})}$<td style="text-align: center">$y = x^{(1-a)/2}[A\cos{(\omega \ln{x})} + B\sin{(\omega \ln{x})}]$</table></blockquote><h2 id="先備知識">先備知識</h2><ul><li><a href="/zh-TW/posts/homogeneous-linear-odes-of-second-order/">二階齊次線性常微分方程式 (Homogeneous Linear ODEs of Second Order)</a><li><a href="/zh-TW/posts/homogeneous-linear-odes-with-constant-coefficients/">常係數二階齊次線性常微分方程式</a><li>歐拉公式</ul><h2 id="輔助方程式-auxiliary-equation">輔助方程式 (auxiliary equation)</h2><p><strong>歐拉-柯西方程式(Euler-Cauchy equation)</strong> 是指具有給定常數 $a$ 和 $b$ 以及未知函數 $y(x)$ 的</p>\[x^2y^{\prime\prime} + axy^{\prime} + by = 0 \label{eqn:euler_cauchy_eqn}\tag{1}\]<p>形式的常微分方程式。將</p>\[y=x^m, \qquad y^{\prime}=mx^{m-1}, \qquad y^{\prime\prime}=m(m-1)x^{m-2}\]<p>代入方程式 ($\ref{eqn:euler_cauchy_eqn}$)</p>\[x^2m(m-1)x^{m-2} + axmx^{m-1} + bx^m = 0,\]<p>即</p>\[[m(m-1) + am + b]x^m = 0\]<p>由此可得輔助方程式</p>\[m^2 + (a-1)m + b = 0 \label{eqn:auxiliary_eqn}\tag{2}\]<p>，而 $y=x^m$ 為歐拉-柯西方程式 ($\ref{eqn:euler_cauchy_eqn}$) 的解的充分必要條件是，$m$ 為輔助方程式 ($\ref{eqn:auxiliary_eqn}$) 的解。</p><p>求解二次方程式 ($\ref{eqn:auxiliary_eqn}$) 可得</p>\[\begin{align*} m_1 &amp;= \frac{1}{2}\left[(1-a) + \sqrt{(1-a)^2 - 4b} \right], \\ m_2 &amp;= \frac{1}{2}\left[(1-a) - \sqrt{(1-a)^2 - 4b} \right] \end{align*}\label{eqn:m1_and_m2}\tag{3}\]<p>，由此可知，兩個函數</p>\[y_1 = x^{m_1}, \quad y_2 = x^{m_2}\]<p>是方程式 ($\ref{eqn:euler_cauchy_eqn}$) 的解。</p><p>如同在<a href="/zh-TW/posts/homogeneous-linear-odes-with-constant-coefficients/">常係數二階齊次線性常微分方程式</a>中一樣，根據輔助方程式 ($\ref{eqn:auxiliary_eqn}$) 的判別式 $(1-a)^2 - 4b$ 的正負號，可將情況分為三種。</p><ul><li>$(1-a)^2 - 4b &gt; 0$：相異實根<li>$(1-a)^2 - 4b = 0$：實重根<li>$(1-a)^2 - 4b &lt; 0$：共軛複數根</ul><h2 id="根據輔助方程式判別式的正負號決定通解形式">根據輔助方程式判別式的正負號決定通解形式</h2><h3 id="i-相異實根-m_1-與-m_2">I. 相異實根 $m_1$ 與 $m_2$</h3><p>在這種情況下，方程式 ($\ref{eqn:euler_cauchy_eqn}$) 在任意區間上的解的基底為</p>\[y_1 = x^{m_1}, \quad y_2 = x^{m_2}\]<p>，其對應的通解為</p>\[y = c_1 x^{m_1} + c_2 x^{m_2} \label{eqn:general_sol_1}\tag{4}\]<p>。</p><h3 id="ii-實重根-m--cfrac1-a2">II. 實重根 $m = \cfrac{1-a}{2}$</h3><p>在 $(1-a)^2 - 4b = 0$，即 $b=\cfrac{(1-a)^2}{4}$ 的情況下，二次方程式 ($\ref{eqn:auxiliary_eqn}$) 只有一個解 $m = m_1 = m_2 = \cfrac{1-a}{2}$，因此可得一個 $y = x^m$ 形式的解</p>\[y_1 = x^{(1-a)/2}\]<p>，而歐拉-柯西方程式 ($\ref{eqn:euler_cauchy_eqn}$) 則變為</p>\[y^{\prime\prime} + \frac{a}{x}y^{\prime} + \frac{(1-a)^2}{4x^2}y = 0 \label{eqn:standard_form}\tag{5}\]<p>的形式。現在，我們利用<a href="/zh-TW/posts/homogeneous-linear-odes-of-second-order/#降階法-reduction-of-order">降階法</a>來求另一個線性獨立的解 $y_2$。</p><p>若將欲求的第二個解設為 $y_2=uy_1$，可得</p>\[u = \int U, \qquad U = \frac{1}{y_1^2}\exp\left(-\int \frac{a}{x}\ dx \right)\]<p>。</p><p>因為 $\exp \left(-\int \cfrac{a}{x}\ dx \right) = \exp (-a\ln x) = \exp(\ln{x^{-a}}) = x^{-a}$，所以</p>\[U = \frac{x^{-a}}{y_1^2} = \frac{x^{-a}}{x^{(1-a)}} = \frac{1}{x}\]<p>，積分後可得 $u = \ln x$。</p><p>因此 $y_2 = uy_1 = y_1 \ln x$，且因為 $y_1$ 和 $y_2$ 的商不為常數，所以它們是線性獨立的。對應於基底 $y_1$ 和 $y_2$ 的通解為</p>\[y = (c_1 + c_2 \ln x)x^m \label{eqn:general_sol_2}\tag{6}\]<p>。</p><h3 id="iii-共軛複數根">III. 共軛複數根</h3><p>在這種情況下，輔助方程式 ($\ref{eqn:auxiliary_eqn}$) 的解為 $m = \cfrac{1}{2}(1-a) \pm i\sqrt{b - \frac{1}{4}(1-a)^2}$，其對應的方程式 ($\ref{eqn:euler_cauchy_eqn}$) 的兩個複數解可利用 $x=e^{\ln x}$ 寫成如下形式：</p>\[\begin{align*} x^{m_1} &amp;= x^{(1-a)/2 + i\sqrt{b - \frac{1}{4}(1-a)^2}} \\ &amp;= x^{(1-a)/2}(e^{\ln x})^{i\sqrt{b - \frac{1}{4}(1-a)^2}} \\ &amp;= x^{(1-a)/2}e^{i(\sqrt{b - \frac{1}{4}(1-a)^2}\ln x)}, \\ x^{m_2} &amp;= x^{(1-a)/2 - i\sqrt{b - \frac{1}{4}(1-a)^2}} \\ &amp;= x^{(1-a)/2}(e^{\ln x})^{-i\sqrt{b - \frac{1}{4}(1-a)^2}} \\ &amp;= x^{(1-a)/2}e^{i(-\sqrt{b - \frac{1}{4}(1-a)^2}\ln x)}. \end{align*} \tag{7}\]<p>令 $t=\sqrt{b - \frac{1}{4}(1-a)^2}\ln x$ 並利用歐拉公式 $e^{it} = \cos{t} + i\sin{t}$，可知</p>\[\begin{align*} x^{m_1} &amp;= x^{(1-a)/2}\left[\cos\left(\sqrt{b - \tfrac{1}{4}(1-a)^2}\ln x \right) + i\sin\left(\sqrt{b - \tfrac{1}{4}(1-a)^2}\ln x \right) \right], \\ x^{m_2} &amp;= x^{(1-a)/2}\left[\cos\left(\sqrt{b - \tfrac{1}{4}(1-a)^2}\ln x \right) - i\sin\left(\sqrt{b - \tfrac{1}{4}(1-a)^2}\ln x \right) \right] \end{align*} \tag{8}\]<p>，由此可得以下兩個實數解</p>\[\begin{align*} \frac{x^{m_1} + x^{m_2}}{2} &amp;= x^{(1-a)/2}\cos\left(\sqrt{b - \tfrac{1}{4}(1-a)^2}\ln x \right), \\ \frac{x^{m_1} - x^{m_2}}{2i} &amp;= x^{(1-a)/2}\sin\left(\sqrt{b - \tfrac{1}{4}(1-a)^2}\ln x \right) \end{align*} \tag{9}\]<p>。</p><p>由於這兩個解的商 $\cos\left(\sqrt{b - \frac{1}{4}(1-a)^2}\ln x \right)$ 不為常數，因此它們是線性獨立的，故根據<a href="/zh-TW/posts/homogeneous-linear-odes-of-second-order/#疊加原理">疊加原理</a>，它們構成了歐拉-柯西方程式 ($\ref{eqn:euler_cauchy_eqn}$) 的基底。由此可得以下的實數通解：</p>\[y = x^{(1-a)/2} \left[ A\cos\left(\sqrt{b - \tfrac{1}{4}(1-a)^2}\ln x \right) + B\sin\left(\sqrt{b - \tfrac{1}{4}(1-a)^2}\ln x \right) \right]. \label{eqn:general_sol_3}\tag{10}\]<p>不過，在歐拉-柯西方程式中，輔助方程式為共軛複數根的情況，其實際重要性並不高。</p><h2 id="轉換為常係數二階齊次線性常微分方程式">轉換為常係數二階齊次線性常微分方程式</h2><p>歐拉-柯西方程式可透過變數變換，轉換為<a href="/zh-TW/posts/homogeneous-linear-odes-with-constant-coefficients/">常係數二階齊次線性常微分方程式</a>。</p><p>若以 $x = e^t$ 進行變換，則</p>\[\frac{d}{dx} = \frac{1}{x}\frac{d}{dt}, \quad \frac{d^2}{dx^2} = \frac{1}{x^2}\left(\frac{d^2}{dt^2} - \frac{d}{dt} \right)\]<p>，歐拉-柯西方程式 ($\ref{eqn:euler_cauchy_eqn}$) 將轉變為如下關於 $t$ 的常係數齊次線性常微分方程式：</p>\[y^{\prime\prime}(t) + (a-1)y^{\prime}(t) + by(t) = 0. \label{eqn:substituted}\tag{11}\]<p>將方程式 ($\ref{eqn:substituted}$) 應用<a href="/zh-TW/posts/homogeneous-linear-odes-with-constant-coefficients/">常係數二階齊次線性常微分方程式</a>的解法對 $t$ 求解，然後利用 $t = \ln{x}$ 將得到的解轉換回關於 $x$ 的解，即可得到與<a href="#根據輔助方程式判別式的正負號決定通解形式">前述結果</a>相同的結果。</p>]]> </content> </entry> <entry><title xml:lang="zh-TW">級數的收斂/發散判定(Testing for Convergence or Divergence of a Series)</title><link href="https://www.yunseo.kim/zh-TW/posts/testing-for-convergence-or-divergence-of-a-series/" rel="alternate" type="text/html" hreflang="en" /><link href="https://www.yunseo.kim/ko/posts/testing-for-convergence-or-divergence-of-a-series/" rel="alternate" type="text/html" hreflang="ko" /><link href="https://www.yunseo.kim/ja/posts/testing-for-convergence-or-divergence-of-a-series/" rel="alternate" type="text/html" hreflang="ja" /><link href="https://www.yunseo.kim/zh-TW/posts/testing-for-convergence-or-divergence-of-a-series/" rel="alternate" type="text/html" hreflang="zh-TW" /><link href="https://www.yunseo.kim/es/posts/testing-for-convergence-or-divergence-of-a-series/" rel="alternate" type="text/html" hreflang="es" /><link href="https://www.yunseo.kim/pt-BR/posts/testing-for-convergence-or-divergence-of-a-series/" rel="alternate" type="text/html" hreflang="pt-BR" /><link href="https://www.yunseo.kim/fr/posts/testing-for-convergence-or-divergence-of-a-series/" rel="alternate" type="text/html" hreflang="fr" /><link href="https://www.yunseo.kim/de/posts/testing-for-convergence-or-divergence-of-a-series/" rel="alternate" type="text/html" hreflang="de" /><link href="https://www.yunseo.kim/pl/posts/testing-for-convergence-or-divergence-of-a-series/" rel="alternate" type="text/html" hreflang="pl" /><link href="https://www.yunseo.kim/cs/posts/testing-for-convergence-or-divergence-of-a-series/" rel="alternate" type="text/html" hreflang="cs" /><link href="https://www.yunseo.kim/sw/posts/testing-for-convergence-or-divergence-of-a-series/" rel="alternate" type="text/html" hreflang="sw" /><link href="https://www.yunseo.kim/am/posts/testing-for-convergence-or-divergence-of-a-series/" rel="alternate" type="text/html" hreflang="am" /><published>2025-03-18T00:00:00+09:00</published> <updated>2025-05-13T16:24:07+09:00</updated> <id>https://www.yunseo.kim/zh-TW/posts/testing-for-convergence-or-divergence-of-a-series/</id> <author> <name>Yunseo Kim</name> </author> <category term="Mathematics" /> <category term="Calculus" /> <summary xml:lang="zh-TW">綜合探討判定級數收斂/發散的各種方法。</summary> <content type="html" xml:lang="zh-TW"> <![CDATA[<p>綜合探討判定級數收斂/發散的各種方法。</p><em><p>* Mathematical equations and diagrams included in posts may not display properly when viewed with a feed reader.</p></em><h2 id="tldr">TL;DR</h2><blockquote class="prompt-info"><ul><li><strong>一般項判定法($n$th-term test for divergence)</strong>: $\lim_{n\to\infty} a_n \neq 0 \Rightarrow \text{級數 }\sum a_n \text{發散}$<li><strong>幾何級數的收斂/發散</strong>: 幾何級數 $\sum ar^{n-1}$<ul><li>$|r| &lt; 1$時收斂<li>$|r| \geq 1$時發散</ul><li><strong>$p$-級數的收斂/發散</strong>: $p$-級數 $\sum \cfrac{1}{n^p}$<ul><li>$p&gt;1$時收斂<li>$p\leq 1$時發散</ul><li><strong>比較判定法(Comparison Test)</strong>: 當 $0 \leq a_n \leq b_n$時,<ul><li>$\sum b_n &lt; \infty \ \Rightarrow \ \sum a_n &lt; \infty$<li>$\sum a_n = \infty \ \Rightarrow \ \sum b_n = \infty$</ul><li><strong>極限比較判定法(Limit Comparison Test)</strong>: 若 $\lim_{n\to\infty} \frac{a_n}{b_n} = c \text{ (}c\text{為有限正數)}$，則兩個級數 $\sum a_n$和 $\sum b_n$要麼都收斂，要麼都發散<li>對於正項級數 $\sum a_n$和正數 $\epsilon &lt; 1$<ul><li>若對所有 $n$都有 $\sqrt[n]{a_n}&lt; 1-\epsilon$，則級數 $\sum a_n$收斂<li>若對所有 $n$都有 $\sqrt[n]{a_n}&gt; 1+\epsilon$，則級數 $\sum a_n$發散</ul><li><strong>根式判定法(Root Test)</strong>: 對於正項級數 $\sum a_n$，若極限值 $\lim_{n\to\infty} \sqrt[n]{a_n} =: r$存在，則<ul><li>$r&lt;1$時，級數 $\sum a_n$收斂<li>$r&gt;1$時，級數 $\sum a_n$發散</ul><li><strong>比值判定法(Ratio Test)</strong>: 對於正數數列 $(a_n)$和 $0 &lt; r &lt; 1$<ul><li>若對所有 $n$都有 $a_{n+1}/a_n \leq r$，則級數 $\sum a_n$收斂<li>若對所有 $n$都有 $a_{n+1}/a_n \geq 1$，則級數 $\sum a_n$發散</ul><li>對於正數數列 $(a_n)$，若極限值 $\rho := \lim_{n\to\infty} \cfrac{a_{n+1}}{a_n}$存在，則<ul><li>$\rho &lt; 1$時，級數 $\sum a_n$收斂<li>$\rho &gt; 1$時，級數 $\sum a_n$發散</ul><li><strong>積分判定法(Integral Test)</strong>: 若連續函數 $f: \left[1,\infty \right) \rightarrow \mathbb{R}$為遞減函數且始終 $f(x)&gt;0$，則級數 $\sum f(n)$收斂的充要條件是積分 $\int_1^\infty f(x)\ dx := \lim_{b\to\infty} \int_1^b f(x)\ dx$收斂<li><strong>交錯級數判定法(Alternating Series Test)</strong>: 若滿足以下條件，則交錯級數 $\sum a_n$收斂<ol><li>對所有 $n$，$a_n$和 $a_{n+1}$的符號不同<li>對所有 $n$，$|a_n| \geq |a_{n+1}|$<li>$\lim_{n\to\infty} a_n = 0$</ol><li>絕對收斂的級數必定收斂。反之則不成立。</ul></blockquote><h2 id="prerequisites">Prerequisites</h2><ul><li><a href="/zh-TW/posts/sequences-and-series/">數列與級數</a></ul><h2 id="引言">引言</h2><p>在之前的<a href="/zh-TW/posts/sequences-and-series/#級數的收斂與發散">數列與級數</a>中，我們了解了級數收斂與發散的定義。本文將整理判定級數收斂/發散時可以使用的各種方法。一般來說，判定級數的收斂/發散比精確計算級數的和要容易得多。</p><h2 id="一般項判定法">一般項判定法</h2><p>對於級數 $\sum a_n$，$a_n$稱為該級數的<strong>一般項</strong>。</p><p>根據以下定理，我們可以輕易判斷某些級數明顯發散，因此在判定級數收斂/發散時，首先檢查這一點是避免浪費時間的明智做法。</p><blockquote class="prompt-info"><p><strong>一般項判定法($n$th-term test for divergence)</strong><br /> 若級數 $\sum a_n$收斂，則</p>\[\lim_{n\to\infty} a_n=0\]<p>也就是說，</p>\[\lim_{n\to\infty} a_n \neq 0 \Rightarrow \text{級數 }\sum a_n \text{發散}\]</blockquote><h3 id="證明">證明</h3><p>設某收斂級數 $\sum a_n$的和為 $l$，前 $n$項的和為</p>\[s_n := a_1 + a_2 + \cdots + a_n\]<p>則，</p>\[\forall \epsilon &gt; 0,\, \exists N \in \mathbb{N}\ (n &gt; N \Rightarrow |s_n - l| &lt; \epsilon).\]<p>因此，對於足夠大的($&gt;N$) $n$，</p>\[|a_n| = |s_n - s_{n-1}| = |(s_n - l) - (s_{n-1} - l)| \leq |s_n - l| + |s_{n-1} - l| \leq \epsilon + \epsilon = 2\epsilon\]<p>由數列收斂的定義，</p>\[\lim_{n\to\infty} |a_n| = 0. \quad \blacksquare\]<h3 id="注意事項">注意事項</h3><p>這個定理的逆命題一般不成立。一個典型的例子是<strong>調和級數(harmonic series)</strong>。</p><p>調和級數是由<strong>等差數列</strong>的倒數形成的數列，即<strong>調和數列</strong>所得的級數。最典型的調和級數是</p>\[H_n := 1 + \frac{1}{2} + \cdots + \frac{1}{n} \quad (n=1,2,3,\dots)\]<p>這個級數發散，可以如下證明：</p>\[\begin{align*} \lim_{n\to\infty} H_n &amp;= 1 + \frac{1}{2} + \frac{1}{3} + \frac{1}{4} + \frac{1}{5} + \frac{1}{6} + \frac{1}{7} + \frac{1}{8} + \frac{1}{9} + \cdots + \frac{1}{16} + \cdots \\ &amp;&gt; 1 + \frac{1}{2} + \frac{1}{4} + \frac{1}{4} + \frac{1}{8} + \frac{1}{8} + \frac{1}{8} + \frac{1}{8} + \frac{1}{16} + \cdots + \frac{1}{16} + \cdots \\ &amp;= 1 + \frac{1}{2} \qquad\, + \frac{1}{2} \qquad\qquad\qquad\ \ + \frac{1}{2} \qquad\qquad\quad + \frac{1}{2} + \cdots \\ &amp;= \infty. \end{align*}\]<p>如此可見，儘管級數 $H_n$發散，但其一般項 $1/n$確實收斂於 $0$。</p><blockquote class="prompt-danger"><p>若 $\lim_{n\to\infty} a_n \neq 0$，則級數 $\sum a_n$必定發散，但若 $\lim_{n\to\infty} a_n = 0$，不能因此認為級數 $\sum a_n$會收斂，這種情況下需要使用其他方法來判定收斂/發散。</p></blockquote><h2 id="幾何級數">幾何級數</h2><p>首項為1，<strong>公比</strong>為 $r$的等比數列所形成的<strong>幾何級數(geometric series)</strong></p>\[1 + r + r^2 + r^3 + \cdots \label{eqn:geometric_series}\tag{5}\]<p>是<u>最重要且基本的級數</u>。從等式</p>\[(1-r)(1+r+\cdots + r^{n-1}) = 1 - r^n\]<p>得到</p>\[1 + r + \cdots + r^{n-1} = \frac{1-r^n}{1-r} = \frac{1}{1-r} - \frac{r^n}{1-r} \qquad (r \neq 1) \label{eqn:sum_of_geometric_series}\tag{6}\]<p>另一方面，</p>\[\lim_{n\to\infty} r^n = 0 \quad \Leftrightarrow \quad |r| &lt; 1\]<p>因此，幾何級數 ($\ref{eqn:geometric_series}$)收斂的充要條件是 $|r| &lt; 1$。</p><blockquote class="prompt-info"><p><strong>幾何級數的收斂/發散</strong><br /> 幾何級數 $\sum ar^{n-1}$</p><ul><li>$|r| &lt; 1$時收斂<li>$|r| \geq 1$時發散</ul></blockquote><p>由此得到</p>\[1 + r + r^2 + r^3 + \cdots = \frac{1}{1-r} \qquad (|r| &lt; 1) \label{eqn:sum_of_inf_geometric_series}\tag{7}\]<h3 id="幾何級數與近似值">幾何級數與近似值</h3><p>恆等式 ($\ref{eqn:sum_of_geometric_series}$)在 $|r| &lt; 1$時對計算 $\cfrac{1}{1-r}$的近似值很有用。</p><p>將 $r=-\epsilon$, $n=2$代入這個式子，得到</p>\[\frac{1}{1+\epsilon} - (1 - \epsilon) = \frac{\epsilon^2}{1 + \epsilon}\]<p>因此，若 $0 &lt; \epsilon &lt; 1$，則</p>\[0 &lt; \frac{1}{1 + \epsilon} - (1 - \epsilon) &lt; \epsilon^2\]<p>所以</p>\[\frac{1}{1 + \epsilon} \approx (1 - \epsilon) \pm \epsilon^2 \qquad (0 &lt; \epsilon &lt; 1)\]<p>由此可知，對於足夠小的正數 $\epsilon$，$\cfrac{1}{1 + \epsilon}$可以近似為 $1 - \epsilon$。</p><h2 id="p-級數判定法-p-series-test">$p$-級數判定法 ($p$-Series Test)</h2><p>對於正實數 $p$，以下形式的級數稱為<strong>$p$-級數</strong>：</p>\[\sum_{n=1}^{\infty} \frac{1}{n^p}\]<blockquote class="prompt-info"><p><strong>$p$-級數的收斂/發散</strong><br /> $p$-級數 $\sum \cfrac{1}{n^p}$</p><ul><li>$p&gt;1$時收斂<li>$p\leq 1$時發散</ul></blockquote><p>在 $p$-級數中，當 $p=1$時就是調和級數，我們已經證明它發散。<br /> 當 $p=2$時的 $p$-級數，即 $\sum \cfrac{1}{n^2}$的值計算問題，被稱為「巴塞爾(Basel)問題」，這個名稱來源於首次證明該級數收斂的伯努利家族的發源地。這個問題的答案已知為 $\cfrac{\pi^2}{6}$。</p><p>更一般地，$p$-級數中 $p&gt;1$的情況被稱為<strong>zeta函數(zeta function)</strong>。這是由萊昂哈德·歐拉(Leonhard Euler)在<a href="https://en.wikipedia.org/wiki/Holocene_calendar">人類紀元</a> 11740年引入，後來由黎曼命名的特殊函數之一，定義為：</p>\[\zeta(s) := \sum_{n=1}^{\infty} \frac{1}{n^s} \qquad (s&gt;1)\]<p>這個主題稍微偏離本文範圍，而且坦白說，我是工科生而非數學家，所以我也不太了解，因此不在此詳述。但值得一提的是，萊昂哈德·歐拉證明了zeta函數也可以用<strong>歐拉乘積(Euler Product)</strong>的形式表示，即素數(prime number)的無限乘積，此後zeta函數在解析數論的多個領域中佔據核心地位。將zeta函數的定義域擴展到複數的<strong>黎曼zeta函數(Riemann zeta function)</strong>以及與之相關的重要未解難題<strong>黎曼猜想(Riemann hypothesis)</strong>就是其中之一。</p><p>回到原主題，$p$-級數判定法的證明需要後面將介紹的<a href="#比較判定法">比較判定法</a>和<a href="#積分判定法">積分判定法</a>。但由於 $p$-級數的收斂/發散與幾何級數一起在接下來的<a href="#比較判定法">比較判定法</a>中非常有用，所以我有意將其放在前面。</p><h3 id="證明-1">證明</h3><h4 id="i-當-p1時">i) 當 $p&gt;1$時</h4><p>積分</p>\[\int_1^\infty \frac{1}{x^p}\ dx = \left[\frac{1}{-p+1}\frac{1}{x^{p-1}} \right]^\infty_1 = \frac{1}{p-1}\]<p>收斂，因此根據<a href="#積分判定法">積分判定法</a>，級數 $\sum \cfrac{1}{n^p}$也收斂。</p><h4 id="ii-當-pleq-1時">ii) 當 $p\leq 1$時</h4><p>在這種情況下</p>\[0 \leq \frac{1}{n} \leq \frac{1}{n^p}\]<p>我們知道調和級數 $\sum \cfrac{1}{n}$發散，所以根據<a href="#比較判定法">比較判定法</a>，$\sum \cfrac{1}{n^p}$也發散。</p><h4 id="結論">結論</h4><p>根據i)和ii)，$p$-級數 $\sum \cfrac{1}{n^p}$在 $p&gt;1$時收斂，在 $p \leq 1$時發散。$\blacksquare$</p><h2 id="比較判定法">比較判定法</h2><p>在判定一般項為非負實數的級數（即<strong>正項級數(series of positive terms)</strong>）的收斂/發散時，雅各布·伯努利(Jakob Bernoulli)的<strong>比較判定法(Comparison Test)</strong>非常有用。</p><p>正項級數 $\sum a_n$是遞增數列，因此如果不是發散到無窮大（$\sum a_n = \infty$），那麼它必定收斂。所以對於正項級數，</p>\[\sum a_n &lt; \infty\]<p>這樣的表達意味著<u>收斂</u>。</p><blockquote class="prompt-info"><p><strong>比較判定法(Comparison Test)</strong><br /> 當 $0 \leq a_n \leq b_n$時,</p><ul><li>$\sum b_n &lt; \infty \ \Rightarrow \ \sum a_n &lt; \infty$<li>$\sum a_n = \infty \ \Rightarrow \ \sum b_n = \infty$</ul></blockquote><p>特別是，對於那些形式類似於前面討論的等比級數 $\sum ar^{n-1}$或 $p$-級數 $\sum \cfrac{1}{n^p}$的正項級數，如 $\sum \cfrac{1}{n^2 + n}$、$\sum \cfrac{\log n}{n^3}$、$\sum \cfrac{1}{2^n + 3^n}$、$\sum \cfrac{1}{\sqrt{n}}$、$\sum \sin{\cfrac{1}{n}}$等，積極嘗試使用比較判定法是個好主意。</p><p>後面將介紹的其他多種收斂/發散判定法都可以從這個<strong>比較判定法</strong>推導出來，從這個意義上說，比較判定法可以說是最重要的。</p><h3 id="極限比較判定法">極限比較判定法</h3><p>對於正項級數 $\sum a_n$和 $\sum b_n$，如果兩個級數一般項的比 $a_n/b_n$中分子和分母的主導項(dominant term)相互抵消，使得 $\lim_{n\to\infty} \cfrac{a_n}{b_n}=c \text{ (}c\text{為有限正數)}$，且我們已知級數 $\sum b_n$的收斂/發散情況，那麼可以使用以下<strong>極限比較判定法(Limit Comparison Test)</strong>。</p><blockquote class="prompt-info"><p><strong>極限比較判定法(Limit Comparison Test)</strong><br /> 若</p>\[\lim_{n\to\infty} \frac{a_n}{b_n} = c \text{ (}c\text{為有限正數)}\]<p>則兩個級數 $\sum a_n$和 $\sum b_n$要麼都收斂，要麼都發散。即 $ \sum a_n &lt; \infty \ \Leftrightarrow \ \sum b_n &lt; \infty$。</p></blockquote><h2 id="根式判定法">根式判定法</h2><blockquote class="prompt-info"><p><strong>定理</strong><br /> 對於正項級數 $\sum a_n$和正數 $\epsilon &lt; 1$</p><ul><li>若對所有 $n$都有 $\sqrt[n]{a_n}&lt; 1-\epsilon$，則級數 $\sum a_n$收斂<li>若對所有 $n$都有 $\sqrt[n]{a_n}&gt; 1+\epsilon$，則級數 $\sum a_n$發散</ul></blockquote><blockquote class="prompt-info"><p><strong>推論：根式判定法(Root Test)</strong><br /> 對於正項級數 $\sum a_n$，若極限值</p>\[\lim_{n\to\infty} \sqrt[n]{a_n} =: r\]<p>存在，則</p><ul><li>$r&lt;1$時，級數 $\sum a_n$收斂<li>$r&gt;1$時，級數 $\sum a_n$發散</ul></blockquote><blockquote class="prompt-warning"><p>在上述推論中，若 $r=1$，則無法判定收斂/發散，需要使用其他方法。</p></blockquote><h2 id="比值判定法">比值判定法</h2><blockquote class="prompt-info"><p><strong>比值判定法(Ratio Test)</strong><br /> 對於正數數列 $(a_n)$和 $0 &lt; r &lt; 1$</p><ul><li>若對所有 $n$都有 $a_{n+1}/a_n \leq r$，則級數 $\sum a_n$收斂<li>若對所有 $n$都有 $a_{n+1}/a_n \geq 1$，則級數 $\sum a_n$發散</ul></blockquote><blockquote class="prompt-info"><p><strong>推論</strong><br /> 對於正數數列 $(a_n)$，若極限值 $\rho := \lim_{n\to\infty} \cfrac{a_{n+1}}{a_n}$存在，則</p><ul><li>$\rho &lt; 1$時，級數 $\sum a_n$收斂<li>$\rho &gt; 1$時，級數 $\sum a_n$發散</ul></blockquote><h2 id="積分判定法">積分判定法</h2><p>使用積分法可以判定由遞減正數列組成的級數的收斂/發散。</p><blockquote class="prompt-info"><p><strong>積分判定法(Integral Test)</strong><br /> 若連續函數 $f: \left[1,\infty \right) \rightarrow \mathbb{R}$為遞減函數且始終 $f(x)&gt;0$，則級數 $\sum f(n)$收斂的充要條件是積分</p>\[\int_1^\infty f(x)\ dx := \lim_{b\to\infty} \int_1^b f(x)\ dx\]<p>收斂。</p></blockquote><h3 id="證明-2">證明</h3><p>由於函數 $f(x)$連續且遞減，同時始終為正，因此不等式</p>\[f(n+1) \leq \int_n^{n+1} f(x)\ dx \leq f(n)\]<p>成立。將這個不等式從 $n=1$到一般項逐項相加，得到不等式</p>\[f(2) + \cdots + f(n+1) \leq \int_1^{n+1} f(x)\ dx \leq f(1) + \cdots + f(n)\]<p>現在使用<a href="#比較判定法">比較判定法</a>即可得到所需結果。$\blacksquare$</p><h2 id="交錯級數">交錯級數</h2><p>一般項不為 $0$且每項 $a_n$的符號與下一項 $a_{n+1}$的符號不同，即正項和負項交替出現的級數 $\sum a_n$稱為<strong>交錯級數(alternating series)</strong>。</p><p>對於交錯級數，德國數學家戈特弗里德·威廉·萊布尼茨(Gottfried Wilhelm Leibniz)發現的以下定理在判定收斂/發散時非常有用。</p><blockquote class="prompt-info"><p><strong>交錯級數判定法(Alternating Series Test)</strong><br /> 若滿足以下條件：</p><ol><li>對所有 $n$，$a_n$和 $a_{n+1}$的符號不同，<li>對所有 $n$，$|a_n| \geq |a_{n+1}|$，<li>$\lim_{n\to\infty} a_n = 0$，</ol><p>則交錯級數 $\sum a_n$收斂。</p></blockquote><h2 id="絕對收斂級數">絕對收斂級數</h2><p>對於級數 $\sum a_n$，若級數 $\sum |a_n|$收斂，則稱「級數 $\sum a_n$<strong>絕對收斂</strong>(<strong>converge absolutely</strong>)」。</p><p>此時以下定理成立：</p><blockquote class="prompt-info"><p><strong>定理</strong><br /> 絕對收斂的級數必定收斂。</p></blockquote><blockquote class="prompt-warning"><p>上述定理的逆命題不成立。<br /> 若級數收斂但不絕對收斂，則稱其「<strong>條件收斂</strong>(<strong>converge conditionally</strong>)」。</p></blockquote><h3 id="證明-3">證明</h3><p>對於實數 $a$，定義</p>\[\begin{align*} a^+ &amp;:= \max\{a,0\} = \frac{1}{2}(|a| + a), \\ a^- &amp;:= -\min\{a,0\} = \frac{1}{2}(|a| - a) \end{align*}\]<p>則，</p>\[a = a^+ - a^-, \qquad |a| = a^+ + a^-\]<p>由於 $0 \leq a^\pm \leq |a|$，根據<a href="#比較判定法">比較判定法</a>，若級數 $\sum |a_n|$收斂，則級數 $\sum a_n^+$和 $\sum a_n^-$也都收斂，因此根據<a href="/zh-TW/posts/sequences-and-series/#收斂級數的基本性質">收斂級數的基本性質</a>，</p>\[\sum a_n = \sum (a_n^+ - a_n^-) = \sum a_n^+ - \sum a_n^-\]<p>也收斂。$\blacksquare$</p>]]> </content> </entry> <entry><title xml:lang="zh-TW">數列與級數</title><link href="https://www.yunseo.kim/zh-TW/posts/sequences-and-series/" rel="alternate" type="text/html" hreflang="en" /><link href="https://www.yunseo.kim/ko/posts/sequences-and-series/" rel="alternate" type="text/html" hreflang="ko" /><link href="https://www.yunseo.kim/ja/posts/sequences-and-series/" rel="alternate" type="text/html" hreflang="ja" /><link href="https://www.yunseo.kim/zh-TW/posts/sequences-and-series/" rel="alternate" type="text/html" hreflang="zh-TW" /><link href="https://www.yunseo.kim/es/posts/sequences-and-series/" rel="alternate" type="text/html" hreflang="es" /><link href="https://www.yunseo.kim/pt-BR/posts/sequences-and-series/" rel="alternate" type="text/html" hreflang="pt-BR" /><link href="https://www.yunseo.kim/fr/posts/sequences-and-series/" rel="alternate" type="text/html" hreflang="fr" /><link href="https://www.yunseo.kim/de/posts/sequences-and-series/" rel="alternate" type="text/html" hreflang="de" /><link href="https://www.yunseo.kim/pl/posts/sequences-and-series/" rel="alternate" type="text/html" hreflang="pl" /><link href="https://www.yunseo.kim/cs/posts/sequences-and-series/" rel="alternate" type="text/html" hreflang="cs" /><link href="https://www.yunseo.kim/sw/posts/sequences-and-series/" rel="alternate" type="text/html" hreflang="sw" /><link href="https://www.yunseo.kim/am/posts/sequences-and-series/" rel="alternate" type="text/html" hreflang="am" /><published>2025-03-16T00:00:00+09:00</published> <updated>2025-05-13T16:24:07+09:00</updated> <id>https://www.yunseo.kim/zh-TW/posts/sequences-and-series/</id> <author> <name>Yunseo Kim</name> </author> <category term="Mathematics" /> <category term="Calculus" /> <summary xml:lang="zh-TW">探討數列與級數的定義、數列的收斂與發散、級數的收斂與發散、自然對數的底數e的定義等微積分的基礎概念。</summary> <content type="html" xml:lang="zh-TW"> <![CDATA[<p>探討數列與級數的定義、數列的收斂與發散、級數的收斂與發散、自然對數的底數e的定義等微積分的基礎概念。</p><em><p>* Mathematical equations and diagrams included in posts may not display properly when viewed with a feed reader.</p></em><h2 id="數列">數列</h2><p>在微積分中討論的<strong>數列（sequence）</strong>主要指無限數列。也就是說，數列是定義在<strong>自然數（natural number）</strong>全體集合上的函數</p>\[\mathbb{N} := \{1,2,3,\dots\}\]<p>*如果這個函數的值是實數（real number），則稱為「實數列」；如果是複數（complex number），則稱為「複數列」；如果是點（point），則稱為「點列」；如果是矩陣（matrix），則稱為「矩陣列」；如果是函數（function），則稱為「函數列」；如果是集合（set），則稱為「集合列」等。但這些都可以簡單地稱為「列」或「數列」。</p><p>通常對於<strong>實數體（the field of real numbers）</strong> $\mathbb{R}$，數列 $\mathbf{a}: \mathbb{N} \to \mathbb{R}$ 中</p>\[a_1 := \mathbf{a}(1), \quad a_2 := \mathbf{a}(2), \quad a_3 := \mathbf{a}(3)\]<p>等，這個數列可以表示為</p>\[a_1,\, a_2,\, a_3,\, \dots\]<p>或</p>\[\begin{gather*} (a_1,a_2,a_3,\dots), \\ (a_n: n=1,2,3,\dots), \\ (a_n)_{n=1}^{\infty}, \qquad (a_n) \end{gather*}\]<p>等。</p><blockquote class="prompt-info"><p>*在定義數列的過程中，定義域可以不用自然數全體集合 $\mathbb{N}$，而改用 $0$ 以上的整數集合</p>\[\mathbb{N}_0 := \{0\} \cup \mathbb{N} = \{0,1,2,\dots\}\]<p>或</p>\[\{2,3,4,\dots \}\]<p>等。例如，在處理冪級數理論時，定義域為 $\mathbb{N}_0$ 會更自然。</p></blockquote><h2 id="收斂與發散">收斂與發散</h2><p>如果數列 $(a_n)$ 收斂於實數 $l$，則寫作</p>\[\lim_{n\to \infty} a_n = l\]<p>這時，$l$ 稱為數列 $(a_n)$ 的<strong>極限值</strong>。</p><blockquote class="prompt-info"><p>使用<strong>ε-δ論證（epsilon-delta argument）</strong>的嚴格定義如下：</p>\[\lim_{n\to \infty} a_n = l \overset{def}\Longleftrightarrow \forall \epsilon &gt; 0,\, \exists N \in \mathbb{N}\ (n &gt; N \Rightarrow |a_n - l| &lt; \epsilon)\]<p>也就是說，對於任何小的正數 $\epsilon$，只要存在一個自然數 $N$，使得當 $n&gt;N$ 時，總是滿足 $|a_n - l | &lt; \epsilon$，這意味著對於足夠大的 $n$，$a_n$ 和 $l$ 的差會無限接近，因此我們定義滿足這個條件的數列 $(a_n)$ 收斂於實數 $l$。</p></blockquote><p>不收斂的數列稱為<strong>發散</strong>。<em>數列的收斂或發散性質不會因為有限項的改變而改變。</em></p><p>如果數列 $(a_n)$ 的每一項無限增大，則寫作</p>\[\lim_{n\to \infty} a_n = \infty\]<p>稱為<em>發散到正無窮大</em>。同樣地，如果數列 $(a_n)$ 的每一項無限減小，則寫作</p>\[\lim_{n\to \infty} a_n = -\infty\]<p>稱為<em>發散到負無窮大</em>。</p><h2 id="收斂數列的基本性質">收斂數列的基本性質</h2><p>如果數列 $(a_n)$ 和 $(b_n)$ 都收斂（即有極限值），則數列 $(a_n + b_n)$ 和 $(a_n \cdot b_n)$ 也同樣收斂，且</p>\[\lim_{n\to \infty} (a_n + b_n) = \lim_{n\to \infty} a_n + \lim_{n\to \infty} b_n \label{eqn:props_of_conv_series_1}\tag{1}\] \[\lim_{n\to \infty} (a_n \cdot b_n) = \left(\lim_{n\to \infty} a_n \right) \cdot \left(\lim_{n\to \infty} b_n \right) \label{eqn:props_of_conv_series_2}\tag{2}\]<p>此外，對於任意實數 $t$，</p>\[\lim_{n\to \infty} (t a_n) = t\left(\lim_{n\to \infty} a_n \right) \label{eqn:props_of_conv_series_3}\tag{3}\]<p>這些性質稱為<strong>收斂數列的基本性質</strong>或<strong>極限的基本性質</strong>。</p><h2 id="自然對數的底數-e">自然對數的底數 $e$</h2><p><strong>自然對數的底數</strong>定義為</p>\[e := \lim_{n\to \infty} \left(1+\frac{1}{n} \right)^n \approx 2.718\]<p>這可以說是數學中最重要的常數之一。</p><blockquote class="prompt-tip"><p>在韓國，「自然常數」這個表達方式相當普遍，但這並不是標準用語。韓國數學會在數學用語集中登錄的官方用語是<a href="https://www.kms.or.kr/mathdict/list.html?key=kname&amp;keyword=%EC%9E%90%EC%97%B0%EB%A1%9C%EA%B7%B8%EC%9D%98+%EB%B0%91">‘自然對數的底數’</a>，而「自然常數」這個表達在該用語集中找不到。甚至在國立國語院標準國語大辭典中也找不到「自然常數」這個詞，只在<a href="https://stdict.korean.go.kr/search/searchView.do?pageSize=10&amp;searchKeyword=%EC%9E%90%EC%97%B0%EB%A1%9C%EA%B7%B8">‘自然對數’的辭典解釋</a>中提到「通常用e表示的特定數字」。<br /> 在英語圈和日本也不存在對應的用語，以英語為準，主要稱為’the base of the natural logarithm’或簡稱’natural base’，或者’Euler’s number’或’the number $e$’。<br /> 由於來源不明，韓國數學會也從未認可為官方用語，而且除了韓國以外，世界上沒有其他地方使用這樣的用語，因此我們沒有理由堅持使用這樣的用語。從現在開始，我也會稱之為「自然對數的底數」或直接表示為$e$。</p></blockquote><h2 id="級數">級數</h2><p>對於數列</p>\[\mathbf{a} = (a_1, a_2, a_3, \dots)\]<p>由這個數列的部分和組成的另一個數列</p>\[a_1, \quad a_1 + a_2, \quad a_1 + a_2 + a_3, \quad \dots\]<p>稱為數列 $\mathbf{a}$ 的<strong>級數</strong>。數列 $(a_n)$ 的級數表示為</p>\[\begin{gather*} a_1 + a_2 + a_3 + \cdots, \qquad \sum_{n=1}^{\infty}a_n, \\ \sum_{n\geq 1} a_n, \qquad \sum_n a_n, \qquad \sum a_n \end{gather*}\]<p>等。</p><h2 id="級數的收斂與發散">級數的收斂與發散</h2><p>如果從數列 $(a_n)$ 得到的級數</p>\[a_1, \quad a_1 + a_2, \quad a_1 + a_2 + a_3, \quad \dots\]<p>收斂於某個實數 $l$，則表示為</p>\[\sum_{n=1}^{\infty} a_n = l\]<p>這時，極限值 $l$ 稱為級數 $\sum a_n$ 的<strong>和</strong>。符號</p>\[\sum a_n\]<p>根據情況可以表示<u>級數</u>，也可以表示該<u>級數的和</u>。</p><p>不收斂的級數稱為<strong>發散</strong>。</p><h2 id="收斂級數的基本性質">收斂級數的基本性質</h2><p>從<a href="#收斂數列的基本性質">收斂數列的基本性質</a>可以得到以下收斂級數的基本性質。對於實數 $t$ 和兩個收斂級數 $\sum a_n$, $\sum b_n$，</p>\[\sum(a_n + b_n) = \sum a_n + \sum b_n, \qquad \sum ta_n = t\sum a_n \tag{4}\]<p>成立。</p><p>級數的收斂性不受有限項變化的影響。也就是說，對於兩個數列 $(a_n)$, $(b_n)$，如果除了有限個 $n$ 外，都有 $a_n=b_n$，則級數 $\sum a_n$ 收斂的充分必要條件是級數 $\sum b_n$ 收斂。</p>]]> </content> </entry> <entry><title xml:lang="zh-TW">牛頓運動定律</title><link href="https://www.yunseo.kim/zh-TW/posts/newtons-laws-of-motion/" rel="alternate" type="text/html" hreflang="en" /><link href="https://www.yunseo.kim/ko/posts/newtons-laws-of-motion/" rel="alternate" type="text/html" hreflang="ko" /><link href="https://www.yunseo.kim/ja/posts/newtons-laws-of-motion/" rel="alternate" type="text/html" hreflang="ja" /><link href="https://www.yunseo.kim/zh-TW/posts/newtons-laws-of-motion/" rel="alternate" type="text/html" hreflang="zh-TW" /><link href="https://www.yunseo.kim/es/posts/newtons-laws-of-motion/" rel="alternate" type="text/html" hreflang="es" /><link href="https://www.yunseo.kim/pt-BR/posts/newtons-laws-of-motion/" rel="alternate" type="text/html" hreflang="pt-BR" /><link href="https://www.yunseo.kim/fr/posts/newtons-laws-of-motion/" rel="alternate" type="text/html" hreflang="fr" /><link href="https://www.yunseo.kim/de/posts/newtons-laws-of-motion/" rel="alternate" type="text/html" hreflang="de" /><link href="https://www.yunseo.kim/pl/posts/newtons-laws-of-motion/" rel="alternate" type="text/html" hreflang="pl" /><link href="https://www.yunseo.kim/cs/posts/newtons-laws-of-motion/" rel="alternate" type="text/html" hreflang="cs" /><link href="https://www.yunseo.kim/sw/posts/newtons-laws-of-motion/" rel="alternate" type="text/html" hreflang="sw" /><link href="https://www.yunseo.kim/am/posts/newtons-laws-of-motion/" rel="alternate" type="text/html" hreflang="am" /><published>2025-03-10T00:00:00+09:00</published> <updated>2026-02-16T05:09:10+09:00</updated> <id>https://www.yunseo.kim/zh-TW/posts/newtons-laws-of-motion/</id> <author> <name>Yunseo Kim</name> </author> <category term="Physics" /> <category term="Classical Dynamics" /> <summary xml:lang="zh-TW">探討牛頓運動定律及其三大定律的意義，以及慣性質量與重力質量的定義，並檢視等效原理在經典力學和後來的廣義相對論中的重要意義。</summary> <content type="html" xml:lang="zh-TW"> <![CDATA[<p>探討牛頓運動定律及其三大定律的意義，以及慣性質量與重力質量的定義，並檢視等效原理在經典力學和後來的廣義相對論中的重要意義。</p><em><p>* Mathematical equations and diagrams included in posts may not display properly when viewed with a feed reader.</p></em><h2 id="tldr">TL;DR</h2><blockquote class="prompt-info"><p><strong>牛頓運動定律(Newton’s laws of motion)</strong></p><ol><li>若無外力作用，物體將保持靜止或勻速直線運動狀態。<li>物體動量的時間變化率等於作用在該物體上的力。<ul><li>$\vec{F} = \cfrac{d\vec{p}}{dt} = \cfrac{d}{dt}(m\vec{v}) = m\vec{a}$</ul><li>當兩物體相互作用時，這兩個力的大小相等且方向相反。<ul><li>$\vec{F_1} = -\vec{F_2}$</ul></ol></blockquote><blockquote class="prompt-info"><p><strong>等效原理(principle of equivalence)</strong></p><ul><li>慣性質量：決定物體在給定力作用下加速度的質量<li>重力質量：決定物體與其他物體之間重力作用的質量<li>目前已知慣性質量與重力質量在誤差範圍約 $10^{-12}$ 內明確相等<li>慣性質量與重力質量完全相等的主張被稱為<strong>等效原理</strong></ul></blockquote><h2 id="牛頓運動定律">牛頓運動定律</h2><p>牛頓運動定律是艾薩克·牛頓(Issac Newton)在<a href="https://en.wikipedia.org/wiki/Holocene_calendar">人類紀年</a> 11687年透過著作《自然哲學的數學原理》(Philosophiæ Naturalis Principia Mathematica，簡稱「原理論」)發表的三大定律，構成了牛頓力學(Newtonian mechanics)的基礎。</p><ol><li>若無外力作用，物體將保持靜止或勻速直線運動狀態。<li>物體動量的時間變化率等於作用在該物體上的力。<li>當兩物體相互作用時，這兩個力的大小相等且方向相反。</ol><h3 id="牛頓第一定律">牛頓第一定律</h3><blockquote><p>I. 若無外力作用，物體將保持靜止或勻速直線運動狀態。</p></blockquote><p>這種無外力作用狀態下的物體被稱為<strong>自由物體(free body)</strong>或<strong>自由粒子(free particle)</strong>。 然而，第一定律本身只提供了關於力的定性概念。</p><h3 id="牛頓第二定律">牛頓第二定律</h3><blockquote><p>II. 物體動量的時間變化率等於作用在該物體上的力。</p></blockquote><p>牛頓將<strong>動量(momentum)</strong>定義為質量與速度的乘積</p>\[\vec{p} \equiv m\vec{v} \label{eqn:momentum}\tag{1}\]<p>由此，牛頓第二定律可表示為：</p>\[\vec{F} = \frac{d\vec{p}}{dt} = \frac{d}{dt}(m\vec{v}) = m\vec{a}. \label{eqn:2nd_law}\tag{2}\]<p>牛頓第一定律和第二定律，與其名稱不同，實際上更接近於對「力」的「定義」而非「定律」。此外，力的定義依賴於「質量」的定義。</p><h3 id="牛頓第三定律">牛頓第三定律</h3><blockquote><p>III. 當兩物體相互作用時，這兩個力的大小相等且方向相反。</p></blockquote><p>這也被稱為「作用與反作用定律」，適用於一個物體對另一個物體施加的力沿著連接兩作用點的直線方向的情況。這種力被稱為<strong>中心力(central force)</strong>，第三定律無論中心力是吸引力還是排斥力都成立。靜止物體間的重力或靜電力，以及彈力等都屬於這類中心力。相反，運動電荷之間的力、運動物體間的重力等依賴於相互作用物體速度的力屬於非中心力，這種情況下第三定律不適用。</p><p>考慮到前面討論的質量定義，第三定律可以改寫為：</p><blockquote><p>III$^\prime$. 當兩物體構成理想孤立系統時，這兩個物體的加速度方向相反，且其大小比例與兩物體質量的反比相等。</p></blockquote><p>根據牛頓第三定律：</p>\[\vec{F_1} = -\vec{F_2} \label{eqn:3rd_law}\tag{3}\]<p>將前面討論的第二定律($\ref{eqn:2nd_law}$)代入：</p>\[\frac{d\vec{p_1}}{dt} = -\frac{d\vec{p_2}}{dt} \label{eqn:3rd-1_law}\tag{4}\]<p>由此可知，在兩粒子的孤立相互作用中，動量是守恆的。</p>\[\frac{d}{dt}(\vec{p_1}+\vec{p_2}) = 0 \label{eqn:conservation_of_momentum}\tag{5}\]<p>此外，從式($\ref{eqn:3rd-1_law}$)中，因為$\vec{p}=m\vec{v}$且質量$m$是常數，所以：</p>\[m_1\left(\frac{d\vec{v_1}}{dt} \right) = m_2\left(-\frac{d\vec{v_2}}{dt} \right) \tag{6a}\] \[m_1(\vec{a_1}) = m_2(-\vec{a_2}) \tag{6b}\]<p>得到：</p>\[\frac{m_2}{m_1} = -\frac{a_1}{a_2}. \tag{7}\]<p>然而，牛頓第三定律描述的是兩物體構成孤立系統的情況，但實際上實現這種理想條件是不可能的，因此牛頓在第三定律中的主張可以說是相當大膽的。儘管結論來自有限的觀察，但由於牛頓深刻的物理洞察力，牛頓力學在近300年間經受住了各種實驗的檢驗而未發現錯誤，直到11900年代才有足夠精確的測量能夠顯示牛頓理論預測與實際情況的差異，從而催生了相對論和量子力學。</p><h2 id="慣性質量與重力質量">慣性質量與重力質量</h2><p>確定物體質量的方法之一是使用天平等工具將該物體的重量與標準重量比較。這種方法利用了物體在重力場中的重量等於作用在該物體上的重力大小的事實，在這種情況下，第二定律$\vec{F}=m\vec{a}$變為$\vec{W}=m\vec{g}$的形式。這種方法基於III$^\prime$中定義的質量$m$與重力方程中出現的質量$m$相同的基本假設。這兩種質量分別被稱為<strong>慣性質量(inertial mass)</strong>和<strong>重力質量(gravitational mass)</strong>，定義如下：</p><ul><li>慣性質量：決定物體在給定力作用下加速度的質量<li>重力質量：決定物體與其他物體之間重力作用的質量</ul><p>雖然與伽利略·伽利萊(Galileo Galilei)無關，是後人編造的故事，但比薩斜塔的落體實驗是首次表明慣性質量和重力質量可能相等的思想實驗。牛頓也試圖通過測量長度相同但擺錘質量不同的鐘擺周期來證明兩種質量之間沒有差異，但由於實驗方法和精度粗糙，未能成功證明。</p><p>後來在11800年代末，匈牙利物理學家厄特沃什·羅蘭德·奧古斯頓(Eötvös Loránd Ágoston)進行了厄特沃什實驗，以精確測量慣性質量和重力質量之間的差異，並以相當高的精度(誤差在二千萬分之一內)證明了慣性質量和重力質量是相同的。</p><p>隨後，羅伯特·亨利·迪克(Robert Henry Dicke)等人進行的更近期實驗進一步提高了精度，目前已知慣性質量和重力質量在誤差範圍約$10^{-12}$內明確相等。這一結果在廣義相對論中具有極其重要的意義，慣性質量和重力質量完全相等的主張被稱為<strong>等效原理(principle of equivalence)</strong>。</p>]]> </content> </entry> <entry><title xml:lang="zh-TW">常係數二階齊次線性常微分方程式</title><link href="https://www.yunseo.kim/zh-TW/posts/homogeneous-linear-odes-with-constant-coefficients/" rel="alternate" type="text/html" hreflang="en" /><link href="https://www.yunseo.kim/ko/posts/homogeneous-linear-odes-with-constant-coefficients/" rel="alternate" type="text/html" hreflang="ko" /><link href="https://www.yunseo.kim/ja/posts/homogeneous-linear-odes-with-constant-coefficients/" rel="alternate" type="text/html" hreflang="ja" /><link href="https://www.yunseo.kim/zh-TW/posts/homogeneous-linear-odes-with-constant-coefficients/" rel="alternate" type="text/html" hreflang="zh-TW" /><link href="https://www.yunseo.kim/es/posts/homogeneous-linear-odes-with-constant-coefficients/" rel="alternate" type="text/html" hreflang="es" /><link href="https://www.yunseo.kim/pt-BR/posts/homogeneous-linear-odes-with-constant-coefficients/" rel="alternate" type="text/html" hreflang="pt-BR" /><link href="https://www.yunseo.kim/fr/posts/homogeneous-linear-odes-with-constant-coefficients/" rel="alternate" type="text/html" hreflang="fr" /><link href="https://www.yunseo.kim/de/posts/homogeneous-linear-odes-with-constant-coefficients/" rel="alternate" type="text/html" hreflang="de" /><link href="https://www.yunseo.kim/pl/posts/homogeneous-linear-odes-with-constant-coefficients/" rel="alternate" type="text/html" hreflang="pl" /><link href="https://www.yunseo.kim/cs/posts/homogeneous-linear-odes-with-constant-coefficients/" rel="alternate" type="text/html" hreflang="cs" /><link href="https://www.yunseo.kim/sw/posts/homogeneous-linear-odes-with-constant-coefficients/" rel="alternate" type="text/html" hreflang="sw" /><link href="https://www.yunseo.kim/am/posts/homogeneous-linear-odes-with-constant-coefficients/" rel="alternate" type="text/html" hreflang="am" /><published>2025-02-22T00:00:00+09:00</published> <updated>2025-07-11T21:25:00+09:00</updated> <id>https://www.yunseo.kim/zh-TW/posts/homogeneous-linear-odes-with-constant-coefficients/</id> <author> <name>Yunseo Kim</name> </author> <category term="Mathematics" /> <category term="Differential Equation" /> <summary xml:lang="zh-TW">根據特徵方程式判別式的正負號，探討常係數齊次線性常微分方程式的通解在各種情況下所呈現的形式。</summary> <content type="html" xml:lang="zh-TW"> <![CDATA[<p>根據特徵方程式判別式的正負號，探討常係數齊次線性常微分方程式的通解在各種情況下所呈現的形式。</p><em><p>* Mathematical equations and diagrams included in posts may not display properly when viewed with a feed reader.</p></em><h2 id="tldr">TL;DR</h2><blockquote class="prompt-info"><ul><li>常係數二階齊次線性常微分方程式：$y^{\prime\prime} + ay^{\prime} + by = 0$<li><strong>特徵方程式(characteristic equation)</strong>：$\lambda^2 + a\lambda + b = 0$<li>根據特徵方程式的判別式 $a^2 - 4b$ 的正負號，通解的形式可分為下表三種情況：</ul><table><thead><tr><th style="text-align: center">情況<th style="text-align: center">特徵方程式的根<th style="text-align: center">常微分方程式的解的基底<th style="text-align: center">常微分方程式的通解<tbody><tr><td style="text-align: center">I<td style="text-align: center">相異實根<br />$\lambda_1$, $\lambda_2$<td style="text-align: center">$e^{\lambda_1 x}$, $e^{\lambda_2 x}$<td style="text-align: center">$y = c_1e^{\lambda_1 x} + c_2e^{\lambda_2 x}$<tr><td style="text-align: center">II<td style="text-align: center">實重根<br /> $\lambda = -\cfrac{1}{2}a$<td style="text-align: center">$e^{-ax/2}$, $xe^{-ax/2}$<td style="text-align: center">$y = (c_1 + c_2 x)e^{-ax/2}$<tr><td style="text-align: center">III<td style="text-align: center">共軛複數根<br /> $\lambda_1 = -\cfrac{1}{2}a + i\omega$, <br /> $\lambda_2 = -\cfrac{1}{2}a - i\omega$<td style="text-align: center">$e^{-ax/2}\cos{\omega x}$, <br /> $e^{-ax/2}\sin{\omega x}$<td style="text-align: center">$y = e^{-ax/2}(A\cos{\omega x} + B\sin{\omega x})$</table></blockquote><h2 id="先備知識">先備知識</h2><ul><li><a href="/zh-TW/posts/Bernoulli-Equation/">白努利方程式(Bernoulli Equation)</a><li><a href="/zh-TW/posts/homogeneous-linear-odes-of-second-order/">二階齊次線性常微分方程式 (Homogeneous Linear ODEs of Second Order)</a><li>歐拉公式</ul><h2 id="特徵方程式-characteristic-equation">特徵方程式 (characteristic equation)</h2><p>我們來探討係數 $a$ 與 $b$ 為常數的二階齊次線性常微分方程式</p>\[y^{\prime\prime} + ay^{\prime} + by = 0 \label{eqn:ode_with_constant_coefficients}\tag{1}\]<p>這種形式的方程式在機械、電學振盪中有重要的應用。</p><p>先前在<a href="/zh-TW/posts/Bernoulli-Equation/">白努利方程式(Bernoulli Equation)</a>中，我們曾求過羅吉斯方程式的通解。根據該文，具有常數係數 $k$ 的一階線性常微分方程式</p>\[y^\prime + ky = 0\]<p>的解是指數函數 $y = ce^{-kx}$。（在該篇文章的方程式 (4) 中，$A=-k$，$B=0$ 的情況）</p><p>因此，對於形式相似的方程式 ($\ref{eqn:ode_with_constant_coefficients}$)，我們也可以先嘗試</p>\[y=e^{\lambda x}\label{eqn:general_sol}\tag{2}\]<p>形式的解。</p><blockquote class="prompt-info"><p>當然，這純屬猜測，完全無法保證通解必定是這種形式。但無論如何，只要能先找到兩個線性獨立的解，就可以像在<a href="/zh-TW/posts/homogeneous-linear-odes-of-second-order/#基底與通解">二階齊次線性常微分方程式</a>一文中所探討的，根據<a href="/zh-TW/posts/homogeneous-linear-odes-of-second-order/#疊加原理">疊加原理</a>求出通解。<br /> 稍後將會看到，也有<a href="#ii-實重根-lambda---cfraca2">需要求取其他形式解的情況</a>。</p></blockquote><p>將方程式 ($\ref{eqn:general_sol}$) 及其導數</p>\[y^\prime = \lambda e^{\lambda x}, \quad y^{\prime\prime} = \lambda^2 e^{\lambda x}\]<p>代入方程式 ($\ref{eqn:ode_with_constant_coefficients}$) 中，可得</p>\[(\lambda^2 + a\lambda + b)e^{\lambda x} = 0\]<p>因此，若 $\lambda$ 是<strong>特徵方程式(characteristic equation)</strong></p>\[\lambda^2 + a\lambda + b = 0 \label{eqn:characteristic_eqn}\tag{3}\]<p>的根，則指數函數 ($\ref{eqn:general_sol}$) 就是常微分方程式 ($\ref{eqn:ode_with_constant_coefficients}$) 的解。求解二次方程式 ($\ref{eqn:characteristic_eqn}$) 的根，可得</p>\[\begin{align*} \lambda_1 &amp;= \frac{1}{2}\left(-a + \sqrt{a^2 - 4b}\right), \\ \lambda_2 &amp;= \frac{1}{2}\left(-a - \sqrt{a^2 - 4b}\right) \end{align*}\label{eqn:lambdas}\tag{4}\]<p>由此可知，兩個函數</p>\[y_1 = e^{\lambda_1 x}, \quad y_2 = e^{\lambda_2 x} \tag{5}\]<p>是方程式 ($\ref{eqn:ode_with_constant_coefficients}$) 的解。</p><blockquote class="prompt-tip"><p><strong>特徵方程式(characteristic equation)</strong> 與 <strong>輔助方程式(auxiliary equation)</strong> 這兩個術語經常混用，但它們的意義完全相同。使用哪個稱呼都無妨。</p></blockquote><p>現在，根據特徵方程式 ($\ref{eqn:characteristic_eqn}$) 的判別式 $a^2 - 4b$ 的正負號，可將情況分為三種。</p><ul><li>$a^2 - 4b &gt; 0$: 相異實根<li>$a^2 - 4b = 0$: 實重根<li>$a^2 - 4b &lt; 0$: 共軛複數根</ul><h2 id="根據特徵方程式判別式的正負號決定通解的形式">根據特徵方程式判別式的正負號決定通解的形式</h2><h3 id="i-相異實根-lambda_1-與-lambda_2">I. 相異實根 $\lambda_1$ 與 $\lambda_2$</h3><p>在這種情況下，方程式 ($\ref{eqn:ode_with_constant_coefficients}$) 在任意區間上的解的基底為</p>\[y_1 = e^{\lambda_1 x}, \quad y_2 = e^{\lambda_2 x}\]<p>其對應的通解為</p>\[y = c_1 e^{\lambda_1 x} + c_2 e^{\lambda_2 x} \label{eqn:general_sol_1}\tag{6}\]<h3 id="ii-實重根-lambda---cfraca2">II. 實重根 $\lambda = -\cfrac{a}{2}$</h3><p>當 $a^2 - 4b = 0$ 時，二次方程式 ($\ref{eqn:characteristic_eqn}$) 只有一個根 $\lambda = \lambda_1 = \lambda_2 = -\cfrac{a}{2}$，因此能得到的 $y = e^{\lambda x}$ 形式的解只有一個：</p>\[y_1 = e^{-(a/2)x}\]<p>為了得到基底，必須找出與 $y_1$ 線性獨立的第二個不同形式的解 $y_2$。</p><p>在這種情況下，可以利用先前探討過的<a href="/zh-TW/posts/homogeneous-linear-odes-of-second-order/#降階法-reduction-of-order">降階法</a>。將欲求的第二個解設為 $y_2=uy_1$，並將</p>\[\begin{align*} y_2 &amp;= uy_1, \\ y_2^{\prime} &amp;= u^{\prime}y_1 + uy_1^{\prime}, \\ y_2^{\prime\prime} &amp;= u^{\prime\prime}y_1 + 2u^{\prime}y_1^{\prime} + uy_1^{\prime\prime} \end{align*}\]<p>代入方程式 ($\ref{eqn:ode_with_constant_coefficients}$) 中，可得</p>\[(u^{\prime\prime}y_1 + 2u^\prime y_1^\prime + uy_1^{\prime\prime}) + a(u^\prime y_1 + uy_1^\prime) + buy_1 = 0\]<p>將 $u^{\prime\prime}$、$u^\prime$、$u$ 的各項分別整理後，可得</p>\[y_1u^{\prime\prime} + (2y_1^\prime + ay_1)u^\prime + (y_1^{\prime\prime} + ay_1^\prime + by_1)u = 0\]<p>在此，因為 $y_1$ 是方程式 ($\ref{eqn:ode_with_constant_coefficients}$) 的解，所以最後一個括號內的式子為 $0$。又因為</p>\[2y_1^\prime = -ae^{-ax/2} = -ay_1\]<p>所以第一個括號內的式子也為 $0$。因此只剩下 $u^{\prime\prime}y_1 = 0$，由此可得 $u^{\prime\prime}=0$。積分兩次可得 $u = c_1x + c_2$。積分常數 $c_1$ 和 $c_2$ 可以是任何值，因此我們可以簡單地選擇 $c_1=1$、$c_2=0$，令 $u=x$。如此一來，$y_2 = uy_1 = xy_1$。由於 $y_1$ 和 $y_2$ 線性獨立，它們構成了一組基底。因此，當特徵方程式 ($\ref{eqn:characteristic_eqn}$) 有重根時，方程式 ($\ref{eqn:ode_with_constant_coefficients}$) 在任意區間上的解的基底為</p>\[e^{-ax/2}, \quad xe^{-ax/2}\]<p>其對應的通解為</p>\[y = (c_1 + c_2x)e^{-ax/2} \label{eqn:general_sol_2}\tag{7}\]<h3 id="iii-共軛複數根--cfrac12a--iomega-與--cfrac12a---iomega">III. 共軛複數根 $-\cfrac{1}{2}a + i\omega$ 與 $-\cfrac{1}{2}a - i\omega$</h3><p>在這種情況下，$a^2 - 4b &lt; 0$ 且 $\sqrt{-1} = i$，因此從方程式 ($\ref{eqn:lambdas}$) 可得</p>\[\cfrac{1}{2}\sqrt{a^2 - 4b} = \cfrac{1}{2}\sqrt{-(4b - a^2)} = \sqrt{-(b-\frac{1}{4}a^2)} = i\sqrt{b - \frac{1}{4}a^2}\]<p>在此，我們定義實數 $\sqrt{b-\cfrac{1}{4}a^2} = \omega$。</p><p>如上定義 $\omega$ 後，特徵方程式 ($\ref{eqn:characteristic_eqn}$) 的根為共軛複數根 $\lambda = -\cfrac{1}{2}a \pm i\omega$，其對應的方程式 ($\ref{eqn:ode_with_constant_coefficients}$) 的兩個複數解為</p>\[\begin{align*} e^{\lambda_1 x} &amp;= e^{-(a/2)x + i\omega x}, \\ e^{\lambda_2 x} &amp;= e^{-(a/2)x - i\omega x} \end{align*}\]<p>不過，在這種情況下，我們仍然可以得到一組由實數解構成的基底，如下所示。</p><p>歐拉公式(Euler formula)</p>\[e^{it} = \cos t + i\sin t \label{eqn:euler_formula}\tag{8}\]<p>以及將上式中的 $t$ 替換為 $-t$ 所得到的</p>\[e^{-it} = \cos t - i\sin t\]<p>將這兩個方程式相加及相減，可得：</p>\[\begin{align*} \cos t &amp;= \frac{1}{2}(e^{it} + e^{-it}), \\ \sin t &amp;= \frac{1}{2i}(e^{it} - e^{-it}). \end{align*} \label{eqn:cos_and_sin}\tag{9}\]<p>具有實部 $r$ 和虛部 $it$ 的複變數 $z = r + it$ 的複指數函數 $e^z$，可以使用實函數 $e^r$、$\cos t$ 和 $\sin t$ 定義如下：</p>\[e^z = e^{r + it} = e^r e^{it} = e^r(\cos t + i\sin t) \label{eqn:complex_exp}\tag{10}\]<p>在此，若令 $r=-\cfrac{1}{2}ax$，$t=\omega x$，則可寫成：</p>\[\begin{align*} e^{\lambda_1 x} &amp;= e^{-(a/2)x + i\omega x} = e^{-(a/2)x}(\cos{\omega x} + i\sin{\omega x}) \\ e^{\lambda_2 x} &amp;= e^{-(a/2)x - i\omega x} = e^{-(a/2)x}(\cos{\omega x} - i\sin{\omega x}) \end{align*}\]<p>根據<a href="/zh-TW/posts/homogeneous-linear-odes-of-second-order/#疊加原理">疊加原理</a>，上述複數解的和與常數倍也同樣是解。因此，將兩個等式相加，並在兩邊同乘以 $\cfrac{1}{2}$，即可得到第一個實數解 $y_1$：</p>\[y_1 = e^{-(a/2)x} \cos{\omega x}. \label{eqn:basis_1}\tag{11}\]<p>同理，將第一個等式減去第二個等式，並在兩邊同乘以 $\cfrac{1}{2i}$，即可得到第二個實數解 $y_2$。</p>\[y_2 = e^{-(a/2)x} \sin{\omega x}. \label{eqn:basis_2}\tag{12}\]<p>由於 $\cfrac{y_1}{y_2} = \cot{\omega x}$ 不是常數，因此 $y_1$ 和 $y_2$ 在所有區間上皆為線性獨立，從而構成了方程式 ($\ref{eqn:ode_with_constant_coefficients}$) 的實數解基底。由此可得通解</p>\[y = e^{-ax/2}(A\cos{\omega x} + B\sin{\omega x}) \quad \text{(}A,\, B\text{為任意常數)} \label{eqn:general_sol_3}\tag{13}\] ]]> </content> </entry> <entry><title xml:lang="zh-TW">使用Polyglot在Jekyll部落格實現多語言支援 (3) - Chirpy 主題建置失敗與搜尋功能錯誤的疑難排解</title><link href="https://www.yunseo.kim/zh-TW/posts/how-to-support-multi-language-on-jekyll-blog-with-polyglot-3/" rel="alternate" type="text/html" hreflang="en" /><link href="https://www.yunseo.kim/ko/posts/how-to-support-multi-language-on-jekyll-blog-with-polyglot-3/" rel="alternate" type="text/html" hreflang="ko" /><link href="https://www.yunseo.kim/ja/posts/how-to-support-multi-language-on-jekyll-blog-with-polyglot-3/" rel="alternate" type="text/html" hreflang="ja" /><link href="https://www.yunseo.kim/zh-TW/posts/how-to-support-multi-language-on-jekyll-blog-with-polyglot-3/" rel="alternate" type="text/html" hreflang="zh-TW" /><link href="https://www.yunseo.kim/es/posts/how-to-support-multi-language-on-jekyll-blog-with-polyglot-3/" rel="alternate" type="text/html" hreflang="es" /><link href="https://www.yunseo.kim/pt-BR/posts/how-to-support-multi-language-on-jekyll-blog-with-polyglot-3/" rel="alternate" type="text/html" hreflang="pt-BR" /><link href="https://www.yunseo.kim/fr/posts/how-to-support-multi-language-on-jekyll-blog-with-polyglot-3/" rel="alternate" type="text/html" hreflang="fr" /><link href="https://www.yunseo.kim/de/posts/how-to-support-multi-language-on-jekyll-blog-with-polyglot-3/" rel="alternate" type="text/html" hreflang="de" /><link href="https://www.yunseo.kim/pl/posts/how-to-support-multi-language-on-jekyll-blog-with-polyglot-3/" rel="alternate" type="text/html" hreflang="pl" /><link href="https://www.yunseo.kim/cs/posts/how-to-support-multi-language-on-jekyll-blog-with-polyglot-3/" rel="alternate" type="text/html" hreflang="cs" /><link href="https://www.yunseo.kim/sw/posts/how-to-support-multi-language-on-jekyll-blog-with-polyglot-3/" rel="alternate" type="text/html" hreflang="sw" /><link href="https://www.yunseo.kim/am/posts/how-to-support-multi-language-on-jekyll-blog-with-polyglot-3/" rel="alternate" type="text/html" hreflang="am" /><published>2025-02-05T00:00:00+09:00</published> <updated>2025-10-08T00:53:56+09:00</updated> <id>https://www.yunseo.kim/zh-TW/posts/how-to-support-multi-language-on-jekyll-blog-with-polyglot-3/</id> <author> <name>Yunseo Kim</name> </author> <category term="Dev" /> <category term="Web Dev" /> <summary xml:lang="zh-TW">介紹在基於&apos;jekyll-theme-chirpy&apos;的Jekyll部落格中應用Polyglot外掛實現多語言支援的過程。本文為系列第三篇，主要探討在Chirpy主題上應用Polyglot時所發生的錯誤，並說明如何識別問題原因及解決方法。</summary> <content type="html" xml:lang="zh-TW"> <![CDATA[<p>介紹在基於'jekyll-theme-chirpy'的Jekyll部落格中應用Polyglot外掛實現多語言支援的過程。本文為系列第三篇，主要探討在Chirpy主題上應用Polyglot時所發生的錯誤，並說明如何識別問題原因及解決方法。</p><em><p>* Mathematical equations and diagrams included in posts may not display properly when viewed with a feed reader.</p></em><h2 id="概述">概述</h2><p>12024 年 7 月初，我為這個透過 Github Pages 託管、基於 Jekyll 的部落格，應用了 <a href="https://github.com/untra/polyglot">Polyglot</a> 外掛，新增了多語言支援功能。 本系列將分享在 Chirpy 主題上應用 Polyglot 外掛過程中遇到的錯誤及其解決過程，並分享考量到 SEO 的 html 標頭與 sitemap.xml 的撰寫方法。 本系列由三篇文章組成，您正在閱讀的是系列中的第三篇。</p><ul><li>第1篇：<a href="/zh-TW/posts/how-to-support-multi-language-on-jekyll-blog-with-polyglot-1">Polyglot外掛程式應用 &amp; html標頭及sitemap修改</a><li>第2篇：<a href="/zh-TW/posts/how-to-support-multi-language-on-jekyll-blog-with-polyglot-2">實現語言選擇按鈕 &amp; 版面配置語言本地化</a><li>第3篇：Chirpy主題構建失敗及搜尋功能錯誤故障排除（本文）</ul><blockquote class="prompt-info"><p>原本此系列為兩篇文章，但經過數次內容補充後，篇幅大幅增加，因此改為三篇文章。</p></blockquote><h2 id="需求條件">需求條件</h2><ul class="task-list"><li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked" />構建的結果（網頁）應按語言路徑（例如 <code class="language-plaintext filepath highlighter-rouge">/posts/ko/</code>、<code class="language-plaintext filepath highlighter-rouge">/posts/ja/</code>）分類提供。<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked" />為了盡量減少多語言支援所需的額外時間和精力，不必在原始markdown文件的YAML front matter中逐一指定’lang’和’permalink’標籤，而是在構建時根據文件所在的本地路徑（例如 <code class="language-plaintext filepath highlighter-rouge">/_posts/ko/</code>、<code class="language-plaintext filepath highlighter-rouge">/_posts/ja/</code>）自動識別語言。<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked" />網站中每個頁面的標頭部分應包含適當的Content-Language元標籤、hreflang替代標籤和canonical連結，以滿足Google多語言搜尋的SEO指南。<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked" />網站中每個語言版本的頁面連結應完整地在<code class="language-plaintext filepath highlighter-rouge">sitemap.xml</code>中提供，而<code class="language-plaintext filepath highlighter-rouge">sitemap.xml</code>本身應只存在於根路徑中，不得重複。<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked" /><a href="https://github.com/cotes2020/jekyll-theme-chirpy">Chirpy主題</a>提供的所有功能應在各語言頁面中正常運作，如果不正常，則需進行修改使其正常運作。<ul class="task-list"><li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked" />‘Recently Updated’、’Trending Tags’功能正常運作<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked" />使用GitHub Actions構建過程中不出現錯誤<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked" />部落格右上角的文章搜尋功能正常運作</ul></ul><h2 id="開始之前">開始之前</h2><p>本文接續自<a href="/zh-TW/posts/how-to-support-multi-language-on-jekyll-blog-with-polyglot-1">第1篇</a>與<a href="/zh-TW/posts/how-to-support-multi-language-on-jekyll-blog-with-polyglot-2">第2篇</a>，如果您尚未閱讀，建議先從前兩篇文章開始。</p><h2 id="疑難排解-relative_url_regex-target-of-repeat-operator-is-not-specified">疑難排解 (‘relative_url_regex’: target of repeat operator is not specified)</h2><p>（+ 12025.10.08. 更新）<a href="https://polyglot.untra.io/2025/09/20/polyglot.1.11.0/">此錯誤已在 Polyglot 1.11 版修復</a>。</p><p>完成前述步驟後，當我執行<code class="language-plaintext highlighter-rouge">bundle exec jekyll serve</code>指令進行建置測試時，發生了<code class="language-plaintext highlighter-rouge">'relative_url_regex': target of repeat operator is not specified</code>的錯誤，導致建置失敗。</p><div class="language-shell highlighter-rouge"><div class="highlight">class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
</pre><td class="rouge-code"><pre>...<span class="o">(</span>略<span class="o">)</span>
                    <span class="nt">------------------------------------------------</span>
      Jekyll 4.3.4   Please append <span class="sb">`</span><span class="nt">--trace</span><span class="sb">`</span> to the <span class="sb">`</span>serve<span class="sb">`</span> <span class="nb">command 
                     </span><span class="k">for </span>any additional information or backtrace. 
                    <span class="nt">------------------------------------------------</span>
/Users/yunseo/.gem/ruby/3.2.2/gems/jekyll-polyglot-1.8.1/lib/jekyll/polyglot/
patches/jekyll/site.rb:234:in <span class="sb">`</span>relative_url_regex<span class="s1">': target of repeat operator 
is not specified: /href="?\/((?:(?!*.gem)(?!*.gemspec)(?!tools)(?!README.md)(
?!LICENSE)(?!*.config.js)(?!rollup.config.js)(?!package*.json)(?!.sass-cache)
(?!.jekyll-cache)(?!gemfiles)(?!Gemfile)(?!Gemfile.lock)(?!node_modules)(?!ve
ndor\/bundle\/)(?!vendor\/cache\/)(?!vendor\/gems\/)(?!vendor\/ruby\/)(?!en\/
)(?!ko\/)(?!es\/)(?!pt-BR\/)(?!ja\/)(?!fr\/)(?!de\/)[^,'</span><span class="s2">"</span><span class="se">\s\/</span><span class="s2">?.]+</span><span class="se">\.</span><span class="s2">?)*(?:</span><span class="se">\/</span><span class="s2">[^
</span><span class="se">\]\[</span><span class="s2">)("</span><span class="s1">'\s]*)?)"/ (RegexpError)

...(略)
</span></pre></div></div><p>經過搜尋，我發現在 Polyglot 的儲存庫中，已經有人回報了<a href="https://github.com/untra/polyglot/issues/204">完全相同的問題</a>，並且已經有了可行的解決方案。</p><p>在本部落格正在使用的 <a href="https://github.com/cotes2020/jekyll-theme-chirpy/blob/master/_config.yml">Chirpy 主題的 <code class="language-plaintext filepath highlighter-rouge">_config.yml</code> 檔案</a> 中，存在以下這段設定。</p><div file="\_config.yml" class="language-yml highlighter-rouge"><div class="highlight">class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
</pre><td class="rouge-code"><pre><span class="na">exclude</span><span class="pi">:</span>
  <span class="pi">-</span> <span class="s2">"</span><span class="s">*.gem"</span>
  <span class="pi">-</span> <span class="s2">"</span><span class="s">*.gemspec"</span>
  <span class="pi">-</span> <span class="s">docs</span>
  <span class="pi">-</span> <span class="s">tools</span>
  <span class="pi">-</span> <span class="s">README.md</span>
  <span class="pi">-</span> <span class="s">LICENSE</span>
  <span class="pi">-</span> <span class="s2">"</span><span class="s">*.config.js"</span>
  <span class="pi">-</span> <span class="s">package*.json</span>
</pre></div></div><p>問題的原因在於，<a href="https://github.com/untra/polyglot/blob/master/lib/jekyll/polyglot/patches/jekyll/site.rb">Polyglot 的 <code class="language-plaintext filepath highlighter-rouge">site.rb</code> 檔案</a> 中包含的兩個函式，其正規表示式語法無法正常處理像上述 <code class="language-plaintext highlighter-rouge">"*.gem"</code>、<code class="language-plaintext highlighter-rouge">"*.gemspec"</code>、<code class="language-plaintext highlighter-rouge">"*.config.js"</code> 這樣包含萬用字元的 globbing 模式 (globbing pattern)。</p><div file="(polyglot 根目錄)/lib/jekyll/polyglot/patches/jekyll/site.rb" class="language-ruby highlighter-rouge"><div class="highlight">class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
</pre><td class="rouge-code"><pre>    <span class="c1"># a regex that matches relative urls in a html document</span>
    <span class="c1"># matches href="baseurl/foo/bar-baz" href="/zh-TW/foo/bar-baz" and others like it</span>
    <span class="c1"># avoids matching excluded files.  prepare makes sure</span>
    <span class="c1"># that all @exclude dirs have a trailing slash.</span>
    <span class="k">def</span> <span class="nf">relative_url_regex</span><span class="p">(</span><span class="n">disabled</span> <span class="o">=</span> <span class="kp">false</span><span class="p">)</span>
      <span class="n">regex</span> <span class="o">=</span> <span class="s1">''</span>
      <span class="k">unless</span> <span class="n">disabled</span>
        <span class="vi">@exclude</span><span class="p">.</span><span class="nf">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">x</span><span class="o">|</span>
          <span class="n">regex</span> <span class="o">+=</span> <span class="s2">"(?!</span><span class="si">#{</span><span class="n">x</span><span class="si">}</span><span class="s2">)"</span>
        <span class="k">end</span>
        <span class="vi">@languages</span><span class="p">.</span><span class="nf">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">x</span><span class="o">|</span>
          <span class="n">regex</span> <span class="o">+=</span> <span class="s2">"(?!</span><span class="si">#{</span><span class="n">x</span><span class="si">}</span><span class="se">\/</span><span class="s2">)"</span>
        <span class="k">end</span>
      <span class="k">end</span>
      <span class="n">start</span> <span class="o">=</span> <span class="n">disabled</span> <span class="p">?</span> <span class="s1">'ferh'</span> <span class="p">:</span> <span class="s1">'href'</span>
      <span class="sr">%r{</span><span class="si">#{</span><span class="n">start</span><span class="si">}</span><span class="sr">="?</span><span class="si">#{</span><span class="vi">@baseurl</span><span class="si">}</span><span class="sr">/((?:</span><span class="si">#{</span><span class="n">regex</span><span class="si">}</span><span class="sr">[^,'"</span><span class="se">\s</span><span class="sr">/?.]+</span><span class="se">\.</span><span class="sr">?)*(?:/[^</span><span class="se">\]\[</span><span class="sr">)("'</span><span class="se">\s</span><span class="sr">]*)?)"}</span>
    <span class="k">end</span>

    <span class="c1"># a regex that matches absolute urls in a html document</span>
    <span class="c1"># matches href="http://baseurl/foo/bar-baz" and others like it</span>
    <span class="c1"># avoids matching excluded files.  prepare makes sure</span>
    <span class="c1"># that all @exclude dirs have a trailing slash.</span>
    <span class="k">def</span> <span class="nf">absolute_url_regex</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">disabled</span> <span class="o">=</span> <span class="kp">false</span><span class="p">)</span>
      <span class="n">regex</span> <span class="o">=</span> <span class="s1">''</span>
      <span class="k">unless</span> <span class="n">disabled</span>
        <span class="vi">@exclude</span><span class="p">.</span><span class="nf">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">x</span><span class="o">|</span>
          <span class="n">regex</span> <span class="o">+=</span> <span class="s2">"(?!</span><span class="si">#{</span><span class="n">x</span><span class="si">}</span><span class="s2">)"</span>
        <span class="k">end</span>
        <span class="vi">@languages</span><span class="p">.</span><span class="nf">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">x</span><span class="o">|</span>
          <span class="n">regex</span> <span class="o">+=</span> <span class="s2">"(?!</span><span class="si">#{</span><span class="n">x</span><span class="si">}</span><span class="se">\/</span><span class="s2">)"</span>
        <span class="k">end</span>
      <span class="k">end</span>
      <span class="n">start</span> <span class="o">=</span> <span class="n">disabled</span> <span class="p">?</span> <span class="s1">'ferh'</span> <span class="p">:</span> <span class="s1">'href'</span>
      <span class="sr">%r{(?&lt;!hreflang="</span><span class="si">#{</span><span class="vi">@default_lang</span><span class="si">}</span><span class="sr">" )</span><span class="si">#{</span><span class="n">start</span><span class="si">}</span><span class="sr">="?</span><span class="si">#{</span><span class="n">url</span><span class="si">}#{</span><span class="vi">@baseurl</span><span class="si">}</span><span class="sr">/((?:</span><span class="si">#{</span><span class="n">regex</span><span class="si">}</span><span class="sr">[^,'"</span><span class="se">\s</span><span class="sr">/?.]+</span><span class="se">\.</span><span class="sr">?)*(?:/[^</span><span class="se">\]\[</span><span class="sr">)("'</span><span class="se">\s</span><span class="sr">]*)?)"}</span>
    <span class="k">end</span>
</pre></div></div><p>解決這個問題的方法有兩種。</p><h3 id="1-fork-polyglot並修改問題部分">1. Fork Polyglot並修改問題部分</h3><p>截至撰寫本文時（12024.11.），<a href="https://jekyllrb.com/docs/configuration/options/#global-configuration">Jekyll官方文檔</a>中明確指出 <code class="language-plaintext highlighter-rouge">exclude</code> 設定支援使用 globbing 模式。</p><blockquote><p>“This configuration option supports Ruby’s File.fnmatch filename globbing patterns to match multiple entries to exclude.”</p></blockquote><p>也就是說，問題的根源不在於 Chirpy 主題，而是在 Polyglot 的 <code class="language-plaintext highlighter-rouge">relative_url_regex()</code> 和 <code class="language-plaintext highlighter-rouge">absolute_url_regex()</code> 這兩個函式，因此，修改這兩個函式以避免問題發生，才是根本的解決方案。</p><p><del>由於 Polyglot 中的這個錯誤尚未被修復，因此</del> 如上所述，<a href="https://polyglot.untra.io/2025/09/20/polyglot.1.11.0/">自 Polyglot 1.11 版起，此問題已獲修復</a>。問題發生當時，則是參考<del><a href="https://hionpu.com/posts/github_blog_4#4-polyglot-%EC%9D%98%EC%A1%B4%EC%84%B1-%EB%AC%B8%EC%A0%9C">這篇部落格文章</a>（網站已失效）和</del><a href="https://github.com/untra/polyglot/issues/204#issuecomment-2143270322">前面提到的 GitHub issue 中的回覆</a>，將 Polyglot 儲存庫派生（fork）後，把有問題的部分按如下方式修改，改為取代原始的 Polyglot，因而得以解決。</p><div file="(polyglot 根目錄)/lib/jekyll/polyglot/patches/jekyll/site.rb" class="language-ruby highlighter-rouge"><div class="highlight">class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
</pre><td class="rouge-code"><pre>    <span class="k">def</span> <span class="nf">relative_url_regex</span><span class="p">(</span><span class="n">disabled</span> <span class="o">=</span> <span class="kp">false</span><span class="p">)</span>
      <span class="n">regex</span> <span class="o">=</span> <span class="s1">''</span>
      <span class="k">unless</span> <span class="n">disabled</span>
        <span class="vi">@exclude</span><span class="p">.</span><span class="nf">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">x</span><span class="o">|</span>
          <span class="n">escaped_x</span> <span class="o">=</span> <span class="no">Regexp</span><span class="p">.</span><span class="nf">escape</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
          <span class="n">regex</span> <span class="o">+=</span> <span class="s2">"(?!</span><span class="si">#{</span><span class="n">escaped_x</span><span class="si">}</span><span class="s2">)"</span>
        <span class="k">end</span>
        <span class="vi">@languages</span><span class="p">.</span><span class="nf">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">x</span><span class="o">|</span>
          <span class="n">escaped_x</span> <span class="o">=</span> <span class="no">Regexp</span><span class="p">.</span><span class="nf">escape</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
          <span class="n">regex</span> <span class="o">+=</span> <span class="s2">"(?!</span><span class="si">#{</span><span class="n">escaped_x</span><span class="si">}</span><span class="se">\/</span><span class="s2">)"</span>
        <span class="k">end</span>
      <span class="k">end</span>
      <span class="n">start</span> <span class="o">=</span> <span class="n">disabled</span> <span class="p">?</span> <span class="s1">'ferh'</span> <span class="p">:</span> <span class="s1">'href'</span>
      <span class="sr">%r{</span><span class="si">#{</span><span class="n">start</span><span class="si">}</span><span class="sr">="?</span><span class="si">#{</span><span class="vi">@baseurl</span><span class="si">}</span><span class="sr">/((?:</span><span class="si">#{</span><span class="n">regex</span><span class="si">}</span><span class="sr">[^,'"</span><span class="se">\s</span><span class="sr">/?.]+</span><span class="se">\.</span><span class="sr">?)*(?:/[^</span><span class="se">\]\[</span><span class="sr">)("'</span><span class="se">\s</span><span class="sr">]*)?)"}</span>
    <span class="k">end</span>

    <span class="k">def</span> <span class="nf">absolute_url_regex</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">disabled</span> <span class="o">=</span> <span class="kp">false</span><span class="p">)</span>
      <span class="n">regex</span> <span class="o">=</span> <span class="s1">''</span>
      <span class="k">unless</span> <span class="n">disabled</span>
        <span class="vi">@exclude</span><span class="p">.</span><span class="nf">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">x</span><span class="o">|</span>
          <span class="n">escaped_x</span> <span class="o">=</span> <span class="no">Regexp</span><span class="p">.</span><span class="nf">escape</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
          <span class="n">regex</span> <span class="o">+=</span> <span class="s2">"(?!</span><span class="si">#{</span><span class="n">escaped_x</span><span class="si">}</span><span class="s2">)"</span>
        <span class="k">end</span>
        <span class="vi">@languages</span><span class="p">.</span><span class="nf">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">x</span><span class="o">|</span>
          <span class="n">escaped_x</span> <span class="o">=</span> <span class="no">Regexp</span><span class="p">.</span><span class="nf">escape</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
          <span class="n">regex</span> <span class="o">+=</span> <span class="s2">"(?!</span><span class="si">#{</span><span class="n">escaped_x</span><span class="si">}</span><span class="se">\/</span><span class="s2">)"</span>
        <span class="k">end</span>
      <span class="k">end</span>
      <span class="n">start</span> <span class="o">=</span> <span class="n">disabled</span> <span class="p">?</span> <span class="s1">'ferh'</span> <span class="p">:</span> <span class="s1">'href'</span>
      <span class="sr">%r{(?&lt;!hreflang="</span><span class="si">#{</span><span class="vi">@default_lang</span><span class="si">}</span><span class="sr">" )</span><span class="si">#{</span><span class="n">start</span><span class="si">}</span><span class="sr">="?</span><span class="si">#{</span><span class="n">url</span><span class="si">}#{</span><span class="vi">@baseurl</span><span class="si">}</span><span class="sr">/((?:</span><span class="si">#{</span><span class="n">regex</span><span class="si">}</span><span class="sr">[^,'"</span><span class="se">\s</span><span class="sr">/?.]+</span><span class="se">\.</span><span class="sr">?)*(?:/[^</span><span class="se">\]\[</span><span class="sr">)("'</span><span class="se">\s</span><span class="sr">]*)?)"}</span>
    <span class="k">end</span>
</pre></div></div><h3 id="2-在chirpy主題的_configyml設定文件中將glob模式替換為確切的文件名">2. 在Chirpy主題的’_config.yml’設定文件中將glob模式替換為確切的文件名</h3><p>理想的方法是將上述修補程式合併到Polyglot主線中。但在此之前，需要使用fork版本，這樣每次Polyglot上游更新時都需要跟進，比較麻煩，所以我選擇了另一種方法。</p><p>在<a href="https://github.com/cotes2020/jekyll-theme-chirpy">Chirpy主題的儲存庫</a>中，檢查位於專案根目錄且符合<code class="language-plaintext highlighter-rouge">"*.gem"</code>、<code class="language-plaintext highlighter-rouge">"*.gemspec"</code>、<code class="language-plaintext highlighter-rouge">"*.config.js"</code>模式的檔案，會發現其實也只有以下這三個檔案。</p><ul><li><code class="language-plaintext filepath highlighter-rouge">jekyll-theme-chirpy.gemspec</code><li><code class="language-plaintext filepath highlighter-rouge">purgecss.config.js</code><li><code class="language-plaintext filepath highlighter-rouge">rollup.config.js</code></ul><p>因此，在<code class="language-plaintext filepath highlighter-rouge">_config.yml</code>檔案的<code class="language-plaintext highlighter-rouge">exclude</code>區塊中，刪除globbing模式並改成如下所示的內容，Polyglot 就能夠順利處理了。</p><div file="\_config.yml" class="language-yml highlighter-rouge"><div class="highlight">class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
</pre><td class="rouge-code"><pre><span class="na">exclude</span><span class="pi">:</span> <span class="c1"># 參考 https://github.com/untra/polyglot/issues/204 issue 進行修改。</span>
  <span class="c1"># - "*.gem"</span>
  <span class="pi">-</span> <span class="s">jekyll-theme-chirpy.gemspec</span> <span class="c1"># - "*.gemspec"</span>
  <span class="pi">-</span> <span class="s">tools</span>
  <span class="pi">-</span> <span class="s">README.md</span>
  <span class="pi">-</span> <span class="s">LICENSE</span>
  <span class="pi">-</span> <span class="s">purgecss.config.js</span> <span class="c1"># - "*.config.js"</span>
  <span class="pi">-</span> <span class="s">rollup.config.js</span>
  <span class="pi">-</span> <span class="s">package*.json</span>
</pre></div></div><h2 id="修改搜尋功能">修改搜尋功能</h2><p>完成前述步驟後，網站上絕大部分的功能都如預期般正常運作。然而，我後來才發現一個問題：套用Chirpy主題的頁面右上角的搜尋欄，無法索引<code class="language-plaintext highlighter-rouge">site.default_lang</code>（以本部落格為例，即英文）以外的語言頁面；且在非英文頁面進行搜尋時，搜尋結果也只會顯示英文頁面的連結。</p><p>為了找出原因，我們來檢視一下與搜尋功能相關的檔案，並找出問題出在哪個環節。</p><h3 id="_layoutsdefaulthtml">‘_layouts/default.html’</h3><p>檢視構成部落格所有頁面框架的 <a href="https://github.com/cotes2020/jekyll-theme-chirpy/blob/master/_layouts/default.html"><code class="language-plaintext filepath highlighter-rouge">_layouts/default.html</code> 檔案</a>，可以看到它在 <code class="language-plaintext highlighter-rouge">&lt;body&gt;</code> 元素中載入了 <code class="language-plaintext filepath highlighter-rouge">search-results.html</code> 和 <code class="language-plaintext filepath highlighter-rouge">search-loader.html</code> 的內容。</p><div file="\_layouts/default.html" class="language-liquid highlighter-rouge"><div class="highlight">class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
</pre><td class="rouge-code"><pre>  &lt;body&gt;
    <span class="cp">{%</span><span class="w"> </span><span class="nt">include</span><span class="w"> </span>sidebar.html<span class="w"> </span><span class="na">lang</span><span class="o">=</span><span class="nv">lang</span><span class="w"> </span><span class="cp">%}</span>

    &lt;div id="main-wrapper" class="d-flex justify-content-center"&gt;
      &lt;div class="container d-flex flex-column px-xxl-5"&gt;
        
        (...略...)

        <span class="cp">{%</span><span class="w"> </span><span class="nt">include_cached</span><span class="w"> </span><span class="nv">search-results</span><span class="p">.</span><span class="nv">html</span><span class="w"> </span><span class="na">lang</span><span class="o">=</span><span class="nv">lang</span><span class="w"> </span><span class="cp">%}</span>
      &lt;/div&gt;

      &lt;aside aria-label="Scroll to Top"&gt;
        &lt;button id="back-to-top" type="button" class="btn btn-lg btn-box-shadow"&gt;
          &lt;i class="fas fa-angle-up"&gt;&lt;/i&gt;
        &lt;/button&gt;
      &lt;/aside&gt;
    &lt;/div&gt;

    (...略...)

    <span class="cp">{%</span><span class="w"> </span><span class="nt">include_cached</span><span class="w"> </span><span class="nv">search-loader</span><span class="p">.</span><span class="nv">html</span><span class="w"> </span><span class="na">lang</span><span class="o">=</span><span class="nv">lang</span><span class="w"> </span><span class="cp">%}</span>
  &lt;/body&gt;
</pre></div></div><h3 id="_includessearch-resulthtml">‘_includes/search-result.html’</h3><p><a href="https://github.com/cotes2020/jekyll-theme-chirpy/blob/master/_includes/search-results.html"><code class="language-plaintext filepath highlighter-rouge">_includes/search-result.html</code></a>用於建構<code class="language-plaintext highlighter-rouge">search-results</code>容器，以便在搜尋框中輸入關鍵字時，儲存對應的搜尋結果。</p><div file="\_includes/search-result.html" class="language-html highlighter-rouge"><div class="highlight">class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
</pre><td class="rouge-code"><pre><span class="c">&lt;!-- 搜尋結果 --&gt;</span>

<span class="nt">&lt;div</span> <span class="na">id=</span><span class="s">"search-result-wrapper"</span> <span class="na">class=</span><span class="s">"d-flex justify-content-center d-none"</span><span class="nt">&gt;</span>
  <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">"col-11 content"</span><span class="nt">&gt;</span>
    <span class="nt">&lt;div</span> <span class="na">id=</span><span class="s">"search-hints"</span><span class="nt">&gt;</span>
      {% include_cached trending-tags.html %}
    <span class="nt">&lt;/div&gt;</span>
    <span class="nt">&lt;div</span> <span class="na">id=</span><span class="s">"search-results"</span> <span class="na">class=</span><span class="s">"d-flex flex-wrap justify-content-center text-muted mt-3"</span><span class="nt">&gt;&lt;/div&gt;</span>
  <span class="nt">&lt;/div&gt;</span>
<span class="nt">&lt;/div&gt;</span>
</pre></div></div><h3 id="_includessearch-loaderhtml">‘_includes/search-loader.html’</h3><p><a href="https://github.com/cotes2020/jekyll-theme-chirpy/blob/master/_includes/search-loader.html"><code class="language-plaintext filepath highlighter-rouge">_includes/search-loader.html</code></a>正是實作基於<a href="https://github.com/christian-fei/Simple-Jekyll-Search">Simple-Jekyll-Search</a>函式庫的搜尋功能的關鍵部分。它會在<a href="#assetsjsdatasearchjson"><code class="language-plaintext filepath highlighter-rouge">search.json</code></a>索引檔的內容中尋找與輸入關鍵字相符的部分，並透過在訪客的瀏覽器上執行 JavaScript，將對應的文章連結以<code class="language-plaintext highlighter-rouge">&lt;article&gt;</code>元素的形式回傳，由此可知它是以客戶端(Client-Side)的方式運作。</p><div file="\_includes/search-loader.html" class="language-js highlighter-rouge"><div class="highlight">class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
</pre><td class="rouge-code"><pre><span class="p">{</span><span class="o">%</span> <span class="nx">capture</span> <span class="nx">result_elem</span> <span class="o">%</span><span class="p">}</span>
  <span class="o">&lt;</span><span class="nx">article</span> <span class="kd">class</span><span class="o">=</span><span class="dl">"</span><span class="s2">px-1 px-sm-2 px-lg-4 px-xl-0</span><span class="dl">"</span><span class="o">&gt;</span>
    <span class="o">&lt;</span><span class="nx">header</span><span class="o">&gt;</span>
      <span class="o">&lt;</span><span class="nx">h2</span><span class="o">&gt;&lt;</span><span class="nx">a</span> <span class="nx">href</span><span class="o">=</span><span class="dl">"</span><span class="s2">{url}</span><span class="dl">"</span><span class="o">&gt;</span><span class="p">{</span><span class="nx">title</span><span class="p">}</span><span class="o">&lt;</span><span class="sr">/a&gt;&lt;/</span><span class="nx">h2</span><span class="o">&gt;</span>
      <span class="o">&lt;</span><span class="nx">div</span> <span class="kd">class</span><span class="o">=</span><span class="dl">"</span><span class="s2">post-meta d-flex flex-column flex-sm-row text-muted mt-1 mb-1</span><span class="dl">"</span><span class="o">&gt;</span>
        <span class="p">{</span><span class="nx">categories</span><span class="p">}</span>
        <span class="p">{</span><span class="nx">tags</span><span class="p">}</span>
      <span class="o">&lt;</span><span class="sr">/div</span><span class="err">&gt;
</span>    <span class="o">&lt;</span><span class="sr">/header</span><span class="err">&gt;
</span>    <span class="o">&lt;</span><span class="nx">p</span><span class="o">&gt;</span><span class="p">{</span><span class="nx">snippet</span><span class="p">}</span><span class="o">&lt;</span><span class="sr">/p</span><span class="err">&gt;
</span>  <span class="o">&lt;</span><span class="sr">/article</span><span class="err">&gt;
</span><span class="p">{</span><span class="o">%</span> <span class="nx">endcapture</span> <span class="o">%</span><span class="p">}</span>

<span class="p">{</span><span class="o">%</span> <span class="nx">capture</span> <span class="nx">not_found</span> <span class="o">%</span><span class="p">}</span><span class="o">&lt;</span><span class="nx">p</span> <span class="kd">class</span><span class="o">=</span><span class="dl">"</span><span class="s2">mt-5</span><span class="dl">"</span><span class="o">&gt;</span><span class="p">{{</span> <span class="nx">site</span><span class="p">.</span><span class="nx">data</span><span class="p">.</span><span class="nx">locales</span><span class="p">[</span><span class="nx">include</span><span class="p">.</span><span class="nx">lang</span><span class="p">].</span><span class="nx">search</span><span class="p">.</span><span class="nx">no_results</span> <span class="p">}}</span><span class="o">&lt;</span><span class="sr">/p&gt;{% endcapture %</span><span class="err">}
</span>
<span class="o">&lt;</span><span class="nx">script</span><span class="o">&gt;</span>
  <span class="p">{</span><span class="o">%</span> <span class="nx">comment</span> <span class="o">%</span><span class="p">}</span> <span class="nx">注意</span><span class="err">：</span><span class="nx">相依的函式庫將在</span> <span class="dl">'</span><span class="s1">js-selector.html</span><span class="dl">'</span> <span class="nx">中載入</span> <span class="p">{</span><span class="o">%</span> <span class="nx">endcomment</span> <span class="o">%</span><span class="p">}</span>
  <span class="nb">document</span><span class="p">.</span><span class="nf">addEventListener</span><span class="p">(</span><span class="dl">'</span><span class="s1">DOMContentLoaded</span><span class="dl">'</span><span class="p">,</span> <span class="p">()</span> <span class="o">=&gt;</span> <span class="p">{</span>
    <span class="nc">SimpleJekyllSearch</span><span class="p">({</span>
      <span class="na">searchInput</span><span class="p">:</span> <span class="nb">document</span><span class="p">.</span><span class="nf">getElementById</span><span class="p">(</span><span class="dl">'</span><span class="s1">search-input</span><span class="dl">'</span><span class="p">),</span>
      <span class="na">resultsContainer</span><span class="p">:</span> <span class="nb">document</span><span class="p">.</span><span class="nf">getElementById</span><span class="p">(</span><span class="dl">'</span><span class="s1">search-results</span><span class="dl">'</span><span class="p">),</span>
      <span class="na">json</span><span class="p">:</span> <span class="dl">'</span><span class="s1">{{ </span><span class="dl">'</span><span class="o">/</span><span class="nx">assets</span><span class="o">/</span><span class="nx">js</span><span class="o">/</span><span class="nx">data</span><span class="o">/</span><span class="nx">search</span><span class="p">.</span><span class="nx">json</span><span class="dl">'</span><span class="s1"> | relative_url }}</span><span class="dl">'</span><span class="p">,</span>
      <span class="na">searchResultTemplate</span><span class="p">:</span> <span class="dl">'</span><span class="s1">{{ result_elem | strip_newlines }}</span><span class="dl">'</span><span class="p">,</span>
      <span class="na">noResultsText</span><span class="p">:</span> <span class="dl">'</span><span class="s1">{{ not_found }}</span><span class="dl">'</span><span class="p">,</span>
      <span class="na">templateMiddleware</span><span class="p">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">prop</span><span class="p">,</span> <span class="nx">value</span><span class="p">,</span> <span class="nx">template</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">if </span><span class="p">(</span><span class="nx">prop</span> <span class="o">===</span> <span class="dl">'</span><span class="s1">categories</span><span class="dl">'</span><span class="p">)</span> <span class="p">{</span>
          <span class="k">if </span><span class="p">(</span><span class="nx">value</span> <span class="o">===</span> <span class="dl">''</span><span class="p">)</span> <span class="p">{</span>
            <span class="k">return</span> <span class="s2">`</span><span class="p">${</span><span class="nx">value</span><span class="p">}</span><span class="s2">`</span><span class="p">;</span>
          <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
            <span class="k">return</span> <span class="s2">`&lt;div class="me-sm-4"&gt;&lt;i class="far fa-folder fa-fw"&gt;&lt;/i&gt;</span><span class="p">${</span><span class="nx">value</span><span class="p">}</span><span class="s2">&lt;/div&gt;`</span><span class="p">;</span>
          <span class="p">}</span>
        <span class="p">}</span>

        <span class="k">if </span><span class="p">(</span><span class="nx">prop</span> <span class="o">===</span> <span class="dl">'</span><span class="s1">tags</span><span class="dl">'</span><span class="p">)</span> <span class="p">{</span>
          <span class="k">if </span><span class="p">(</span><span class="nx">value</span> <span class="o">===</span> <span class="dl">''</span><span class="p">)</span> <span class="p">{</span>
            <span class="k">return</span> <span class="s2">`</span><span class="p">${</span><span class="nx">value</span><span class="p">}</span><span class="s2">`</span><span class="p">;</span>
          <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
            <span class="k">return</span> <span class="s2">`&lt;div&gt;&lt;i class="fa fa-tag fa-fw"&gt;&lt;/i&gt;</span><span class="p">${</span><span class="nx">value</span><span class="p">}</span><span class="s2">&lt;/div&gt;`</span><span class="p">;</span>
          <span class="p">}</span>
        <span class="p">}</span>
      <span class="p">}</span>
    <span class="p">});</span>
  <span class="p">});</span>
<span class="o">&lt;</span><span class="sr">/script</span><span class="err">&gt;
</span></pre></div></div><h3 id="assetsjsdatasearchjson">‘/assets/js/data/search.json’</h3><div file="/assets/js/data/search.json" class="language-liquid highlighter-rouge"><div class="highlight">class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
</pre><td class="rouge-code"><pre>---
layout: compress
swcache: true
---

[
  <span class="cp">{%</span><span class="w"> </span><span class="nt">for</span><span class="w"> </span><span class="nv">post</span><span class="w"> </span><span class="nt">in</span><span class="w"> </span><span class="nv">site</span><span class="p">.</span><span class="nv">posts</span><span class="w"> </span><span class="cp">%}</span>
  {
    "title": <span class="cp">{{</span><span class="w"> </span><span class="nv">post</span><span class="p">.</span><span class="nv">title</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="nf">jsonify</span><span class="w"> </span><span class="cp">}}</span>,
    "url": <span class="cp">{{</span><span class="w"> </span><span class="nv">post</span><span class="p">.</span><span class="nv">url</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="nf">relative_url</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="nf">jsonify</span><span class="w"> </span><span class="cp">}}</span>,
    "categories": <span class="cp">{{</span><span class="w"> </span><span class="nv">post</span><span class="p">.</span><span class="nv">categories</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="nf">join</span><span class="p">:</span><span class="w"> </span><span class="s1">', '</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="nf">jsonify</span><span class="w"> </span><span class="cp">}}</span>,
    "tags": <span class="cp">{{</span><span class="w"> </span><span class="nv">post</span><span class="p">.</span><span class="nv">tags</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="nf">join</span><span class="p">:</span><span class="w"> </span><span class="s1">', '</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="nf">jsonify</span><span class="w"> </span><span class="cp">}}</span>,
    "date": "<span class="cp">{{</span><span class="w"> </span><span class="nv">post</span><span class="p">.</span><span class="nv">date</span><span class="w"> </span><span class="cp">}}</span>",
    <span class="cp">{%</span><span class="w"> </span><span class="nt">include</span><span class="w"> </span>no-linenos.html<span class="w"> </span><span class="na">content</span><span class="o">=</span><span class="nv">post</span><span class="p">.</span><span class="nv">content</span><span class="w"> </span><span class="cp">%}</span>
    <span class="cp">{%</span><span class="w"> </span><span class="nt">assign</span><span class="w"> </span><span class="nv">_content</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">content</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="nf">strip_html</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="nf">strip_newlines</span><span class="w"> </span><span class="cp">%}</span>
    "snippet": <span class="cp">{{</span><span class="w"> </span><span class="nv">_content</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="nf">truncate</span><span class="p">:</span><span class="w"> </span><span class="mi">200</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="nf">jsonify</span><span class="w"> </span><span class="cp">}}</span>,
    "content": <span class="cp">{{</span><span class="w"> </span><span class="nv">_content</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="nf">jsonify</span><span class="w"> </span><span class="cp">}}</span>
  }<span class="cp">{%</span><span class="w"> </span><span class="nt">unless</span><span class="w"> </span><span class="nb">forloop.last</span><span class="w"> </span><span class="cp">%}</span>,<span class="cp">{%</span><span class="w"> </span><span class="nt">endunless</span><span class="w"> </span><span class="cp">%}</span>
  <span class="cp">{%</span><span class="w"> </span><span class="nt">endfor</span><span class="w"> </span><span class="cp">%}</span>
]
</pre></div></div><p>此檔案利用Jekyll的Liquid語法，定義了一個JSON檔案，其中包含了網站內所有文章的標題、URL、分類與標籤資訊、撰寫日期、內文前200字的摘要，以及完整的內文內容。</p><h3 id="搜尋功能運作架構及問題點分析">搜尋功能運作架構及問題點分析</h3><p>總結來說，在GitHub Pages上託管Chirpy主題時，搜尋功能的運作流程如下。</p><pre><code class="language-mermaid">stateDiagram
  state "變更" as CH
  state "開始建置" as BLD
  state "建立 search.json" as IDX
  state "靜態網站" as DEP
  state "測試中" as TST
  state "搜尋載入器" as SCH
  state "結果" as R
    
  [*] --&gt; CH: 進行變更
  CH --&gt; BLD: Commit &amp; Push origin
  BLD --&gt; IDX: jekyll build
  IDX --&gt; TST: 建置完成
  TST --&gt; CH: 偵測到錯誤
  TST --&gt; DEP: 部署
  DEP --&gt; SCH: 輸入搜尋
  SCH --&gt; R: 回傳結果
  R --&gt; [*]
</code></pre><p>在此過程中，我確認了<code class="language-plaintext filepath highlighter-rouge">search.json</code>會由Polyglot針對各種語言分別產生，如下所示。</p><ul><li><code class="language-plaintext filepath highlighter-rouge">/assets/js/data/search.json</code><li><code class="language-plaintext filepath highlighter-rouge">/ko/assets/js/data/search.json</code><li><code class="language-plaintext filepath highlighter-rouge">/ja/assets/js/data/search.json</code><li><code class="language-plaintext filepath highlighter-rouge">/zh-TW/assets/js/data/search.json</code><li><code class="language-plaintext filepath highlighter-rouge">/es/assets/js/data/search.json</code><li><code class="language-plaintext filepath highlighter-rouge">/pt-BR/assets/js/data/search.json</code><li><code class="language-plaintext filepath highlighter-rouge">/fr/assets/js/data/search.json</code><li><code class="language-plaintext filepath highlighter-rouge">/de/assets/js/data/search.json</code></ul><p>因此，問題的根源在於「搜尋載入器 (Search Loader)」。之所以無法搜尋到英文以外的其他語言版本頁面，是因為 <code class="language-plaintext filepath highlighter-rouge">_includes/search-loader.html</code> 無論當前瀏覽頁面的語言為何，都只會靜態地載入英文的索引檔 (<code class="language-plaintext filepath highlighter-rouge">/assets/js/data/search.json</code>)。</p><blockquote class="prompt-warning"><ul><li>不過，與Markdown或HTML格式的檔案不同，對於JSON檔案，Polyglot針對<code class="language-plaintext highlighter-rouge">post.title</code>、<code class="language-plaintext highlighter-rouge">post.content</code> 等 Jekyll 內建變數的包裝器(wrapper)雖然能正常運作，但<a href="https://github.com/untra/polyglot?tab=readme-ov-file#relativized-local-urls">Relativized Local Urls</a>功能似乎無法作用。<li>同樣地，在測試過程中我已確認，在JSON檔案範本中，除了Jekyll內建的變數外，無法存取<a href="https://github.com/untra/polyglot?tab=readme-ov-file#features">Polyglot額外提供的<code class="language-plaintext highlighter-rouge">{{ site.default_lang }}</code>、<code class="language-plaintext highlighter-rouge">{{ site.active_lang }}</code> liquid標籤</a>。</ul><p>因此，索引檔中的<code class="language-plaintext highlighter-rouge">title</code>、<code class="language-plaintext highlighter-rouge">snippet</code>、<code class="language-plaintext highlighter-rouge">content</code>等值會根據語言產生不同的內容，但<code class="language-plaintext highlighter-rouge">url</code>的值回傳的卻是未考慮語言的基本路徑，所以必須在「搜尋載入器 (Search Loader)」部分為其追加適當的處理。</p></blockquote><h3 id="解決問題">解決問題</h3><p>要解決這個問題，只需將<code class="language-plaintext filepath highlighter-rouge">_includes/search-loader.html</code>的內容修改如下即可。</p><div file="\_includes/search-loader.html" class="language-plaintext highlighter-rouge"><div class="highlight">class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
</pre><td class="rouge-code"><pre>{% capture result_elem %}
  &lt;article class="px-1 px-sm-2 px-lg-4 px-xl-0"&gt;
    &lt;header&gt;
      {% if site.active_lang != site.default_lang %}
      &lt;h2&gt;&lt;a {% static_href %}href="/{{ site.active_lang }}{url}"{% endstatic_href %}&gt;{title}&lt;/a&gt;&lt;/h2&gt;
      {% else %}
      &lt;h2&gt;&lt;a href="{url}"&gt;{title}&lt;/a&gt;&lt;/h2&gt;
      {% endif %}

(...略...)

&lt;script&gt;
  {% comment %} 注意：相依的函式庫將在 'js-selector.html' 中載入 {% endcomment %}
  document.addEventListener('DOMContentLoaded', () =&gt; {
    {% assign search_path = '/assets/js/data/search.json' %}
    {% if site.active_lang != site.default_lang %}
      {% assign search_path = '/' | append: site.active_lang | append: search_path %}
    {% endif %}
    
    SimpleJekyllSearch({
      searchInput: document.getElementById('search-input'),
      resultsContainer: document.getElementById('search-results'),
      json: '{{ search_path | relative_url }}',
      searchResultTemplate: '{{ result_elem | strip_newlines }}',

(...略...)
</pre></div></div><ul><li>當<code class="language-plaintext highlighter-rouge">site.active_lang</code>（當前頁面語言）和<code class="language-plaintext highlighter-rouge">site.default_lang</code>（網站預設語言）不相同時，我修改了 <code class="language-plaintext highlighter-rouge">{% capture result_elem %}</code> 部分的liquid語法，在從JSON檔案讀取的文章URL前方加上<code class="language-plaintext highlighter-rouge">"/{{ site.active_lang }}"</code>的前綴。<li>用同樣的方法，我修改了<code class="language-plaintext highlighter-rouge">&lt;script&gt;</code>部分，使其在建置過程中比較當前頁面的語言和網站的預設語言。如果兩者相同，則將<code class="language-plaintext highlighter-rouge">search_path</code>指定為預設路徑(<code class="language-plaintext filepath highlighter-rouge">/assets/js/data/search.json</code>)；如果不同，則指定為對應語言的路徑（例如 <code class="language-plaintext filepath highlighter-rouge">/ko/assets/js/data/search.json</code>）。</ul><p>如上修改後，重新建置網站，我確認了搜尋結果現在可以根據不同語言正常顯示。</p><blockquote class="prompt-tip"><p><code class="language-plaintext highlighter-rouge">{url}</code>是一個佔位符，在執行搜尋時，JavaScript會將從JSON檔案讀取到的URL值填入此處，它在建置時點並不是一個有效的URL，因此Polyglot不會將其視為本地化的對象，必須根據語言手動處理。問題在於，經過這樣處理的<code class="language-plaintext highlighter-rouge">"/{{ site.active_lang }}{url}"</code> 範本在建置時會被識別為相對URL，雖然本地化已經完成，但Polyglot並不知道這一點，因此會試圖進行重複的本地化（例如：<code class="language-plaintext filepath highlighter-rouge">"/ko/ko/posts/example-post"</code>）。為了防止這種情況，我明確指定了<a href="https://github.com/untra/polyglot?tab=readme-ov-file#disabling-url-relativizing"><code class="language-plaintext highlighter-rouge">{% static_href %}</code>標籤</a>。</p></blockquote>]]> </content> </entry> </feed>
