<?xml version="1.0" encoding="utf-8"?> <feed xmlns="http://www.w3.org/2005/Atom"> <id>https://www.yunseo.kim/pl/</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:15:29+09:00</updated> <author> <name>Yunseo Kim</name> <uri>https://www.yunseo.kim/pl/</uri> </author><link rel="self" type="application/atom+xml" href="https://www.yunseo.kim/pl/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="pl">Notatki do koreańskiego tłumaczenia Kodeksu postępowania Contributor Covenant 3.0</title><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="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/pl/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="pl">Przy okazji pracy nad koreańskim przekładem wersji 3.0 Contributor Covenant, opublikowanej w lipcu 12025 roku, zapisuję tu najważniejsze założenia, powody wybranych decyzji tłumaczeniowych i osobiste refleksje.</summary> <content type="html" xml:lang="pl"> <![CDATA[<p>Przy okazji pracy nad koreańskim przekładem wersji 3.0 Contributor Covenant, opublikowanej w lipcu 12025 roku, zapisuję tu najważniejsze założenia, powody wybranych decyzji tłumaczeniowych i osobiste refleksje.</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>PR dodający oficjalne koreańskie tłumaczenie Contributor Covenant 3.0 Code of Conduct: <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="contributor-covenant">Contributor Covenant</h2><p><a href="https://www.contributor-covenant.org/">Contributor Covenant</a> to najpowszechniej używany dziś na świecie kodeks postępowania dla społeczności cyfrowych. Po raz pierwszy został opracowany i opublikowany w 12014 roku przez <strong>Coraline Ada Ehmke</strong>, a od 12021 roku jest rozwijany, utrzymywany i udoskonalany przez <strong>OES (Organization for Ethical Source)</strong> oraz jego współtwórców. Jego celem jest wyraźne nazwanie domyślnych wartości, które społeczności mogą wspólnie podzielać, aby budować kulturę wspólnoty, w której każdy czuje się mile widziany i bezpieczny.</p><p>W przeszłości w społecznościach programistycznych często tolerowano agresywny język czy dyskryminujące wypowiedzi pod szyldem merytokracji, a Contributor Covenant odegrał ważną rolę jako punkt zwrotny w przemianie tych społeczności ku bardziej ludzkiemu modelowi kultury, który stawia na inkluzywność, wzajemny szacunek i konstruktywną informację zwrotną. Dziś kodeks ten został przyjęty przez setki tysięcy projektów open source na całym świecie, w tym przez Creative Commons, Linux, Apple, Mastodon, Microsoft, WordPress, IBM i wiele innych.</p><h2 id="co-zmieniło-się-w-aktualizacji-contributor-covenant-30">Co zmieniło się w aktualizacji Contributor Covenant 3.0</h2><p>Wersja 3.0, nad którą OES rozpoczęło prace w 12024 roku z okazji 10-lecia Contributor Covenant i którą opublikowano w lipcu 12025 roku po około roku prac, w porównaniu z poprzednią wersją 2.1 wprowadza następujące główne zmiany.</p><ul><li>Materiały referencyjne:<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="większa-elastyczność">Większa elastyczność</h3><ul><li>W porównaniu z wcześniejszą wersją zoptymalizowaną pod kątem społeczności open source, nowa wersja została zaprojektowana tak, by można ją było stosować także w rozmaitych społecznościach online i offline, nie tylko w obszarze tworzenia oprogramowania<ul><li>np. zamiast <strong>„프로젝트 유지 관리자(Project Maintainers)”</strong> użyto bardziej neutralnego i inkluzywnego określenia <strong>„커뮤니티 중재자(Community Moderators)”</strong></ul><li>Usunięto idiomy charakterystyczne dla amerykańskiego kontekstu kulturowego i zastąpiono je bardziej jednoznacznymi sformułowaniami, które użytkownikom z innych kręgów kulturowych łatwiej zrozumieć i przetłumaczyć</ul><h3 id="zmiana-paradygmatu-od-sprawiedliwości-retrybutywnej-do-naprawczej">Zmiana paradygmatu: od sprawiedliwości retrybutywnej do naprawczej</h3><p>Jedną z największych zmian w Contributor Covenant 3.0 względem wcześniejszej wersji jest przejście od <strong>sprawiedliwości retrybutywnej (Retributive Justice)</strong> do <strong>sprawiedliwości naprawczej (Restorative Justice)</strong>. Sekcja <strong>wytycznych egzekwowania (enforcement guidelines)</strong>, która wcześniej koncentrowała się na kolejnych poziomach sankcji, została przebudowana w sekcję <strong>Reagowanie na szkody i ich naprawianie (Addressing and Repairing Harm)</strong>.</p><ul><li>Zmieniono nazwy części etapów reakcji<li>Oprócz dotychczasowych pozycji dotyczących konsekwencji (Consequence) dodano również wskazówki dotyczące naprawy (Repair), dzięki czemu dokument nie ogranicza się już do sankcjonowania sprawcy, lecz obejmuje też to, jak po zdarzeniu odbudowywać naruszone relacje między stronami, łagodzić konflikt i naprawiać wyrządzone szkody<li>Zamiast kłaść nacisk wyłącznie na egzekwowanie i karanie przez osoby trzecie, dokument przesuwa się w stronę zachęcania — tam, gdzie to możliwe — do dobrowolnej refleksji, pojednania i poprawy oraz do namysłu nad tym, jak po incydencie przywrócić społeczności zdrowe funkcjonowanie</ul><h3 id="jaśniejsze-wytyczne">Jaśniejsze wytyczne</h3><ul><li>Sekcja <strong>Standardy (Our Standards)</strong> została wyraźnie podzielona na dwie części: <strong>Zachowania promowane (Encouraged Behaviors)</strong> i <strong>Zachowania ograniczane (Restricted Behaviors)</strong>, co poprawiło czytelność<li>W szczególności sekcja <strong>Zachowania ograniczane (Restricted Behaviors)</strong> wyraźnie zakazuje nie tylko faktycznego podejmowania określonych szkodliwych działań, lecz także grożenia nimi lub ich promowania, wzmacniając tym samym zdolność do zapobiegania<blockquote><p>Zgadzamy się ograniczać w naszej społeczności następujące zachowania. Przejawy tych zachowań, groźby ich podjęcia oraz ich promowanie stanowią naruszenie niniejszego kodeksu postępowania.</p></blockquote><li>Dodano też nową podsekcję <strong>Inne ograniczenia (Other Restrictions)</strong> w ramach <strong>Zachowań ograniczanych (Restricted Behaviors)</strong>, w której dodatkowo doprecyzowano zasady dotyczące takich obszarów, jak podszywanie się pod inną tożsamość (Misleading identity), niepodawanie źródeł (Failing to credit sources), materiały promocyjne (Promotional materials) oraz nieodpowiedzialna komunikacja (Irresponsible communication), wcześniej niewystarczająco jasno uregulowanych<li>Uwzględniono odpowiedzi z ankiety przeprowadzonej wśród osób realnie stosujących Contributor Covenant w swoich społecznościach i wyraźnie zaznaczono, że stopniowy model egzekwowania (enforcement ladder) stanowi jedynie punkt odniesienia i nie ogranicza uznaniowości osób zarządzających społecznością<blockquote><p>Ta drabina egzekwowania ma służyć jako wskazówka. Nie ogranicza ona zdolności Community Managers do korzystania z własnego uznania i osądu zgodnie z najlepiej pojętym interesem naszej społeczności.</p></blockquote></ul><h3 id="wzmocnienie-zapisów-o-równości-i-zakazie-dyskryminacji">Wzmocnienie zapisów o równości i zakazie dyskryminacji</h3><p>W pierwszej sekcji, <strong>Przyrzeczenie (Our Pledge)</strong>, doprecyzowano i wzmocniono postanowienia dotyczące prawa do równości i zakazu dyskryminacji: część terminów zastąpiono bardziej inkluzywnymi wyrażeniami, a także dodano niektóre współczesne wartości związane z różnorodnością.</p><ul><li>Wyrażenia „rozmiar ciała (body size)” i „wygląd osobisty (personal appearance)” zastąpiono szerszym określeniem „cechy fizyczne (physical characteristics)”<li>„religię (religion)” zastąpiono bardziej pojemnym „przekonania lub religia (philosophy or religion)”<li>„narodowość (nationality)” zastąpiono bardziej pojemnym „pochodzenie narodowe lub społeczne (national or social origin)”<li>Dodatkowo wyraźnie wymieniono „neuroróżnorodność (neurodiversity)”<li>Dodano także „język (language)”, by lepiej uwzględnić osoby nieanglojęzyczne<li>Wprowadzono też ogólne zmiany w sformułowaniach dotyczących równości i różnorodności płciowej<blockquote><p><strong>v2.1</strong><br /> cechy płciowe, tożsamość i ekspresja płciowa albo tożsamość i orientacja seksualna</p><p><strong>v3.0</strong><br /> płeć biologiczna lub społeczna, tożsamość lub ekspresja płciowa, orientacja seksualna</p></blockquote></ul><h2 id="kwestie-uwzględnione-przy-tym-koreańskim-przekładzie">Kwestie uwzględnione przy tym koreańskim przekładzie</h2><h3 id="uwagi-ogólne">Uwagi ogólne</h3><h4 id="użycie-form-grzecznościowych">Użycie form grzecznościowych</h4><p>Przy redagowaniu przyrzeczenia i kodeksu postępowania po koreańsku wybór między formą grzecznościową a formą neutralną zależy od przyjętego kierunku, kultury organizacyjnej oraz postawy, jaką chce się przekazać. Dawniej dominowała forma neutralna, podkreślająca autorytet i dyscyplinę, ale ostatnio coraz częściej spotyka się formę grzecznościową, gdy celem jest zaakcentowanie kultury horyzontalnej i opartej na szacunku.</p><table><thead><tr><th>Styl<th>Forma grzecznościowa(~합니다, ~하겠습니다)<th>Forma neutralna(~한다)<tbody><tr><td>Wydźwięk<td>wzajemny szacunek,<br /> dobrowolna obietnica, zachęta<td>stanowczość, skuteczność prawna,<br /> obiektywna norma<tr><td>Kultura organizacyjna<td>kultura elastyczna i horyzontalna<td>kultura relatywnie bardziej rygorystyczna<tr><td>Główne zastosowania<td>kodeksy postępowania, deklaracje etyczne<td>zobowiązania bezpieczeństwa, umowy o pracę,<br /> prawne regulacje dyscyplinarne<tr><td>Efekt psychologiczny<td>„przestrzegamy tego razem”<br /> (dobrowolna zgoda)<td>„trzeba tego przestrzegać”<br /> (silniejszy nacisk na charakter wiążący)</table><p>Jeśli spojrzeć na <a href="https://github.com/EthicalSource/contributor_covenant/pull/895#pullrequestreview-563210153">dawne dyskusje</a>, wydaje się, że przy tłumaczeniu wersji 2.0 na koreański początkowo rozważano formę grzecznościową, ale ostatecznie <a href="https://github.com/EthicalSource/contributor_covenant/commit/3971299d81149b3fc0ce603a5dd26400509f090f">przeredagowano tekst do formy neutralnej</a>. Szanuję tamtą dyskusję i jej wnioski, a mimo to tym razem ponownie zdecydowałem się na tłumaczenie w formie grzecznościowej z następujących powodów.</p><p>Dzisiejsza kultura społeczności open source jest z natury dość odległa od rygoru, surowości i egzekwowania przymusu, a dużo bliższa wzajemnemu szacunkowi, dobrowolnemu uczestnictwu i wkładowi. <a href="#zmiana-paradygmatu-od-sprawiedliwosci-retrybutywnej-do-naprawczej">W tej wersji Contributor Covenant 3.0 filozofia ta została szczególnie mocno odzwierciedlona w całym tekście</a>. Biorąc pod uwagę podstawowe wartości i filozofię, które oryginał chciał przekazać w tej aktualizacji, a także kulturę i tendencje panujące w społecznościach, uznałem, że w przekładzie na koreański odpowiedniejsza będzie forma grzecznościowa. Korzystałem też z przykładów takich jak <a href="https://rust-kr.org/pages/code-of-conduct/">koreańska grupa użytkowników Rust</a>, <a href="https://pythonkr.github.io/pycon-code-of-conduct/ko/coc/a_intent_and_purpose.html">PyCon KR CoC</a> oraz <a href="https://kubernetes.io/ko/community/code-of-conduct/">koreańska wersja kodeksu postępowania społeczności Kubernetes</a>, które również stosują formę grzecznościową.</p><h4 id="unikanie-zbędnych-konstrukcji-biernych">Unikanie zbędnych konstrukcji biernych</h4><p>W przeciwieństwie do angielskiego, który często posługuje się stroną bierną, koreański zasadniczo preferuje konstrukcje czynne. Jeśli bierne formy z angielskiego oryginału mechanicznie przenosi się do koreańskiego jako konstrukcje bierne, powstaje tekst, który brzmi nienaturalnie i zdradza, że jest tłumaczeniem, a do tego bywa niepoprawny gramatycznie.</p><p>Nie znaczy to oczywiście, że w koreańskim w ogóle nie używa się strony biernej, ale tam, gdzie nie zniekształcało to sensu tekstu, starałem się możliwie często przekładać wyrażenia bierne z oryginału na formy czynne w koreańskim przekładzie.</p><p><strong>np.</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="uwzględnianie-kontekstu-w-jakim-dane-słowo-zostało-użyte-w-tekście-zamiast-słownikowego-i-mechanicznego-przekładu-słów">Uwzględnianie kontekstu, w jakim dane słowo zostało użyte w tekście, zamiast słownikowego i mechanicznego przekładu słów</h4><p>Ponieważ angielski i koreański są językami dość odległymi, słowa w naturalny sposób nie odpowiadają sobie dokładnie w relacji jeden do jednego. Tak jest nawet wtedy, gdy słownik podaje je jako znaczeniowo równoważne.</p><p>Na przykład w poniższym fragmencie “intimate” w danym kontekście nie znaczy “친밀한”, lecz raczej “성적인”.</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>Ponadto w kolejnym fragmencie słownikowy przekład “process” jako “처리할” brzmi niezręcznie. W kontekście tego tekstu właściwsze jest oddanie go jako “추스를”.</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>Z drugiej strony są też zapożyczenia, dla których trudno znaleźć odpowiedni rodzimy odpowiednik. Na przykład w przypadku “community” można by użyć słowa “공동체”, ale uznałem, że wydźwięk angielskiego “community” i koreańskiego “공동체” dość wyraźnie się różni. Dlatego starałem się co do zasady zastępować zapożyczenia rodzimymi odpowiednikami, lecz w sytuacjach, gdy istniało duże ryzyko zniekształcenia sensu lub tonu oryginału, zostawiałem formy takie jak “커뮤니티”.</p><p>Z tych powodów nie chciałem wykonywać prostego, słownikowego i mechanicznego podstawiania wyrazów, lecz dobierać takie wyrażenia koreańskie, które są najbliższe sensowi i kontekstowi oryginału.</p><h4 id="ponadto-przestrzeganie-norm-językowych-języka-koreańskiego">Ponadto: przestrzeganie norm językowych języka koreańskiego</h4><p>Starałem się możliwie dokładnie przestrzegać norm języka koreańskiego, takich jak zasady ortografii hangul i normy języka standardowego.</p><h3 id="sekcja-서약our-pledge">Sekcja “서약(Our Pledge)”</h3><h4 id="śródtytuł">Śródtytuł</h4><p>Dosłowne tłumaczenie “Our Pledge” dawałoby “우리의 맹세”, ale ponieważ w <a href="https://www.contributor-covenant.org/ko/version/2/1/code_of_conduct/">dotychczasowym koreańskim przekładzie</a> użyto formy “서약”, a pod względem naturalności tekstu mieści się ona w pełni w dopuszczalnym zakresie, tym razem również pozostawiłem “서약”.</p><h4 id="tłumaczenie-terminu-caste">Tłumaczenie terminu “caste”</h4><p>W <a href="https://www.contributor-covenant.org/ko/version/2/1/code_of_conduct/">dotychczasowym koreańskim przekładzie wersji 2.1</a> oddano to dosłownie jako “카스트 제도”. Choć słowo caste może funkcjonować także jako akademicki rzeczownik pospolity oznaczający <u>szczegółowo utrwalone systemy hierarchii stanowej w różnych częściach świata</u>, więc nie da się tego uznać po prostu za błąd, to bez takiego szerszego tła większość osób rozumie w codziennym koreańskim “카스트 제도” jako “specyficzny dla hinduistów w Indiach system stanowy wywodzący się m.in. z Praw Manu”. Dlatego, uwzględniając kontekst oryginału, przetłumaczyłem to jako “계급”. W tym miejscu “caste” należy rozumieć jako odnoszące się nie do konkretnego państwa (Indii) czy religii (hinduizmu), lecz do wszelkiego rodzaju systemów statusowych i wynikających z nich klas.</p><h4 id="użycie-wyrażenia-성-zamiast-성별">Użycie wyrażenia “성” zamiast “성별”</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>Biorąc pod uwagę wartości i kontekst, które oryginał próbuje przekazać, “sex”, “gender” i “sexual orientation” nie odnoszą się tu zapewne do rozróżnienia opartego na binarnym podziale na mężczyzn i kobiety. Dlatego zamiast “성별”, które subtelnie implikuje taki binarny podział, użyłem słowa “성”, a zarazem starałem się możliwie zachować rozróżnienia znaczeniowe między sex, gender i sexuality w humanistyce oraz naukach społecznych, tłumacząc ten fragment następująco.</p><blockquote><p>… 생물학적 또는 사회적 성, 성 정체성 또는 성 표현, 성적 지향…</p></blockquote><h3 id="sekcje-장려하는-행동encouraged-behaviors-i-제한하는-행동restricted-behaviors">Sekcje “장려하는 행동(Encouraged Behaviors)” i “제한하는 행동(Restricted Behaviors)”</h3><h4 id="usunięcie-dwukropka-">Usunięcie dwukropka (<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>W angielskim oryginale często spotyka się użycie dwukropka po pełnym zdaniu po to, by wyliczyć przykłady, jak powyżej. Jednak współczesne normy koreańskie ograniczają użycie dwukropka głównie do stylu wyliczeniowego, np. przy podawaniu haseł i odpowiadających im elementów albo objaśnień. Dlatego, o ile cały tekst nie został napisany w formie punktowej, zapis taki jak poniżej jest bardzo nienaturalny i łatwo sprawia wrażenie pobieżnego tłumaczenia maszynowego albo wykonanego przy użyciu LLM.</p><blockquote><p>이러한 점을 유념하며, 우리는 서로를 사려 깊게 대하고 우리가 공유하는 다음 가치를 중심으로 행동할 것에 동의합니다:</p><ol><li>우리 <strong>공동체의 목적</strong>, 활동 및 모임 방식을 존중합니다.<li><strong>친절하고 정직하게</strong> 다른 사람들과 소통합니다. …</ol></blockquote><p>Dlatego, zgodnie z koreańskim użyciem, nie przepisywałem tego miejsca mechanicznie z dwukropkiem, lecz zastąpiłem go kropką (<code class="language-plaintext highlighter-rouge">.</code>), aby tekst brzmiał naturalnie.</p><h4 id="tłumaczenie-wyrażenia-that-would-generally-be-considered-inappropriately">Tłumaczenie wyrażenia “that would generally be considered inappropriately”</h4><p>Tutaj zamiast przekładać “generally” dosłownie jako “일반적으로”, uznałem, że w tym kontekście naturalniejsze będzie oddanie go jako “대부분의 사람들에게”.</p><blockquote><p>…<u>대부분의 사람들이</u> 부적절하다고 간주할 만한…</p></blockquote><h3 id="tłumaczenie-wyrażenia-act-on">Tłumaczenie wyrażenia “act on”</h3><p>Początkowo zastanawiałem się, czy nie przetłumaczyć “act on” po prostu jako “이용하다”, ale w kontekście chodzi raczej o zakaz wszelkich działań podejmowanych — niezależnie od intencji — na podstawie czyichś danych identyfikacyjnych lub prywatnych informacji. Uznałem więc, że tłumaczenie tego jako “이용하다” zbyt zawęża znaczenie, i oddałem to następująco.</p><blockquote><p><strong>비밀 침해.</strong> 타인의 신상 관련 정보 또는 개인적인 정보를 당사자의 허락 없이 공유하거나, 그 정보<u>를 바탕으로 행하는</u> 모든 행위.</p></blockquote><h3 id="sekcja-문제-신고reporting-an-issue">Sekcja “문제 신고(Reporting an Issue)”</h3><ul><li>“this Code of Conduct <strong>reinforces</strong> encouraged behaviors and norms that …”: przetłumaczone jako “본 행동 강령은 …는 권장 행동 방식과 규범을 <strong>증진합니다</strong>”<li>“in a timely manner”: przetłumaczone jako “적시에”<li>“while prioritizing safety and confidentiality”: przetłumaczone jako “안전과 비밀 유지를 우선시한다는 전제 하에”<li>“In order to <strong>honor</strong> these values”: przetłumaczone jako “이들 가치를 <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="sekcja-피해-대응-및-교정addressing-and-repairing-harm">Sekcja “피해 대응 및 교정(Addressing and Repairing Harm)”</h3><ul><li>“Addressing”: przetłumaczone jako “대응”<li>“Repairing”: przetłumaczone jako “교정”</ul><h4 id="tłumaczenie-event-consequence-repair">Tłumaczenie <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>Był to fragment, nad którym długo się zastanawiałem, bo w koreańskim trudno oddać go naturalnie. Dosłowne tłumaczenia jako “사건”, “결과”, “교정” sprawiają, że tekst brzmi dość niezręcznie.</p><p>Po namyśle nad tym, jak możliwie najpełniej oddać <a href="#zmiana-paradygmatu-od-sprawiedliwosci-retrybutywnej-do-naprawczej">filozofię oryginału</a>, a jednocześnie zachować naturalność tekstu, zdecydowałem się na następujące przekłady.</p><ul><li>“Event”: przetłumaczone jako “적용 상황”<li>“Consequence”: przetłumaczone jako “대응 조치”<li>“Repair”: początkowo rozważałem “회복 조치”, ale uznałem, że słowo “조치” sugeruje bardziej interwencję i egzekwowanie przez kogoś z zewnątrz niż dobrowolną refleksję i poprawę ze strony samej osoby, co rozmija się z intencją oryginału. Ostatecznie więc przetłumaczyłem to jako “교정 노력”</ul><h4 id="tłumaczenie-wyrażenia-seeking-clarification-on-expectations">Tłumaczenie wyrażenia “seeking clarification on expectations”</h4><p>“expectations” można przetłumaczyć dosłownie jako “기대 사항” i sens byłby zrozumiały, ale dla płynniejszego brzmienia tekstu oddałem to jako “준수 사항”.</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” można by oddać jako żądanie wyjaśnień, ale w kontekście pozycji Repair chodzi o pożądane działania i postawę po incydencie ze strony osoby, która problem spowodowała. Gdyby więc przetłumaczyć clarification i seeking odpowiednio jako wyjaśnienie i żądanie, sens robi się dziwny. Uznałem, że najwłaściwiej będzie oddać to jako wysiłek mający na celu <u>jasne potwierdzenie i przyswojenie</u> <u>zasad, których należy przestrzegać</u>, po to, by dana osoba mogła się zreflektować i nie powtórzyć tego samego błędu.</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="tłumaczenie-wyrażenia-cooldown">Tłumaczenie wyrażenia “cooldown”</h4><p>Słownikowo może ono oznaczać chłodzenie, wyciszenie po ćwiczeniach albo uspokojenie; tutaj najbliższe kontekstowi jest właśnie uspokojenie. Chodzi o znaczenie najbliższe temu, co wyraża koreańskie “머리 좀 식혀라.”</p><p>Jednak “time-limited cooldown period” brzmi po koreańsku dość niezręcznie jako “한시적 진정 기간”, dlatego w tym przekładzie “cooldown period” oddałem jako “자숙 기간”.</p><h4 id="tłumaczenie-wyrażenia-time-to-process-the-incident">Tłumaczenie wyrażenia “time to process the incident”</h4><p><a href="#uwzglednianie-kontekstu-w-jakim-dane-slowo-zostalo-uzyte-w-tekscie-zamiast-slownikowego-i-mechanicznego-przekladu-slow">Jak wspomniano wyżej</a>, przetłumaczyłem to jako “해당 일을 추스를 시간”.</p><h4 id="tłumaczenie-wyrażeń-suspension-i-ban">Tłumaczenie wyrażeń “suspension” i “ban”</h4><p>W <a href="https://www.contributor-covenant.org/ko/version/2/1/code_of_conduct/">dotychczasowym koreańskim przekładzie wersji 2.1</a> “ban” przetłumaczono jako “제재”, ale “제재” jest pojęciem nadrzędnym obejmującym wszelkie środki podejmowane wobec naruszeń, także na niższych etapach, takich jak ostrzeżenie czy czasowe ograniczenie aktywności, więc znaczenie staje się niejednoznaczne. Poza tym angielskie “ban” ma jasne znaczenie: zakazać, trwale zablokować, a wyrażenie odpowiadające “(계정 등의) 영구 정지” jest w koreańskim całkowicie naturalne i powszechnie używane, więc nie widziałem powodu, by koniecznie je omijać parafrazą.</p><p>To samo dotyczy “suspension”, które również jasno oznacza zawieszenie lub wstrzymanie i nie wymaga sztucznej parafrazy.</p><p>Dlatego “Temporary Suspension” i “Permanent Ban” przetłumaczyłem odpowiednio jako “일시적 정지” i “영구 정지”.</p><h4 id="tłumaczenie-zdania-this-enforcement-ladder-is-intended-as-a-guideline">Tłumaczenie zdania “This enforcement ladder is intended as a guideline.”</h4><p>Wyrażenie “enforcement ladder” przetłumaczyłem jako “단계적 집행 기준”. Ponadto zdanie to zostało użyte w kontekście podkreślenia, że wspomniane wyżej etapy egzekwowania są tylko jedną z możliwych opcji, a zarazem mają gwarantować uznaniowość i decyzyjność osób zarządzających społecznością, dlatego rodzajnik “a” oddałem jako “하나의”. W przekładzie brzmi to następująco.</p><blockquote><p><u>이 단계적 집행 기준은 하나의 기준선으로 마련한 것입니다.</u> 이는 커뮤니티의 최선의 이익에 부합하는 커뮤니티 관리자의 재량권과 판단 권한을 제한하지 않습니다.</p></blockquote><h2 id="na-zakończenie">Na zakończenie</h2><p>Wiele dokumentów i projektów o takim prospołecznym charakterze bywa tłumaczonych na różne języki przez wolontariuszy i współtwórców. Niestety, w przypadku tłumaczeń na koreański nierzadko albo w ogóle brakuje tłumacza i przekład nie powstaje, albo istniejąca wersja brzmi nienaturalnie, jakby była wykonana mechanicznie — do tego stopnia, że jako Koreańczyk nieraz miałem ochotę pomyśleć: „już lepiej przeczytam to po angielsku”, i przełączyć się na stronę angielską.</p><p>Kiedy tym razem zdecydowałem się wnieść wkład w koreańskie tłumaczenie, uznałem, że skoro już mam to zrobić, powinienem przygotować przekład na tyle dobry, by czytelnik nie odczuwał dysonansu nawet wtedy, gdyby uznał, że tekst od początku został napisany po koreańsku przez koreańskiego autora. Starałem się zrozumieć i oddać filozofię oraz subtelny kontekst oryginału, zwłaszcza to, jakie sformułowania zmieniły się w wersji 3.0 względem 2.1 i z jakich powodów autorzy oryginału dokonali właśnie takich wyborów.</p><p>Ze względu na naturę języka tłumaczenie nie działa tak, że ten sam tekst wejściowy zawsze daje identyczny wynik jak jakaś funkcja. Różni tłumacze przygotują nieco różne przekłady, a wynika to nie tylko z poziomu umiejętności, lecz z samej istoty tłumaczenia, a szerzej — pisania, w którym nie istnieje jedna jedyna poprawna odpowiedź. Ostatnio niemal we wszystkich swoich pracach pomocniczo korzystam z AI, a nawet wpisy na tym blogu automatycznie tłumaczę i publikuję w wielu językach, podłączając API modeli LLM. Jednak akurat w tym przypadku naprawdę chciałem przygotować przekład dopracowany i możliwie najlepszy, na jaki mnie stać. Wielokrotnie samodzielnie weryfikowałem każde sformułowanie i zastanawiałem się, jak najwierniej, a zarazem naturalnie oddać sens oryginału. W efekcie przedkładam tu rezultat mojej subiektywnej, ale najlepszej możliwej oceny i interpretacji. Dziś, gdy wszyscy korzystają z AI, uważam, że przynajmniej w przypadku tłumaczeń ważnych dokumentów, takich jak przyrzeczenia czy kodeksy postępowania, przekład ma wartość tylko wtedy, gdy oferuje wyraźną przewagę nad wynikiem uzyskanym przez po prostu wrzucenie oryginału do AI z poleceniem „przetłumacz to”. Przynajmniej na obecnym etapie, tj. w marcu 12026 roku, mogę z przekonaniem powiedzieć, że w <a href="https://github.com/EthicalSource/contributor_covenant/pull/1590">tym przekładzie</a> udało się w pełni zachować subtelny ton i kontekst oryginału, których tłumaczenie maszynowe czy LLM nie potrafią jeszcze całkowicie uchwycić.</p><p>Na dzień 20 marca 12026 roku Contributor Covenant 3.0, poza angielskim oryginałem i koreańskim przekładem, który właśnie złożyłem, został w pełni przetłumaczony tylko na trzy języki: bengalski, niemiecki i chiński kontynentalny, a jeśli spojrzeć na <a href="https://github.com/EthicalSource/contributor_covenant/pulls">listę otwartych PR-ów</a>, widać też wiele języków, dla których szkice tłumaczeń zostały już zgłoszone w PR-ach, ale nie zostały ostatecznie zatwierdzone z powodu braku recenzentów. Co więcej, wiele wersji językowych nie dotarło jeszcze nawet do 3.0, a nadal pozostaje przy 1.4. Jeśli z jakiegokolwiek powodu czyta to ktoś, kto posługuje się innym językiem niż koreański, to <a href="https://github.com/EthicalSource/contributor_covenant?tab=contributing-ov-file#translators-and-native-speakers">ponieważ sam proces włączenia się w tłumaczenie nie jest szczególnie skomplikowany</a>, byłoby ogromną pomocą dla OES i użytkowników danego języka, gdyby poświęcił na to choć jeden dzień weekendu i dołożył swoją cegiełkę. Dla mnie również był to pierwszy raz, kiedy wniosłem wkład w taki projekt tłumaczeniowy i przeczytałem cały kodeks postępowania od początku do końca, ale uważam, że było to zadanie zdecydowanie warte kilku godzin czasu. Korea należy do krajów, w których — względem liczby ludności — liczba programistów aktywnie działających w społecznościach open source, takich jak GitHub, jest dość wysoka. Tym bardziej byłbym rad, gdyby <a href="https://github.com/EthicalSource/contributor_covenant/pull/1590">koreańska wersja</a> kodeksu postępowania Contributor Covenant 3.0, którą tym razem przetłumaczyłem i zgłosiłem, została zrecenzowana także przez innych Koreańczyków, a najlepiej również szeroko przyjęta i praktycznie wykorzystywana w wielu miejscach.</p><p>Jak powiedział <strong>profesor Nathan Schneider</strong>, cytowany we <a href="https://ethicalsource.dev/blog/contributor-covenant-3/">wpisie na blogu OES</a>, Contributor Covenant stanowi niezbędny fundament budowania odpowiedzialnych i przejrzystych społeczności, a w praktyce faktycznie przyczyniał się do rozwiązywania konfliktów. Zwyczajowo na GitHubie i w podobnych miejscach często po prostu naciska się przycisk „Add a code of conduct” i wkleja gotowy szablon, ale z jakiegoś powodu szablon automatycznie udostępniany przez GitHub nie jest aktualizowany od wersji 2.0. Ponieważ wersja 3.0 przynosi duże zmiany i ulepszenia względem 2.0 i 2.1, chciałbym zachęcić, by — jeśli to możliwe — przyjmować najnowszą wersję przez <a href="https://www.contributor-covenant.org/adopt/">oficjalną stronę</a>. Sam tekst wcale nie jest tak długi, więc tym bardziej warto przy tej okazji choć raz spokojnie przeczytać go w całości. Kończę więc z nadzieją, że Contributor Covenant 3.0 Code of Conduct i przygotowany tym razem <a href="https://github.com/EthicalSource/contributor_covenant/pull/1590">koreański przekład</a> spotkają się z dużym zainteresowaniem.</p>]]> </content> </entry> <entry><title xml:lang="pl">Jak przygotować materiały IR (How to Prepare IR Materials)</title><link href="https://www.yunseo.kim/pl/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/pl/posts/how-to-prepare-ir-materials/</id> <author> <name>Yunseo Kim</name> </author> <category term="Startup" /> <category term="IR" /> <summary xml:lang="pl">Wyjaśniam, czym są materiały IR, oraz porządkuję elementy, które powinny znaleźć się w dobrym IR, by skutecznie pozyskać finansowanie.</summary> <content type="html" xml:lang="pl"> <![CDATA[<p>Wyjaśniam, czym są materiały IR, oraz porządkuję elementy, które powinny znaleźć się w dobrym IR, by skutecznie pozyskać finansowanie.</p><em><p>* Mathematical equations and diagrams included in posts may not display properly when viewed with a feed reader.</p></em><h2 id="czym-są-materiały-ir">Czym są materiały IR?</h2><p><strong>IR</strong> to skrót od <strong>Investor Relations</strong> — termin obejmujący wszystkie materiały i działania potrzebne do przedstawienia i promowania firmy inwestorom, budowania relacji oraz pozyskania inwestycji. Mówiąc o „materiałach IR”, najczęściej ma się na myśli dokumenty, którymi firma przedstawia się inwestorom w celu pozyskania finansowania.</p><h2 id="co-powinno-znaleźć-się-w-materiałach-ir">Co powinno znaleźć się w materiałach IR</h2><p>Ponieważ celem materiałów IR jest pozyskanie inwestycji, trzeba z perspektywy inwestora przekonująco pokazać, dlaczego warto zainwestować właśnie w tę spółkę. Dlatego materiały powinny obejmować całościowy obraz biznesu: podsumowanie usługi, otoczenie rynkowe, opis produktu/usługi, krajobraz konkurencyjny, wyniki, model biznesowy, plany wzrostu, zespół itd.</p><ul><li><strong>Pitch deck</strong>:<ul><li>Celem jest zostawienie <strong>krótkiego i mocnego</strong> oraz <strong>pozytywnego pierwszego wrażenia</strong> u szerokiego grona potencjalnych inwestorów<li>Używany na wczesnym etapie pozyskiwania finansowania<li>Zwykle 10–15 slajdów: zwięźle, z naciskiem na warstwę wizualną</ul><li><strong>IR deck</strong>:<ul><li>Dostarcza <strong>pogłębionych informacji finansowych i długoterminowej strategii</strong> spółki<li>Dla profesjonalnych inwestorów, którzy zaczęli wykazywać zainteresowanie i są przed podjęciem decyzji<li>Pozwala inwestorom przeprowadzić <strong>głębszą ocenę i wyrobić sobie zdanie</strong><li>Zwykle 20–30 slajdów: bardziej szczegółowe informacje, m.in. <strong>plan finansowy, analiza rynku, zespół, analiza konkurencji</strong></ul></ul><h3 id="misja--wizja-missionvision">Misja / wizja (Mission/Vision)</h3><ul><li>Jaka jest fundamentalna wartość, którą firma chce dostarczyć?</ul><blockquote class="prompt-tip"><p>To część, którą można uznać za rdzeń tożsamości firmy. Warto umieścić misję i wizję na samym początku materiałów IR i ująć każdą z nich zwięźle, ale jednoznacznie — po jednym zdaniu.</p></blockquote><h3 id="podsumowanie-usługi">Podsumowanie usługi</h3><h4 id="problem-problem">Problem (Problem)</h4><ul><li>Jaki problem rynkowy ta usługa chce rozwiązać?<li>Jak bardzo konsumenci odczuwają z tym problemem dyskomfort?<li>Dlaczego ten problem jest ważny?<li>Czy istnieje popyt na rozwiązanie? Kto jest targetem?</ul><h4 id="rozwiązanie-solution">Rozwiązanie (Solution)</h4><ul><li>Jak konkretnie zamierzacie rozwiązać wspomniany problem?<li>Jakie korzyści zyskuje konsument i użytkownik końcowy w porównaniu z dotychczasowymi sposobami?</ul><blockquote class="prompt-tip"><p>Inwestorzy często nie są ekspertami w danej dziedzinie, dlatego warto opisywać usługę z perspektywy konsumenta, a nie dewelopera. Szczegóły techniczne najlepiej zostawić na później — np. gdy pojawią się dodatkowe pytania.</p></blockquote><h3 id="wielkość-rynku-market-size">Wielkość rynku (Market Size)</h3><p>Jeśli bezpośrednio określa się wielkość rynku w pieniądzu, wynik może znacząco się różnić w zależności od metody wyliczenia i wielu zmiennych, a ryzyko sporów co do założeń jest relatywnie wysokie. Bezpieczniej i często skuteczniej jest pokazać wielkość rynku za pomocą innych wskaźników, np. liczby potencjalnych użytkowników czy liczby/częstotliwości transakcji.</p><ul><li><strong>TAM (Total Addressable Market, cały rynek)</strong>: maksymalna teoretycznie dostępna wielkość rynku przy założeniu idealnego scenariusza, w którym wykluczamy wszystkich konkurentów i osiągamy 100% udziału globalnie; dotyczy sytuacji, gdy produkt/usługa jest oferowany(a) na całym świecie<li><strong>SAM (Service Available Market, rynek dostępny)</strong>: realnie osiągalna wielkość rynku w zakresie, który firma faktycznie adresuje, przy uwzględnieniu ograniczeń geograficznych, infrastrukturalnych i regulacyjnych<li><strong>SOM (Service Obtainable Market, rynek osiągalny / „do zdobycia”)</strong>: wielkość rynku, którą realnie można zdobyć na początku nawet w ramach SAM, biorąc pod uwagę konkurencję, możliwości firmy, strategię marketingową itd.</ul><blockquote class="prompt-tip"><p>Przy szacowaniu wielkości rynku często wygląda to tak, że dla TAM lub SAM podaje się konkretne liczby i wskaźniki, cytując zewnętrzne raporty rynkowe, natomiast kluczowy z perspektywy startupu SOM opisuje się w stylu: „jeśli zdobędziemy X% udziału w tym rynku, osiągniemy Y przychodu”. Szczerze mówiąc, gdy dopiero przygotowywałem się do założenia firmy, w pierwszym wewnętrznym szkicu materiałów IR też pisałem w ten sposób.</p><p>Problem w tym, że z perspektywy inwestora takie plany dotyczące „ile % rynku zdobędziemy” są trudne do uznania za wiarygodne. Samo wypuszczenie usługi nie oznacza, że łatwo przejmie się rynek, a ogólne stwierdzenie, że zdobędzie się kilka procent „wśród wszystkich uczestników rynku”, ma niską siłę perswazyjną.</p><p>Kluczowe jest, aby jednocześnie pokazać, że docelowy TAM i SAM są wystarczająco duże, oraz przedstawić logikę: jak definiujecie <strong>wczesną grupę klientów (Immediate Market)</strong>, a następnie jakie kolejne segmenty klientów będziecie etapami „dobudowywać”, aby zwiększać SOM.</p></blockquote><blockquote class="prompt-tip"><p><strong>Timing biznesu</strong></p><ul><li>W biznesie timing ma ogromne znaczenie<li>Trzeba umieć wyjaśnić inwestorom, dlaczego właśnie teraz ten biznes może się udać i dlaczego warto inwestować właśnie teraz<li>Należy przedstawić powody, dla których to dobry moment na realizację: możliwości technologiczne, zmiany zachowań ludzi, trendy społeczne, zmiany środowiskowe itd.</ul></blockquote><h3 id="opis-produktuusługi-product">Opis produktu/usługi (Product)</h3><ul><li>Jakie są kluczowe cechy i funkcje produktu/usługi?<li>Jaki jest konkretny sposób działania, jakie są przykłady użycia?</ul><h3 id="model-biznesowy-business-model">Model biznesowy (Business Model)</h3><ul><li>Jak będziecie zarabiać?<li>Kto płaci? (Ponieważ użytkownik końcowy nie zawsze jest tym, kto płaci, trzeba jasno wskazać, kto realnie generuje przychód)<li>Za co będziecie pobierać opłaty? Jak będzie wyglądać pricing?</ul><h3 id="konkurencja-competition">Konkurencja (Competition)</h3><ul><li>Kim są główni konkurenci?<li><strong>Z perspektywy klienta</strong>: pod jakim względem nasza usługa/produkt jest lepsza i ma przewagę nad ofertą konkurencji?<li>Które usługi uznajecie za konkurencyjne i jakich klientów wybieracie jako główny target?</ul><blockquote class="prompt-tip"><p>Rzetelna analiza konkurencji pomaga skutecznie pokazać inwestorom, że dobrze rozumiecie sytuację rynkową.</p></blockquote><h3 id="wyniki-i-strategia-wejścia-na-rynek-go-to-market-strategy">Wyniki i strategia wejścia na rynek (Go-to Market Strategy)</h3><ul><li>Jaki jest najważniejszy kluczowy wskaźnik sukcesu dla tego biznesu?<ul><li>np. liczba zamówień, miesięczna liczba aktywnych użytkowników (MAU), miesięczna wartość transakcji itd.</ul><li>Jakie wyniki osiągnęliście, koncentrując się na tym wskaźniku?<li>Jakie są główne narzędzia i kanały marketingowe spółki?<li>Jakie są metody pozyskiwania nowych klientów i jaki jest ich koszt?<li>*<strong>Jaka jest wartość życiowa klienta (LTV)</strong>?</ul><blockquote class="prompt-info"><p>*<strong>Wartość życiowa klienta (Customer Lifetime Value, LTV)</strong>: liczbowy wskaźnik tego, ile łącznego zysku przynosi jeden użytkownik przez cały okres korzystania z usługi.</p></blockquote><blockquote class="prompt-tip"><p>Warto pominąć poboczne metryki niezwiązane bezpośrednio z kluczowym wskaźnikiem.</p></blockquote><blockquote class="prompt-tip"><p><strong>Jeśli to ultra-wczesny startup bez przychodów</strong></p><ul><li>Wyznaczcie i pokażcie <strong>próg rentowności</strong><li>Nie „pompować” wskaźników przychodowych; ustawiać je realistycznie z konserwatywnej perspektywy<li>Przedstawić scenariusz przychodów w pierwszym roku ich pojawienia się oraz dołączyć plan sprzedażowy na kolejne lata, aby zbudować przekonanie, że wzrost może być stabilny<ul><li>prognoza krótkoterminowa: 1 rok<li>prognoza średnioterminowa: 3 lata<li>prognoza długoterminowa: 5 lat</ul><li>Aktywnie wykorzystywać wykresy i tabele, aby dało się wszystko szybko ogarnąć wzrokiem<li>Warto uwzględnić <strong>slajdy weryfikacji hipotez</strong>, by przekonująco pokazać, dlaczego przyjęto takie, a nie inne KPI i scenariusze przychodowe, oraz wzmocnić uzasadnienie<ul><li>Należy przygotować mocne podstawy prognoz poprzez wielokrotne eksperymenty i weryfikację hipotez</ul></ul></blockquote><h3 id="zespół-the-team">Zespół (The Team)</h3><ul><li>Zamiast przedstawiać wszystkich, lepiej zaprezentować głównie kluczowych członków zespołu (w tym CEO), którzy pełnią najważniejsze role<li>Doświadczenie i kompetencje: 2–3 najważniejsze punkty; warto używać logotypów itp., aby poprawić czytelność<li>Jeśli są inwestorzy lub doradcy, którzy odegrali/odgrywają kluczową rolę, warto ich również uwzględnić</ul><h3 id="plany-wzrostu-milestones">Plany wzrostu (Milestones)</h3><ul><li>Przedstawić cele do osiągnięcia w czasie (wg etapów i okresów)<li>Zwykle wyznacza się cele do kolejnej rundy (np. seed → do Series A, Series A → do Series B)<li>Podać oczekiwaną kwotę inwestycji i plan wykorzystania środków<li>Lepiej nie brać zbyt długich interwałów (np. pół roku lub dłużej), tylko dzielić na krótsze odcinki, rzędu ok. 2 miesięcy</ul><h3 id="plan-finansowy-financials">Plan finansowy (Financials)</h3><p>W przypadku IR decka plan finansowy powinien się znaleźć.</p><ul><li>Tabela planu finansowego na kolejne 3–5 lat<li><strong>Unit economics</strong>: przychód i koszt w przeliczeniu na jednostkę (np. na klienta)<li><strong>Burn rate</strong>: tempo spalania gotówki w młodej firmie, czyli relacja wydatków (koszty założenia, R&amp;D i inne) ponoszonych w gotówce<li>Łączne przychody i koszty<li>EBITDA albo rachunek przepływów pieniężnych (cash flow) itd.</ul><blockquote class="prompt-warning"><ul><li>Uważać, aby nie przedstawiać zbyt nierealistycznych planów finansowych<li>Często zdarza się zawyżać prognozowane przychody i zaniżać koszty, więc przy szacowaniu skali przychodów trzeba zachować ostrożność<li>Koszty należy możliwie dokładnie oszacować, uwzględniając koszty rozwoju produktu/usługi oraz koszty operacyjne</ul></blockquote><h2 id="na-co-kłaść-nacisk-na-poszczególnych-etapach-finansowania">Na co kłaść nacisk na poszczególnych etapach finansowania</h2><h3 id="seed">Seed</h3><ul><li>Etap budowy MVP, sprawdzenia reakcji rynku i weryfikacji sensowności modelu biznesowego<li>Należy mocno akcentować wstępne hipotezy, wyniki ich weryfikacji, wyniki eksperymentów z MVP oraz wynikające z nich przychody</ul><h3 id="pre-a">Pre-A</h3><ul><li>Etap, w którym trzeba udowodnić potencjał wzrostu i zabezpieczyć dodatkowy kapitał na rozwój produktu, marketing, rekrutację itd.<li>Potrzebne wyjaśnienie: jakie są kluczowe wskaźniki biznesu, jakimi działaniami i jak skutecznie rośnie firma oraz jakie są perspektywy dalszego wzrostu</ul><h3 id="series-a">Series A</h3><ul><li>Etap, na którym firma rośnie na poważnie i zwiększa swoją wycenę<li>Ponieważ w tym momencie weryfikacja hipotez powinna być już zakończona, trzeba budować zaufanie inwestora poprzez ilościowe (mierzalne) wyniki biznesowe</ul><h2 id="kilka-wskazówek">Kilka wskazówek</h2><ul><li>W pierwszych pięciu slajdach warto szczególnie się przyłożyć, aby zostawić pozytywne pierwsze wrażenie<li>Misję/wizję z pierwszego slajdu można powtórzyć jeszcze raz na ostatnim slajdzie<li>Wszystko przekazywać konkluzją na początku (najpierw sedno)<li>Przedmiotem inwestycji jest <strong>firma</strong>, więc także w materiałach IR nazwa spółki jest ważniejsza niż nazwa usługi<li>Potencjalni inwestorzy czytający materiały IR mogą nie być osobami z branży — warto więc używać możliwie prostych sformułowań, a gdy nie da się uniknąć terminów specjalistycznych, dopisać krótkie wyjaśnienie<li>Nie mieszać problemu rynkowego z rozwiązaniem — rozdzielić je<li>Tekst opierać na słowach-kluczach; przy obrazach unikać zrzutów ekranu, by poprawić czytelność<li>Podawać dokładne i konkretne liczby w tabelach lub na wykresach<li>Uważać, aby nie pominąć prezentacji zespołu, oczekiwanej kwoty inwestycji oraz planu wykorzystania środków<li>Dobrze jest pokazać również strategię wyjścia dla inwestorów (exit)<li>Nawet jeśli nie jest to dopięte na 100%, warto choć z grubsza pokazać plan docelowej struktury udziałowców (w jakich proporcjach)<li>Nie upychać zbyt wielu materiałów w treści; jeśli trzeba, przenieść je do załączników<li>Na ostatnim slajdzie umieścić dane kontaktowe (e-mail, numer telefonu, imię i nazwisko)<li>Font ma duże znaczenie, więc użyj czytelnego kroju pisma, np. <a href="https://cactus.tistory.com/306">Pretendard</a>, i przygotuj wszystko w PDF, aby uniknąć problemów z „rozjechaniem” się czcionek</ul><h2 id="materiały-referencyjne">Materiały referencyjne</h2><h3 id="kanał-publikacji-raportów-spółek-kind">Kanał publikacji raportów spółek 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>Kanał publikacji raportów spółek prowadzony przez Korea Exchange<li>Dostarcza informacje raportowe dla spółek notowanych na KOSPI, KOSDAQ i KONEX<li>Pozwala przeglądać materiały IR spółek giełdowych, dzięki czemu można sprawdzić, jak są zbudowane inne, niedawno przygotowane materiały IR</ul>]]> </content> </entry> <entry><title xml:lang="pl">Podstawowe pojęcia kryptografii</title><link href="https://www.yunseo.kim/pl/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/pl/posts/basic-concepts-of-cryptography/</id> <author> <name>Yunseo Kim</name> </author> <category term="Dev" /> <category term="Cryptography" /> <summary xml:lang="pl">Czym jest kryptografia? Poznaj podstawy: szyfrowanie symetryczne i asymetryczne, dystrybucję klucza oraz zasadę Kerckhoffsa.</summary> <content type="html" xml:lang="pl"> <![CDATA[<p>Czym jest kryptografia? Poznaj podstawy: szyfrowanie symetryczne i asymetryczne, dystrybucję klucza oraz zasadę Kerckhoffsa.</p><em><p>* Mathematical equations and diagrams included in posts may not display properly when viewed with a feed reader.</p></em><h2 id="czym-jest-kryptografia">Czym jest kryptografia</h2><p><strong>Kryptografia (cryptography)</strong> jest w istocie poddziedziną nauki, której celem jest obrona <strong>protokołów (protocols)</strong> przed działaniami przeciwnika.</p><p>Protokół to lista kroków, które jedna lub więcej osób musi wykonać, aby coś osiągnąć. Na przykład, jeśli chcemy współdzielić schowek między urządzeniami, to poniższe kroki stanowią protokół współdzielenia schowka:</p><ol><li>Gdy na jednym z urządzeń nastąpi zmiana w schowku, kopiuje ono zawartość schowka i przesyła ją na serwer.<li>Serwer informuje pozostałe urządzenia, że w udostępnionym schowku zaszła zmiana.<li>Pozostałe urządzenia pobierają z serwera zawartość udostępnionego schowka.</ol><p>Nie jest to jednak dobry protokół, ponieważ jeśli wyślemy na serwer treść schowka w postaci jawnej i tak samo ją pobierzemy, to w trakcie komunikacji ktoś po drodze (albo nawet sam serwer) może podejrzeć zawartość schowka. Uwzględnienie istnienia wroga, który chce podejrzeć tę zawartość, oraz obrona przed nim — to właśnie rola kryptografii.</p><h2 id="kryptografia-symetryczna">Kryptografia symetryczna</h2><h3 id="szyfrowanie-symetryczne">Szyfrowanie symetryczne</h3><blockquote><p>Rozważmy sytuację, w której Alice ma wysłać list do Boba. Alice, aby przekazać Bobowi poufne informacje, poleca posłańcowi (messenger), by zaniósł list. Jednak Alice nie ufa posłańcowi w pełni i chce, aby przekazywana wiadomość pozostała tajna dla wszystkich oprócz Boba — włącznie z posłańcem niosącym list.</p></blockquote><p>Algorytmem kryptograficznym wynalezionym dawno temu do użycia w takiej sytuacji jest <strong>algorytm szyfrowania symetrycznego (symmetric encryption algorithm)</strong>.</p><blockquote class="prompt-info"><p><strong>Prymityw (primitive)</strong><br /> Słowo <em>primitive</em> w słowniku oznacza „prymitywny”, „pierwotny”. W kryptografii również często używa się terminu <em>prymityw</em>, gdzie oznacza on najmniejszy „klocek” systemu kryptograficznego: funkcję lub algorytm. Można o tym myśleć jako o „elemencie bazowym” albo „logice fundamentowej”.</p></blockquote><p>Rozważmy pewien prymityw, który udostępnia dwie funkcje:</p><ul><li><code class="language-plaintext highlighter-rouge">ENCRYPT</code>: przyjmuje <strong>klucz tajny (secret key)</strong> (zwykle dużą liczbę) oraz <strong>wiadomość (message)</strong>, a na wyjściu zwraca ciąg liczb jako zaszyfrowaną wiadomość<li><code class="language-plaintext highlighter-rouge">DECRYPT</code>: funkcja odwrotna do <code class="language-plaintext highlighter-rouge">ENCRYPT</code>; przyjmuje ten sam klucz tajny oraz zaszyfrowaną wiadomość i zwraca wiadomość oryginalną</ul><p>Aby, używając takiego prymitywu, ukryć wiadomość Alice przed posłańcem i innymi osobami trzecimi, Alice i Bob muszą najpierw spotkać się wcześniej i ustalić, jakiego klucza tajnego użyją. Następnie Alice może użyć funkcji <code class="language-plaintext highlighter-rouge">ENCRYPT</code>, aby zaszyfrować wiadomość umówionym kluczem, i przekazać zaszyfrowaną wiadomość Bobowi przez posłańca. Bob używa tego samego klucza tajnego oraz funkcji <code class="language-plaintext highlighter-rouge">DECRYPT</code>, aby odzyskać wiadomość oryginalną.</p><p>Proces szyfrowania obiektu przy użyciu klucza tajnego — tak aby na pierwszy rzut oka nie dało się go odróżnić od bezsensownego szumu — jest w kryptografii typową metodą ochrony protokołów.</p><p>Szyfrowanie symetryczne należy do szerszej klasy algorytmów zwanej <strong>kryptografią symetryczną (symmetric cryptography)</strong> lub <strong>kryptografią klucza tajnego (secret key cryptography)</strong>; w zależności od przypadku kluczy może być nawet więcej niż jeden.</p><h2 id="zasada-kerckhoffsa">Zasada Kerckhoffsa</h2><p>Dziś potrafimy komunikować się niemal w czasie rzeczywistym, używając znacznie potężniejszych niż papierowe listy środków — komputerów i internetu. Ale to oznacza też, że „złośliwy posłaniec” również stał się potężniejszy: może to być niezabezpieczone publiczne Wi‑Fi w kawiarni, operator (ISP), rozmaite urządzenia i serwery telekomunikacyjne współtworzące internet i przenoszące wiadomości, instytucje rządowe, a nawet nasze własne urządzenie, na którym uruchamiany jest algorytm. Przeciwnicy mogą obserwować więcej wiadomości w czasie rzeczywistym i — niezauważalnie — fałszować je, podsłuchiwać lub cenzurować z rozdzielczością nanosekund.</p><p>W długim procesie prób i błędów kryptografii wypracowano nadrzędną zasadę zapewniającą wiarygodne bezpieczeństwo: <u>prymitywy należy analizować publicznie</u>. Podejściem przeciwnym jest tzw. <strong>bezpieczeństwo przez niejawność (security by obscurity)</strong>, które ma wyraźne ograniczenia i dziś jest w praktyce zarzucone.</p><p>Zasadę tę po raz pierwszy sformułował w 11883 roku niderlandzki językoznawca i kryptograf Auguste Kerckhoffs, i nazywa się ją <strong>zasadą Kerckhoffsa (Kerckhoffs’s principle)</strong>. Tę samą ideę amerykański matematyk, informatyk i kryptograf — ojciec teorii informacji — Claude Shannon ujął jako „The enemy knows the system”, tj. „projektując system, należy zakładać, że przeciwnik pozna system”. To sformułowanie bywa nazywane <strong>maksymą Shannona (Shannon’s maxim)</strong>.</p><p>Bezpieczeństwo systemu kryptograficznego powinno zależeć wyłącznie od tajności klucza; sam system nie powinien sprawiać problemu nawet wtedy, gdy jest znany, a wręcz powinien być aktywnie ujawniany, aby — jak w przypadku AES — wielu <strong>kryptoanalityków (cryptanalysts)</strong> mogło go weryfikować. Tajemnica zawsze może wyciec, a więc jest potencjalnym punktem awarii; z perspektywy obrońcy im mniejsza część systemu musi pozostać tajna, tym lepiej. Utrzymanie w tajemnicy przez długi czas całego dużego i złożonego systemu (jak system kryptograficzny) jest niezwykle trudne, natomiast utrzymanie w tajemnicy samego klucza jest względnie proste. Co więcej, nawet jeśli tajemnica wycieknie, znacznie łatwiej jest wymienić ujawniony klucz na nowy niż wymieniać cały system kryptograficzny.</p><h2 id="kryptografia-asymetryczna">Kryptografia asymetryczna</h2><p>Wiele protokołów faktycznie działa w oparciu o kryptografię symetryczną, ale takie podejście zakłada, że aby ustalić klucz, uczestnicy muszą co najmniej raz na początku spotkać się osobno. Pojawia się więc problem, jak klucz ustalić i bezpiecznie współdzielić zawczasu — nazywa się to <strong>dystrybucją klucza (key distribution)</strong>. Problem dystrybucji klucza przez długi czas był trudny i dopiero pod koniec lat 11970., wraz z opracowaniem algorytmów zwanych <strong>kryptografią asymetryczną (asymmetric cryptography)</strong> lub <strong>kryptografią klucza publicznego (public key cryptography)</strong>, został rozwiązany.</p><p>Do reprezentatywnych prymitywów kryptografii asymetrycznej należą <strong>wymiana kluczy (key exchange)</strong>, <strong>szyfrowanie asymetryczne (asymmetric encryption)</strong> oraz <strong>podpis cyfrowy (digital signature)</strong>.</p><h3 id="wymiana-kluczy">Wymiana kluczy</h3><p><strong>Wymiana kluczy</strong> w przybliżeniu działa następująco:</p><ol><li>Alice i Bob uzgadniają, że będą wspólnie używać pewnego zestawu parametrów $G$<li>Alice i Bob wybierają swoje <strong>klucze prywatne (private keys)</strong> $a, b$<li>Alice i Bob łączą wspólne parametry $G$ ze swoimi kluczami prywatnymi $a$, $b$, aby obliczyć <strong>klucze publiczne (public keys)</strong> $A = f(G,a)$, $B = f(G,b)$, po czym udostępniają je publicznie<li>Alice używa publicznego klucza Boba $B = f(G,b)$ oraz własnego klucza prywatnego $a$, aby obliczyć $f(B,a) = f(f(G,b),a)$; Bob analogicznie używa publicznego klucza Alice $A = f(G,a)$ oraz własnego klucza prywatnego $b$, aby obliczyć $f(A,b) = f(f(G,a),b)$<li>Jeśli użyjemy odpowiedniej funkcji $f$ mającej własność $f(f(G,a),b) = f(f(G,b),a)$, to ostatecznie Alice i Bob będą współdzielić ten sam sekret, a osoba trzecia, mimo że zna $G$ i klucze publiczne $A = f(G,a)$ oraz $B = f(G,b)$, nie będzie w stanie z tego wywnioskować $f(A,b)$, więc sekret pozostanie tajny</ol><p>Zwykle tak współdzielony sekret wykorzystuje się później jako klucz tajny do <a href="#szyfrowanie-symetryczne">szyfrowania symetrycznego</a> przy wymianie kolejnych wiadomości.</p><p>Pierwszym opublikowanym i najbardziej reprezentatywnym algorytmem wymiany kluczy jest algorytm Diffiego–Hellmana (Diffie-Hellman key exchange), nazwany od nazwisk dwóch autorów: Diffie i Hellman.</p><p>Jednak wymiana kluczy Diffiego–Hellmana ma też ograniczenia. Rozważmy sytuację, w której atakujący przechwytuje w kroku wymiany kluczy publicznych klucze $A = f(G,a)$ i $B = f(G,b)$, po czym podmienia je na własny $M = f(G,m)$ i przekazuje Alice oraz Bobowi. Wtedy Alice i atakujący współdzielą fałszywy sekret $f(M, a) = f(A, m)$, a Bob i atakujący współdzielą inny fałszywy sekret $f(M, b) = f(B, m)$. W efekcie atakujący może podszyć się pod Boba wobec Alice i pod Alice wobec Boba. Taką sytuację opisuje się stwierdzeniem, że <u><strong>atakujący typu man-in-the-middle (MITM)</strong> skutecznie zaatakował protokół</u>. Z tego powodu wymiana kluczy nie rozwiązuje problemu zaufania, a jedynie upraszcza procedurę, gdy uczestników jest wielu.</p><h3 id="szyfrowanie-asymetryczne">Szyfrowanie asymetryczne</h3><p>Po wynalezieniu algorytmu wymiany kluczy Diffiego–Hellmana szybko pojawił się kolejny przełom: <strong>algorytm RSA (RSA algorithm)</strong>, nazwany od nazwisk wynalazców — Ronald Rivest, Adi Shamir i Leonard Adleman. RSA obejmuje dwa prymitywy: szyfrowanie kluczem publicznym (szyfrowanie asymetryczne) oraz podpis cyfrowy; oba należą do kryptografii asymetrycznej.</p><p>W przypadku <strong>szyfrowania asymetrycznego</strong> podstawowy cel — szyfrowanie wiadomości w celu zapewnienia poufności — jest podobny do <a href="#szyfrowanie-symetryczne">szyfrowania symetrycznego</a>. Jednak w odróżnieniu od szyfrowania symetrycznego, w którym ten sam klucz symetryczny służy zarówno do szyfrowania, jak i do deszyfrowania, szyfrowanie asymetryczne ma następujące cechy:</p><ul><li>działa na dwóch kluczach: kluczu publicznym i kluczu prywatnym<li>każdy może zaszyfrować kluczem publicznym, ale odszyfrować może tylko posiadacz klucza prywatnego</ul><ol><li>Istnieje otwarte pudełko (klucz publiczny), do którego każdy może włożyć wiadomość i je zamknąć, ale gdy zostanie zamknięte, otworzyć je można wyłącznie kluczem (kluczem prywatnym), który ma Bob<li>Alice wkłada wiadomość do pudełka i je zamyka (szyfruje), po czym przekazuje Bobowi<li>Bob otrzymuje zamknięte pudełko (zaszyfrowaną wiadomość) i otwiera je swoim kluczem (kluczem prywatnym), wyjmując wiadomość (odszyfrowuje)</ol><h3 id="podpis-cyfrowy">Podpis cyfrowy</h3><p>RSA zapewnia nie tylko szyfrowanie asymetryczne, ale również <strong>podpis cyfrowy</strong> — prymityw, który okazał się ogromnie pomocny w budowaniu zaufania między Alice i Bobem. Do podpisywania wiadomości używa się własnego klucza prywatnego, a weryfikacja autentyczności podpisu odbywa się przez sprawdzenie podpisanej wiadomości, podpisu oraz klucza publicznego podpisującego.</p><h2 id="po-co-kryptografia">Po co kryptografia?</h2><p>Skoro celem kryptografii jest ochrona protokołów przed działaniami przeciwnika, to o tym, na ile jest ona „użyteczna”, decyduje cel, jaki dany protokół ma osiągnąć. Większość prymitywów i protokołów kryptograficznych ma co najmniej jedną z poniższych własności:</p><ul><li><strong>poufność (confidentiality)</strong>: ukrywanie i ochrona informacji przed osobami, które nie powinny ich widzieć<li><strong>uwierzytelnianie (authentication)</strong>: identyfikacja rozmówcy (np. sprawdzenie, czy otrzymana wiadomość naprawdę została wysłana przez Alice)</ul><h2 id="ekosystem-kryptografii">Ekosystem kryptografii</h2><pre><code class="language-mermaid">flowchart TD
    Alice[Badacz kryptografii]-- wynalazek prymitywu --&gt;Primitive(Propozycja nowego prymitywu)
    Alice-- wynalazek protokołu --&gt;Protocol(Propozycja nowego protokołu)
    Alice-. organizacja konkursu .-&gt;C(Konkurs algorytmiczny)

    David[Przemysł prywatny]-. finansowanie .-&gt;Alice
    David-. organizacja konkursu .-&gt;C

    Eve[Agencje rządowe]-. finansowanie .-&gt;Alice
    Eve-. organizacja konkursu .-&gt;C

    Primitive --&gt; t1{"Czy da się zaimplementować?"}
    t1-- tak --&gt;Protocol
    t1-- nie --&gt;term1@{ shape: framed-circle, label: "Stop" }

    Protocol-- udział w konkursie --&gt;C
    Protocol-- standaryzacja --&gt;Standard(Standard)
    Protocol-- zgłoszenie patentowe --&gt;Patent(Wygaśnięcie patentu)
    Protocol-- implementacja --&gt;Library(Biblioteka)
    
    C-- wygrana w konkursie --&gt;Standard
    C-- odpadnięcie --&gt;term2@{ shape: framed-circle, label: "Stop" }

    Standard-- implementacja --&gt;Library
    Standard-- odpadnięcie --&gt;term3@{ shape: framed-circle, label: "Stop" }

    Patent-- odpadnięcie --&gt;term2@{ shape: framed-circle, label: "Stop" }
    Patent-- standaryzacja --&gt;Standard
    Patent-- implementacja --&gt;Library

    Library-- standaryzacja --&gt;Standard
    Library-- złamanie bezpieczeństwa --&gt;term4@{ shape: framed-circle, label: "Stop" }
</code></pre>]]> </content> </entry> <entry><title xml:lang="pl">Przekształcenia liniowe, jądro i obraz</title><link href="https://www.yunseo.kim/pl/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/pl/posts/linear-transformation-nullspace-and-image/</id> <author> <name>Yunseo Kim</name> </author> <category term="Mathematics" /> <category term="Linear Algebra" /> <summary xml:lang="pl">Omawiamy definicję przekształcenia liniowego, dwa kluczowe podprzestrzenie: jądro i obraz, oraz twierdzenia o rządzie i defekcie (nullity, rank).</summary> <content type="html" xml:lang="pl"> <![CDATA[<p>Omawiamy definicję przekształcenia liniowego, dwa kluczowe podprzestrzenie: jądro i obraz, oraz twierdzenia o rządzie i defekcie (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="/pl/posts/vectors-and-linear-combinations/">Wektory i kombinacje liniowe</a><li><a href="/pl/posts/vector-spaces-subspaces-and-matrices/">Przestrzenie wektorowe, podprzestrzenie i macierze</a><li><a href="posts/linear-dependence-and-independence-basis-and-dimension/">Zależność liniowa i niezależność liniowa, baza i wymiar</a><li>funkcja injektywna, funkcja surjektywna</ul><h2 id="przekształcenia-liniowe">Przekształcenia liniowe</h2><p>Szczególną funkcję, która zachowuje strukturę przestrzeni wektorowej, nazywamy <strong>przekształceniem liniowym (linear transformation)</strong>. Jest to kluczowe pojęcie, bardzo często pojawiające się w czystej matematyce, matematyce stosowanej, naukach społecznych, przyrodniczych oraz w inżynierii.</p><blockquote class="prompt-info"><p><strong>Definicja</strong><br /> Niech $\mathbb{V}$ oraz $\mathbb{W}$ będą $F$-przestrzeniami wektorowymi. Funkcję $T: \mathbb{V} \to \mathbb{W}$ nazywamy <strong>przekształceniem liniowym (linear transformation)</strong> z $\mathbb{V}$ do $\mathbb{W}$, jeśli dla wszystkich $\mathbf{x}, \mathbf{y} \in \mathbb{V}$ oraz $c \in F$ spełnione są dwa warunki:</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>Stwierdzenie, że $T$ jest przekształceniem liniowym, skraca się często do „$T$ jest <strong>liniowe (linear)</strong>”. Przekształcenie liniowe $T: \mathbb{V} \to \mathbb{W}$ spełnia następujące cztery własności.</p><blockquote class="prompt-info"><ol><li>$T$ jest liniowe $\quad \Rightarrow \quad $ $T(\mathbf{0}) = \mathbf{0}$<li>$T$ jest liniowe $\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$ jest liniowe $\quad \Rightarrow \quad $ $T(\mathbf{x} - \mathbf{y}) = T(\mathbf{x}) - T(\mathbf{y}) \; \forall \, \mathbf{x}, \mathbf{y} \in \mathbb{V}$<li>$T$ jest liniowe $\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>Przy wykazywaniu liniowości danej funkcji zazwyczaj najwygodniej jest użyć własności 2.</p></blockquote><blockquote class="prompt-tip"><p>Algebrę liniową można szeroko i różnorodnie stosować także w geometrii, ponieważ wiele ważnych przekształceń geometrycznych jest liniowych. W szczególności trzy kluczowe przekształcenia geometryczne — <strong>obrót</strong>, <strong>symetria</strong>, <strong>rzut</strong> — są przekształceniami liniowymi.</p></blockquote><p>Szczególnie często pojawiają się dwa następujące przekształcenia liniowe.</p><blockquote class="prompt-info"><p><strong>Przekształcenie identycznościowe i przekształcenie zerowe</strong><br /> Dla $F$-przestrzeni wektorowych $\mathbb{V}, \mathbb{W}$:</p><ul><li><strong>przekształcenie identycznościowe (identity transformation)</strong>: funkcja $I_\mathbb{V}: \mathbb{V} \to \mathbb{V}$ zdefiniowana przez $I_\mathbb{V}(\mathbf{x}) = \mathbf{x}$ dla wszystkich $\mathbf{x} \in \mathbb{V}$<li><strong>przekształcenie zerowe (zero transformation)</strong>: funkcja $T_0: \mathbb{V} \to \mathbb{W}$ zdefiniowana przez $T_0(\mathbf{x}) = \mathbf{0}$ dla wszystkich $\mathbf{x} \in \mathbb{V}$</ul></blockquote><p>Poza tym wiele innych pojęć również jest przykładami przekształceń liniowych.</p><blockquote class="prompt-tip"><p><strong>Przykłady przekształceń liniowych</strong></p><ul><li>obrót<li>symetria<li>rzut<li><a href="/pl/posts/vector-spaces-subspaces-and-matrices/#macierz-transponowana-macierz-symetryczna-macierz-antysymetryczna">transpozycja</a><li>pochodna funkcji różniczkowalnej<li>całka funkcji ciągłej</ul></blockquote><h2 id="jądro-i-obraz">Jądro i obraz</h2><h3 id="definicje-jądra-i-obrazu">Definicje jądra i obrazu</h3><blockquote class="prompt-info"><p><strong>Definicja</strong><br /> Dla przestrzeni wektorowych $\mathbb{V}, \mathbb{W}$ oraz przekształcenia liniowego $T: \mathbb{V} \to \mathbb{W}$:</p><ul><li><p><strong>jądro (kernel)</strong>, czyli <strong>przestrzeń zerowa (null space)</strong>: zbiór tych $\mathbf{x} \in \mathbb{V}$, dla których $T(\mathbf{x}) = \mathbf{0}$; oznaczamy $\mathrm{N}(T)$</p>\[\mathrm{N}(T) = \{ \mathbf{x} \in \mathbb{V}: T(\mathbf{x}) = \mathbf{0} \}\]<li><p><strong>zbiór wartości (range)</strong>, czyli <strong>obraz (image)</strong>: podzbiór $\mathbb{W}$ złożony z wartości funkcji $T$; oznaczamy $\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> Dla przestrzeni wektorowych $\mathbb{V}, \mathbb{W}$ oraz przekształcenia identycznościowego $I: \mathbb{V} \to \mathbb{V}$ i przekształcenia zerowego $T_0: \mathbb{V} \to \mathbb{W}$ zachodzi:</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>To będzie pojawiać się dalej wielokrotnie: jądro i obraz przekształcenia liniowego są <a href="/pl/posts/vector-spaces-subspaces-and-matrices/#podprzestrzen">podprzestrzeniami</a> przestrzeni wektorowej.</p><blockquote class="prompt-info"><p><strong>Twierdzenie 1</strong><br /> Dla przestrzeni wektorowych $\mathbb{V}, \mathbb{W}$ oraz przekształcenia liniowego $T: \mathbb{V} \to \mathbb{W}$ zbiory $\mathrm{N}(T)$ i $\mathrm{R}(T)$ są odpowiednio podprzestrzeniami $\mathbb{V}$ i $\mathbb{W}$.</p><p><strong>Dowód</strong><br /> Oznaczmy wektory zerowe $\mathbb{V}$ oraz $\mathbb{W}$ odpowiednio przez $\mathbf{0}_\mathbb{V}, \mathbf{0}_\mathbb{W}$.</p><p>Ponieważ $T(\mathbf{0}_\mathbb{V}) = \mathbf{0}_\mathbb{W}$, mamy $\mathbf{0}_\mathbb{V} \in \mathrm{N}(T)$. Ponadto dla $\mathbf{x}, \mathbf{y} \in \mathrm{N}(T)$ oraz $c \in F$ zachodzi:</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="/pl/posts/vector-spaces-subspaces-and-matrices/#podprzestrzen">$\mathbf{0}_\mathbb{V} \in \mathrm{N}(T),\ \mathbf{x} + \mathbf{y} \in \mathrm{N}(T),\ c\mathbf{x} \in \mathrm{N}(T)$, więc $\mathrm{N}(T)$ jest podprzestrzenią $\mathbb{V}$</a>.</p><p>Analogicznie, ponieważ $T(\mathbf{0}_\mathbb{V}) = \mathbf{0}_\mathbb{W}$, mamy $\mathbf{0}_\mathbb{W} \in \mathrm{R}(T)$ oraz $\forall \mathbf{x}, \mathbf{y} \in \mathrm{R}(T),\ c \in F \ (\exists \mathbf{v}, \mathbf{w} \in \mathbb{V} \ (T(\mathbf{v}) = \mathbf{x}\ \wedge \ T(\mathbf{w}) = \mathbf{y}))$, więc</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="/pl/posts/vector-spaces-subspaces-and-matrices/#podprzestrzen">$\mathbf{0}_\mathbb{W} \in \mathrm{R}(T),\ \mathbf{x} + \mathbf{y} \in \mathrm{R}(T),\ c\mathbf{x} \in \mathrm{R}(T)$, więc $\mathrm{R}(T)$ jest podprzestrzenią $\mathbb{W}$</a>. $\blacksquare$</p></blockquote><p>Z kolei dla przestrzeni wektorowych $\mathbb{V}, \mathbb{W}$ i przekształcenia liniowego $T: \mathbb{V} \to \mathbb{W}$, jeśli znamy <a href="/pl/posts/linear-dependence-and-independence-basis-and-dimension/#baza">bazę</a> $\beta = \{\mathbf{v}_1, \mathbf{v}_2, \dots, \mathbf{v}_n \}$ przestrzeni $\mathbb{V}$, to <a href="/pl/posts/vectors-and-linear-combinations/#rozpinanie">zbiór generujący</a> obrazu $\mathrm{R}(T)$ można znaleźć następująco.</p><blockquote class="prompt-info"><p><strong>Twierdzenie 2</strong><br /> Dla przestrzeni wektorowych $\mathbb{V}, \mathbb{W}$ oraz przekształcenia liniowego $T: \mathbb{V} \to \mathbb{W}$ i <a href="/pl/posts/linear-dependence-and-independence-basis-and-dimension/#baza">bazy</a> $\beta = \{\mathbf{v}_1, \mathbf{v}_2, \dots, \mathbf{v}_n \}$ przestrzeni $\mathbb{V}$ zachodzi:</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>Dowód</strong></p>\[T(\mathbf{v}_i) \in \mathrm{R}(T) \quad \forall \mathbf{v}_i \in \beta.\]<p>Ponieważ $\mathrm{R}(T)$ jest podprzestrzenią, na mocy <strong>Twierdzenia 2</strong> z tekstu <a href="/pl/posts/vector-spaces-subspaces-and-matrices/#podprzestrzen">Przestrzenie wektorowe, podprzestrzenie i macierze</a> mamy</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>Ponadto,</p>\[\forall \mathbf{w} \in \mathrm{R}(T) \ (\exists \mathbf{v} \in \mathbb{V} \ (\mathbf{w} = T(\mathbf{v}))).\]<p>Ponieważ $\beta$ jest bazą $\mathbb{V}$,</p>\[\mathbf{v} = \sum_{i=1}^n a_i \mathbf{v}_i \quad \text{(gdzie } a_1, a_2, \dots, a_n \in F \text{)}.\]<p>A ponieważ $T$ jest liniowe,</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 })$ i jednocześnie $\mathrm{R}(T) \subseteq \mathrm{span}({T(\mathbf{v}_i): \mathbf{v}_i \in \beta })$, zatem $\mathrm{R}(T) = \mathrm{span}({T(\mathbf{v}): \mathbf{v} \in \beta })$. $\blacksquare$</p></blockquote><p>Twierdzenie to pozostaje prawdziwe także wtedy, gdy baza $\beta$ jest zbiorem nieskończonym.</p><h3 id="twierdzenie-o-rządzie-i-defekcie">Twierdzenie o rządzie i defekcie</h3><p>Ponieważ jądro i obraz są bardzo ważnymi podprzestrzeniami, wyróżnia się także ich <a href="/pl/posts/linear-dependence-and-independence-basis-and-dimension/#wymiar">wymiary</a> specjalnymi nazwami.</p><blockquote class="prompt-info"><p>Dla przestrzeni wektorowych $\mathbb{V}, \mathbb{W}$ oraz przekształcenia liniowego $T: \mathbb{V} \to \mathbb{W}$ załóżmy, że $\mathrm{N}(T)$ i $\mathrm{R}(T)$ są skończenie wymiarowe.</p><ul><li><strong>wymiar jądra (nullity)</strong>: wymiar $\mathrm{N}(T)$, oznaczany $\mathrm{nullity}(T)$<li><strong>rząd (rank)</strong>: wymiar $\mathrm{R}(T)$, oznaczany $\mathrm{rank}(T)$</ul></blockquote><p>W przekształceniu liniowym, im większy jest wymiar jądra, tym mniejszy jest rząd; i odwrotnie, im większy jest rząd, tym mniejszy jest wymiar jądra.</p><blockquote class="prompt-info"><p><strong>Twierdzenie 3: twierdzenie o wymiarze (dimension theorem)</strong><br /> Dla przestrzeni wektorowych $\mathbb{V}, \mathbb{W}$ oraz przekształcenia liniowego $T: \mathbb{V}\to \mathbb{W}$, jeśli $\mathbb{V}$ jest skończenie wymiarowa, to zachodzi:</p>\[\mathrm{nullity}(T) + \mathrm{rank}(T) = \dim(\mathbb{V})\]</blockquote><h4 id="dowód">Dowód</h4><p>Niech $\dim(\mathbb{V}) = n$, $\mathrm{nullity}(T) = \dim(\mathrm{N}(T)) = k$ oraz niech bazą $\mathrm{N}(T)$ będzie $\{\mathbf{v}_1, \mathbf{v}_2, \dots, \mathbf{v}_k \}$.</p><p>Zgodnie z <a href="/pl/posts/linear-dependence-and-independence-basis-and-dimension/#wymiar-podprzestrzeni">Wnioskiem 6-1 z tekstu „Zależność liniowa i niezależność liniowa, baza i wymiar”</a>, zbiór $\{\mathbf{v}_1, \mathbf{v}_2, \dots, \mathbf{v}_k \}$ można rozszerzyć do bazy $\mathbb{V}$, tj. otrzymać bazę $\beta = \{\mathbf{v}_1, \mathbf{v}_2, \dots, \mathbf{v}_n \}$.</p><p>Pokażemy teraz, że $S = \{T(\mathbf{v}_{k+1}), T(\mathbf{v}_{k+2}), \dots, T(\mathbf{v}_n) \}$ jest bazą $\mathrm{R}(T)$. Ponieważ dla $1 \leq i \leq k$ mamy $T(\mathbf{v}_i) = 0$, z <a href="#definicje-jadra-i-obrazu"><strong>Twierdzenia 2</strong></a> wynika:</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>Zatem $S$ jest zbiorem generującym $\mathrm{R}(T)$. Teraz, na mocy <a href="/pl/posts/linear-dependence-and-independence-basis-and-dimension/#wymiar">Wniosku 5-2 z twierdzenia o zastępowaniu</a>, jeśli pokażemy, że $S$ jest liniowo niezależny, to udowodnimy, że $S$ jest bazą $\mathrm{R}(T)$.</p><p>Załóżmy, że $\sum_{i=k+1}^n b_i T(\mathbf{v}_i) = 0$ (gdzie $b_{k+1}, b_{k+2}, \dots, b_n \in F$). Ponieważ $T$ jest liniowe,</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>Stąd</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>Ponieważ $\beta$ jest bazą $\mathbb{V}$, jedynym rozwiązaniem równania $\sum_{i=1}^k (-c_i)\mathbf{v}_i + \sum_{i=k+1}^n b_i \mathbf{v}_i = 0$ jest</p>\[c_1 = c_2 = \cdots = c_k = b_{k+1} = b_{k+2} = \cdots = b_n = 0\]<p>a zatem</p>\[\sum_{i=k+1}^n b_i T(\mathbf{v}_i) = 0 \quad \Rightarrow \quad b_i = 0.\]<p>Czyli $S$ jest liniowo niezależny i jest bazą $\mathrm{R}(T)$.</p>\[\therefore \mathrm{rank}(T) = n - k = \dim{\mathbb{V}} - \mathrm{nullity}(T). \blacksquare\]<h3 id="przekształcenia-liniowe-a-iniekcje-i-surjekcje">Przekształcenia liniowe a iniekcje i surjekcje</h3><p>W przypadku przekształceń liniowych własności bycia iniekcją (injection) i surjekcją (surjection) są ściśle powiązane z rzędem i wymiarem jądra.</p><blockquote class="prompt-info"><p><strong>Twierdzenie 4</strong><br /> Dla przestrzeni wektorowych $\mathbb{V}, \mathbb{W}$ oraz przekształcenia liniowego $T: \mathbb{V} \to \mathbb{W}$:</p>\[T\text{ jest iniekcją.} \quad \Leftrightarrow \quad \mathrm{N}(T) = \{\mathbf{0}\}.\]</blockquote><blockquote class="prompt-info"><p><strong>Twierdzenie 5</strong><br /> Jeżeli skończenie wymiarowe przestrzenie wektorowe $\mathbb{V}, \mathbb{W}$ mają ten sam wymiar, to dla przekształcenia liniowego $T: \mathbb{V} \to \mathbb{W}$ następujące cztery zdania są równoważne:</p><ol><li>$T$ jest iniekcją.<li>$\mathrm{nullity}(T) = 0$<li>$\mathrm{rank}(T) = \dim(\mathbb{V})$<li>$T$ jest surjekcją.</ol></blockquote><p>Korzystając z <a href="#twierdzenie-o-rzadzie-i-defekcie">twierdzenia o wymiarze</a>, <a href="#przeksztalcenia-liniowe">własności 1 i 3 przekształceń liniowych</a> oraz <a href="/pl/posts/linear-dependence-and-independence-basis-and-dimension/#wymiar-podprzestrzeni">Twierdzenia 6 z tekstu „Zależność liniowa i niezależność liniowa, baza i wymiar”</a>, można udowodnić <strong>Twierdzenie 4</strong> i <strong>Twierdzenie 5</strong>.</p><p>Te dwa twierdzenia są przydatne przy rozstrzyganiu, czy dane przekształcenie liniowe jest iniekcją albo surjekcją.</p><blockquote class="prompt-warning"><p>Dla nieskończenie wymiarowej przestrzeni wektorowej $\mathbb{V}$ i przekształcenia liniowego $T: \mathbb{V} \to \mathbb{V}$ iniektywność i surjektywność nie są równoważne.</p></blockquote><p>Ponadto, jeśli pewne przekształcenie liniowe jest iniekcją, to w zależności od sytuacji przydatne może być następujące twierdzenie do sprawdzania, czy dany podzbiór przestrzeni jest liniowo niezależny.</p><blockquote class="prompt-info"><p><strong>Twierdzenie 6</strong><br /> Dla przestrzeni wektorowych $\mathbb{V}, \mathbb{W}$ oraz iniektywnego przekształcenia liniowego $T: \mathbb{V} \to \mathbb{W}$ i podzbioru $S \subseteq \mathbb{V}$ zachodzi:</p>\[S\text{ jest liniowo niezależny.} \quad \Leftrightarrow \quad \{T(\mathbf{v}): \mathbf{v} \in S \}\text{ jest liniowo niezależny.}\]</blockquote><h2 id="przekształcenia-liniowe-a-baza">Przekształcenia liniowe a baza</h2><p>Ważną cechą przekształceń liniowych jest to, że ich „zachowanie” jest wyznaczone przez wartości na bazie.</p><blockquote class="prompt-info"><p><strong>Twierdzenie 7</strong><br /> Dla $F$-przestrzeni wektorowych $\mathbb{V}, \mathbb{W}$, bazy $\{\mathbf{v}_1, \mathbf{v}_2, \dots, \mathbf{v}_n \}$ przestrzeni $\mathbb{V}$ oraz wektorów $\mathbf{w}_1, \mathbf{w}_2, \dots, \mathbf{w}_n \in \mathbb{W}$ istnieje dokładnie jedno przekształcenie liniowe $T: \mathbb{V} \to \mathbb{W}$ spełniające warunek:</p>\[i = 1, 2, \dots, n \text{ oraz } T(\mathbf{v}_i) = \mathbf{w}_i\]<p><strong>Dowód</strong><br /> Dla $\mathbf{x} \in \mathbb{V}$ następujące przedstawienie jako kombinacja liniowa jest jednoznaczne:</p>\[\mathbf{x} = \sum_{i=1}^n a_i \mathbf{v}_i \text{ (}a_1, a_2, \dots, a_n \in F \text{)}\]<p>Zdefiniujmy przekształcenie liniowe $T: \mathbb{V} \to \mathbb{W}$ przez</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>i) Dla $i = 1, 2, \dots, n$ mamy $T(\mathbf{v}_i) = \mathbf{w}_i$.</p><p>ii)</p><p>Jeśli założymy, że inne przekształcenie liniowe $U: \mathbb{V} \to \mathbb{W}$ spełnia $U(\mathbf{v}_i) = \mathbf{w}_i$ dla $i = 1, 2, \dots, n$, to dla $\mathbf{x} = \sum_{i=1}^n a_i \mathbf{v}_i \in \mathbb{V}$ zachodzi</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>Z punktów i), ii) wynika, że przekształcenie liniowe spełniające $T(\mathbf{v}_i) = \mathbf{w}_i$ dla $i = 1, 2, \dots, n$ jest jedyne i ma postać</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>$\blacksquare$</p><p><strong>Wniosek 7-1</strong><br /> Dla dwóch przestrzeni wektorowych $\mathbb{V}, \mathbb{W}$ załóżmy, że $\mathbb{V}$ zawiera skończoną bazę $\{\mathbf{v}_1, \mathbf{v}_2, \dots, \mathbf{v}_n \}$. Jeśli dwa przekształcenia liniowe $U, T: \mathbb{V} \to \mathbf{W}$ spełniają $U(\mathbf{v}_i) = T(\mathbf{v}_i)$ dla $i = 1, 2, \dots, n$, to $U = T$.<br /> Innymi słowy, <u>jeśli wartości funkcji są takie same na bazie, to jest to to samo przekształcenie liniowe.</u></p></blockquote>]]> </content> </entry> <entry><title xml:lang="pl">Zależność liniowa i niezależność liniowa, baza i wymiar</title><link href="https://www.yunseo.kim/pl/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-09-16T00:00:00+09:00</updated> <id>https://www.yunseo.kim/pl/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="pl">Porządkujemy pojęcia zależności i niezależności liniowej oraz bazy i wymiaru przestrzeni wektorowej.</summary> <content type="html" xml:lang="pl"> <![CDATA[<p>Porządkujemy pojęcia zależności i niezależności liniowej oraz bazy i wymiaru przestrzeni wektorowej.</p><em><p>* Mathematical equations and diagrams included in posts may not display properly when viewed with a feed reader.</p></em><h2 id="wymagania-wstępne">Wymagania wstępne</h2><ul><li><a href="/pl/posts/vectors-and-linear-combinations/">Wektory i kombinacje liniowe</a><li><a href="/pl/posts/vector-spaces-subspaces-and-matrices/">Przestrzenie wektorowe, podprzestrzenie i macierze</a></ul><h2 id="zależność-liniowa-i-niezależność-liniowa">Zależność liniowa i niezależność liniowa</h2><p>Dla pewnej <a href="/pl/posts/vector-spaces-subspaces-and-matrices/#przestrzen-wektorowa">przestrzeni wektorowej</a> $\mathbb{V}$ oraz <a href="/pl/posts/vector-spaces-subspaces-and-matrices/#podprzestrzen">podprzestrzeni</a> $\mathbb{W}$ załóżmy, że chcemy znaleźć możliwie mały skończony podzbiór $S$, który generuje (rozpina) $\mathbb{W}$.</p><p>Jeśli dla zbioru $S = \{\mathbf{u}_1, \mathbf{u}_2, \mathbf{u}_3, \mathbf{u}_4 \}$ zachodzi $\mathrm{span}(S) = \mathbb{W}$, to jak rozstrzygnąć, czy nie istnieje właściwy podzbiór $S$, który również generuje $\mathbb{W}$? Jest to to samo, co problem sprawdzenia, czy jeden z wektorów wybranych z $S$ da się wyrazić jako <a href="/pl/posts/vectors-and-linear-combinations/#kombinacja-liniowa-wektorow">kombinację liniową</a> pozostałych. Na przykład, warunkiem koniecznym i wystarczającym, aby wyrazić $\mathbf{u}_4$ jako kombinację liniową pozostałych trzech wektorów, jest istnienie skalarów $a_1, a_2, a_3$ spełniających:</p>\[\mathbf{u}_4 = a_1\mathbf{u}_1 + a_2\mathbf{u}_2 + a_3\mathbf{u}_3\]<p>Jednak za każdym razem konstruowanie układu równań liniowych osobno dla $\mathbf{u}_1$, $\mathbf{u}_2$, $\mathbf{u}_3$, $\mathbf{u}_4$ i sprawdzanie, czy istnieje rozwiązanie, jest uciążliwe, więc nieco przekształćmy równanie.</p>\[a_1\mathbf{u}_1 + a_2\mathbf{u}_2 + a_3\mathbf{u}_3 + a_4\mathbf{u}_4 = \mathbf{0}\]<p>Jeżeli pewien wektor z $S$ jest kombinacją liniową pozostałych wektorów, to wówczas przy zapisie wektora zerowego jako kombinacji liniowej elementów $S$ istnieje reprezentacja, w której co najmniej jeden współczynnik spośród $a_1, a_2, a_3, a_4$ jest różny od $0$. Odwrotność tego stwierdzenia również jest prawdziwa: jeśli istnieje sposób wyrażenia wektora zerowego jako kombinacji liniowej wektorów należących do $S$, w którym co najmniej jeden ze współczynników $a_1, a_2, a_3, a_4$ jest różny od $0$, to pewien wektor z $S$ jest kombinacją liniową pozostałych.</p><p>Uogólniając, definiujemy następująco <strong>zależność liniową</strong> i <strong>niezależność liniową</strong>.</p><blockquote class="prompt-info"><p><strong>Definicja</strong><br /> Dla podzbioru $S$ przestrzeni wektorowej $\mathbb{V}$, jeżeli istnieje skończona liczba parami różnych wektorów $\mathbf{u}_1, \mathbf{u}_2, \dots, \mathbf{u}_n \in S$ oraz skalary $a_1, a_2, \dots, a_n$, z których co najmniej jeden jest różny od $0$, takie że $a_1\mathbf{u}_1 + a_2\mathbf{u}_2 + \cdots + a_n\mathbf{u}_n = \mathbf{0}$, to zbiór $S$ (i jego wektory) nazywa się <strong>liniowo zależnym (linearly dependent)</strong>. W przeciwnym razie nazywa się go <strong>liniowo niezależnym (linearly independent)</strong>.</p></blockquote><p>Dla dowolnych wektorów $\mathbf{u}_1, \mathbf{u}_2, \dots, \mathbf{u}_n$, jeśli $a_1 = a_2 = \cdots = a_n = 0$, to $a_1\mathbf{u}_1 + a_2\mathbf{u}_2 + \cdots + a_n\mathbf{u}_n = \mathbf{0}$; nazywamy to <strong>trywialnym przedstawieniem (trivial representation of $\mathbf{0}$)</strong> wektora zerowego.</p><p>Poniższe trzy stwierdzenia o zbiorach liniowo niezależnych są zawsze prawdziwe w każdej przestrzeni wektorowej. W szczególności <strong>Stwierdzenie 3</strong>, jak widzieliśmy, jest bardzo użyteczne przy sprawdzaniu, czy dany zbiór skończony jest liniowo niezależny.</p><blockquote class="prompt-info"><ul><li><strong>Stwierdzenie 1</strong>: Zbiór pusty jest liniowo niezależny. Aby zbiór był liniowo zależny, nie może być pusty.<li><strong>Stwierdzenie 2</strong>: Zbiór złożony z jednego niezerowego wektora jest liniowo niezależny.<li><strong>Stwierdzenie 3</strong>: Warunkiem koniecznym i wystarczającym, aby dany zbiór był liniowo niezależny, jest to, że jedynym sposobem wyrażenia $\mathbf{0}$ jako kombinacji liniowej tego zbioru jest przedstawienie trywialne.</ul></blockquote><p>Ważne są również następujące twierdzenia.</p><blockquote class="prompt-info"><p><strong>Twierdzenie 1</strong><br /> Niech $\mathbb{V}$ będzie przestrzenią wektorową oraz $S_1 \subseteq S_2 \subseteq \mathbb{V}$. Jeśli $S_1$ jest liniowo zależny, to $S_2$ również jest liniowo zależny.</p><p><strong>Wniosek 1-1</strong><br /> Niech $\mathbb{V}$ będzie przestrzenią wektorową oraz $S_1 \subseteq S_2 \subseteq \mathbb{V}$. Jeśli $S_2$ jest liniowo niezależny, to $S_1$ również jest liniowo niezależny.</p></blockquote><blockquote class="prompt-info"><p><strong>Twierdzenie 2</strong><br /> Rozważmy przestrzeń wektorową $\mathbb{V}$ oraz liniowo niezależny podzbiór $S$. Dla wektora $\mathbf{v} \in \mathbb{V}$, który nie należy do $S$, warunkiem koniecznym i wystarczającym, aby $S \cup \{\mathbf{v}\}$ było liniowo zależne, jest $\mathbf{v} \in \mathrm{span}(S)$.</p><p>Innymi słowy, <strong>jeśli żaden właściwy podzbiór $S$ nie jest w stanie wygenerować tej samej przestrzeni co $S$, to $S$ jest liniowo niezależny.</strong></p></blockquote><h2 id="baza-i-wymiar">Baza i wymiar</h2><h3 id="baza">Baza</h3><p>Zbiór generujący $S$ podprzestrzeni $\mathbb{W}$, który jest <a href="#zaleznosc-liniowa-i-niezaleznosc-liniowa">liniowo niezależny</a>, ma szczególną własność: każdy wektor należący do $\mathbb{W}$ można koniecznie wyrazić jako kombinację liniową wektorów z $S$, a ponadto to przedstawienie jest jednoznaczne (<strong>Twierdzenie 3</strong>). Dlatego liniowo niezależny zbiór generujący danej przestrzeni wektorowej definiuje się szczególnie jako <strong>bazę (basis)</strong>.</p><blockquote class="prompt-info"><p><strong>Definicja bazy</strong><br /> Dla przestrzeni wektorowej $\mathbb{V}$ i jej podzbioru $\beta$, jeśli $\beta$ jest liniowo niezależny i generuje $\mathbb{V}$, to $\beta$ nazywa się <strong>bazą (basis)</strong> przestrzeni $\mathbb{V}$. Mówimy wtedy, że wektory z $\beta$ tworzą bazę $\mathbb{V}$.</p></blockquote><blockquote class="prompt-tip"><p>$\mathrm{span}(\emptyset) = \{\mathbf{0}\}$, a $\emptyset$ jest liniowo niezależny. Zatem $\emptyset$ jest bazą przestrzeni punktowej.</p></blockquote><p>W szczególności następującą szczególną bazę przestrzeni $F^n$ nazywa się <strong>bazą standardową (standard basis)</strong>.</p><blockquote class="prompt-info"><p><strong>Definicja bazy standardowej</strong><br /> Dla przestrzeni wektorowej $F^n$ rozważmy następujące wektory.</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>Wtedy zbiór $\{\mathbf{e}_1, \mathbf{e}_2, \dots, \mathbf{e}_n \}$ jest bazą $F^n$ i nazywa się go <strong>bazą standardową (standard basis)</strong> przestrzeni $F^n$.</p></blockquote><blockquote class="prompt-info"><p><strong>Twierdzenie 3</strong><br /> Dla przestrzeni wektorowej $\mathbb{V}$ oraz $n$ parami różnych wektorów $\mathbf{u}_1, \mathbf{u}_2, \dots, \mathbf{u}_n \in \mathbb{V}$, zbiór $\beta = \{\mathbf{u}_1, \mathbf{u}_2, \dots, \mathbf{u}_n \}$ jest bazą $\mathbb{V}$ wtedy i tylko wtedy, gdy „dowolny wektor $\mathbf{v} \in \mathbb{V}$ można przedstawić jako kombinację liniową wektorów z $\beta$, a przedstawienie to jest jednoznaczne”. To znaczy, dla jedynej uporządkowanej $n$-ki skalarów $(a_1, a_2, \dots, a_n)$ wektor $\mathbf{v}$ musi spełniać:</p>\[\mathbf{v} = a_1\mathbf{u}_1 + a_2\mathbf{u}_2 + \cdots + a_n\mathbf{u}_n\]</blockquote><p>Z <strong>Twierdzenia 3</strong> wynika, że jeśli $n$ parami różnych wektorów $\mathbf{u}_1, \mathbf{u}_2, \dots, \mathbf{u}_n$ tworzy bazę przestrzeni wektorowej $\mathbb{V}$, to w tej przestrzeni, dla danego wektora $\mathbf{v}$, jednoznacznie wyznaczona jest odpowiadająca mu uporządkowana $n$-ka skalarów $(a_1, a_2, \dots, a_n)$; i odwrotnie, jeśli dana jest uporządkowana $n$-ka skalarów, można odzyskać odpowiadający jej wektor $\mathbf{v}$. Później uporządkujemy to ponownie przy nauce o <strong>odwracalności</strong> i <strong>izomorfizmach</strong>, ale w tym przypadku przestrzenie $\mathbb{V}$ oraz $F^n$ są <u>w istocie takie same</u>.</p><blockquote class="prompt-info"><p><strong>Twierdzenie 4</strong><br /> Jeśli dla zbioru skończonego $S$ zachodzi $\mathrm{span}(S) = \mathbb{V}$, to wśród podzbiorów $S$ istnieje baza przestrzeni $\mathbb{V}$. To znaczy, w tym przypadku baza $\mathbb{V}$ jest zbiorem skończonym.</p></blockquote><blockquote class="prompt-tip"><p>Wiele przestrzeni wektorowych spełnia założenia <strong>Twierdzenia 4</strong>, ale nie jest to konieczne. <u>Baza nie musi być zbiorem skończonym</u>.</p></blockquote><h3 id="wymiar">Wymiar</h3><blockquote class="prompt-info"><p><strong>Twierdzenie 5: twierdzenie o zastępowaniu (replacement theorem)</strong><br /> Niech $G$ będzie zbiorem złożonym z $n$ wektorów oraz $\mathrm{span}(G) = \mathbb{V}$. Jeśli $L$ jest podzbiorem $\mathbb{V}$ złożonym z $m$ liniowo niezależnych wektorów, to $m\leq n$. Ponadto istnieje zbiór $H \subseteq G$ mający $n-m$ wektorów taki, że $\mathrm{span}(L \cup H) = \mathbb{V}$.</p></blockquote><p>Stąd otrzymujemy dwa bardzo ważne wnioski.</p><blockquote class="prompt-info"><p><strong>Wniosek 5-1 z twierdzenia o zastępowaniu</strong><br /> Zakładając, że przestrzeń wektorowa $\mathbb{V}$ zawiera bazę będącą zbiorem skończonym, każda baza $\mathbb{V}$ jest zbiorem skończonym i wszystkie bazy mają tę samą liczbę wektorów.</p></blockquote><p>Zatem liczba wektorów tworzących bazę $\mathbb{V}$ jest niezmienną, istotną własnością $\mathbb{V}$ i nazywa się ją <strong>wymiarem (dimension)</strong>.</p><blockquote class="prompt-info"><p><strong>Definicja wymiaru</strong><br /> Przestrzeń wektorową, której baza jest zbiorem skończonym, nazywa się <strong>skończenie wymiarową (finite dimension)</strong>. Wtedy liczbę elementów bazy $n$ nazywa się <strong>wymiarem (dimension)</strong> danej przestrzeni wektorowej i oznacza $\dim(\mathbb{V})$. Przestrzeń wektorowa, która nie jest skończenie wymiarowa, jest <strong>nieskończenie wymiarowa (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>Wymiar przestrzeni wektorowej może zależeć od tego, nad jakim ciałem jest rozważana.</p><ul><li>Nad ciałem liczb zespolonych $\mathbb{C}$ wymiar przestrzeni wektorowej liczb zespolonych wynosi $1$, a bazą jest $\{1\}$<li>Nad ciałem liczb rzeczywistych $\mathbb{R}$ wymiar przestrzeni wektorowej liczb zespolonych wynosi $2$, a bazą jest $\{1,i\}$</ul></blockquote><p>W skończenie wymiarowej przestrzeni wektorowej $\mathbb{V}$ każdy podzbiór zawierający więcej wektorów niż $\dim(\mathbb{V})$ nie może być liniowo niezależny.</p><blockquote class="prompt-info"><p><strong>Wniosek 5-2 z twierdzenia o zastępowaniu</strong><br /> Niech $\mathbb{V}$ będzie przestrzenią wektorową o wymiarze $n$.</p><ol><li>Każdy skończony zbiór generujący $\mathbb{V}$ musi zawierać co najmniej $n$ wektorów, a zbiór generujący $\mathbb{V}$ składający się z $n$ wektorów jest bazą $\mathbb{V}$.<li>Podzbiór $\mathbb{V}$ złożony z $n$ wektorów, który jest liniowo niezależny, jest bazą $\mathbb{V}$.<li>Każdy liniowo niezależny podzbiór $\mathbb{V}$ można rozszerzyć do bazy. To znaczy, jeśli $L \subseteq \mathbb{V}$ jest liniowo niezależny, to istnieje baza $\beta$ przestrzeni $\mathbb{V}$ taka, że $\beta \supseteq L$.</ol></blockquote><h3 id="wymiar-podprzestrzeni">Wymiar podprzestrzeni</h3><blockquote class="prompt-info"><p><strong>Twierdzenie 6</strong><br /> Dla skończenie wymiarowej przestrzeni wektorowej $\mathbb{V}$ podprzestrzeń $\mathbb{W}$ jest skończenie wymiarowa oraz $\dim(\mathbb{W}) \leq \dim(\mathbb{V})$. W szczególności, $\dim(\mathbb{W}) = \dim(\mathbb{V}) \quad \Rightarrow \quad \mathbb{V} = \mathbb{W}.$</p><p><strong>Wniosek 6-1</strong><br /> Dla podprzestrzeni $\mathbb{W}$ skończenie wymiarowej przestrzeni wektorowej $\mathbb{V}$ dowolną bazę $\mathbb{W}$ można rozszerzyć do bazy $\mathbb{V}$.</p></blockquote><p>Z <strong>Twierdzenia 6</strong> wynika, że wymiar podprzestrzeni $\mathbb{R}^3$ może wynosić $0,1,2,3$.</p><ul><li>wymiar 0: przestrzeń punktowa $\{\mathbf{0}\}$ zawierająca wyłącznie początek układu współrzędnych ($\mathbf{0}$)<li>wymiar 1: prosta przechodząca przez początek układu współrzędnych ($\mathbf{0}$)<li>wymiar 2: płaszczyzna zawierająca początek układu współrzędnych ($\mathbf{0}$)<li>wymiar 3: cała euklidesowa przestrzeń trójwymiarowa</ul>]]> </content> </entry> <entry><title xml:lang="pl">Przestrzenie wektorowe, podprzestrzenie i macierze</title><link href="https://www.yunseo.kim/pl/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-09-13T00:00:00+09:00</updated> <id>https://www.yunseo.kim/pl/posts/vector-spaces-subspaces-and-matrices/</id> <author> <name>Yunseo Kim</name> </author> <category term="Mathematics" /> <category term="Linear Algebra" /> <summary xml:lang="pl">Omawiamy definicje przestrzeni wektorowej i podprzestrzeni oraz typowe przykłady: $F^n$, przestrzenie macierzy i funkcji. Skupiamy się na przestrzeniach macierzy i ważnych podprzestrzeniach: macierzach symetrycznych/antysymetrycznych oraz trójkątnych i diagonalnych.</summary> <content type="html" xml:lang="pl"> <![CDATA[<p>Omawiamy definicje przestrzeni wektorowej i podprzestrzeni oraz typowe przykłady: $F^n$, przestrzenie macierzy i funkcji. Skupiamy się na przestrzeniach macierzy i ważnych podprzestrzeniach: macierzach symetrycznych/antysymetrycznych oraz trójkątnych i diagonalnych.</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>macierz (matrix)</strong><ul><li>element w $i$-tym wierszu i $j$-tej kolumnie macierzy $A$ zapisujemy jako $A_{ij}$ lub $a_{ij}$<li><strong>element diagonalny (diagonal entry)</strong>: element $a_{ij}$ taki, że $i=j$<li>elementy $a_{i1}, a_{i2}, \dots, a_{in}$ nazywamy $i$-tym <strong>wierszem (row)</strong> tej macierzy<ul><li>każdy wiersz macierzy można przedstawić jako wektor z $F^n$<li>ponadto, wektor wierszowy z $F^n$ można przedstawić jako inną macierz rozmiaru $1 \times n$</ul><li>elementy $a_{1j}, a_{2j}, \dots, a_{mj}$ nazywamy $j$-tą <strong>kolumną (column)</strong> tej macierzy<ul><li>każdą kolumnę macierzy można przedstawić jako wektor z $F^m$<li>ponadto, wektor kolumnowy z $F^m$ można przedstawić jako inną macierz rozmiaru $m \times 1$</ul><li><strong>macierz zerowa (zero matrix)</strong>: macierz, której wszystkie elementy są równe $0$; oznaczamy ją przez $O$<li><strong>macierz kwadratowa (square matrix)</strong>: macierz, w której liczba wierszy jest równa liczbie kolumn<li>dla dwóch macierzy $m \times n$ $A, B$: jeśli dla wszystkich $1 \leq i \leq m$, $1 \leq j \leq n$ zachodzi $A_{ij} = B_{ij}$ (tj. wszystkie odpowiadające sobie elementy są identyczne), to definiujemy, że macierze są <strong>równe</strong> ($A=B$)<li><strong>macierz transponowana (transpose matrix)</strong>: dla macierzy $m \times n$ $A$ macierzą transponowaną nazywamy macierz $A^T$ rozmiaru $n \times m$, otrzymaną przez zamianę wierszy z kolumnami<li><strong>macierz symetryczna (symmetric matrix)</strong>: macierz kwadratowa $A$ taka, że $A^T = A$<li><strong>macierz antysymetryczna (skew-symmetric matrix)</strong>: macierz kwadratowa $B$ taka, że $B^T = -B$<li><strong>macierz trójkątna (triangular matrix)</strong><ul><li><strong>macierz górnotrójkątna (upper triangular matrix)</strong>: macierz, w której wszystkie elementy pod przekątną są równe $0$ (tj. $i&gt;j \Rightarrow A_{ij}=0$); zwykle oznaczana przez $U$<li><strong>macierz dolnotrójkątna (lower triangular matrix)</strong>: macierz, w której wszystkie elementy nad przekątną są równe $0$ (tj. $i&lt;j \Rightarrow A_{ij}=0$); zwykle oznaczana przez $L$</ul><li><strong>macierz diagonalna (diagonal matrix)</strong>: macierz kwadratowa, w której wszystkie elementy poza przekątną są równe $0$ (tj. $i \neq j \Rightarrow M_{ij}=0$ dla macierzy $n \times n$); zwykle oznaczana przez $D$</ul><li>reprezentatywne przestrzenie wektorowe<ul><li><strong>$n$-tki $F^n$</strong>:<ul><li>zbiór wszystkich $n$-tek, których składowe należą do ciała $F$<li>oznaczamy przez $F^n$; jest to przestrzeń wektorowa nad $F$</ul><li><strong>przestrzeń macierzy (matrix space)</strong>:<ul><li>zbiór wszystkich macierzy $m \times n$, których elementy należą do ciała $F$<li>oznaczamy przez $\mathcal{M}_{m \times n}(F)$; jest to przestrzeń wektorowa</ul><li><strong>przestrzeń funkcji (function space)</strong>:<ul><li>dla niepustego zbioru $S$ oraz ciała $F$: zbiór wszystkich funkcji z $S$ do $F$<li>oznaczamy przez $\mathcal{F}(S,F)$; jest to przestrzeń wektorowa</ul></ul><li><strong>podprzestrzeń (subspace)</strong><ul><li>jeśli podzbiór $\mathbb{W}$ przestrzeni wektorowej nad $F$, $\mathbb{V}$, jest przestrzenią wektorową nad $F$ z tym samym dodawaniem i mnożeniem przez skalar co w $\mathbb{V}$, to $\mathbb{W}$ nazywamy <strong>podprzestrzenią (subspace)</strong> $\mathbb{V}$<li>dla każdej przestrzeni wektorowej $\mathbb{V}$: sama $\mathbb{V}$ oraz $\{0\}$ są podprzestrzeniami; w szczególności $\{0\}$ nazywamy <strong>podprzestrzenią zerową (zero subspace)</strong><li>jeśli pewien podzbiór przestrzeni wektorowej zawiera wektor zerowy i jest domknięty na <a href="/pl/posts/vectors-and-linear-combinations/#kombinacje-liniowe-wektorow">kombinacje liniowe</a> (tj. $\mathrm{span}(\mathbb{W})=\mathbb{W}$), to jest on podprzestrzenią</ul></ul></blockquote><h2 id="prerequisites">Prerequisites</h2><ul><li><a href="/pl/posts/vectors-and-linear-combinations/">Wektory i kombinacje liniowe</a></ul><h2 id="przestrzeń-wektorowa">Przestrzeń wektorowa</h2><p>Jak krótko widzieliśmy już w tekście <a href="/pl/posts/vectors-and-linear-combinations/#wektor-w-szerokim-sensie-element-przestrzeni-wektorowej">Wektory i kombinacje liniowe</a>, definicje wektora i przestrzeni wektorowej jako struktury algebraicznej są następujące.</p><blockquote class="prompt-info"><p><strong>Definicja</strong><br /> <strong>Przestrzeń wektorowa (vector space)</strong> lub <strong>przestrzeń liniowa (linear space)</strong> $\mathbb{V}$ nad ciałem $F$ jest zbiorem wyposażonym w dwa działania, <strong>dodawanie</strong> oraz <strong>mnożenie przez skalar</strong>, spełniające poniższe 8 warunków. Elementy ciała $F$ nazywamy <strong>skalarami (scalar)</strong>, a elementy przestrzeni $\mathbb{V}$ — <strong>wektorami (vector)</strong>.</p><ul><li><strong>Suma (sum)</strong>: dla dwóch elementów $\mathbf{x}, \mathbf{y} \in \mathbb{V}$ jest to działanie przyporządkowujące jednoznacznie element $\mathbf{x} + \mathbf{y} \in \mathbb{V}$. Element $\mathbf{x} + \mathbf{y}$ nazywamy <strong>sumą</strong> $\mathbf{x}$ i $\mathbf{y}$.<li><strong>Mnożenie przez skalar (scalar multiplication)</strong>: dla elementu $a \in F$ i elementu $\mathbf{x} \in \mathbb{V}$ jest to działanie przyporządkowujące jednoznacznie element $a\mathbf{x} \in \mathbb{V}$. Element $a\mathbf{x}$ nazywamy <strong>wielokrotnością skalarną (scalar multiple)</strong> wektora $\mathbf{x}$.</ul><ol><li>Dla wszystkich $\mathbf{x},\mathbf{y} \in \mathbb{V}$ zachodzi $\mathbf{x} + \mathbf{y} = \mathbf{y} + \mathbf{x}$. (przemienność dodawania)<li>Dla wszystkich $\mathbf{x},\mathbf{y},\mathbf{z} \in \mathbb{V}$ zachodzi $(\mathbf{x}+\mathbf{y})+\mathbf{z} = \mathbf{x}+(\mathbf{y}+\mathbf{z})$. (łączność dodawania)<li>Dla każdego $\mathbf{x} \in \mathbb{V}$ istnieje $\mathbf{0} \in \mathbb{V}$ takie, że $\mathbf{x} + \mathbf{0} = \mathbf{x}$. (wektor zerowy, element neutralny dodawania)<li>Dla każdego $\mathbf{x} \in \mathbb{V}$ istnieje $\mathbf{y} \in \mathbb{V}$ takie, że $\mathbf{x}+\mathbf{y}=\mathbf{0}$. (element przeciwny względem dodawania)<li>Dla każdego $\mathbf{x} \in \mathbb{V}$ zachodzi $1\mathbf{x} = \mathbf{x}$. (element neutralny mnożenia)<li>Dla wszystkich $a,b \in F$ oraz wszystkich $\mathbf{x} \in \mathbb{V}$ zachodzi $(ab)\mathbf{x} = a(b\mathbf{x})$. (łączność mnożenia przez skalar)<li>Dla wszystkich $a \in F$ oraz wszystkich $\mathbf{x},\mathbf{y} \in \mathbb{V}$ zachodzi $a(\mathbf{x}+\mathbf{y}) = a\mathbf{x} + a\mathbf{y}$. (rozdzielność 1 mnożenia przez skalar względem dodawania)<li>Dla wszystkich $a,b \in F$ oraz wszystkich $\mathbf{x},\mathbf{y} \in \mathbb{V}$ zachodzi $(a+b)\mathbf{x} = a\mathbf{x} + b\mathbf{x}$. (rozdzielność 2 mnożenia przez skalar względem dodawania)</ol></blockquote><p>Ściśle mówiąc, należy pisać „przestrzeń wektorowa $\mathbb{V}$ nad $F$”, jednak przy omawianiu przestrzeni wektorowych ciało zwykle nie jest kluczowym elementem, więc jeśli nie ma ryzyka nieporozumienia, pomijamy ciało $F$ i piszemy po prostu „przestrzeń wektorowa $\mathbb{V}$”.</p><h3 id="przestrzeń-macierzy">Przestrzeń macierzy</h3><h4 id="wektory-wierszowe-i-wektory-kolumnowe">Wektory wierszowe i wektory kolumnowe</h4><p>Zbiór wszystkich $n$-tek o elementach z ciała $F$ oznaczamy przez $F^n$. Dla $u = (a_1, a_2, \dots, a_n) \in F^n$, $v = (b_1, b_2, \dots, b_n) \in F^n$ definiujemy dodawanie i mnożenie przez skalar następująco; wtedy $F^n$ jest przestrzenią wektorową nad $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>Wektory z $F^n$ zapisuje się zwykle nie jako <strong>wektory wierszowe (row vector)</strong> $(a_1, a_2, \dots, a_n)$, lecz jako <strong>wektory kolumnowe (column vector)</strong></p>\[\begin{pmatrix} a_1 \\ a_2 \\ \vdots \\ a_n \end{pmatrix}\]<p>.</p><blockquote class="prompt-tip"><p>Ponieważ taki zapis kolumnowy zajmuje dużo miejsca, czasem stosuje się <a href="#macierz-transponowana-macierz-symetryczna-macierz-antysymetryczna">transpozycję</a> i zapisuje jako $(a_1, a_2, \dots, a_n)^T$.</p></blockquote><h4 id="macierze-i-przestrzeń-macierzy">Macierze i przestrzeń macierzy</h4><p>Z kolei macierz $m \times n$ o elementach z ciała $F$ to prostokątna tablica postaci poniżej; zapisujemy ją kursywą wielką literą ($A, B, C$ itd.).</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>element w $i$-tym wierszu i $j$-tej kolumnie macierzy $A$ zapisujemy jako $A_{ij}$ lub $a_{ij}$.<li>wszystkie $a_{ij}$ ($1 \leq i \leq m$, $1 \leq j \leq n$) są elementami $F$.<li>element $a_{ij}$ taki, że $i=j$, nazywamy <strong>elementem diagonalnym (diagonal entry)</strong> tej macierzy.<li>elementy $a_{i1}, a_{i2}, \dots, a_{in}$ nazywamy $i$-tym <strong>wierszem (row)</strong> tej macierzy. Każdy wiersz macierzy można przedstawić jako wektor z $F^n$; ponadto wektor wierszowy z $F^n$ można przedstawić jako inną macierz rozmiaru $1 \times n$.<li>elementy $a_{1j}, a_{2j}, \dots, a_{mj}$ nazywamy $j$-tą <strong>kolumną (column)</strong> tej macierzy. Każdą kolumnę macierzy można przedstawić jako wektor z $F^m$; ponadto wektor kolumnowy z $F^m$ można przedstawić jako inną macierz rozmiaru $m \times 1$.<li>macierz $m \times n$, której wszystkie elementy są równe $0$, nazywamy <strong>macierzą zerową (zero matrix)</strong> i oznaczamy przez $O$.<li>macierz, w której liczba wierszy jest równa liczbie kolumn, nazywamy <strong>macierzą kwadratową (square matrix)</strong>.<li>dla dwóch macierzy $m \times n$ $A, B$: jeśli dla wszystkich $1 \leq i \leq m$, $1 \leq j \leq n$ zachodzi $A_{ij} = B_{ij}$ (tj. wszystkie odpowiadające sobie elementy są identyczne), to definiujemy, że macierze są <strong>równe</strong> ($A=B$).</ul><p>Zbiór wszystkich macierzy $m \times n$ o elementach z ciała $F$ oznaczamy przez $\mathcal{M}_{m \times n}(F)$. Dla $\mathbf{A},\mathbf{B} \in \mathcal{M}_{m \times n}(F)$ oraz $c \in F$, jeśli dodawanie i mnożenie przez skalar zdefiniujemy następująco, to $\mathcal{M}_{m \times n}(F)$ jest przestrzenią wektorową; nazywamy ją <strong>przestrzenią macierzy (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{(przy czym }1 \leq i \leq &amp;m, 1 \leq j \leq n \text{)} \end{align*}\]<p>Jest to naturalne rozszerzenie działań zdefiniowanych w $F^n$ oraz $F^m$.</p><h3 id="przestrzeń-funkcji">Przestrzeń funkcji</h3><p>Dla niepustego zbioru $S$ oraz ciała $F$, $\mathcal{F}(S,F)$ jest zbiorem wszystkich funkcji z $S$ do $F$. W $\mathcal{F}(S,F)$, jeśli dla każdego $s \in S$ zachodzi $f(s) = g(s)$, to mówimy, że funkcje $f, g$ są <strong>równe</strong> ($f=g$).</p><p>Dla $f,g \in \mathcal{F}(S,F)$, $c \in F$, $s \in S$ definiujemy dodawanie i mnożenie przez skalar następująco; wtedy $\mathcal{F}(S,F)$ jest przestrzenią wektorową i nazywamy ją <strong>przestrzenią funkcji (function space)</strong>.</p>\[\begin{align*} (f + g)(s) &amp;= f(s) + g(s), \\ (cf)(s) &amp;= c[f(s)] \end{align*}\]<h2 id="podprzestrzeń">Podprzestrzeń</h2><blockquote class="prompt-info"><p><strong>Definicja</strong><br /> Jeśli podzbiór $\mathbb{W}$ przestrzeni wektorowej nad $F$, $\mathbb{V}$, jest przestrzenią wektorową nad $F$ z tym samym dodawaniem i mnożeniem przez skalar co w $\mathbb{V}$, to $\mathbb{W}$ nazywamy <strong>podprzestrzenią (subspace)</strong> $\mathbb{V}$.</p></blockquote><p>Dla każdej przestrzeni wektorowej $\mathbb{V}$: sama $\mathbb{V}$ oraz $\{0\}$ są podprzestrzeniami; w szczególności $\{0\}$ nazywamy <strong>podprzestrzenią zerową (zero subspace)</strong>.</p><p>To, czy dany podzbiór jest podprzestrzenią, można sprawdzić za pomocą następującego twierdzenia.</p><blockquote class="prompt-info"><p><strong>Twierdzenie 1</strong><br /> Dla przestrzeni wektorowej $\mathbb{V}$ i jej podzbioru $\mathbb{W}$ warunkiem koniecznym i wystarczającym na to, by $\mathbb{W}$ była podprzestrzenią $\mathbb{V}$, jest spełnienie poniższych 3 warunków. Działania są takie same jak te zdefiniowane w $\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>Krótko mówiąc: jeśli zbiór zawiera wektor zerowy i jest domknięty na <a href="/pl/posts/vectors-and-linear-combinations/#kombinacje-liniowe-wektorow">kombinacje liniowe</a> (tj. $\mathrm{span}(\mathbb{W})=\mathbb{W}$), to jest podprzestrzenią.</p></blockquote><p>Ponadto zachodzą następujące twierdzenia.</p><blockquote class="prompt-info"><p><strong>Twierdzenie 2</strong></p><ul><li><p>Rozpiętość $\mathrm{span}(S)$ dowolnego podzbioru $S$ przestrzeni wektorowej $\mathbb{V}$ jest podprzestrzenią $\mathbb{V}$ zawierającą $S$.</p>\[S \subset \mathrm{span}(S) \leq \mathbb{V} \quad \forall\ S \subset \mathbb{V}.\]<li><p>Każda podprzestrzeń $\mathbb{V}$ zawierająca $S$ musi zawierać rozpiętość $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>Twierdzenie 3</strong><br /> Dla dowolnej rodziny podprzestrzeni przestrzeni wektorowej $\mathbb{V}$ ich dowolne przecięcie jest również podprzestrzenią $\mathbb{V}$.</p></blockquote><h3 id="macierz-transponowana-macierz-symetryczna-macierz-antysymetryczna">Macierz transponowana, macierz symetryczna, macierz antysymetryczna</h3><p>Dla macierzy $m \times n$ $A$ jej <strong>macierz transponowana (transpose matrix)</strong> $A^T$ jest macierzą $n \times m$ otrzymaną przez zamianę wierszy z kolumnami.</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>Macierz $A$ spełniającą $A^T = A$ nazywamy <strong>macierzą symetryczną (symmetric matrix)</strong>, a macierz $B$ spełniającą $B^T = -B$ — <strong>macierzą antysymetryczną (skew-symmetric matrix)</strong>. Macierze symetryczne i antysymetryczne muszą być macierzami kwadratowymi.</p><p>Dwa zbiory $\mathbb{W}_1, \mathbb{W}_2$, których elementami są odpowiednio wszystkie macierze symetryczne oraz wszystkie macierze antysymetryczne z $\mathcal{M}_{n \times n}(F)$, są podprzestrzeniami $\mathcal{M}_{n \times n}(F)$. To znaczy: $\mathbb{W}_1, \mathbb{W}_2$ są domknięte względem dodawania i mnożenia przez skalar.</p><h3 id="macierze-trójkątne-macierze-diagonalne">Macierze trójkątne, macierze diagonalne</h3><p>Te dwa typy macierzy są również szczególnie ważne.</p><p>Najpierw następujące dwa typy macierzy łącznie nazywamy <strong>macierzami trójkątnymi (triangular matrix)</strong>.</p><ul><li><strong>macierz górnotrójkątna (upper triangular matrix)</strong>: macierz, w której wszystkie elementy pod przekątną są równe $0$ (tj. $i&gt;j \Rightarrow A_{ij}=0$); zwykle oznaczana przez $U$<li><strong>macierz dolnotrójkątna (lower triangular matrix)</strong>: macierz, w której wszystkie elementy nad przekątną są równe $0$ (tj. $i&lt;j \Rightarrow A_{ij}=0$); zwykle oznaczana przez $L$</ul><p>Macierz kwadratową, w której wszystkie elementy poza przekątną są równe $0$, tzn. macierz $n \times n$ spełniającą $i \neq j \Rightarrow M_{ij}=0$, nazywamy <strong>macierzą diagonalną (diagonal matrix)</strong> i zwykle oznaczamy przez $D$. Macierz diagonalna jest jednocześnie macierzą górnotrójkątną i dolnotrójkątną.</p><p>Zbiór macierzy górnotrójkątnych, zbiór macierzy dolnotrójkątnych oraz zbiór macierzy diagonalnych są podprzestrzeniami $\mathcal{M}_{m \times n}(F)$.</p>]]> </content> </entry> <entry><title xml:lang="pl">Iloczyn wewnętrzny i norma</title><link href="https://www.yunseo.kim/pl/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-09-10T00:00:00+09:00</updated> <id>https://www.yunseo.kim/pl/posts/inner-product-and-norm/</id> <author> <name>Yunseo Kim</name> </author> <category term="Mathematics" /> <category term="Linear Algebra" /> <summary xml:lang="pl">Poznaj definicję iloczynu wewnętrznego i iloczynu skalarnego, a następnie zobacz, jak na ich podstawie definiuje się długość/normę wektora oraz kąt między wektorami.</summary> <content type="html" xml:lang="pl"> <![CDATA[<p>Poznaj definicję iloczynu wewnętrznego i iloczynu skalarnego, a następnie zobacz, jak na ich podstawie definiuje się długość/normę wektora oraz kąt między wektorami.</p><em><p>* Mathematical equations and diagrams included in posts may not display properly when viewed with a feed reader.</p></em><h2 id="wymagania-wstępne">Wymagania wstępne</h2><ul><li><a href="/pl/posts/vectors-and-linear-combinations/">Wektory i kombinacje liniowe</a></ul><h2 id="iloczyn-wewnętrzny">Iloczyn wewnętrzny</h2><p>Definicja <strong>iloczynu wewnętrznego (inner product)</strong> w ogólnej $F$-przestrzeni wektorowej jest następująca.</p><blockquote class="prompt-info"><p><strong>Definicja iloczynu wewnętrznego (inner product) i przestrzeni z iloczynem wewnętrznym (inner product space)</strong><br /> Rozważmy $F$-przestrzeń wektorową $\mathbb{V}$. <strong>Iloczyn wewnętrzny (inner product)</strong> $\langle \mathbf{x},\mathbf{y} \rangle$ na $\mathbb{V}$ definiuje się jako funkcję, która każdej uporządkowanej parze dowolnych wektorów $\mathbf{x}$ i $\mathbf{y}$ z $\mathbb{V}$ przyporządkowuje skalar należący do $F$ i spełnia następujące warunki.</p><p>Dla dowolnych $\mathbf{x},\mathbf{y},\mathbf{z} \in \mathbb{V}$ oraz dowolnego $c \in F$ zachodzi:</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}}$ to sprzężenie zespolone liczby $\mathbf{z}$)<li>Gdy $\mathbf{x} \neq \mathbf{0}$, to $\langle \mathbf{x}, \mathbf{x} \rangle$ jest dodatnie.</ol><p>$F$-przestrzeń wektorową $\mathbb{V}$ wyposażoną w iloczyn wewnętrzny nazywa się <strong>przestrzenią z iloczynem wewnętrznym (inner product space)</strong>. W szczególności, gdy $F=\mathbb{C}$, mówimy o <strong>zespolonej przestrzeni z iloczynem wewnętrznym (complex inner product space)</strong>, a gdy $F=\mathbb{R}$ — o <strong>rzeczywistej przestrzeni z iloczynem wewnętrznym (real inner product space)</strong>.</p></blockquote><p>W szczególności poniższy iloczyn wewnętrzny nazywa się <strong>standardowym iloczynem wewnętrznym (standard inner product)</strong>. Można sprawdzić, że spełnia on wszystkie cztery warunki z powyższej definicji.</p><blockquote class="prompt-info"><p><strong>Definicja standardowego iloczynu wewnętrznego (standard inner product)</strong><br /> Dla dwóch wektorów $\mathbf{x}=(a_1, a_2, \dots, a_n)$ oraz $\mathbf{y}=(b_1, b_2, \dots, b_n)$ w $F^n$ definiujemy <strong>standardowy iloczyn wewnętrzny (standard inner product)</strong> na $F^n$ następująco:</p>\[\langle \mathbf{x}, \mathbf{y} \rangle = \sum_{i=1}^n a_i \overline{b_i}\]</blockquote><p>Gdy $F=\mathbb{R}$, sprzężenie zespolone liczby rzeczywistej jest równe jej samej, więc standardowy iloczyn wewnętrzny ma wówczas postać $\sum_{i=1}^n a_i b_i$. W tym szczególnym przypadku standardowy iloczyn wewnętrzny zapisuje się często nie jako $\langle \mathbf{x}, \mathbf{y} \rangle$, lecz jako $\mathbf{x} \cdot \mathbf{y}$, i nazywa <strong>iloczynem skalarnym (dot product)</strong> lub <strong>iloczynem skalarnym (scalar product)</strong>.</p><blockquote class="prompt-info"><p><strong>Definicja iloczynu skalarnego (dot product)/iloczynu skalarnego (scalar product)</strong><br /> Dla $\mathbf{v}=(v_1, v_2, \dots, v_n)$ oraz $\mathbf{w}=(w_1, w_2, \dots, w_n)$ w $\mathbb{R}^n$ definiujemy <strong>iloczyn skalarny (dot product)</strong> lub <strong>iloczyn skalarny (scalar product)</strong> na $\mathbb{R}^n$ następująco:</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>Wspomniany tu „iloczyn skalarny (<strong>scalar product</strong>)” jest działaniem między wektorami i jest czymś innym niż „mnożenie skalarne (<strong>scalar multiplication</strong>)” (działanie skalar–wektor) omawiane w <a href="/pl/posts/vectors-and-linear-combinations/">Wektory i kombinacje liniowe</a>. Ponieważ angielskie nazwy są do siebie dość podobne, a do tego <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">w standardzie tłumaczeń przyjętym przez Koreańskie Towarzystwo Matematyczne oba terminy są w języku koreańskim identyczne</a>, trzeba uważać, by ich nie pomylić.</p><p>Aby uniknąć nieporozumień, dalej będę możliwie konsekwentnie używać określenia <strong>iloczyn skalarny (dot product)</strong>.</p></blockquote><blockquote class="prompt-tip"><p>Ponieważ w przestrzeni euklidesowej iloczyn wewnętrzny (inner product) jest tym samym co iloczyn skalarny (dot product), często — jeśli z kontekstu nie wynika ryzyko pomyłki — iloczyn skalarny nazywa się po prostu iloczynem wewnętrznym. Ściśle rzecz biorąc, iloczyn wewnętrzny jest jednak pojęciem bardziej ogólnym, obejmującym iloczyn skalarny jako szczególny przypadek.</p></blockquote><pre><code class="language-mermaid">flowchart TD
    A["Iloczyn wewnętrzny (Inner Product)"] --&gt;|zawiera| B["Standardowy iloczyn wewnętrzny (Standard Inner Product)"]
    B --&gt;|"F = R (ciało liczb rzeczywistych)"| C["Iloczyn skalarny (Dot/Scalar Product)"]

    %% 포함(포함 관계) 표기
    C -. zawarte .-&gt; B
    B -. zawarte .-&gt; A
</code></pre><h2 id="długośćnorma-wektora">Długość/norma wektora</h2><p>Dla wektora $\mathbf{v}=(v_1, v_2, \dots, v_n)$ w $\mathbb{R}^n$ długość euklidesową wektora $\mathbf{v}$ definiuje się za pomocą iloczynu skalarnego następująco:</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>Bardziej ogólnie, w dowolnej przestrzeni z iloczynem wewnętrznym <strong>długość (length)</strong> lub <strong>normę (norm)</strong> wektora definiuje się następująco:</p>\[\| \mathbf{x} \| = \sqrt{\langle \mathbf{x}, \mathbf{x} \rangle}\]<p>W ogólnej przestrzeni z iloczynem wewnętrznym dla normy wektora zachodzą następujące ważne własności.</p><blockquote class="prompt-info"><p><strong>Twierdzenie</strong><br /> Dla $F$-przestrzeni z iloczynem wewnętrznym $\mathbb{V}$, dowolnych wektorów $\mathbf{x}, \mathbf{y} \in \mathbb{V}$ oraz skalaru $c \in F$ zachodzi:</p><ol><li>$\|c\mathbf{x}\| = |c| \cdot \|\mathbf{x}\|$<li>Zachodzą dwa fakty:<ul><li>$\|\mathbf{x}\| = 0 \iff \mathbf{x}=\mathbf{0}$<li>$\|\mathbf{x}\| \geq 0 \ \forall \mathbf{x}$</ul><li><strong>Nierówność Cauchy’ego-Schwarza (Cauchy-Schwarz inequality)</strong>: $| \langle \mathbf{x}, \mathbf{y} \rangle | \leq \|\mathbf{x}\| \cdot \|\mathbf{y}\|$ (równość zachodzi, gdy jeden z wektorów $\mathbf{x}$ i $\mathbf{y}$ jest stałą wielokrotnością drugiego)<li><strong>Nierówność trójkąta (triangle inequality)</strong>: $\| \mathbf{x} + \mathbf{y} \| \leq \|\mathbf{x}\| + \|\mathbf{y}\|$ (równość zachodzi, gdy jeden z wektorów $\mathbf{x}$ i $\mathbf{y}$ jest stałą wielokrotnością drugiego oraz mają ten sam zwrot)</ol></blockquote><h2 id="kąt-między-wektorami-i-wektor-jednostkowy">Kąt między wektorami i wektor jednostkowy</h2><p>Wektor o długości $1$ nazywa się <strong>wektorem jednostkowym (unit vector)</strong>. Ponadto dla dwóch wektorów $\mathbf{v}=(v_1, v_2, \dots, v_n)$ oraz $\mathbf{w}=(w_1, w_2, \dots, w_n)$ w $\mathbb{R}^n$ zachodzi zależność $\mathbf{v} \cdot \mathbf{w} = \|\mathbf{v}\| \cdot \|\mathbf{w}\| \cos\theta$, skąd można wyznaczyć kąt $\theta$ ($0 \leq \theta \leq \pi$) między $\mathbf{v}$ i $\mathbf{w}$.</p>\[\theta = \arccos{\frac{\mathbf{v} \cdot \mathbf{w}}{\|\mathbf{v}\| \cdot \|\mathbf{w}\|}}\]<p>Jeśli $\mathbf{v} \cdot \mathbf{w} = 0$, to dwa wektory są <strong>prostopadłe (perpendicular)</strong> lub <strong>ortogonalne (orthogonal)</strong>.</p><blockquote class="prompt-tip"><p>Gdy dwa wektory $\mathbf{v}$ i $\mathbf{w}$ są prostopadłe,</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>Uogólnienie tego na dowolną przestrzeń z iloczynem wewnętrznym wygląda następująco.</p><blockquote class="prompt-info"><p><strong>Definicja</strong><br /> Rozważmy przestrzeń z iloczynem wewnętrznym $\mathbb{V}$. Dla wektorów $\mathbf{x}, \mathbf{y}$ z $\mathbb{V}$, jeśli $\langle \mathbf{x}, \mathbf{y} \rangle = 0$, to definiujemy, że dwa wektory są <strong>ortogonalne (orthogonal)</strong> lub <strong>prostopadłe (perpendicular)</strong>. Ponadto:</p><ol><li>Dla podzbioru $S$ przestrzeni $\mathbb{V}$, jeśli dowolne dwa różne wektory należące do $S$ są ortogonalne, to zbiór $S$ nazywa się <strong>zbiorem ortogonalnym (orthogonal set)</strong>.<li>Wektor $\mathbf{x} \in \mathbb{V}$ spełniający $\|\mathbf{x}\|=1$ nazywa się <strong>wektorem jednostkowym (unit vector)</strong>.<li>Jeśli podzbiór $S$ przestrzeni $\mathbb{V}$ jest zbiorem ortogonalnym i składa się wyłącznie z wektorów jednostkowych, to zbiór $S$ nazywa się <strong>zbiorem ortonormalnym (orthonormal set)</strong>.</ol></blockquote><p>Warunkiem koniecznym i wystarczającym na to, by zbiór $S = { \mathbf{v}_1, \mathbf{v}_2, \dots }$ był zbiorem ortonormalnym, jest $\langle \mathbf{v}_i, \mathbf{v}_j \rangle = \delta_{ij}$. Pomnożenie wektora przez niezerowy skalar nie wpływa na ortogonalność.</p><p>Dla dowolnego niezerowego wektora $\mathbf{x}$, wektor $\cfrac{\mathbf{x}}{\|\mathbf{x}\|}$ jest wektorem jednostkowym. Proces otrzymywania wektora jednostkowego poprzez pomnożenie niezerowego wektora przez skalar równy odwrotności jego długości nazywa się <strong>normalizacją (normalizing)</strong>.</p>]]> </content> </entry> <entry><title xml:lang="pl">Wektory i kombinacje liniowe</title><link href="https://www.yunseo.kim/pl/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-09-07T00:00:00+09:00</updated> <id>https://www.yunseo.kim/pl/posts/vectors-and-linear-combinations/</id> <author> <name>Yunseo Kim</name> </author> <category term="Mathematics" /> <category term="Linear Algebra" /> <summary xml:lang="pl">Czym jest wektor oraz jakie są jego podstawowe operacje (mnożenie przez skalar, dodawanie); na tej podstawie wyjaśniamy kombinacje liniowe wektorów i pojęcie rozpiętości (span).</summary> <content type="html" xml:lang="pl"> <![CDATA[<p>Czym jest wektor oraz jakie są jego podstawowe operacje (mnożenie przez skalar, dodawanie); na tej podstawie wyjaśniamy kombinacje liniowe wektorów i pojęcie rozpiętości (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>Definicja wektora</strong><ul><li><strong>Wektor w wąskim sensie (wektor euklidesowy)</strong>: wielkość fizyczna mająca jednocześnie moduł i kierunek<li><strong>Wektor w szerokim sensie, w algebrze liniowej</strong>: element przestrzeni wektorowej</ul><li><strong>Sposoby zapisu wektora</strong><ul><li><strong>Zapis strzałkowy</strong>: moduł wektora przedstawia długość strzałki, a kierunek wektora — kierunek strzałki. Zaletą jest łatwa wizualizacja i intuicyjność, jednak trudno w ten sposób przedstawiać wektory wysokowymiarowe (≥4) lub nieeuklidesowe.<li><strong>Zapis współrzędnych (składowych)</strong>: ustawiamy początek wektora w początku układu współrzędnych i opisujemy wektor współrzędnymi punktu końcowego.</ul><li><strong>Podstawowe działania na wektorach</strong><ul><li><strong>Suma</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>Iloczyn przez skalar</strong>: $c(a_1, a_2, \cdots, a_n) := (ca_1, ca_2, \cdots, ca_n)$</ul><li><strong>Kombinacja liniowa wektorów</strong><ul><li>Dla skończonej liczby wektorów $\mathbf{u}_1, \mathbf{u}_2, \dots, \mathbf{u}_n$ oraz skalarów $a_1, a_2, \dots, a_n$ wektor $\mathbf{v}$ spełniający $\mathbf{v} = a_1\mathbf{u}_1 + a_2\mathbf{u}_2 + \cdots + a_n\mathbf{u}_n$ nazywamy <strong>kombinacją liniową (linear combination)</strong> wektorów $\mathbf{u}_1, \mathbf{u}_2, \dots, \mathbf{u}_n$<li>Wtedy $a_1, a_2, \dots, a_n$ nazywamy <strong>współczynnikami (coefficient)</strong> tej kombinacji liniowej</ul><li><strong>Rozpiętość</strong><ul><li>Dla niepustego podzbioru $S$ przestrzeni wektorowej $\mathbb{V}$: zbiór wszystkich kombinacji liniowych utworzonych z wektorów z $S$, oznaczany $\mathrm{span}(S)$<li>Definiujemy $\mathrm{span}(\emptyset) = \{0\}$<li>Jeśli dla podzbioru $S \subset \mathbb{V}$ zachodzi $\mathrm{span}(S) = \mathbb{V}$, to mówimy, że $S$ generuje (generate lub span) przestrzeń $\mathbb{V}$</ul></ul></blockquote><h2 id="prerequisites">Prerequisites</h2><ul><li>płaszczyzna/ przestrzeń współrzędnych<li>ciało (field)</ul><h2 id="czym-jest-wektor">Czym jest wektor?</h2><h3 id="wektor-w-wąskim-sensie-wektor-euklidesowy">Wektor w wąskim sensie: wektor euklidesowy</h3><blockquote class="prompt-info"><p>Siła, prędkość, przyspieszenie i wiele innych wielkości fizycznych ma nie tylko moduł, lecz także informację o kierunku. Taką wielkość fizyczną mającą zarówno moduł, jak i kierunek nazywa się <strong>wektorem (vector)</strong>.</p></blockquote><p>Powyższa definicja to definicja wektora znana z mechaniki w fizyce lub z matematyki na poziomie szkoły średniej. Wektor w wąskim sensie — mający geometryczne znaczenie „długości i kierunku zorientowanego odcinka” oraz oparty na fizycznej intuicji — nazywa się ściślej <strong>wektorem euklidesowym (Euclidean vector)</strong>.</p><h3 id="wektor-w-szerokim-sensie-element-przestrzeni-wektorowej">Wektor w szerokim sensie: element przestrzeni wektorowej</h3><p>W algebrze liniowej wektor definiuje się jako bardziej abstrakcyjną strukturę algebraiczną o szerszym znaczeniu niż powyższy wektor euklidesowy:</p><blockquote class="prompt-info"><p><strong>Definicja</strong><br /> <strong>Przestrzeń wektorowa (vector space)</strong> lub <strong>przestrzeń liniowa (linear space)</strong> $\mathbb{V}$ nad ciałem $F$ jest zbiorem wyposażonym w dwa działania, <strong>dodawanie</strong> oraz <strong>mnożenie przez skalar</strong>, spełniające poniższe 8 warunków. Elementy ciała $F$ nazywamy <strong>skalarami (scalar)</strong>, a elementy przestrzeni $\mathbb{V}$ — <strong>wektorami (vector)</strong>.</p><ul><li><strong>Suma (sum)</strong>: dla dwóch elementów $\mathbf{x}, \mathbf{y} \in \mathbb{V}$ jest to działanie przyporządkowujące jednoznacznie element $\mathbf{x} + \mathbf{y} \in \mathbb{V}$. Element $\mathbf{x} + \mathbf{y}$ nazywamy <strong>sumą</strong> $\mathbf{x}$ i $\mathbf{y}$.<li><strong>Mnożenie przez skalar (scalar multiplication)</strong>: dla elementu $a \in F$ i elementu $\mathbf{x} \in \mathbb{V}$ jest to działanie przyporządkowujące jednoznacznie element $a\mathbf{x} \in \mathbb{V}$. Element $a\mathbf{x}$ nazywamy <strong>wielokrotnością skalarną (scalar multiple)</strong> wektora $\mathbf{x}$.</ul><ol><li>Dla wszystkich $\mathbf{x},\mathbf{y} \in \mathbb{V}$ zachodzi $\mathbf{x} + \mathbf{y} = \mathbf{y} + \mathbf{x}$. (przemienność dodawania)<li>Dla wszystkich $\mathbf{x},\mathbf{y},\mathbf{z} \in \mathbb{V}$ zachodzi $(\mathbf{x}+\mathbf{y})+\mathbf{z} = \mathbf{x}+(\mathbf{y}+\mathbf{z})$. (łączność dodawania)<li>Dla każdego $\mathbf{x} \in \mathbb{V}$ istnieje $\mathbf{0} \in \mathbb{V}$ takie, że $\mathbf{x} + \mathbf{0} = \mathbf{x}$. (wektor zerowy, element neutralny dodawania)<li>Dla każdego $\mathbf{x} \in \mathbb{V}$ istnieje $\mathbf{y} \in \mathbb{V}$ takie, że $\mathbf{x}+\mathbf{y}=\mathbf{0}$. (element przeciwny względem dodawania)<li>Dla każdego $\mathbf{x} \in \mathbb{V}$ zachodzi $1\mathbf{x} = \mathbf{x}$. (element neutralny mnożenia)<li>Dla wszystkich $a,b \in F$ oraz wszystkich $\mathbf{x} \in \mathbb{V}$ zachodzi $(ab)\mathbf{x} = a(b\mathbf{x})$. (łączność mnożenia przez skalar)<li>Dla wszystkich $a \in F$ oraz wszystkich $\mathbf{x},\mathbf{y} \in \mathbb{V}$ zachodzi $a(\mathbf{x}+\mathbf{y}) = a\mathbf{x} + a\mathbf{y}$. (rozdzielność 1 mnożenia przez skalar względem dodawania)<li>Dla wszystkich $a,b \in F$ oraz wszystkich $\mathbf{x},\mathbf{y} \in \mathbb{V}$ zachodzi $(a+b)\mathbf{x} = a\mathbf{x} + b\mathbf{x}$. (rozdzielność 2 mnożenia przez skalar względem dodawania)</ol></blockquote><p>Taka definicja wektora w algebrze liniowej jest definicją o szerszym zakresie, obejmującą również wspomniany wcześniej <a href="#wektor-w-wąskim-sensie-wektor-euklidesowy">wektor euklidesowy</a>. Można sprawdzić, że <a href="#wektor-w-wąskim-sensie-wektor-euklidesowy">wektor euklidesowy</a> także spełnia powyższe 8 własności.</p><p>Geneza i rozwój pojęcia wektora są ściśle związane z różnymi praktycznymi problemami stawianymi przez fizykę — próbami ilościowego opisu takich pojęć jak siła, ruch ciała, obrót czy pole. Z potrzeby fizycznej, by matematycznie opisywać zjawiska przyrodnicze, początkowo zaproponowano pojęcie wektora jako <a href="#wektor-w-wąskim-sensie-wektor-euklidesowy">wektora euklidesowego</a>. Następnie matematyka uogólniała i formalizowała te idee, ustanawiając struktury takie jak przestrzenie wektorowe, iloczyn skalarny i wektorowy, co doprowadziło do współczesnej definicji wektora. Innymi słowy, wektor to pojęcie „wymagane przez fizykę i ugruntowane przez matematykę” — produkt interdyscyplinarny rozwijany przez ścisłą współpracę matematyków i fizyków, a nie wyłącznie wytwór czystej matematyki.</p><p><a href="#wektor-w-wąskim-sensie-wektor-euklidesowy">Wektory euklidesowe</a> używane w klasycznej mechanice można matematycznie opisać w <a href="#wektor-w-szerokim-sensie-element-przestrzeni-wektorowej">bardziej uogólnionych ramach</a>. Współczesna fizyka aktywnie wykorzystuje nie tylko <a href="#wektor-w-wąskim-sensie-wektor-euklidesowy">wektory euklidesowe</a>, lecz także bardziej abstrakcyjne pojęcia zdefiniowane w matematyce, takie jak przestrzenie wektorowe czy przestrzenie funkcji, nadając im interpretację fizyczną. Dlatego niewłaściwe jest rozumienie tych dwóch definicji wyłącznie jako „definicji fizycznej” i „definicji matematycznej”.</p><p>O przestrzeniach wektorowych powiemy więcej później; na razie skupimy się na wąskim sensie wektora — wektorach euklidesowych, które da się geometrycznie przedstawić w przestrzeni współrzędnych. Najpierw warto zobaczyć intuicyjne przykłady wektorów euklidesowych, bo ułatwia to późniejsze uogólnienia na inne rodzaje wektorów.</p><h2 id="sposoby-zapisu-wektora">Sposoby zapisu wektora</h2><h3 id="zapis-strzałkowy">Zapis strzałkowy</h3><p>To najczęściej spotykany zapis, najlepiej oddający intuicję geometryczną. Moduł wektora przedstawia się jako długość strzałki, a kierunek wektora — jako kierunek strzałki.</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>Źródło obrazu</em></p><ul><li>autor: użytkownik Wikipedii <a href="https://en.wikipedia.org/wiki/User:Nguyenthephuc">Nguyenthephuc</a><li>licencja: <a href="https://creativecommons.org/licenses/by-sa/3.0/deed.en">CC BY-SA 3.0</a></ul></blockquote><p>Taki zapis jest intuicyjny, jednak dla wektorów wysokowymiarowych (co najmniej 4-wymiarowych) ma oczywiste ograniczenia. Co więcej, później trzeba będzie rozważać także wektory nieeuklidesowe, których nie da się wygodnie przedstawić geometrycznie, dlatego warto oswoić się z omówionym niżej zapisem współrzędnych.</p><h3 id="zapis-współrzędnych-składowych">Zapis współrzędnych (składowych)</h3><p>Wektory o takim samym module i kierunku uznaje się za identyczne, niezależnie od tego, gdzie „leżą”. Zatem, gdy dana jest przestrzeń współrzędnych, jeśli umocujemy początek wektora w początku układu, to <u>wektor $n$-wymiarowy odpowiada dowolnemu punktowi w przestrzeni $n$-wymiarowej</u>, a wtedy wektor można opisać współrzędnymi punktu końcowego. Taki zapis nazywamy <strong>zapisem współrzędnych (składowych)</strong> wektora.</p>\[(a_1, a_2, \cdots, a_n) \in \mathbb{R}^n \text{ lub } \mathbb{C}^n\]<p><img src="https://upload.wikimedia.org/wikipedia/commons/5/5d/Position_vector.svg" alt="Position vector" /></p><blockquote><p><em>Źródło obrazu</em></p><ul><li>autor: użytkownik Wikimedia <a href="https://commons.wikimedia.org/wiki/User:Acdx">Acdx</a><li>licencja: <a href="https://creativecommons.org/licenses/by-sa/3.0/deed.en">CC BY-SA 3.0</a></ul></blockquote><h2 id="podstawowe-działania-na-wektorach">Podstawowe działania na wektorach</h2><p>Podstawowe działania na wektorach to dwa: <strong>suma</strong> oraz <strong>mnożenie przez skalar</strong>. Wszystkie operacje wektorowe da się wyrazić jako złożenie tych dwóch podstawowych działań.</p><h3 id="suma-wektorów">Suma wektorów</h3><p>Suma dwóch wektorów jest również wektorem, a składowe wektora wynikowego są sumami odpowiednich składowych.</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="mnożenie-wektora-przez-skalar">Mnożenie wektora przez skalar</h3><p>Wektor można „powiększać” lub „pomniejszać”; opisuje to działanie mnożenia wektora przez stałą (skalar). Wynik mnożenia przez skalar odpowiada mnożeniu każdej składowej przez ten skalar.</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>Źródło obrazu</em></p><ul><li>autor: użytkownik Wikipedii <a href="https://en.wikipedia.org/wiki/User:Silly_rabbit">Silly rabbit</a><li>licencja: <a href="https://creativecommons.org/licenses/by-sa/3.0/deed.en">CC BY-SA 3.0</a></ul></blockquote><h2 id="kombinacje-liniowe-wektorów">Kombinacje liniowe wektorów</h2><p>Tak jak analiza matematyczna startuje od liczby $x$ i funkcji $f(x)$, tak algebra liniowa startuje od wektorów $\mathbf{v}, \mathbf{w}, \dots$ oraz kombinacji liniowych postaci $c\mathbf{v} + d\mathbf{w} + \cdots$. Wszystkie kombinacje liniowe wektorów są zbudowane jako złożenie dwóch podstawowych działań: <a href="#suma-wektorów">sumy</a> i <a href="#mnożenie-wektora-przez-skalar">mnożenia przez skalar</a>.</p><blockquote class="prompt-info"><p>Dla skończonej liczby wektorów $\mathbf{u}_1, \mathbf{u}_2, \dots, \mathbf{u}_n$ oraz skalarów $a_1, a_2, \dots, a_n$ wektor $\mathbf{v}$ spełniający</p>\[\mathbf{v} = a_1\mathbf{u}_1 + a_2\mathbf{u}_2 + \cdots + a_n\mathbf{u}_n\]<p>nazywamy <strong>kombinacją liniową (linear combination)</strong> wektorów $\mathbf{u}_1, \mathbf{u}_2, \dots, \mathbf{u}_n$.</p><p>Wtedy $a_1, a_2, \dots, a_n$ nazywamy <strong>współczynnikami (coefficient)</strong> tej kombinacji liniowej.</p></blockquote><p>Dlaczego takie kombinacje liniowe są ważne? Rozważmy sytuację, w której <strong>$n$ wektorów w $m$-wymiarowej przestrzeni tworzy $n$ kolumn macierzy $m \times 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>Kluczowe są tu dwa punkty:</p><ol><li><strong>Opisz wszystkie możliwe kombinacje liniowe $Ax = x_1\mathbf{v}_1 + x_2\mathbf{v}_2 + \cdots x_n\mathbf{v}_n$.</strong> Co tworzą?<li>Znajdź <strong>liczby $x_1, x_2, \dots, x_n$</strong>, które wytworzą żądany wektor wyjściowy $Ax = b$.</ol><p>Do odpowiedzi na drugie pytanie wrócimy później, a teraz skupmy się na pierwszym. Aby uprościć rozważania, rozpatrzmy przykład dwóch niezerowych wektorów dwuwymiarowych ($m=2$) w liczbie dwóch ($n=2$).</p><h3 id="kombinacja-liniowa-cmathbfv--dmathbfw">Kombinacja liniowa $c\mathbf{v} + d\mathbf{w}$</h3><p>Wektor $\mathbf{v}$ w przestrzeni 2D ma dwie składowe. Dla każdego skalara $c$ <u>wektor $c\mathbf{v}$ jest równoległy do $\mathbf{v}$ i wyznacza w płaszczyźnie $xy$ nieskończenie długą prostą przechodzącą przez początek układu.</u></p><p>Jeżeli drugi dany wektor $\mathbf{w}$ nie leży na tej prostej (tj. wektory $\mathbf{v}$ i $\mathbf{w}$ nie są równoległe), to wektor $d\mathbf{w}$ wyznacza drugą prostą. Gdy połączymy te dwie proste, widać, że <strong>kombinacja liniowa $c\mathbf{v} + d\mathbf{w}$ wyznacza pewną płaszczyznę zawierającą początek układu</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>Źródło obrazu</em></p><ul><li>autor: użytkownik Wikimedia <a href="https://commons.wikimedia.org/wiki/User:Svjo">Svjo</a><li>licencja: <a href="https://creativecommons.org/licenses/by-sa/4.0/deed.en">CC BY-SA 4.0</a></ul></blockquote><h3 id="rozpinanie">Rozpinanie</h3><p>W ten sposób kombinacje liniowe wektorów tworzą przestrzeń wektorową; nazywa się to <strong>rozpinaniem (span)</strong>.</p><blockquote class="prompt-info"><p><strong>Definicja</strong><br /> Dla niepustego podzbioru $S$ przestrzeni wektorowej $\mathbb{V}$ zbiór wszystkich kombinacji liniowych utworzonych z wektorów z $S$ nazywamy <strong>rozpiętością (span)</strong> zbioru $S$ i oznaczamy $\mathrm{span}(S)$. Ponadto definiujemy $\mathrm{span}(\emptyset) = \{0\}$.</p></blockquote><blockquote class="prompt-info"><p><strong>Definicja</strong><br /> Dla podzbioru $S$ przestrzeni wektorowej $\mathbb{V}$, jeśli $\mathrm{span}(S) = \mathbb{V}$, to mówimy, że $S$ generuje (generate lub span) przestrzeń $\mathbb{V}$.</p></blockquote><p>Nie omawialiśmy jeszcze pojęć takich jak podprzestrzeń czy baza, jednak przywołanie tego przykładu pomaga w zrozumieniu samej idei przestrzeni wektorowej.</p>]]> </content> </entry> <entry><title xml:lang="pl">Podsumowanie kursu Kaggle „Pandas” (2) — lekcje 4–6</title><link href="https://www.yunseo.kim/pl/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/pl/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="pl">Podsumowanie wykorzystania biblioteki Pandas do czyszczenia i przetwarzania danych. Streszczenie kursu Kaggle „Pandas” z uzupełnieniami; część 2 obejmuje lekcje 4–6.</summary> <content type="html" xml:lang="pl"> <![CDATA[<p>Podsumowanie wykorzystania biblioteki Pandas do czyszczenia i przetwarzania danych. Streszczenie kursu Kaggle „Pandas” z uzupełnieniami; część 2 obejmuje lekcje 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>Poniżej porządkuję notatki z nauki na kursie Kaggle <a href="https://www.kaggle.com/learn/pandas">Pandas</a>.<br /> Ponieważ materiału jest całkiem sporo, podzieliłem go na 2 części.</p><ul><li><a href="/pl/posts/summary-of-kaggle-pandas-course-1/">Część 1: lekcje 1–3</a><li>Część 2: lekcje 4–6 (ten wpis)</ul><p><img src="/assets/img/kaggle-pandas/certificate.png" alt="Certyfikat ukończenia" /></p><h2 id="lekcja-4-grupowanie-i-sortowanie">Lekcja 4. Grupowanie i sortowanie</h2><p>Czasem trzeba sklasyfikować dane i wykonać pewne operacje osobno dla każdej grupy, albo posortować je według określonego kryterium.</p><h3 id="analiza-grupowa">Analiza grupowa</h3><p>Metoda <a href="https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.groupby.html"><code class="language-plaintext highlighter-rouge">groupby()</code></a> pozwala grupować rekordy o tych samych wartościach w wybranej kolumnie, a następnie dla każdej grupy wykonać podgląd lub przekształcenia.</p><p>Wcześniej omawialiśmy <a href="/pl/posts/summary-of-kaggle-pandas-course-1/#podglad-ogolnej-charakterystyki-danych">metodę <code class="language-plaintext highlighter-rouge">value_counts()</code></a>; to samo działanie da się zrealizować metodą <code class="language-plaintext highlighter-rouge">groupby()</code> w następujący sposób:</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>Grupuje DataFrame <code class="language-plaintext highlighter-rouge">reviews</code> według jednakowych wartości w kolumnie <code class="language-plaintext highlighter-rouge">taster_name</code><li>Zwraca Series z rozmiarem (liczbą rekordów) każdej grupy</ol><p>Albo:</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>Grupuje DataFrame <code class="language-plaintext highlighter-rouge">reviews</code> według jednakowych wartości w kolumnie <code class="language-plaintext highlighter-rouge">taster_name</code><li>Dla każdej grupy wybiera dane z kolumny <code class="language-plaintext highlighter-rouge">taster_name</code><li>Zwraca Series z liczbą wartości niepustych (bez braków) w każdej grupie</ol><p>Czyli <code class="language-plaintext highlighter-rouge">value_counts()</code> jest w istocie skrótem dla zachowania podobnego do powyższego. Poza metodą <a href="https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.count.html"><code class="language-plaintext highlighter-rouge">count()</code></a> można w ten sposób wykorzystywać dowolną funkcję podsumowującą. Na przykład, aby z danych o winach sprawdzić minimalną cenę dla każdego wyniku punktowego:</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>Grupuje DataFrame <code class="language-plaintext highlighter-rouge">reviews</code> według jednakowych wartości w kolumnie <code class="language-plaintext highlighter-rouge">points</code><li>Dla każdej grupy wybiera dane z kolumny <code class="language-plaintext highlighter-rouge">price</code><li>Zwraca Series z minimalną wartością w każdej grupie</ol><p>Można też grupować po więcej niż jednej kolumnie. Aby wybrać wyłącznie informacje o winie z najwyższą oceną dla każdej pary (kraj, prowincja/stan):</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>Kolejną przydatną metodą obiektu <code class="language-plaintext highlighter-rouge">DataFrameGroupBy</code> jest <a href="https://pandas.pydata.org/docs/reference/api/pandas.core.groupby.DataFrameGroupBy.agg.html"><code class="language-plaintext highlighter-rouge">agg()</code></a>. Pozwala ona po zgrupowaniu danych uruchomić jednocześnie kilka funkcji dla każdej grupy.</p><blockquote class="prompt-tip"><p>W tym przypadku jako argument można przekazać:</p><ul><li>funkcję,<li>napis z nazwą funkcji,<li>listę funkcji lub nazw funkcji,<li>słownik, gdzie kluczem jest etykieta osi, a wartością jest funkcja lub lista funkcji do zastosowania na tej osi.</ul><p>Sama funkcja musi:</p><ul><li>przyjmować DataFrame jako wejście, albo<li>być możliwa do przekazania jako argument do (omawianej wcześniej) metody <a href="/pl/posts/summary-of-kaggle-pandas-course-1/#odwzorowania-maps"><code class="language-plaintext highlighter-rouge">DataFrame.apply()</code></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>To uzupełnienie nie występowało w oryginalnym kursie Kaggle; dopisałem je, opierając się na oficjalnej dokumentacji Pandas.</p></blockquote><p>Na przykład w ten sposób można policzyć statystyki cen w podziale na kraje:</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>Tutaj <code class="language-plaintext highlighter-rouge">len</code> oznacza wbudowaną funkcję Pythona <a href="https://docs.python.org/3/library/functions.html#len"><code class="language-plaintext highlighter-rouge">len()</code></a>; w tym przykładzie użyłem jej do wypisania liczby rekordów ceny (<code class="language-plaintext highlighter-rouge">price</code>) w każdej grupie (<code class="language-plaintext highlighter-rouge">country</code>) <u>łącznie z brakami danych</u>.</p><p>Metoda <a href="https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.count.html"><code class="language-plaintext highlighter-rouge">count()</code></a> z Pandas różni się tym, że zwraca <u>wyłącznie liczbę poprawnych (niepustych) wartości</u>, z pominięciem braków.</p><p>To uzupełnienie nie występowało w oryginalnym kursie Kaggle; dopisałem je, opierając się na oficjalnej dokumentacji Pythona i Pandas.</p></blockquote><h3 id="indeks-wielopoziomowy-multiindex">Indeks wielopoziomowy (MultiIndex)</h3><p>Gdy przetwarza się i analizuje dane metodą <code class="language-plaintext highlighter-rouge">groupby()</code>, czasem zamiast zwykłych etykiet otrzymuje się DataFrame z indeksem wielopoziomowym (złożonym z dwóch lub więcej poziomów).</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>Indeks wielopoziomowy ma pewne metody przeznaczone do pracy ze strukturą hierarchiczną, których nie ma zwykły indeks. Szczegółowe przykłady i zalecenia dotyczące MultiIndex znajdziesz w sekcji <a href="https://pandas.pydata.org/pandas-docs/stable/user_guide/advanced.html">MultiIndex / advanced indexing w pandas User Guide</a>.</p><p>W praktyce jednak najczęściej używaną metodą dla MultiIndex bywa <a href="https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.reset_index.html"><code class="language-plaintext highlighter-rouge">reset_index()</code></a>, która „spłaszcza” indeks z powrotem do zwykłego.</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="sortowanie">Sortowanie</h3><p>Jeśli przyjrzysz się <code class="language-plaintext highlighter-rouge">countries_reviewed</code>, zauważysz, że wynik grupowania jest zwracany w kolejności indeksu. Innymi słowy: kolejność wierszy w wyniku <code class="language-plaintext highlighter-rouge">groupby</code> jest wyznaczana nie przez „zawartość” danych, tylko przez wartości indeksu.</p><p>W razie potrzeby możesz ręcznie posortować dane w inny sposób. W tym celu wygodnie użyć metody <a href="https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.sort_values.html"><code class="language-plaintext highlighter-rouge">sort_values()</code></a>. Na przykład poniżej sortujemy rosnąco według liczby rekordów (<code class="language-plaintext highlighter-rouge">len</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">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> domyślnie sortuje rosnąco (od mniejszych do większych wartości). Jeśli ustawisz opcję, możesz sortować malejąco (od większych do mniejszych):</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>Aby sortować według indeksu, użyj metody <a href="https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.sort_index.html"><code class="language-plaintext highlighter-rouge">sort_index()</code></a>. Ma te same argumenty i domyślny kierunek sortowania co <code class="language-plaintext highlighter-rouge">sort_values()</code>, więc sposób użycia jest analogiczny.</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>Na koniec: można też sortować jednocześnie po więcej niż jednej kolumnie, np.:</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="lekcja-5-typy-danych-i-braki-danych">Lekcja 5. Typy danych i braki danych</h2><p>W praktyce rzadko zdarza się, by dane były zawsze idealnie wyczyszczone. Często trzeba konwertować typy (bo nie są takie, jakich oczekujemy) albo radzić sobie z brakami danych i poprawnie je obsłużyć. Przy przetwarzaniu i analizie danych to zwykle najtrudniejszy etap.</p><h3 id="typy-danych">Typy danych</h3><p>Typ danych konkretnej kolumny w DataFrame (albo typu danych Series) nazywa się <strong>dtype</strong>. Za pomocą atrybutu <code class="language-plaintext highlighter-rouge">dtype</code> można sprawdzić typ danej kolumny. Poniżej przykład dla kolumny <code class="language-plaintext highlighter-rouge">price</code> w DataFrame <code class="language-plaintext highlighter-rouge">reviews</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>Można też użyć atrybutu <code class="language-plaintext highlighter-rouge">dtypes</code>, aby jednocześnie sprawdzić <code class="language-plaintext highlighter-rouge">dtype</code> wszystkich kolumn w DataFrame:</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>Typ danych mówi, jak Pandas przechowuje dane wewnętrznie. Na przykład <code class="language-plaintext highlighter-rouge">float64</code> oznacza 64-bitową liczbę zmiennoprzecinkową, a <code class="language-plaintext highlighter-rouge">int64</code> — 64-bitową liczbę całkowitą.</p><p>Warto też zauważyć jedną specyfikę: kolumny złożone wyłącznie z napisów (string) nie mają osobnego typu tekstowego i są po prostu traktowane jako obiekty (<code class="language-plaintext highlighter-rouge">object</code>).</p><p>Metoda <a href="https://pandas.pydata.org/docs/reference/api/pandas.Series.astype.html"><code class="language-plaintext highlighter-rouge">astype()</code></a> pozwala przekonwertować kolumnę z jednego typu na inny. Na przykład można przekonwertować kolumnę <code class="language-plaintext highlighter-rouge">points</code> z typu <code class="language-plaintext highlighter-rouge">int64</code> na <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>Indeks DataFrame lub Series również ma typ danych:</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>Poza tym Pandas wspiera także typy „zewnętrzne”, np. dane kategoryczne czy szeregi czasowe.</p><h3 id="braki-danych">Braki danych</h3><p>Wpisy bez wartości (puste) dostają wartość <code class="language-plaintext highlighter-rouge">NaN</code> (skrót od „Not a Number”). Z powodów technicznych <code class="language-plaintext highlighter-rouge">NaN</code> zawsze ma typ <code class="language-plaintext highlighter-rouge">float64</code>.</p><p>Pandas udostępnia kilka funkcji wyspecjalizowanych do pracy z brakami danych. <a href="/pl/posts/summary-of-kaggle-pandas-course-1/#wybor-warunkowy">Wcześniej widzieliśmy coś podobnego</a>: poza metodami istnieją też niezależne funkcje <a href="https://pandas.pydata.org/docs/reference/api/pandas.isna.html"><code class="language-plaintext highlighter-rouge">pd.isna</code></a> oraz <a href="https://pandas.pydata.org/docs/reference/api/pandas.notna.html"><code class="language-plaintext highlighter-rouge">pd.notna</code></a>. Zwracają one informację, czy dany wpis jest brakiem (albo czy nim nie jest) — jako pojedynczą wartość boolowską albo tablicę wartości boolowskich — i można je wykorzystać np. tak:</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>Zwykle najpierw trzeba sprawdzić, czy w danych są braki, a jeśli są — uzupełnić je w odpowiedni sposób. Istnieje kilka strategii. Po pierwsze, metoda <a href="https://pandas.pydata.org/docs/reference/api/pandas.Series.fillna.html"><code class="language-plaintext highlighter-rouge">fillna()</code></a> pozwala zastąpić braki jakąś sensowną wartością. Poniżej przykład, w którym wszystkie <code class="language-plaintext highlighter-rouge">NaN</code> w kolumnie <code class="language-plaintext highlighter-rouge">region_2</code> zastępujemy napisem <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>Można też zastosować strategię forward fill lub backward fill, czyli uzupełniać braki najbliższą poprawną wartością odpowiednio z przodu albo z tyłu. Da się to zrobić metodami <a href="https://pandas.pydata.org/docs/reference/api/pandas.Series.ffill.html"><code class="language-plaintext highlighter-rouge">ffill()</code></a> oraz <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>Dawniej można było używać <code class="language-plaintext highlighter-rouge">fillna()</code> z argumentem <code class="language-plaintext highlighter-rouge">method</code> ustawionym na napisy <code class="language-plaintext highlighter-rouge">'ffill'</code> i <code class="language-plaintext highlighter-rouge">'bfill'</code>, ale od Pandas 2.1.0 ta metoda jest deprecated i nie jest zalecana. Zamiast tego należy używać <code class="language-plaintext highlighter-rouge">ffill()</code> lub <code class="language-plaintext highlighter-rouge">bfill()</code> odpowiednio do sytuacji.</p></blockquote><p>Bywa też tak, że nawet jeśli nie mamy braków danych, trzeba masowo zamienić jedną wartość na inną. W oryginalnym kursie Kaggle jako przykład podano sytuację, w której w zbiorze recenzji zmienił się twitterowy handle konkretnego recenzenta. To dobry przykład, ale spróbujmy wymyślić inny, bardziej „namacalny” w polskim (i nie tylko) kontekście.</p><p>Wyobraźmy sobie hipotetyczną sytuację, w której w Korei Południowej wydzielono północną część prowincji Gyeonggi-do jako nową jednostkę administracyjną pod nazwą <strong>Gyeonggibuk-do</strong>, i istnieje już zbiór danych, w którym ta nazwa figuruje. Następnie ktoś wpada na absurdalny pomysł, żeby tę całkiem sensowną nazwę <strong>Gyeonggibuk-do</strong> zmienić na <strong>Pyeonghwanuri Special Self-Governing Province</strong>, i jakimś cudem doprowadza do formalnego wdrożenia tej zmiany. <del>To tylko hipotetyczny scenariusz, ale przerażające jest to, że coś podobnego mogło się wydarzyć naprawdę.</del> Wtedy trzeba byłoby w istniejącym zbiorze danych masowo zamienić <code class="language-plaintext highlighter-rouge">"Gyeonggibuk-do"</code> na nowe wartości, np. <code class="language-plaintext highlighter-rouge">"Pyeonghwanuri State"</code> albo <code class="language-plaintext highlighter-rouge">"Pyeonghwanuri Special Self-Governing Province"</code>. Jednym ze sposobów wykonania takiej operacji w Pandas jest metoda <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>Korzystając z powyższego kodu, można skutecznie zamienić wszystkie wystąpienia <code class="language-plaintext highlighter-rouge">"Gyeonggibuk-do"</code> w kolumnie <code class="language-plaintext highlighter-rouge">province</code> zbioru <code class="language-plaintext highlighter-rouge">rok_2030_census</code> na „to długie coś”. <del>I z ulgą można stwierdzić, że na szczęście w realnym świecie nikt nie musiał tego naprawdę uruchamiać.</del></p><p>Tego typu zamiany napisów są przydatne również przy czyszczeniu danych i obsłudze braków, bo braki danych nie zawsze są zapisane jako <code class="language-plaintext highlighter-rouge">NaN</code> — często pojawiają się jako napisy typu <code class="language-plaintext highlighter-rouge">"Unknown"</code>, <code class="language-plaintext highlighter-rouge">"Undisclosed"</code>, <code class="language-plaintext highlighter-rouge">"Invalid"</code> itd. W realnych projektach, np. gdy tworzy się zbiory danych przez OCR starych dokumentów urzędowych, takie przypadki mogą wręcz dominować.</p><h2 id="lekcja-6-zmiana-nazw-i-łączenie">Lekcja 6. Zmiana nazw i łączenie</h2><p>Czasem trzeba zmienić nazwy kolumn lub indeksu w zbiorze danych. Równie często pojawia się potrzeba łączenia wielu DataFrame lub Series.</p><h3 id="zmiana-nazw">Zmiana nazw</h3><p>Metoda <a href="https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.rename.html"><code class="language-plaintext highlighter-rouge">rename()</code></a> pozwala zmieniać nazwy wybranych kolumn lub indeksu w zbiorze danych. <code class="language-plaintext highlighter-rouge">rename()</code> obsługuje różne formaty wejścia, ale najwygodniej zwykle użyć słownika Pythona. Poniżej przykład: zmieniamy nazwę kolumny <code class="language-plaintext highlighter-rouge">points</code> na <code class="language-plaintext highlighter-rouge">score</code> w DataFrame <code class="language-plaintext highlighter-rouge">reviews</code>, a także zmieniamy etykiety indeksu <code class="language-plaintext highlighter-rouge">0</code> i <code class="language-plaintext highlighter-rouge">1</code> na <code class="language-plaintext highlighter-rouge">firstEntry</code> oraz <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>W praktyce często zmienia się nazwy kolumn, ale bardzo rzadko zmienia się konkretne wartości indeksu. Do takich zastosowań zwykle wygodniej użyć (jak widzieliśmy wcześniej) metody <a href="/pl/posts/summary-of-kaggle-pandas-course-1/#modyfikowanie-indeksu"><code class="language-plaintext highlighter-rouge">set_index()</code></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>Indeks wierszy i indeks kolumn mają też własny atrybut <code class="language-plaintext highlighter-rouge">name</code>; metodą <code class="language-plaintext highlighter-rouge">rename_axis()</code> można zmienić nazwę osi. Na przykład: osi indeksu można nadać nazwę <code class="language-plaintext highlighter-rouge">wines</code>, a osi kolumn — <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="łączenie-zbiorów-danych">Łączenie zbiorów danych</h3><p>Czasem trzeba łączyć DataFrame z DataFrame albo Series z Series. Pandas udostępnia do tego trzy kluczowe funkcje; od najprostszej do najbardziej złożonej są to: <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> oraz <a href="https://pandas.pydata.org/docs/reference/api/pandas.merge.html"><code class="language-plaintext highlighter-rouge">merge()</code></a>. Kurs Kaggle zaznacza, że większość tego, co da się zrobić <code class="language-plaintext highlighter-rouge">merge()</code>, można prościej zrobić <code class="language-plaintext highlighter-rouge">join()</code>, więc skupia się na dwóch pierwszych.</p><p>Funkcja <code class="language-plaintext highlighter-rouge">concat()</code> jest najprostsza: „dokleja” wiele DataFrame lub Series wzdłuż wybranej osi. Jest przydatna, gdy łączone obiekty mają te same pola (kolumny). Domyślnie konkatenacja idzie wzdłuż osi indeksu; można też ustawić <code class="language-plaintext highlighter-rouge">axis=1</code> lub <code class="language-plaintext highlighter-rouge">axis='columns'</code>, żeby sklejać wzdłuż osi kolumn.</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>Według <a href="(https://pandas.pydata.org/docs/reference/api/pandas.concat.html)">oficjalnej dokumentacji Pandas</a> nie zaleca się tworzenia DataFrame przez dodawanie pojedynczych wierszy w pętli. Jeśli trzeba połączyć wiele wierszy, lepiej zebrać je w listę i scalić jedną operacją <code class="language-plaintext highlighter-rouge">concat()</code>.</p></blockquote><p>Metoda <code class="language-plaintext highlighter-rouge">join()</code> jest nieco bardziej złożona: dokleja jeden DataFrame do drugiego na podstawie indeksu. Jeśli występują kolumny o tych samych nazwach, trzeba podać argumenty <code class="language-plaintext highlighter-rouge">lsuffix</code> i <code class="language-plaintext highlighter-rouge">rsuffix</code>, aby dodać odpowiednie sufiksy rozróżniające nakładające się nazwy kolumn.</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="pl">Wskaźniki wydajności WWW (Web Vitals)</title><link href="https://www.yunseo.kim/pl/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-05T00:00:00+09:00</updated> <id>https://www.yunseo.kim/pl/posts/about-web-vitals/</id> <author> <name>Yunseo Kim</name> </author> <category term="Dev" /> <category term="Web Dev" /> <summary xml:lang="pl">Porządkuję Web Vitals oraz kryteria pomiaru i oceny w Lighthouse, a także wyjaśniam, co oznacza każdy z kluczowych wskaźników wydajności.</summary> <content type="html" xml:lang="pl"> <![CDATA[<p>Porządkuję Web Vitals oraz kryteria pomiaru i oceny w Lighthouse, a także wyjaśniam, co oznacza każdy z kluczowych wskaźników wydajności.</p><em><p>* Mathematical equations and diagrams included in posts may not display properly when viewed with a feed reader.</p></em><h2 id="czynniki-decydujące-o-wydajności-www">Czynniki decydujące o wydajności WWW</h2><p>Przy optymalizacji wydajności WWW czynniki, które ją determinują, można w dużym uproszczeniu podzielić na dwie kategorie: wydajność ładowania oraz wydajność renderowania.</p><h3 id="wydajność-ładowania-html">Wydajność ładowania HTML</h3><ul><li>Czas od pierwszego żądania strony WWW do serwera przez sieć, przez pobranie dokumentu HTML, aż do momentu, w którym przeglądarka rozpocznie renderowanie<li>Decyduje o tym, jak szybko strona zaczyna się wyświetlać<li>Optymalizacja m.in. przez: minimalizację przekierowań, cache’owanie odpowiedzi HTML, kompresję zasobów, odpowiednie wykorzystanie CDN</ul><h3 id="wydajność-renderowania">Wydajność renderowania</h3><ul><li>Czas, jaki przeglądarka potrzebuje, aby narysować ekran widoczny dla użytkownika i umożliwić interakcję<li>Decyduje o tym, jak płynnie i szybko renderowany jest widok<li>Optymalizacja m.in. przez: usunięcie zbędnych CSS i JS, zapobieganie opóźnionemu ładowaniu fontów i miniaturek, przeniesienie ciężkich obliczeń do osobnego Web Worker w celu minimalizacji zajętości wątku głównego, optymalizację animacji</ul><h2 id="wskaźniki-wydajności-www-web-vitals">Wskaźniki wydajności WWW (Web Vitals)</h2><p>Opis opiera się na <a href="https://web.dev/performance?hl=pl">web.dev</a> Google oraz <a href="https://developer.chrome.com/docs/lighthouse/performance/performance-scoring?hl=pl">dokumentacji Chrome dla deweloperów</a>. Jeśli nie ma ku temu szczególnego powodu, lepiej nie skupiać się wyłącznie na jednym wskaźniku, lecz dążyć do poprawy całościowej. Kluczowe jest też ustalenie, które elementy na optymalizowanej stronie stanowią wąskie gardło wydajności. Ponadto, jeśli dostępne są statystyki oparte na danych rzeczywistych użytkowników, zamiast koncentrować się na wartościach z czołówki lub średniej, warto patrzeć na wartości z dolnego kwartyla (około Q1) i sprawdzać, czy także w tym przypadku spełniane są założone cele — oraz odpowiednio wprowadzać usprawnienia.</p><h3 id="kluczowe-wskaźniki-internetowe-core-web-vitals">Kluczowe wskaźniki internetowe (Core Web Vitals)</h3><p>Jak jeszcze za chwilę omówię, Web Vitals obejmują różne wskaźniki. Spośród nich Google uznaje za szczególnie istotne te trzy, które są mocno powiązane z doświadczeniem użytkownika i mogą być mierzone w środowisku rzeczywistym (a nie tylko laboratoryjnym). Nazywa je <a href="https://web.dev/articles/vitals?hl=pl#core-web-vitals">Core Web Vitals</a>. Ponieważ Google uwzględnia Core Web Vitals także w rankingu wyników wyszukiwania, z perspektywy właściciela serwisu warto uważnie śledzić te wskaźniki również pod kątem SEO.</p><ul><li><a href="#lcp-largest-contentful-paint">Large Contentful Paint (LCP)</a>: odzwierciedla <em>wydajność ładowania</em>, powinno wynosić ≤ 2,5 s<li><a href="https://web.dev/articles/inp?hl=pl">Interaction to Next Paint (INP)</a>: odzwierciedla <em>responsywność</em>, powinno wynosić ≤ 200 ms<li><a href="#cls-cumulative-layout-shift">Cummulative Layout Shift (CLS)</a>: odzwierciedla <em>stabilność wizualną</em>, należy utrzymywać ≤ 0,1</ul><p>Core Web Vitals są zasadniczo przeznaczone do pomiaru w środowisku rzeczywistym, ale dwa z nich (z wyjątkiem INP) da się zmierzyć także w środowisku laboratoryjnym, np. w Chrome DevTools lub Lighthouse. INP wymaga rzeczywistych interakcji użytkownika, więc w labie nie da się go zmierzyć; w takich przypadkach można posiłkować się wskaźnikiem <a href="#tbt-total-blocking-time">TBT</a>, który jest z INP silnie skorelowany i podobny interpretacyjnie. Zazwyczaj <a href="https://web.dev/articles/vitals?hl=pl#lab_tools_to_measure_core_web_vitals">poprawa TBT poprawia też INP</a>.</p><h3 id="wagi-punktacji-wydajności-w-lighthouse-10">Wagi punktacji wydajności w Lighthouse 10</h3><p><a href="https://developer.chrome.com/docs/lighthouse/performance/performance-scoring?hl=pl">Wynik wydajności w Lighthouse jest liczony jako średnia ważona punktów poszczególnych metryk, zgodnie z wagami z poniższej tabeli</a>.</p><table><thead><tr><th>Metryka<th>Waga<tbody><tr><td><a href="#fcp-first-contentful-paint">First Contentful Paint</a><td>10%<tr><td><a href="#si-speed-index">Speed Index</a><td>10%<tr><td><a href="#lcp-largest-contentful-paint">Largest Contentful Paint</a><td>25%<tr><td><a href="#tbt-total-blocking-time">Total Blocking Time</a><td>30%<tr><td><a href="#cls-cumulative-layout-shift">Cumulative Layout Shift</a><td>25%</table><h3 id="fcp-first-contentful-paint">FCP (First Contentful Paint)</h3><ul><li>Mierzy czas od żądania strony do wyrenderowania pierwszej treści DOM<li>Za treść DOM uznaje m.in. obrazy na stronie, elementy <code class="language-plaintext highlighter-rouge">&lt;canvas&gt;</code> (inne niż białe), SVG itd.; nie uwzględnia treści wewnątrz <code class="language-plaintext highlighter-rouge">iframe</code></ul><blockquote class="prompt-tip"><p>Jednym z czynników szczególnie istotnie wpływających na FCP jest czas ładowania fontów; w kwestii optymalizacji Chrome zaleca zapoznanie się z <a href="https://developer.chrome.com/docs/lighthouse/performance/font-display?hl=pl">powiązanym wpisem</a> w <a href="https://developer.chrome.com/docs/lighthouse/performance/first-contentful-paint/?hl=pl">dokumentacji Chrome dla deweloperów</a>.</p></blockquote><h4 id="kryteria-oceny-lighthouse">Kryteria oceny Lighthouse</h4><p>Zgodnie z <a href="https://developer.chrome.com/docs/lighthouse/performance/first-contentful-paint/?hl=pl">dokumentacją Chrome dla deweloperów</a>, kryteria oceny w Lighthouse są następujące.</p><table><thead><tr><th>Kolor oceny<th>FCP na mobile (s)<th>FCP na desktopie (s)<tbody><tr><td>Zielony (szybko)<td>0-1.8<td>0-0.9<tr><td>Pomarańczowy (średnio)<td>1.8-3<td>0.9-1.6<tr><td>Czerwony (wolno)<td>&gt; 3<td>&gt; 1.6</table><h3 id="lcp-largest-contentful-paint">LCP (Largest Contentful Paint)</h3><ul><li>Przy pierwszym otwarciu strony, licząc względem widocznego obszaru ekranu (viewport), mierzy czas do wyrenderowania największego elementu w tym obszarze (obraz, blok tekstu, wideo itd.)<li>Im większa powierzchnia zajmowana na ekranie, tym większe prawdopodobieństwo, że użytkownik będzie to postrzegał jako główną treść<li>Jeśli LCP dotyczy obrazu, czas ten można podzielić na 4 podetapy; ważne jest zidentyfikowanie, w którym miejscu powstaje wąskie gardło<ol><li>Time to first byte (TTFB): czas od rozpoczęcia ładowania strony do otrzymania pierwszego bajtu odpowiedzi dokumentu HTML<li>Opóźnienie ładowania (Load delay): różnica między momentem, gdy przeglądarka zaczyna ładować zasób LCP, a TTFB<li>Czas ładowania (Load time): czas potrzebny na załadowanie samego zasobu LCP<li>Opóźnienie renderowania (Render delay): czas od zakończenia ładowania zasobu LCP do pełnego wyrenderowania elementu LCP</ol></ul><h4 id="kryteria-oceny-lighthouse-1">Kryteria oceny Lighthouse</h4><p>Zgodnie z <a href="https://developer.chrome.com/docs/lighthouse/performance/lighthouse-largest-contentful-paint/?hl=pl">dokumentacją Chrome dla deweloperów</a>, kryteria oceny w Lighthouse są następujące.</p><table><thead><tr><th>Kolor oceny<th>LCP na mobile (s)<th>LCP na desktopie (s)<tbody><tr><td>Zielony (szybko)<td>0-2.5<td>0-1.2<tr><td>Pomarańczowy (średnio)<td>2.5-4<td>1.2-2.4<tr><td>Czerwony (wolno)<td>&gt; 4<td>&gt; 2.4</table><h3 id="tbt-total-blocking-time">TBT (Total Blocking Time)</h3><ul><li>Mierzy łączny czas, w którym strona nie jest w stanie reagować na wejście użytkownika (np. kliknięcie myszą, dotyk ekranu, wpisywanie z klawiatury)<li>Spośród zadań pomiędzy FCP a <a href="https://developer.chrome.com/docs/lighthouse/performance/interactive?hl=pl">TTI (moment rozpoczęcia interakcji, Time to Interactive)</a>* za <em>długie zadania</em> uznaje się te, które wykonywały się ≥ 50 ms. Dla każdego takiego zadania część czasu przekraczająca 50 ms jest nazywana <em>częścią blokującą (blocking portion)</em>, a suma wszystkich części blokujących jest definiowana jako TBT</ul><blockquote class="prompt-info"><p>* Samo TTI jest nadmiernie wrażliwe na wartości odstające odpowiedzi sieciowych oraz na długie zadania, przez co ma niską spójność i wysoką zmienność; dlatego <a href="https://developer.chrome.com/blog/lighthouse-10-0#scoring-changes">od Lighthouse 10 zostało wyłączone z kryteriów oceny wydajności</a>.</p></blockquote><blockquote class="prompt-tip"><p>Najczęstszą przyczyną długich zadań są zwykle zbędne lub nieefektywne ładowanie, parsowanie i wykonywanie JavaScript. <a href="https://developer.chrome.com/docs/lighthouse/performance/lighthouse-total-blocking-time/?hl=pl">Dokumentacja Chrome dla deweloperów</a> oraz <a href="https://web.dev/articles/long-tasks-devtools#what_is_causing_my_long_tasks?hl=pl">web.dev Google</a> zalecają zastosowanie <a href="https://web.dev/articles/reduce-javascript-payloads-with-code-splitting?hl=pl">podziału kodu (code splitting)</a> w celu zmniejszenia rozmiaru payloadu JS tak, aby każdy fragment dało się wykonać w czasie ≤ 50 ms; a jeśli to potrzebne — rozważyć przeniesienie pracy poza wątek główny, np. do osobnego service worker, aby wykonywać ją wielowątkowo.</p></blockquote><h4 id="kryteria-oceny-lighthouse-2">Kryteria oceny Lighthouse</h4><p>Zgodnie z <a href="https://developer.chrome.com/docs/lighthouse/performance/lighthouse-total-blocking-time/?hl=pl">dokumentacją Chrome dla deweloperów</a>, kryteria oceny w Lighthouse są następujące.</p><table><thead><tr><th>Kolor oceny<th>TBT na mobile (ms)<th>TBT na desktopie (ms)<tbody><tr><td>Zielony (szybko)<td>0-200<td>0-150<tr><td>Pomarańczowy (średnio)<td>200-600<td>150-350<tr><td>Czerwony (wolno)<td>&gt; 600<td>&gt; 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>Przykład nagłej zmiany układu (layoutu)</em></p><blockquote><p>Źródło wideo: <a href="https://web.dev/articles/cls?hl=pl">Cumulative Layout Shift (CLS) | Articles | web.dev</a></p></blockquote><p><del>W ruchu kursora czuć głęboką wściekłość</del></p><ul><li>Nieoczekiwane zmiany układu psują UX na wiele sposobów: tekst nagle „ucieka”, przez co tracisz miejsce czytania, albo przypadkowo klikasz link czy przycisk<li>Szczegółowy sposób wyliczania CLS jest opisany na <a href="https://web.dev/articles/cls">web.dev Google</a><li>Jak widać na poniższym obrazie, celem powinno być ≤ 0,1</ul><p><img src="https://web.dev/static/articles/cls/image/good-cls-values.svg" alt="What is a good CLS score?" width="640" height="480" /></p><blockquote><p>Źródło obrazu: <a href="https://web.dev/articles/cls#what-is-a-good-cls-score?hl=pl">Cumulative Layout Shift (CLS) | Articles | web.dev</a></p></blockquote><h3 id="si-speed-index">SI (Speed Index)</h3><ul><li>Mierzy, jak szybko treść jest wizualnie wyświetlana podczas ładowania strony<li>Lighthouse nagrywa wideo z procesu ładowania strony w przeglądarce, analizuje je i oblicza postęp między klatkami, a następnie wyznacza wynik SI z użyciem <a href="https://github.com/paulirish/speedline">modułu Speedline dla Node.js</a></ul><blockquote class="prompt-tip"><p>Wszystko, co poprawia szybkość ładowania strony — w tym działania omawiane wcześniej przy <a href="#fcp-first-contentful-paint">FCP</a>, <a href="#lcp-largest-contentful-paint">LCP</a> i <a href="#tbt-total-blocking-time">TBT</a> — wpływa pozytywnie także na SI. To wskaźnik, który nie tyle reprezentuje jeden etap ładowania, ile w pewnym stopniu odzwierciedla cały proces.</p></blockquote><h4 id="kryteria-oceny-lighthouse-3">Kryteria oceny Lighthouse</h4><p>Zgodnie z <a href="https://developer.chrome.com/docs/lighthouse/performance/speed-index/?hl=pl">dokumentacją Chrome dla deweloperów</a>, kryteria oceny w Lighthouse są następujące.</p><table><thead><tr><th>Kolor oceny<th>SI na mobile (s)<th>SI na desktopie (s)<tbody><tr><td>Zielony (szybko)<td>0-3.4<td>0-1.3<tr><td>Pomarańczowy (średnio)<td>3.4-5.8<td>1.3-2.3<tr><td>Czerwony (wolno)<td>&gt; 5.8<td>&gt; 2.3</table>]]> </content> </entry> <entry><title xml:lang="pl">Pole grawitacyjne i potencjał grawitacyjny</title><link href="https://www.yunseo.kim/pl/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-05-17T00:00:00+09:00</updated> <id>https://www.yunseo.kim/pl/posts/gravitational-field-and-potential/</id> <author> <name>Yunseo Kim</name> </author> <category term="Physics" /> <category term="Classical Dynamics" /> <summary xml:lang="pl">Definicje wektora pola grawitacyjnego i potencjału grawitacyjnego wynikające z newtonowskiego prawa powszechnego ciążenia, a także dwa kluczowe przykłady: twierdzenie o powłoce sferycznej i krzywe rotacji galaktyk.</summary> <content type="html" xml:lang="pl"> <![CDATA[<p>Definicje wektora pola grawitacyjnego i potencjału grawitacyjnego wynikające z newtonowskiego prawa powszechnego ciążenia, a także dwa kluczowe przykłady: twierdzenie o powłoce sferycznej i krzywe rotacji galaktyk.</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>Prawo powszechnego ciążenia Newtona: $\mathbf{F} = -G\cfrac{mM}{r^2}\mathbf{e}_r$<li>Dla ciągłego rozkładu masy i ciał o skończonych rozmiarach: $\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}})$: gęstość masy w punkcie o wektorze położenia $\mathbf{r^{\prime}}$ względem dowolnie wybranego początku układu<li>$dv^{\prime}$: element objętości w punkcie o wektorze położenia $\mathbf{r^{\prime}}$ względem dowolnie wybranego początku układu</ul><li><strong>Wektor pola grawitacyjnego (gravitational field vector)</strong>:<ul><li>wektor opisujący siłę przypadającą na jednostkę masy, jakiej doświadcza cząstka w polu wytworzonym przez masę $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>ma wymiar <em>siły na jednostkę masy</em> albo <em>przyspieszenia</em></ul><li><strong>Potencjał grawitacyjny (gravitational potential)</strong>:<ul><li>$\mathbf{g} \equiv -\nabla \Phi$<li>ma wymiar $($<em>siła na jednostkę masy</em> $) \times ($<em>odległość</em> $)$ albo <em>energia na jednostkę masy</em><li>$\Phi = -G\cfrac{M}{r}$<li>sens fizyczny ma jedynie różnica potencjałów, a nie bezwzględna wartość $\Phi$<li>zwykle arbitralnie przyjmuje się warunek $\Phi \to 0$ dla $r \to \infty$, aby usunąć niejednoznaczność (ambiguity)<li>$U = m\Phi, \quad \mathbf{F} = -\nabla U$</ul><li><strong>Potencjał grawitacyjny wewnątrz i na zewnątrz powłoki sferycznej (twierdzenie o powłoce)</strong><ul><li>Gdy $R&gt;a$:<ul><li>$\Phi(R&gt;a) = -\cfrac{GM}{R}$<li>przy wyznaczaniu potencjału grawitacyjnego w punkcie zewnętrznym od sferycznie symetrycznego rozkładu masy (spherical symmetric distribution) można traktować ciało jak masę punktową (point mass)</ul><li>Gdy $R&lt;b$:<ul><li>$\Phi(R&lt;b) = -2\pi\rho G(a^2 - b^2)$<li>wewnątrz sferycznie symetrycznej powłoki masy potencjał jest stały (niezależny od położenia), a działająca grawitacja wynosi $0$</ul><li>Gdy $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="pole-grawitacyjne">Pole grawitacyjne</h2><h3 id="prawo-powszechnego-ciążenia-newtona">Prawo powszechnego ciążenia Newtona</h3><p>Newton już przed 11666 HE usystematyzował prawo powszechnego ciążenia i zweryfikował je także ilościowo. Mimo to publikacja jego wyników w dziele <em>Principia</em> w 11687 HE zajęła mu kolejne 20 lat — ponieważ nie potrafił uzasadnić metody obliczeń wykonywanych przy założeniu, że Ziemia i Księżyc są masami punktowymi (point mass), tj. nie mają rozmiaru. Na szczęście, korzystając z rachunku różniczkowego i całkowego, który Newton wynalazł później, możemy dziś dużo łatwiej udowodnić to, co w 11600 latach nie było dla Newtona proste: <a href="#gdy-ra">że problem ten da się poprawnie rozwiązać</a>.</p><p>Zgodnie z prawem powszechnego ciążenia Newtona (Newton’s law of universal gravitation), <em>każda cząstka masy przyciąga każdą inną cząstkę we Wszechświecie siłą proporcjonalną do iloczynu ich mas i odwrotnie proporcjonalną do kwadratu odległości między nimi.</em> Matematycznie:</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>Źródło obrazu</em></p><ul><li>autor: użytkownik Wikimedia <a href="https://commons.wikimedia.org/wiki/User:Dna-webmaster">Dennis Nilsson</a><li>licencja: <a href="https://creativecommons.org/licenses/by/3.0/">CC BY 3.0</a></ul></blockquote><p>Wektor jednostkowy $\mathbf{e}_r$ jest skierowany od $M$ w stronę $m$, a znak minus oznacza, że siła jest przyciągająca. Innymi słowy, $m$ jest przyciągane w stronę $M$.</p><h3 id="eksperyment-cavendisha">Eksperyment Cavendisha</h3><p>Eksperymentalna weryfikacja tego prawa oraz wyznaczenie wartości $G$ zostały dokonane w 11798 HE przez brytyjskiego fizyka Henry’ego Cavendisha (Henry Cavendish). Eksperyment Cavendisha wykorzystuje wagę skręceń (torsion balance) złożoną z dwóch małych kul przymocowanych do końców lekkiego pręta. Dwie małe kule są przyciągane przez dwie inne, duże kule znajdujące się w pobliżu. Oficjalna wartość $G$ wyznaczona dotychczas wynosi $6.673 \pm 0.010 \times 10^{-11} \mathrm{N\cdot m^2/kg^2}$.</p><blockquote class="prompt-tip"><p>Mimo że $G$ jest jedną z najdawniej znanych stałych fundamentalnych, znamy ją jedynie z mniejszą precyzją (precision) niż większość innych stałych, takich jak $e$, $c$ czy $\hbar$. Do dziś prowadzi się liczne badania mające na celu wyznaczenie $G$ z większą dokładnością.</p></blockquote><h3 id="przypadek-ciał-o-skończonych-rozmiarach">Przypadek ciał o skończonych rozmiarach</h3><p>Prawo z równania ($\ref{eqn:law_of_gravitation}$) ściśle rzecz biorąc można stosować tylko do <em>cząstek punktowych (point particle)</em>. Jeżeli jedno z ciał (lub oba) ma skończone rozmiary, aby obliczyć siłę, trzeba dodatkowo założyć, że pole grawitacyjne (gravitational force field) jest <em>polem liniowym (linear field)</em>. To znaczy: zakładamy, że całkowita grawitacja działająca na cząstkę o masie $m$ od wielu innych cząstek jest sumą wektorową poszczególnych sił. Dla ciągłego rozkładu materii zamieniamy sumę na całkę:</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}})$: gęstość masy w punkcie o wektorze położenia $\mathbf{r^{\prime}}$ względem dowolnego początku układu<li>$dv^{\prime}$: element objętości w punkcie o wektorze położenia $\mathbf{r^{\prime}}$ względem dowolnego początku układu</ul><p>Jeśli zarówno ciało o masie $M$, jak i ciało o masie $m$ mają skończone rozmiary i chcemy wyznaczyć całkowitą siłę grawitacyjną, potrzebna jest także druga całka objętościowa po objętości ciała $m$.</p><h3 id="wektor-pola-grawitacyjnego">Wektor pola grawitacyjnego</h3><p><strong>Wektor pola grawitacyjnego (gravitational field vector)</strong> $\mathbf{g}$ definiuje się jako wektor siły przypadającej na jednostkę masy, jakiej doświadcza cząstka w polu wytworzonym przez ciało o masie $M$:</p>\[\mathbf{g} = \frac{\mathbf{F}}{m} = - G \frac{M}{r^2}\mathbf{e}_r \label{eqn:g_vector}\tag{3}\]<p>albo</p>\[\boxed{\mathbf{g} = - G \int_V \frac{\rho(\mathbf{r^\prime})\mathbf{e}_r}{r^2}dv^\prime} \tag{4}\]<p>Przy czym kierunek $\mathbf{e}_r$ zależy od $\mathbf{r^\prime}$.</p><p>Wielkość $\mathbf{g}$ ma wymiar <em>siły na jednostkę masy</em> albo <em>przyspieszenia</em>. W pobliżu powierzchni Ziemi moduł wektora pola grawitacyjnego $\mathbf{g}$ jest równy temu, co nazywamy <strong>stałą przyspieszenia grawitacyjnego (gravitational acceleration constant)</strong>: $|\mathbf{g}| \approx 9.80\mathrm{m/s^2}$.</p><h2 id="potencjał-grawitacyjny">Potencjał grawitacyjny</h2><h3 id="definicja">Definicja</h3><p>Wektor pola grawitacyjnego $\mathbf{g}$ zmienia się jak $1/r^2$, zatem spełnia warunek umożliwiający przedstawienie go jako gradientu pewnej funkcji skalarnej (potencjału), tj. ($\nabla \times \mathbf{g} \equiv 0$). Wobec tego można napisać:</p>\[\mathbf{g} \equiv -\nabla \Phi \label{eqn:gradient_phi}\tag{5}\]<p>Tutaj $\Phi$ nazywamy <strong>potencjałem grawitacyjnym (gravitational potential)</strong>; ma on wymiar $($<em>siła na jednostkę masy</em> $) \times ($<em>odległość</em> $)$ albo <em>energia na jednostkę masy</em>.</p><p>Ponieważ $\mathbf{g}$ zależy tylko od promienia, $\Phi$ również zmienia się wraz z $r$. Z równań ($\ref{eqn:g_vector}$) i ($\ref{eqn:gradient_phi}$) wynika</p>\[\nabla\Phi = \frac{d\Phi}{dr}\mathbf{e}_r = G\frac{M}{r^2}\mathbf{e}_r\]<p>a po scałkowaniu:</p>\[\boxed{\Phi = -G\frac{M}{r}} \label{eqn:g_potential}\tag{6}\]<p>Ponieważ sens fizyczny ma tylko różnica potencjału grawitacyjnego, a nie jego wartość bezwzględna, stałą całkowania można pominąć. Zwykle arbitralnie narzuca się warunek $\Phi \to 0$ dla $r \to \infty$, aby usunąć niejednoznaczność (ambiguity); równanie ($\ref{eqn:g_potential}$) spełnia ten warunek.</p><p>Dla ciągłego rozkładu materii potencjał grawitacyjny ma postać:</p>\[\Phi = -G\int_V \frac{\rho(\mathbf{r\prime})}{r}dv^\prime \label{eqn:g_potential_v}\tag{7}\]<p>Jeśli masa jest rozłożona powierzchniowo na cienkiej powłoce:</p>\[\Phi = -G\int_S \frac{\rho_s}{r}da^\prime. \label{eqn:g_potential_s}\tag{8}\]<p>Natomiast dla liniowego źródła masy o gęstości liniowej $\rho_l$:</p>\[\Phi = -G\int_\Gamma \frac{\rho_l}{r}ds^\prime. \label{eqn:g_potential_l}\tag{9}\]<h3 id="znaczenie-fizyczne">Znaczenie fizyczne</h3><p>Rozważmy pracę na jednostkę masy $dW^\prime$, jaką wykonuje ciało, gdy przemieszcza się w polu grawitacyjnym o $d\mathbf{r}$.</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>W tym równaniu $\Phi$ jest funkcją wyłącznie współrzędnych położenia: $\Phi=\Phi(x_1, x_2, x_3) = \Phi(x_i)$. Zatem, gdy przesuwamy ciało w polu grawitacyjnym z jednego punktu do drugiego, praca na jednostkę masy jest równa różnicy potencjałów między tymi punktami.</p><p>Jeśli zdefiniujemy potencjał grawitacyjny w nieskończoności jako $0$, to $\Phi$ w dowolnym punkcie można interpretować jako pracę na jednostkę masy potrzebną do przemieszczenia ciała z nieskończoności do tego punktu. Energia potencjalna ciała jest równa iloczynowi jego masy i potencjału grawitacyjnego $\Phi$, więc dla energii potencjalnej $U$:</p>\[U = m\Phi. \label{eqn:potential_e}\tag{11}\]<p>W konsekwencji siłę grawitacyjną działającą na ciało otrzymujemy jako ujemny gradient jego energii potencjalnej:</p>\[\mathbf{F} = -\nabla U \label{eqn:force_and_potential}\tag{12}\]<p>Gdy obiekt znajduje się w polu grawitacyjnym wytworzonym przez pewną masę, zawsze pojawia się pewna energia potencjalna. Ściśle rzecz biorąc, ta energia jest „w polu”, ale zwyczajowo mówi się o niej jako o energii potencjalnej danego obiektu.</p><h2 id="przykład-potencjał-grawitacyjny-wewnątrz-i-na-zewnątrz-powłoki-sferycznej-twierdzenie-o-powłoce">Przykład: potencjał grawitacyjny wewnątrz i na zewnątrz powłoki sferycznej (twierdzenie o powłoce)</h2><h3 id="ustalenie-układu-współrzędnych-i-zapis-potencjału-grawitacyjnego-w-postaci-całki">Ustalenie układu współrzędnych i zapis potencjału grawitacyjnego w postaci całki</h3><p>Wyznaczmy potencjał grawitacyjny wewnątrz i na zewnątrz jednorodnej powłoki sferycznej (spherical shell) o promieniu wewnętrznym $b$ i zewnętrznym $a$. Grawitację od powłoki można otrzymać, licząc bezpośrednio składowe siły działającej na jednostkę masy, ale metoda potencjałowa jest prostsza.</p><p><img src="/assets/img/gravitational-field-and-potential/spherical-shell.png" alt="Spherical shell" /></p><p>Policzmy potencjał w punkcie $P$, oddalonym od środka o $R$. Przy założeniu jednorodnego rozkładu masy powłoki mamy $\rho(r^\prime)=\rho$, a ze względu na symetrię osiową względem prostej łączącej środek kuli z punktem $P$ (symetria względem kąta azymutalnego $\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>Z prawa cosinusów:</p>\[r^2 = {r^\prime}^2 + R^2 - 2r^\prime R \cos\theta \label{eqn:law_of_cosines}\tag{14}\]<p>a ponieważ $R$ jest stałe, różniczkując to równanie po $r^\prime$, otrzymujemy:</p>\[2rdr = 2r^\prime R \sin\theta d\theta\] \[\frac{\sin\theta}{r}d\theta = \frac{dr}{r^\prime R} \tag{15}\]<p>Po podstawieniu do ($\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>Gdzie $r_\mathrm{max}$ i $r_\mathrm{min}$ zależą od położenia punktu $P$.</p><h3 id="gdy-ra">Gdy $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>Masa powłoki sferycznej wynosi:</p>\[M = \frac{4}{3}\pi\rho(a^3 - b^3) \label{eqn:mass_of_shell}\tag{18}\]<p>więc potencjał:</p>\[\boxed{\Phi(R&gt;a) = -\frac{GM}{R}} \label{eqn:spherical_shell_outside_2}\tag{19}\]<blockquote class="prompt-info"><p>Porównując wzór na potencjał grawitacyjny od masy punktowej $M$ — równanie ($\ref{eqn:g_potential}$) — z dopiero co uzyskanym wynikiem ($\ref{eqn:spherical_shell_outside_2}$), widzimy, że są identyczne. Oznacza to, że wyznaczając potencjał grawitacyjny w dowolnym punkcie zewnętrznym od sferycznie symetrycznego rozkładu masy (spherical symmetric distribution), możemy bez szkody traktować całą masę jak skupioną w centrum. Dotyczy to większości obiektów astronomicznych o kształcie zbliżonym do kuli i dostatecznie dużych rozmiarach, takich jak Ziemia czy Księżyc; można je traktować jak <a href="https://en.wikipedia.org/wiki/Matryoshka_doll">matrioszki</a>: niezliczone powłoki sferyczne o wspólnym środku i różnych promieniach, nałożone jedna na drugą. Stanowi to uzasadnienie przyjętego na początku tego tekstu założenia, że <a href="#prawo-powszechnego-ci%C4%85%C5%BCenia-newtona">ciała niebieskie takie jak Ziemia czy Księżyc można traktować jak masy punktowe</a>.</p></blockquote><h3 id="gdy-rb">Gdy $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>Wewnątrz sferycznie symetrycznej powłoki masy potencjał grawitacyjny jest stały (niezależny od położenia), a działająca grawitacja wynosi $0$.</p></blockquote><blockquote class="prompt-tip"><p>Jest to też jedna z głównych przesłanek, że popularna pseudonauka w rodzaju „teorii pustej Ziemi” to kompletna bzdura. Gdyby Ziemia miała postać powłoki sferycznej z pustym wnętrzem — jak głosi ta teoria — wówczas na wszystkie obiekty znajdujące się w tej pustce nie działałaby grawitacja Ziemi. Patrząc na masę i objętość Ziemi, nie ma zresztą miejsca na taką „pustkę”; a nawet gdyby istniała, hipotetyczne istoty żywe nie chodziłyby po „wewnętrznej powierzchni” powłoki jak po ziemi, tylko unosiłyby się w stanie nieważkości jak na stacji kosmicznej.<br /> <a href="https://youtu.be/VD6xJq8NguY?si=szgtuLkuk6rPJag3">Mikroorganizmy mogą co prawda żyć głęboko pod powierzchnią, na głębokości kilku km</a>, ale przynajmniej w formie postulowanej przez teorię pustej Ziemi jest to niemożliwe. Bardzo lubię powieść Juliusza Verne’a <em>Podróż do wnętrza Ziemi (Voyage au centre de la Terre)</em> i film „Podróż do wnętrza Ziemi (Journey to the Center of the Earth)”, ale fikcję trzeba traktować jako fikcję — nie wierzmy w nią na serio.</p></blockquote><h3 id="gdy-bra">Gdy $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="wyniki">Wyniki</h3><p>Wykresy potencjału grawitacyjnego $\Phi$ w trzech obszarach oraz odpowiadającego mu modułu wektora pola $|\mathbf{g}|$ jako funkcji odległości $R$ wyglądają następująco:</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>Kod wizualizacji w Pythonie: <a href="https://github.com/yunseo-kim/physics-visualizations/blob/main/src/shell_theorem.py">repozytorium yunseo-kim/physics-visualizations</a><li>Licencja: <a href="https://github.com/yunseo-kim/physics-visualizations?tab=readme-ov-file#license">Zobacz tutaj</a></ul></blockquote><p>Widać, że potencjał grawitacyjny i moduł wektora pola grawitacyjnego są funkcjami ciągłymi. Gdyby potencjał grawitacyjny był w jakimś punkcie nieciągły, wówczas gradient potencjału — czyli wartość grawitacji — byłby w tym punkcie nieskończony, co jest fizycznie nieuzasadnione; zatem funkcja potencjału musi być ciągła w każdym punkcie. Natomiast <em>pochodna</em> wektora pola grawitacyjnego jest nieciągła na wewnętrznej i zewnętrznej powierzchni powłoki.</p><h2 id="przykład-krzywe-rotacji-galaktyk">Przykład: krzywe rotacji galaktyk</h2><p>Z obserwacji astronomicznych wynika, że w wielu galaktykach spiralnych obracających się wokół centrum — takich jak Droga Mleczna czy Galaktyka Andromedy — większość obserwowalnej masy jest silnie skoncentrowana w pobliżu centrum. Jednak prędkości orbitalne mas w tych galaktykach, jak widać na poniższym wykresie, znacząco odbiegają od wartości teoretycznie przewidywanych na podstawie obserwowalnego rozkładu masy i po pewnej odległości pozostają prawie stałe.</p><p><img src="https://upload.wikimedia.org/wikipedia/commons/b/b9/GalacticRotation2.svg" alt="Galactic Rotation" width="972" /></p><blockquote><p><em>Źródło obrazu</em></p><ul><li>autor: użytkownik Wikipedii <a href="https://en.wikipedia.org/wiki/User:PhilHibbs">PhilHibbs</a><li>licencja: 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>Po lewej: rotacja galaktyki przewidziana na podstawie obserwowalnej masy | Po prawej: rotacja galaktyki faktycznie obserwowana.</em></p><blockquote><p><em>Źródło wideo</em></p><ul><li>link do pliku źródłowego (Ogg Theora video): <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>autor: <a href="https://beltoforion.de/en/index.php">Ingo Berg</a><li>licencja: <a href="https://creativecommons.org/licenses/by-sa/3.0/deed.en">CC BY-SA 3.0</a><li>wykorzystana metoda symulacji i kod: <a href="https://beltoforion.de/en/spiral_galaxy_renderer/">https://beltoforion.de/en/spiral_galaxy_renderer/</a></ul></blockquote><blockquote class="prompt-danger"><p>Poprzednio osadzony na tej stronie plik obrazu <code class="language-plaintext highlighter-rouge">Rotation curve of spiral galaxy Messier 33 (Triangulum).png</code> został usunięty z Wikimedia Commons, ponieważ użytkownik Wikimedia <a href="https://commons.wikimedia.org/wiki/User:Accrama">Mario De Leo</a> okazał się opublikować go jako utwór zależny powstały w wyniku plagiatu nie-wolnego utworu należącego do <a href="https://markwhittle.uvacreate.virginia.edu/">prof. Marka Whittle’a z University of Virginia</a>, bez właściwego cytowania; w związku z tym usunąłem go również z tej strony: <a href="https://commons.wikimedia.org/wiki/Commons:Deletion_requests/File:Rotation_curve_of_spiral_galaxy_Messier_33_(Triangulum).png">https://commons.wikimedia.org/wiki/Commons:Deletion_requests/File:Rotation_curve_of_spiral_galaxy_Messier_33_(Triangulum).png</a>.</p></blockquote><p>Przewidźmy prędkość orbitalną w funkcji odległości w przypadku, gdy masa galaktyki jest skoncentrowana w centrum, i sprawdźmy, że taka prognoza nie zgadza się z obserwacjami. Następnie pokażmy, że aby wyjaśnić wyniki obserwacji, masa $M(R)$ rozłożona wewnątrz promienia $R$ od centrum galaktyki musi być proporcjonalna do $R$.</p><p>Najpierw, jeśli masa galaktyki $M$ jest skupiona w centrum, prędkość orbitalna w odległości $R$ wynosi:</p>\[\frac{GMm}{R^2} = \frac{mv^2}{R}\] \[v = \sqrt{\frac{GM}{R}} \propto \frac{1}{\sqrt{R}}.\]<p>W tym przypadku, jak pokazuje linia przerywana na wykresach powyżej, przewidujemy spadek prędkości orbitalnej jak $1/\sqrt{R}$. Jednak obserwacje wskazują, że prędkość orbitalna $v$ jest prawie stała niezależnie od odległości $R$, więc teoria i obserwacje nie są zgodne. Takie wyniki obserwacyjne można wyjaśnić tylko wtedy, gdy $M(R)\propto R$.</p><p>Wprowadzając stałą proporcjonalności $k$ i przyjmując $M(R) = kR$, dostajemy:</p>\[v = \sqrt{\frac{GM(R)}{R}} = \sqrt{Gk}\ \text{(stała)}.\]<p>Na tej podstawie astrofizycy wnioskują, że w wielu galaktykach musi istnieć nieodkryta jeszcze „ciemna materia (dark matter)” i że taka ciemna materia powinna stanowić ponad 90% masy Wszechświata. Jednak natura ciemnej materii nadal nie jest jednoznacznie wyjaśniona; istnieją też próby wyjaśnienia obserwacji bez zakładania jej istnienia — niebędące jednak teorią dominującą — takie jak zmodyfikowana dynamika Newtonowska (Modified Newtonian Dynamics, MOND). Obecnie jest to jedna z najbardziej „frontowych” dziedzin badań w astrofizyce.</p>]]> </content> </entry> <entry><title xml:lang="pl">Metoda nieoznaczonych współczynników</title><link href="https://www.yunseo.kim/pl/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-04-20T00:00:00+09:00</updated> <id>https://www.yunseo.kim/pl/posts/method-of-undetermined-coefficients/</id> <author> <name>Yunseo Kim</name> </author> <category term="Mathematics" /> <category term="Differential Equation" /> <summary xml:lang="pl">Metoda nieoznaczonych współczynników pozwala prosto rozwiązywać zagadnienia początkowe dla pewnej klasy liniowych niejednorodnych równań różniczkowych o stałych współczynnikach, często używana w inżynierii (układy drgające, modele obwodów RLC).</summary> <content type="html" xml:lang="pl"> <![CDATA[<p>Metoda nieoznaczonych współczynników pozwala prosto rozwiązywać zagadnienia początkowe dla pewnej klasy liniowych niejednorodnych równań różniczkowych o stałych współczynnikach, często używana w inżynierii (układy drgające, modele obwodów 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>Zastosowanie <strong>metody nieoznaczonych współczynników</strong>:<ul><li>dla <strong>stałych współczynników $a$ i $b$</strong><li>gdy wymuszenie $r(x)$ jest funkcją wykładniczą, potęgą $x$, $\cos$ lub $\sin$, albo sumą i/lub iloczynem takich funkcji<li>dla liniowego równania różniczkowego zwyczajnego $y^{\prime\prime} + ay^{\prime} + by = r(x)$</ul><li><strong>Reguły wyboru w metodzie nieoznaczonych współczynników</strong><ul><li><strong>(a) reguła podstawowa (basic rule)</strong>: w równaniu ($\ref{eqn:linear_ode_with_constant_coefficients}$), jeśli $r(x)$ jest jedną z funkcji z pierwszej kolumny tabeli, wybierz $y_p$ z tej samej linii, a następnie wyznacz nieoznaczone współczynniki, podstawiając $y_p$ i jego pochodne do ($\ref{eqn:linear_ode_with_constant_coefficients}$).<li><strong>(b) reguła modyfikacji (modification rule)</strong>: jeśli składnik wybrany jako $y_p$ jest rozwiązaniem odpowiadającego mu jednorodnego równania $y^{\prime\prime} + ay^{\prime} + by = 0$, pomnóż go przez $x$ (albo przez $x^2$, jeśli odpowiada on pierwiastkowi podwójnemu równania charakterystycznego).<li><strong>(c) reguła sumy (sum rule)</strong>: jeśli $r(x)$ jest sumą funkcji z pierwszej kolumny tabeli, wybierz jako $y_p$ sumę odpowiadających funkcji z drugiej kolumny.</ul></ul><table><thead><tr><th style="text-align: left">Składnik w $r(x)$<th style="text-align: left">Wybór dla $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="wymagania-wstępne">Wymagania wstępne</h2><ul><li><a href="/pl/posts/homogeneous-linear-odes-of-second-order/">Jednorodne liniowe RRO drugiego rzędu (Homogeneous Linear ODEs of Second Order)</a><li><a href="/pl/posts/homogeneous-linear-odes-with-constant-coefficients/">Jednorodne liniowe RRO drugiego rzędu o stałych współczynnikach</a><li><a href="/pl/posts/euler-cauchy-equation/">Równanie Eulera–Cauchy’ego</a><li><a href="/pl/posts/wronskian-existence-and-uniqueness-of-solutions/">Wronskian, istnienie i jednoznaczność rozwiązań</a><li><a href="/pl/posts/nonhomogeneous-linear-odes-of-second-order/">Niejednorodne liniowe RRO drugiego rzędu (Nonhomogeneous Linear ODEs of Second Order)</a><li>przestrzenie wektorowe, rozpiętość liniowa (algebra liniowa)</ul><h2 id="metoda-nieoznaczonych-współczynników">Metoda nieoznaczonych współczynników</h2><p>Rozważmy niejednorodne liniowe równanie różniczkowe zwyczajne drugiego rzędu z $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>oraz odpowiadające mu jednorodne równanie różniczkowe:</p>\[y^{\prime\prime} + p(x)y^{\prime} + q(x)y = 0 \label{eqn:homogeneous_linear_ode}\tag{2}\]<p>Jak omówiono wcześniej w tekście <a href="/pl/posts/nonhomogeneous-linear-odes-of-second-order/">Niejednorodne liniowe RRO drugiego rzędu (Nonhomogeneous Linear ODEs of Second Order)</a>, aby rozwiązać zagadnienie początkowe dla niejednorodnego liniowego RRO ($\ref{eqn:nonhomogeneous_linear_ode}$), należy najpierw rozwiązać jednorodne RRO ($\ref{eqn:homogeneous_linear_ode}$) i znaleźć $y_h$, a następnie znaleźć jedno rozwiązanie szczególne $y_p$ równania ($\ref{eqn:nonhomogeneous_linear_ode}$), aby otrzymać rozwiązanie ogólne</p>\[y(x) = y_h(x) + y_p(x) \label{eqn:general_sol}\tag{3}\]<p>Jak zatem znaleźć $y_p$? Ogólną metodą wyznaczania $y_p$ jest <strong>metoda wariacji stałych (method of variation of parameters)</strong>, jednak w pewnych przypadkach można zastosować znacznie prostszą <strong>metodę nieoznaczonych współczynników (method of undetermined coefficients)</strong>. Jest ona szczególnie użyteczna w inżynierii, bo stosuje się ją m.in. do układów drgających oraz modeli obwodów elektrycznych RLC.</p><p>Metoda nieoznaczonych współczynników nadaje się do liniowych równań różniczkowych o <strong>stałych współczynnikach $a$ i $b$</strong>, w których wymuszenie $r(x)$ jest funkcją wykładniczą, potęgą $x$, $\cos$ lub $\sin$, albo sumą i/lub iloczynem takich funkcji:</p>\[y^{\prime\prime} + ay^{\prime} + by = r(x) \label{eqn:linear_ode_with_constant_coefficients}\tag{4}\]<p>Istotą metody jest to, że $r(x)$ tego typu ma pochodne o podobnej postaci. Aby zastosować metodę nieoznaczonych współczynników, wybiera się $y_p$ o postaci podobnej do $r(x)$, lecz zawierające niewiadome współczynniki, które wyznacza się poprzez podstawienie $y_p$ oraz jego pochodnych do danego równania różniczkowego. Reguły wyboru odpowiedniego $y_p$ dla praktycznie ważnych postaci $r(x)$ są następujące.</p><blockquote class="prompt-info"><p><strong>Reguły wyboru w metodzie nieoznaczonych współczynników</strong><br /> <strong>(a) reguła podstawowa (basic rule)</strong>: w równaniu ($\ref{eqn:linear_ode_with_constant_coefficients}$), jeśli $r(x)$ jest jedną z funkcji z pierwszej kolumny tabeli, wybierz $y_p$ z tej samej linii, a następnie wyznacz nieoznaczone współczynniki, podstawiając $y_p$ i jego pochodne do ($\ref{eqn:linear_ode_with_constant_coefficients}$).<br /> <strong>(b) reguła modyfikacji (modification rule)</strong>: jeśli składnik wybrany jako $y_p$ jest rozwiązaniem odpowiadającego mu jednorodnego równania różniczkowego $y^{\prime\prime} + ay^{\prime} + by = 0$, pomnóż go przez $x$ (albo przez $x^2$, jeśli odpowiada on pierwiastkowi podwójnemu równania charakterystycznego).<br /> <strong>(c) reguła sumy (sum rule)</strong>: jeśli $r(x)$ jest sumą funkcji z pierwszej kolumny tabeli, wybierz jako $y_p$ sumę odpowiadających funkcji z drugiej kolumny.</p><table><thead><tr><th style="text-align: left">Składnik w $r(x)$<th style="text-align: left">Wybór dla $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>Metoda ta jest nie tylko prosta, ale ma też zaletę „samokorygującą”. Jeśli wybierzesz błędne $y_p$ lub zbyt małą liczbę składników, w obliczeniach pojawi się sprzeczność; jeśli zaś wybierzesz zbyt wiele składników, współczynniki zbędnych składników wyjdą równe $0$, co i tak prowadzi do poprawnego wyniku. Nawet jeśli coś pójdzie nie tak, zwykle w naturalny sposób zauważysz to w trakcie rachunków, więc gdy wybierzesz w miarę sensowne $y_p$ zgodnie z powyższymi regułami, warto po prostu spróbować.</p><h3 id="dowód-reguły-sumy">Dowód reguły sumy</h3><p>Rozważmy niejednorodne liniowe RRO postaci $r(x) = r_1(x) + r_2(x)$:</p>\[y^{\prime\prime} + ay^{\prime} + by = r_1(x) + r_2(x)\]<p>Teraz rozważmy dwa równania o tej samej lewej stronie, lecz z wymuszeniami odpowiednio $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>Niech ich rozwiązaniami szczególnymi będą odpowiednio ${y_p}_1$, ${y_p}_2$. Oznaczmy lewą stronę danego równania przez $L[y]$. Wówczas z liniowości operatora $L$ wynika, że dla $y_p = {y_p}_1 + {y_p}_2$ zachodzi:</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="przykład-yprimeprime--ayprime--by--kegamma-x">Przykład: $y^{\prime\prime} + ay^{\prime} + by = ke^{\gamma x}$</h2><p>Zgodnie z regułą podstawową (a) przyjmujemy $y_p = Ce^{\gamma x}$ i podstawiamy do danego równania $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="przypadek-gamma2--agamma--b-neq-0">Przypadek $\gamma^2 + a\gamma + b \neq 0$</h3><p>Możemy wyznaczyć nieoznaczony współczynnik $C$ i znaleźć $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="przypadek-gamma2--agamma--b--0">Przypadek $\gamma^2 + a\gamma + b = 0$</h3><p>W tym przypadku należy zastosować regułę modyfikacji (b). Najpierw, korzystając z $b = -\gamma^2 - a\gamma = -\gamma(a + \gamma)$, znajdźmy pierwiastki równania charakterystycznego jednorodnego RRO $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>Stąd otrzymujemy bazę rozwiązań jednorodnego równania:</p>\[y_1 = e^{\gamma x}, \quad y_2 = e^{(-a - \gamma)x}\]<h4 id="przypadek-gamma-neq--a-gamma">Przypadek $\gamma \neq -a-\gamma$</h4><p>Ponieważ $Ce^{\gamma x}$, wybrane jako $y_p$, jest rozwiązaniem jednorodnego równania, ale nie odpowiada pierwiastkowi podwójnemu, zgodnie z regułą modyfikacji (b) mnożymy przez $x$ i przyjmujemy $y_p = Cxe^{\gamma x}$.</p><p>Podstawiając zmodyfikowane $y_p$ do równania $y^{\prime\prime} + ay^{\prime} - \gamma(a + \gamma)y = ke^{\gamma x}$ otrzymujemy:</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="przypadek-gamma---a-gamma">Przypadek $\gamma = -a-\gamma$</h4><p>W tym przypadku $Ce^{\gamma x}$ odpowiada pierwiastkowi podwójnemu równania charakterystycznego, więc zgodnie z regułą modyfikacji (b) mnożymy przez $x^2$ i przyjmujemy $y_p = Cx^2 e^{\gamma x}$.</p><p>Podstawiając do równania $y^{\prime\prime} - 2\gamma y^{\prime} + \gamma^2 y = ke^{\gamma x}$ otrzymujemy:</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="rozszerzenie-metody-nieoznaczonych-współczynników-rx-jako-iloczyn-funkcji">Rozszerzenie metody nieoznaczonych współczynników: $r(x)$ jako iloczyn funkcji</h2><p>Rozważmy niejednorodne liniowe RRO, w którym $r(x)$ ma postać $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>Załóżmy, że $r(x)$ jest iloczynem wykładniczej $e^{\alpha x}$, potęgi $x^m$, $\cos{\omega x}$ lub $\sin{\omega x}$ (tu zakładamy $\cos$ — bez straty ogólności), ewentualnie sumą i/lub iloczynem takich funkcji (tj. da się go zapisać jako sumę i iloczyn funkcji z pierwszej kolumny wcześniejszej tabeli). Pokażemy, że istnieje rozwiązanie $y_p$ będące sumą i iloczynem funkcji z drugiej kolumny tej samej tabeli.</p><blockquote class="prompt-tip"><p>Dla ścisłości w pewnym miejscu użyto aparatu algebry liniowej — te fragmenty oznaczono znakiem *. Można je pominąć i czytać dalej; do ogólnego zrozumienia nie są konieczne.</p></blockquote><h3 id="definicja-przestrzeni-wektorowej-v">Definicja przestrzeni wektorowej $V$*</h3><p>Dla $r(x)$ postaci</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>możemy zdefiniować przestrzeń wektorową $V$ tak, aby $r(x) \in V$, w następujący sposób:</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="postacie-pochodnych-funkcji-wykładniczej-wielomianu-i-funkcji-trygonometrycznych">Postacie pochodnych funkcji wykładniczej, wielomianu i funkcji trygonometrycznych</h3><p>Postacie pochodnych funkcji bazowych z pierwszej kolumny tabeli są następujące:</p><ul><li>funkcja wykładnicza: $\cfrac{d}{dx}e^{\alpha x} = \alpha e^{\alpha x}$<li>wielomian: $\cfrac{d}{dx}x^m = mx^{m-1}$<li>funkcje trygonometryczne: $\cfrac{d}{dx}\cos\omega x = -\omega\sin\omega x, \quad \cfrac{d}{dx}\sin\omega x = \omega\cos\omega x$</ul><p>Pochodne otrzymywane przez różniczkowanie tych funkcji również dają się zapisać jako <u>suma funkcji tego samego typu</u>.</p><p>Zatem jeśli $f$ i $g$ są jedną z powyższych funkcji lub ich sumą, to dla $r(x) = f(x)g(x)$, stosując regułę iloczynu, mamy</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>przy czym $f$, $f^{\prime}$, $f^{\prime\prime}$ oraz $g$, $g^{\prime}$, $g^{\prime\prime}$ można wszystkie zapisać jako sumy (lub stałe wielokrotności) funkcji wykładniczych, wielomianów i funkcji trygonometrycznych. W konsekwencji $r^{\prime}(x) = (fg)^{\prime}$ i $r^{\prime\prime}(x) = (fg)^{\prime\prime}$ również, podobnie jak $r(x)$, dają się wyrazić jako sumy i iloczyny tych funkcji.</p><h3 id="niezmienniczość-v-względem-różniczkowania-d-i-przekształcenia-liniowego-l">Niezmienniczość $V$ względem różniczkowania $D$ i przekształcenia liniowego $L$*</h3><p>To znaczy: nie tylko samo $r(x)$, ale też $r^{\prime}(x)$ i $r^{\prime\prime}(x)$ są kombinacjami liniowymi składników postaci $x^k e^{\alpha x}\cos(\omega x)$ oraz $x^k e^{\alpha x}\sin(\omega x)$, więc</p>\[r(x) \in V \implies r^{\prime}(x) \in V,\ r^{\prime\prime}(x) \in V.\]<p>Nie ograniczając się do $r(x)$, wprowadzamy operator różniczkowania $D$ dla wszystkich elementów przestrzeni $V$. Wtedy <em>przestrzeń $V$ jest domknięta ze względu na operator różniczkowania $D$</em>. Jeśli oznaczymy lewą stronę równania jako $L[y] = y^{\prime\prime} + ay^{\prime} + by$, to <em>$V$ jest niezmiennicza (invariant) względem $L$</em>.</p>\[D^2(V)\subseteq V,\quad aD(V)\subseteq V,\quad b\,V\subseteq V \implies L(V)\subseteq V.\]<p>Ponieważ $r(x) \in V$ i $V$ jest niezmiennicza względem $L$, istnieje pewien element $y_p \in V$ taki, że $L[y_p] = r$.</p>\[\exists y_p \in V: L[y_p] = r\]<h3 id="ansatz">Ansatz</h3><p>Zatem, jeśli wybierzemy odpowiednie $y_p$ jako sumę wszystkich możliwych składników iloczynowych, używając nieoznaczonych współczynników $A_0, A_1, \dots, A_n$ oraz $K$, $M$, w postaci</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>to zgodnie z regułą podstawową (a) i regułą modyfikacji (b) można wyznaczyć nieoznaczone współczynniki, podstawiając $y_p$ (lub $xy_p$, $x^2y_p$) i jego pochodne do danego równania. Wartość $n$ dobiera się zgodnie ze stopniem wielomianowym w $x$ występującym w $r(x)$.</p><p>$\blacksquare$</p><blockquote class="prompt-warning"><p>Jeśli dane wymuszenie $r(x)$ zawiera kilka różnych wartości $\alpha_i$ oraz $\omega_j$, to dla każdej z nich trzeba dobrać $y_p$ tak, by zawierało wszystkie możliwe składniki postaci $x^{k}e^{\alpha_i x}\cos(\omega_j x)$ oraz $x^{k}e^{\alpha_i x}\sin(\omega_j x)$ (bez pominięć).<br /> Zaletą metody nieoznaczonych współczynników jest prostota; jeśli ansatz robi się zbyt złożony i ta zaleta zanika, rozsądniej może być zastosować (omawianą później) metodę wariacji stałych.</p></blockquote><h2 id="rozszerzenie-metody-nieoznaczonych-współczynników-równanie-euleracauchyego">Rozszerzenie metody nieoznaczonych współczynników: równanie Eulera–Cauchy’ego</h2><p>Metodę nieoznaczonych współczynników można wykorzystać nie tylko dla <a href="/pl/posts/homogeneous-linear-odes-with-constant-coefficients/">jednorodnych liniowych RRO drugiego rzędu o stałych współczynnikach</a>, ale także dla <a href="/pl/posts/euler-cauchy-equation/">równania Eulera–Cauchy’ego</a>:</p>\[x^2y^{\prime\prime} + axy^{\prime} + by = r(x) \label{eqn:euler_cauchy}\tag{5}\]<h3 id="podstawienie-zmiennej">Podstawienie zmiennej</h3><p>Jeśli wykonamy podstawienie <a href="/pl/posts/euler-cauchy-equation/#przeksztalcenie-do-jednorodnego-liniowego-rro-drugiego-rzedu-o-stalych-wspolczynnikach">$x = e^t$ i sprowadzimy do jednorodnego liniowego RRO drugiego rzędu o stałych współczynnikach</a>, to</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>i — jak już wcześniej ustaliliśmy — równanie Eulera–Cauchy’ego można przekształcić do liniowego RRO o stałych współczynnikach względem $t$:</p>\[y^{\prime\prime} + (a-1)y^{\prime} + by = r(e^t). \label{eqn:substituted}\tag{6}\]<p>Teraz wystarczy zastosować dokładnie tak samo <a href="#metoda-nieoznaczonych-wspolczynnikow">metodę nieoznaczonych współczynników omówioną wcześniej</a>, rozwiązać równanie względem $t$, a na końcu użyć faktu, że $t = \ln x$, aby otrzymać rozwiązanie względem $x$.</p><h3 id="gdy-rx-jest-potęgą-x-logarytmem-naturalnym-lub-sumąiloczynem-takich-funkcji">Gdy $r(x)$ jest potęgą $x$, logarytmem naturalnym lub sumą/iloczynem takich funkcji</h3><p>W szczególności, gdy wymuszenie $r(x)$ składa się z potęg $x$, logarytmów naturalnych, lub sum i/lub iloczynów takich funkcji, można od razu dobrać odpowiednie $y_p$ według poniższych reguł dla równania Eulera–Cauchy’ego.</p><blockquote class="prompt-info"><p><strong>Reguły wyboru w metodzie nieoznaczonych współczynników: dla równania Eulera–Cauchy’ego</strong><br /> <strong>(a) reguła podstawowa (basic rule)</strong>: w równaniu ($\ref{eqn:euler_cauchy}$), jeśli $r(x)$ jest jedną z funkcji z pierwszej kolumny tabeli, wybierz $y_p$ z tej samej linii, a następnie wyznacz nieoznaczone współczynniki, podstawiając $y_p$ i jego pochodne do ($\ref{eqn:euler_cauchy}$).<br /> <strong>(b) reguła modyfikacji (modification rule)</strong>: jeśli składnik wybrany jako $y_p$ jest rozwiązaniem odpowiadającego mu jednorodnego równania $x^2y^{\prime\prime} + axy^{\prime} + by = 0$, pomnóż go przez $\ln{x}$ (albo przez $(\ln{x})^2$, jeśli odpowiada on pierwiastkowi podwójnemu równania charakterystycznego).<br /> <strong>(c) reguła sumy (sum rule)</strong>: jeśli $r(x)$ jest sumą funkcji z pierwszej kolumny tabeli, wybierz jako $y_p$ sumę odpowiadających funkcji z drugiej kolumny.</p><table><thead><tr><th style="text-align: left">Składnik w $r(x)$<th style="text-align: left">Wybór dla $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>Dzięki temu dla praktycznie ważnych postaci wymuszenia $r(x)$ można znaleźć $y_p$ szybciej i wygodniej — otrzymując to samo, co metodą <a href="#podstawienie-zmiennej">podstawienia zmiennej</a>. Wystarczy wziąć <a href="#metoda-nieoznaczonych-wspolczynnikow">oryginalne reguły wyboru</a> i w miejsce $x$ podstawić $\ln{x}$, aby wyprowadzić te reguły dla równania Eulera–Cauchy’ego.</p>]]> </content> </entry> <entry><title xml:lang="pl">Niejednorodne liniowe równania różniczkowe zwyczajne drugiego rzędu (Nonhomogeneous Linear ODEs of Second Order)</title><link href="https://www.yunseo.kim/pl/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-04-16T00:00:00+09:00</updated> <id>https://www.yunseo.kim/pl/posts/nonhomogeneous-linear-odes-of-second-order/</id> <author> <name>Yunseo Kim</name> </author> <category term="Mathematics" /> <category term="Differential Equation" /> <summary xml:lang="pl">Omawiamy postać rozwiązania ogólnego niejednorodnych liniowych równań różniczkowych II rzędu i jego związek z rozwiązaniem równania jednorodnego; pokazujemy istnienie rozwiązania ogólnego oraz brak rozwiązań osobliwych.</summary> <content type="html" xml:lang="pl"> <![CDATA[<p>Omawiamy postać rozwiązania ogólnego niejednorodnych liniowych równań różniczkowych II rzędu i jego związek z rozwiązaniem równania jednorodnego; pokazujemy istnienie rozwiązania ogólnego oraz brak rozwiązań osobliwych.</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>Rozwiązanie ogólne</strong> niejednorodnego liniowego równania różniczkowego zwyczajnego II rzędu $y^{\prime\prime} + p(x)y^{\prime} + q(x)y = r(x)$:<ul><li>$y(x) = y_h(x) + y_p(x)$<li>$y_h$: rozwiązanie ogólne równania jednorodnego $y^{\prime\prime} + p(x)y^{\prime} + q(x)y = 0$, tj. $y_h = c_1y_1 + c_2y_2$<li>$y_p$: rozwiązanie szczególne danego równania niejednorodnego</ul><li>Składnik odpowiedzi $y_p$ jest wyznaczany wyłącznie przez wejście $r(x)$; dla tego samego równania niejednorodnego $y_p$ nie zmienia się nawet przy innych warunkach początkowych. Różnica dwóch rozwiązań szczególnych równania niejednorodnego jest rozwiązaniem odpowiadającego mu równania jednorodnego.<li><strong>Istnienie rozwiązania ogólnego</strong>: jeżeli współczynniki $p(x)$, $q(x)$ oraz funkcja wejściowa $r(x)$ są ciągłe, to rozwiązanie ogólne zawsze istnieje<li><strong>Brak rozwiązań osobliwych</strong>: rozwiązanie ogólne obejmuje wszystkie rozwiązania równania (tzn. rozwiązanie osobliwe nie istnieje)</ul></blockquote><h2 id="wymagania-wstępne">Wymagania wstępne</h2><ul><li><a href="/pl/posts/homogeneous-linear-odes-of-second-order/">Jednorodne liniowe równania różniczkowe zwyczajne drugiego rzędu (Homogeneous Linear ODEs of Second Order)</a><li><a href="/pl/posts/wronskian-existence-and-uniqueness-of-solutions/">Wronskian, istnienie i jednoznaczność rozwiązań</a></ul><h2 id="rozwiązanie-ogólne-i-rozwiązanie-szczególne-niejednorodnego-liniowego-róz-ii-rzędu">Rozwiązanie ogólne i rozwiązanie szczególne niejednorodnego liniowego RÓZ II rzędu</h2><p>Rozważmy niejednorodne liniowe równanie różniczkowe zwyczajne II rzędu</p>\[y^{\prime\prime} + p(x)y^{\prime} + q(x)y = r(x) \label{eqn:nonhomogeneous_linear_ode}\tag{1}\]<p>gdzie $r(x) \not\equiv 0$. Na otwartym przedziale $I$ <strong>rozwiązanie ogólne</strong> równania ($\ref{eqn:nonhomogeneous_linear_ode}$) ma postać sumy rozwiązania ogólnego odpowiadającego mu równania jednorodnego</p>\[y^{\prime\prime} + p(x)y^{\prime} + q(x)y = 0 \label{eqn:homogeneous_linear_ode}\tag{2}\]<p>tj. $y_h = c_1y_1 + c_2y_2$, oraz rozwiązania szczególnego $y_p$ równania ($\ref{eqn:nonhomogeneous_linear_ode}$):</p>\[y(x) = y_h(x) + y_p(x) \label{eqn:general_sol}\tag{3}\]<p>Ponadto na przedziale $I$ <strong>rozwiązaniem szczególnym</strong> równania ($\ref{eqn:nonhomogeneous_linear_ode}$) jest rozwiązanie otrzymane z ($\ref{eqn:general_sol}$) przez nadanie konkretnych wartości dowolnym stałym $c_1$ i $c_2$ w $y_h$.</p><p>Innymi słowy: jeśli do jednorodnego równania różniczkowego ($\ref{eqn:homogeneous_linear_ode}$) dodamy wejście $r(x)$ zależne wyłącznie od zmiennej niezależnej $x$, to w odpowiedzi pojawi się odpowiadający mu składnik $y_p$. Ten dodatkowy składnik odpowiedzi $y_p$ jest wyznaczany niezależnie od warunków początkowych — wyłącznie przez wejście $r(x)$. Jak zobaczymy dalej, gdy odejmiemy od siebie dowolne dwa rozwiązania $y_1$ i $y_2$ równania ($\ref{eqn:nonhomogeneous_linear_ode}$) (tj. różnicę dwóch rozwiązań szczególnych odpowiadających dwóm różnym warunkom początkowym), część $y_p$ — niezależna od warunków początkowych — znika i pozostaje jedynie różnica ${y_h}_1$ i ${y_h}_2$, która na mocy <a href="/pl/posts/homogeneous-linear-odes-of-second-order/#zasada-superpozycji">zasady superpozycji</a> jest rozwiązaniem równania ($\ref{eqn:homogeneous_linear_ode}$).</p><h2 id="związek-między-rozwiązaniami-równania-niejednorodnego-a-rozwiązaniami-odpowiadającego-mu-równania-jednorodnego">Związek między rozwiązaniami równania niejednorodnego a rozwiązaniami odpowiadającego mu równania jednorodnego</h2><blockquote class="prompt-info"><p><strong>Twierdzenie 1: związek między rozwiązaniami równania niejednorodnego ($\ref{eqn:nonhomogeneous_linear_ode}$) i rozwiązaniami równania jednorodnego ($\ref{eqn:homogeneous_linear_ode}$)</strong><br /> <strong>(a)</strong> Na pewnym otwartym przedziale $I$ suma rozwiązania $y$ równania niejednorodnego ($\ref{eqn:nonhomogeneous_linear_ode}$) i rozwiązania $\tilde{y}$ równania jednorodnego ($\ref{eqn:homogeneous_linear_ode}$) jest na przedziale $I$ rozwiązaniem równania ($\ref{eqn:nonhomogeneous_linear_ode}$). W szczególności wzór ($\ref{eqn:general_sol}$) jest na przedziale $I$ rozwiązaniem równania ($\ref{eqn:nonhomogeneous_linear_ode}$).<br /> <strong>(b)</strong> Na przedziale $I$ różnica dwóch rozwiązań równania niejednorodnego ($\ref{eqn:nonhomogeneous_linear_ode}$) jest na przedziale $I$ rozwiązaniem równania jednorodnego ($\ref{eqn:homogeneous_linear_ode}$).</p></blockquote><h3 id="dowód">Dowód</h3><h4 id="a">(a)</h4><p>Oznaczmy lewą stronę równań ($\ref{eqn:nonhomogeneous_linear_ode}$) i ($\ref{eqn:homogeneous_linear_ode}$) przez $L[y]$. Wtedy dla dowolnego rozwiązania $y$ równania ($\ref{eqn:nonhomogeneous_linear_ode}$) oraz dowolnego rozwiązania $\tilde{y}$ równania ($\ref{eqn:homogeneous_linear_ode}$) na przedziale $I$ zachodzi</p>\[L[y + \tilde{y}] = L[y] + L[\tilde{y}] = r + 0 = r.\]<h4 id="b">(b)</h4><p>Dla dowolnych dwóch rozwiązań $y$ i $y^*$ równania ($\ref{eqn:nonhomogeneous_linear_ode}$) na przedziale $I$ zachodzi</p>\[L[y - y^*] = L[y] - L[y^*] = r - r = 0.\ \blacksquare\]<h2 id="rozwiązanie-ogólne-równania-niejednorodnego-obejmuje-wszystkie-rozwiązania">Rozwiązanie ogólne równania niejednorodnego obejmuje wszystkie rozwiązania</h2><p>Dla równania jednorodnego ($\ref{eqn:homogeneous_linear_ode}$) <a href="/pl/posts/wronskian-existence-and-uniqueness-of-solutions/#ogolne-rozwiazanie-zawiera-wszystkie-rozwiazania">wiemy, że rozwiązanie ogólne obejmuje wszystkie rozwiązania</a>. Pokażmy, że dla równania niejednorodnego ($\ref{eqn:nonhomogeneous_linear_ode}$) zachodzi to samo.</p><blockquote class="prompt-info"><p><strong>Twierdzenie 2: rozwiązanie ogólne równania niejednorodnego obejmuje wszystkie rozwiązania</strong><br /> Jeżeli współczynniki $p(x)$, $q(x)$ oraz funkcja wejściowa $r(x)$ równania ($\ref{eqn:nonhomogeneous_linear_ode}$) są ciągłe na pewnym otwartym przedziale $I$, to każde rozwiązanie równania ($\ref{eqn:nonhomogeneous_linear_ode}$) na przedziale $I$ można otrzymać z rozwiązania ogólnego ($\ref{eqn:general_sol}$) przez odpowiedni dobór wartości stałych $c_1$ i $c_2$ w $y_h$.</p></blockquote><h3 id="dowód-1">Dowód</h3><p>Niech $y^*$ będzie pewnym rozwiązaniem równania ($\ref{eqn:nonhomogeneous_linear_ode}$) na $I$, a $x_0$ — pewnym punktem $x$ należącym do $I$. Na mocy <a href="/pl/posts/wronskian-existence-and-uniqueness-of-solutions/#istnienie-rozwiazania-ogolnego">twierdzenia o istnieniu rozwiązania ogólnego dla jednorodnego RÓZ o ciągłych współczynnikach zmiennych</a> istnieje $y_h = c_1y_1 + c_2y_2$, a ponadto (jak omówimy później) na mocy <strong>metody wariacji parametrów (method of variation of parameters)</strong> istnieje także $y_p$, więc rozwiązanie ogólne ($\ref{eqn:general_sol}$) równania ($\ref{eqn:nonhomogeneous_linear_ode}$) na przedziale $I$ istnieje. Teraz, na mocy udowodnionego wcześniej twierdzenia <a href="#zwiazek-miedzy-rozwiazaniami-rownania-niejednorodnego-a-rozwiazaniami-odpowiadajacego-mu-rownania-jednorodnego">1(b)</a>, funkcja $Y = y^* - y_p$ jest na przedziale $I$ rozwiązaniem jednorodnego równania ($\ref{eqn:homogeneous_linear_ode}$), a w punkcie $x_0$ mamy</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>Z <a href="/pl/posts/wronskian-existence-and-uniqueness-of-solutions/#twierdzenie-o-istnieniu-i-jednoznacznosci-rozwiazania-zadania-poczatkowego">twierdzenia o istnieniu i jednoznaczności rozwiązania zadania początkowego</a> wynika, że na przedziale $I$ dla powyższych warunków początkowych istnieje dokładnie jedno rozwiązanie szczególne $Y$ jednorodnego równania ($\ref{eqn:homogeneous_linear_ode}$), które można otrzymać przez odpowiedni dobór $c_1$, $c_2$ w $y_h$. Ponieważ $y^* = Y + y_p$, pokazaliśmy, że dowolne rozwiązanie szczególne $y^*$ równania niejednorodnego ($\ref{eqn:nonhomogeneous_linear_ode}$) można otrzymać z rozwiązania ogólnego ($\ref{eqn:general_sol}$). $\blacksquare$</p>]]> </content> </entry> <entry><title xml:lang="pl">Wronskian, istnienie i jednoznaczność rozwiązań</title><link href="https://www.yunseo.kim/pl/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-04-06T00:00:00+09:00</updated> <id>https://www.yunseo.kim/pl/posts/wronskian-existence-and-uniqueness-of-solutions/</id> <author> <name>Yunseo Kim</name> </author> <category term="Mathematics" /> <category term="Differential Equation" /> <summary xml:lang="pl">Dla jednorodnego liniowego RÓZ 2. rzędu z ciągłymi współczynnikami zmiennymi omawiamy twierdzenie o istnieniu i jednoznaczności oraz kryterium zależności/niezależności liniowej z użyciem Wronskianu.</summary> <content type="html" xml:lang="pl"> <![CDATA[<p>Dla jednorodnego liniowego RÓZ 2. rzędu z ciągłymi współczynnikami zmiennymi omawiamy twierdzenie o istnieniu i jednoznaczności oraz kryterium zależności/niezależności liniowej z użyciem Wronskianu.</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>Dla jednorodnego liniowego równania różniczkowego zwyczajnego 2. rzędu z dowolnymi ciągłymi współczynnikami zmiennymi $p$ i $q$ na przedziale $I$</p>\[y^{\prime\prime} + p(x)y^{\prime} + q(x)y = 0\]<p>oraz warunków początkowych</p>\[y(x_0)=K_0, \qquad y^{\prime}(x_0)=K_1\]<p>zachodzą następujące 4 twierdzenia.</p><ol><li><strong>Twierdzenie o istnieniu i jednoznaczności rozwiązania zagadnienia początkowego</strong>: zagadnienie początkowe złożone z danego równania i warunków początkowych ma na przedziale $I$ jedyne rozwiązanie $y(x)$.<li><strong>Rozstrzyganie zależności/niezależności liniowej rozwiązań za pomocą Wronskianu</strong>: dla dwóch rozwiązań $y_1$ i $y_2$ tego równania, jeśli istnieje $x_0$ na przedziale $I$ takie, że wartość <strong>Wronskianu</strong> $W(y_1, y_2) = y_1y_2^{\prime} - y_2y_1^{\prime}$ jest równa $0$, to rozwiązania są liniowo zależne. Ponadto, jeśli istnieje $x_1$ na $I$ takie, że $W\neq 0$, to rozwiązania są liniowo niezależne.<li><strong>Istnienie rozwiązania ogólnego</strong>: dane równanie ma na przedziale $I$ rozwiązanie ogólne.<li><strong>Brak rozwiązań osobliwych</strong>: to rozwiązanie ogólne obejmuje wszystkie rozwiązania równania (tzn. nie istnieją rozwiązania osobliwe).</ol></blockquote><h2 id="prerequisites">Prerequisites</h2><ul><li><a href="/pl/posts/Solution-of-First-Order-Linear-ODE/">Rozwiązywanie liniowych równań różniczkowych zwyczajnych 1. rzędu</a><li><a href="/pl/posts/homogeneous-linear-odes-of-second-order/">Jednorodne liniowe równania różniczkowe zwyczajne drugiego rzędu (Homogeneous Linear ODEs of Second Order)</a><li><a href="/pl/posts/homogeneous-linear-odes-with-constant-coefficients/">Jednorodne liniowe RÓZ 2. rzędu ze stałymi współczynnikami</a><li><a href="/pl/posts/euler-cauchy-equation/">Równanie Eulera–Cauchy’ego</a><li>macierz odwrotna i macierz osobliwa, wyznacznik</ul><h2 id="jednorodne-liniowe-równanie-różniczkowe-zwyczajne-z-dowolnymi-ciągłymi-współczynnikami-zmiennymi">Jednorodne liniowe równanie różniczkowe zwyczajne z dowolnymi ciągłymi współczynnikami zmiennymi</h2><p>Wcześniej poznaliśmy rozwiązania ogólne dla <a href="/pl/posts/homogeneous-linear-odes-with-constant-coefficients/">jednorodnych liniowych RÓZ 2. rzędu ze stałymi współczynnikami</a> oraz <a href="/pl/posts/euler-cauchy-equation/">równania Eulera–Cauchy’ego</a>. W tym wpisie rozszerzymy rozważania na bardziej ogólny przypadek: jednorodne liniowe RÓZ 2. rzędu z dowolnymi ciągłymi <strong>współczynnikami zmiennymi (variable coefficient)</strong> $p$ i $q$</p>\[y^{\prime\prime} + p(x)y^{\prime} + q(x)y = 0 \label{eqn:homogeneous_linear_ode_with_var_coefficients}\tag{1}\]<p>i omówimy istnienie oraz postać jego rozwiązania ogólnego. Dodatkowo zbadamy też jednoznaczność <a href="/pl/posts/homogeneous-linear-odes-of-second-order/#zagadnienie-poczatkowe-i-warunki-poczatkowe">zagadnienia początkowego</a> złożonego z równania różniczkowego ($\ref{eqn:homogeneous_linear_ode_with_var_coefficients}$) i następujących dwóch warunków początkowych</p>\[y(x_0)=K_0, \qquad y^{\prime}(x_0)=K_1 \label{eqn:initial_conditions}\tag{2}\]<p>Mówiąc od razu, sednem jest fakt, że <u>liniowe</u> RÓZ o ciągłych współczynnikach nie mają <em>rozwiązań osobliwych (singular solution)</em> (tj. rozwiązań, których nie da się uzyskać z rozwiązania ogólnego).</p><h2 id="twierdzenie-o-istnieniu-i-jednoznaczności-rozwiązania-zagadnienia-początkowego">Twierdzenie o istnieniu i jednoznaczności rozwiązania zagadnienia początkowego</h2><blockquote class="prompt-info"><p><strong>Twierdzenie o istnieniu i jednoznaczności rozwiązania zagadnienia początkowego (Existence and Uniqueness Theorem for Initial Value Problems)</strong><br /> Jeśli $p(x)$ i $q(x)$ są funkcjami ciągłymi na pewnym otwartym przedziale $I$, a $x_0$ należy do $I$, to zagadnienie początkowe złożone z równań ($\ref{eqn:homogeneous_linear_ode_with_var_coefficients}$) oraz ($\ref{eqn:initial_conditions}$) ma na $I$ jedyne rozwiązanie $y(x)$.</p></blockquote><p>Dowodu istnienia tutaj nie omawiamy; przyjrzymy się wyłącznie dowodowi jednoznaczności. Zwykle udowodnienie jednoznaczności jest prostsze niż udowodnienie istnienia.<br /> Jeśli dowód Cię nie interesuje, możesz pominąć tę część i przejść do <a href="#zaleznosc-i-niezaleznosc-liniowa-rozwiazan">zależności i niezależności liniowej rozwiązań</a>.</p><h3 id="dowód-jednoznaczności">Dowód jednoznaczności</h3><p>Załóżmy, że zagadnienie początkowe złożone z równania ($\ref{eqn:homogeneous_linear_ode_with_var_coefficients}$) i warunków ($\ref{eqn:initial_conditions}$) ma na przedziale $I$ dwa rozwiązania: $y_1(x)$ oraz $y_2(x)$. Jeśli pokażemy, że ich różnica</p>\[y(x) = y_1(x) - y_2(x)\]<p>jest identycznie równa $0$ na $I$, to będzie to oznaczało, że $y_1 \equiv y_2$ na $I$, czyli że rozwiązanie jest jednoznaczne.</p><p>Ponieważ równanie ($\ref{eqn:homogeneous_linear_ode_with_var_coefficients}$) jest jednorodnym liniowym RÓZ, funkcja $y$ będąca kombinacją liniową $y_1$ i $y_2$ także jest rozwiązaniem na $I$. Ponieważ $y_1$ i $y_2$ spełniają te same warunki początkowe ($\ref{eqn:initial_conditions}$), $y$ spełnia</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>Rozważmy teraz funkcję</p>\[z(x) = y(x)^2 + y^{\prime}(x)^2\]<p>oraz jej pochodną</p>\[z^{\prime} = 2yy^{\prime} + 2y^{\prime}y^{\prime\prime}\]<p>Z równania różniczkowego mamy</p>\[y^{\prime\prime} = -py^{\prime} - qy\]<p>a po podstawieniu do wyrażenia na $z^{\prime}$ otrzymujemy</p>\[z^{\prime} = 2yy^{\prime} - 2p{y^{\prime}}^2 - 2qyy^{\prime} \label{eqn:z_prime}\tag{4}\]<p>Ponieważ $y$ i $y^{\prime}$ są rzeczywiste,</p>\[(y\pm y^{\prime})^2 = y^2 \pm 2yy^{\prime} + {y^{\prime}}^2 \geq 0\]<p>Stąd oraz z definicji $z$ wynikają dwie nierówności</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>Z nich dostajemy $|2yy^{\prime}|\leq z$, a więc dla ostatniego wyrazu w ($\ref{eqn:z_prime}$) zachodzi</p>\[\pm2qyy^{\prime} \leq |\pm 2qyy^{\prime}| = |q||2yy^{\prime}| \leq |q|z.\]<p>Korzystając z tego oraz z faktu, że $-p \leq |p|$, i stosując ($\ref{eqn:inequalities}$a) do wyrazu $2yy^{\prime}$ w ($\ref{eqn:z_prime}$), otrzymujemy</p>\[z^{\prime} \leq z + 2|p|{y^{\prime}}^2 + |q|z\]<p>Ponieważ ${y^{\prime}}^2 \leq y^2 + {y^{\prime}}^2 = z$, stąd</p>\[z^{\prime} \leq (1 + 2|p| + |q|)z\]<p>Wprowadzając $h = 1 + 2|p| + |q|$, dostajemy</p>\[z^{\prime} \leq hz \quad \forall x \in I \label{eqn:inequality_6a}\tag{6a}\]<p>Analogicznie, z ($\ref{eqn:z_prime}$) i ($\ref{eqn:inequalities}$) wynika</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>Nierówności ($\ref{eqn:inequality_6a}$) i ($\ref{eqn:inequality_6b}$) są równoważne</p>\[z^{\prime} - hz \leq 0, \qquad z^{\prime} + hz \geq 0 \label{eqn:inequalities_7}\tag{7}\]<p>a <em>czynnikami całkującymi</em> dla lewych stron (por. <a href="/pl/posts/Solution-of-First-Order-Linear-ODE/#niejednorodne-liniowe-rownania-rozniczkowe-zwyczajne">czynnik całkujący</a>) są</p>\[F_1 = e^{-\int h(x)\ dx} \qquad \text{oraz} \qquad F_2 = e^{\int h(x)\ dx}\]<p>Ponieważ $h$ jest ciągła, całka nieoznaczona $\int h(x)\ dx$ istnieje. Ponadto $F_1$ i $F_2$ są dodatnie, więc z ($\ref{eqn:inequalities_7}$) mamy</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>To oznacza, że na $I$ funkcja $F_1 z$ nie rośnie, a $F_2 z$ nie maleje. Ponieważ z ($\ref{eqn:initial_conditions_*}$) wynika $z(x_0) = 0$, otrzymujemy</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>Na koniec dzielimy obie strony nierówności przez dodatnie $F_1$ i $F_2$, co daje jednoznaczność:</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="zależność-i-niezależność-liniowa-rozwiązań">Zależność i niezależność liniowa rozwiązań</h2><p>Przypomnijmy na chwilę treści z wpisu o <a href="/pl/posts/homogeneous-linear-odes-of-second-order/#baza-i-rozwiazanie-ogolne">jednorodnych liniowych RÓZ 2. rzędu</a>. Rozwiązanie ogólne na otwartym przedziale $I$ buduje się z pary rozwiązań liniowo niezależnych $y_1$, $y_2$, czyli z <strong>bazy (basis)</strong> na $I$. To, że $y_1$ i $y_2$ są <strong>liniowo niezależne (linearly independent)</strong> na $I$, oznacza, że dla każdego $x$ z przedziału zachodzi</p>\[k_1y_1(x) + k_2y_2(x) = 0 \Leftrightarrow k_1=0\text{ i }k_2=0 \label{eqn:linearly_independent}\tag{8}\]<p>Jeśli powyższe nie zachodzi, tzn. istnieją współczynniki $k_1$, $k_2$ niezerowe (co najmniej jeden z nich) takie, że $k_1y_1(x) + k_2y_2(x) = 0$, to $y_1$ i $y_2$ są <strong>liniowo zależne (linearly dependent)</strong> na $I$. Wówczas dla każdego $x$ z $I$ mamy</p>\[\text{(a) } y_1 = ky_2 \quad \text{lub} \quad \text{(b) } y_2 = ly_1 \label{eqn:linearly_dependent}\tag{9}\]<p>czyli $y_1$ i $y_2$ są proporcjonalne.</p><p>Poznajmy teraz kryterium rozstrzygania zależności/niezależności liniowej.</p><blockquote class="prompt-info"><p><strong>Rozstrzyganie zależności/niezależności liniowej rozwiązań za pomocą Wronskianu</strong><br /> <strong>i.</strong> Jeśli równanie różniczkowe ($\ref{eqn:homogeneous_linear_ode_with_var_coefficients}$) ma na otwartym przedziale $I$ ciągłe współczynniki $p(x)$ i $q(x)$, to warunkiem koniecznym i wystarczającym na to, aby dwa rozwiązania $y_1$ i $y_2$ równania ($\ref{eqn:homogeneous_linear_ode_with_var_coefficients}$) były liniowo zależne na $I$, jest to, by <em>wyznacznik Wrońskiego (Wronski determinant)</em>, w skrócie <strong>Wronskian</strong>, tj.</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>zerował się w pewnym punkcie $x_0$ z przedziału $I$.</p>\[\exists x_0 \in I: W(x_0)=0 \iff y_1 \text{ i } y_2 \text{ są liniowo zależne}\]<p><strong>ii.</strong> Jeśli w jednym punkcie $x=x_0$ z przedziału $I$ zachodzi $W=0$, to w całym $I$ zachodzi $W=0$.</p>\[\exists x_0 \in I: W(x_0)=0 \implies \forall x \in I: W(x)=0\]<p>Innymi słowy, jeżeli istnieje $x_1 \in I$ takie, że $W\neq 0$, to na całym $I$ rozwiązania $y_1$, $y_2$ są liniowo niezależne.</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{ i } y_2 \text{ są liniowo niezależne} \end{align*}\]</blockquote><blockquote class="prompt-tip"><p>Wronskian został po raz pierwszy wprowadzony przez polskiego matematyka Józefa Marię Hoene-Wrońskiego, a obecną nazwę nadano mu pośmiertnie w 11882 HE przez szkockiego matematyka Sir Thomasa Muira.</p></blockquote><h3 id="dowód">Dowód</h3><h4 id="i-a">i. (a)</h4><p>Niech $y_1$ i $y_2$ będą liniowo zależne na $I$. Wtedy na $I$ zachodzi ($\ref{eqn:linearly_dependent}$a) lub ($\ref{eqn:linearly_dependent}$b). Jeśli zachodzi ($\ref{eqn:linearly_dependent}$a), to</p>\[W(y_1, y_2) = y_1y_2^{\prime} - y_2y_1^{\prime} = ky_2ky_2^{\prime} - y_2ky_2^{\prime} = 0\]<p>a analogicznie, gdy zachodzi ($\ref{eqn:linearly_dependent}$b), mamy</p>\[W(y_1, y_2) = y_1y_2^{\prime} - y_2y_1^{\prime} = y_1ly_1^{\prime} - ly_1y_1^{\prime} = 0\]<p>Zatem widzimy, że <u>dla każdego $x$ z przedziału $I$</u> zachodzi $W(y_1, y_2)=0$.</p><h4 id="i-b">i. (b)</h4><p>Odwrotnie, załóżmy, że dla pewnego $x = x_0$ zachodzi $W(y_1, y_2)=0$. Pokażemy, że wtedy $y_1$ i $y_2$ są liniowo zależne na $I$. Rozważmy układ równań liniowych ze względu na niewiadome $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>Można go zapisać w postaci równania wektorowego:</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>Macierzą współczynników jest</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>a jej wyznacznik jest równy $W(y_1(x_0), y_2(x_0))$. Ponieważ $\det(A) = W=0$, macierz $A$ jest <strong>macierzą osobliwą (singular matrix)</strong>, czyli nie ma <strong>macierzy odwrotnej (inverse matrix)</strong>. Zatem układ ($\ref{eqn:linear_system}$) ma rozwiązanie inne niż wektor zerowy $(0,0)$: istnieje rozwiązanie $(c_1, c_2)$, gdzie przynajmniej jedna z liczb $c_1$, $c_2$ nie jest równa $0$. Wprowadźmy teraz funkcję</p>\[y(x) = c_1y_1(x) + c_2y_2(x)\]<p>Ponieważ równanie ($\ref{eqn:homogeneous_linear_ode_with_var_coefficients}$) jest jednorodne liniowe, to na mocy <a href="/pl/posts/homogeneous-linear-odes-of-second-order/#zasada-superpozycji">zasady superpozycji</a> funkcja ta jest rozwiązaniem ($\ref{eqn:homogeneous_linear_ode_with_var_coefficients}$) na $I$. Z ($\ref{eqn:linear_system}$) wynika, że spełnia warunki początkowe $y(x_0)=0$ oraz $y^{\prime}(x_0)=0$.</p><p>Z drugiej strony istnieje rozwiązanie trywialne $y^* \equiv 0$, które spełnia te same warunki początkowe $y^*(x_0)=0$, ${y^*}^{\prime}(x_0)=0$. Ponieważ współczynniki $p$ i $q$ są ciągłe, z <a href="#twierdzenie-o-istnieniu-i-jednoznacznosci-rozwiazania-zagadnienia-poczatkowego">twierdzenia o istnieniu i jednoznaczności zagadnienia początkowego</a> wynika jednoznaczność rozwiązania, a więc $y \equiv y^*$. Innymi słowy, na $I$</p>\[c_1y_1 + c_2y_2 \equiv 0\]<p>Ponieważ przynajmniej jedno z $c_1$, $c_2$ jest niezerowe, warunek ($\ref{eqn:linearly_independent}$) nie jest spełniony. Zatem $y_1$ i $y_2$ są liniowo zależne na $I$.</p><h4 id="ii">ii.</h4><p>Jeśli w pewnym punkcie $x_0 \in I$ zachodzi $W(x_0)=0$, to z <a href="#i-b">i.(b)</a> wynika, że $y_1$, $y_2$ są liniowo zależne na $I$, a wtedy z <a href="#i-a">i.(a)</a> dostajemy $W\equiv 0$. Zatem jeśli istnieje choć jeden punkt $x_1 \in I$ taki, że $W(x_1)\neq 0$, to $y_1$ i $y_2$ są liniowo niezależne. $\blacksquare$</p><h2 id="rozwiązanie-ogólne-obejmuje-wszystkie-rozwiązania">Rozwiązanie ogólne obejmuje wszystkie rozwiązania</h2><h3 id="istnienie-rozwiązania-ogólnego">Istnienie rozwiązania ogólnego</h3><blockquote class="prompt-info"><p>Jeśli $p(x)$ i $q(x)$ są ciągłe na otwartym przedziale $I$, to równanie ($\ref{eqn:homogeneous_linear_ode_with_var_coefficients}$) ma na $I$ rozwiązanie ogólne.</p></blockquote><h4 id="dowód-1">Dowód</h4><p>Na mocy <a href="#twierdzenie-o-istnieniu-i-jednoznacznosci-rozwiazania-zagadnienia-poczatkowego">twierdzenia o istnieniu i jednoznaczności zagadnienia początkowego</a>, równanie ($\ref{eqn:homogeneous_linear_ode_with_var_coefficients}$) ma na $I$ rozwiązanie $y_1(x)$ spełniające warunki początkowe</p>\[y_1(x_0) = 1, \qquad y_1^{\prime}(x_0) = 0\]<p>oraz rozwiązanie $y_2(x)$ spełniające na $I$ warunki</p>\[y_2(x_0) = 0, \qquad y_2^{\prime}(x_0) = 1\]<p>Wronskian tych dwóch rozwiązań w punkcie $x=x_0$ ma wartość niezerową:</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>Zatem na mocy kryterium <a href="#zaleznosc-i-niezaleznosc-liniowa-rozwiazan">zależności i niezależności liniowej rozwiązań</a> $y_1$ i $y_2$ są liniowo niezależne na $I$. W konsekwencji tworzą bazę rozwiązań równania ($\ref{eqn:homogeneous_linear_ode_with_var_coefficients}$) na $I$, a więc rozwiązanie ogólne postaci $y = c_1y_1 + c_2y_2$ (dla dowolnych stałych $c_1$, $c_2$) istnieje na $I$. $\blacksquare$</p><h3 id="brak-rozwiązań-osobliwych">Brak rozwiązań osobliwych</h3><blockquote class="prompt-info"><p>Jeśli równanie ($\ref{eqn:homogeneous_linear_ode_with_var_coefficients}$) ma na pewnym otwartym przedziale $I$ ciągłe współczynniki $p(x)$ i $q(x)$, to każde jego rozwiązanie $y=Y(x)$ na $I$ ma postać</p>\[Y(x) = C_1y_1(x) + C_2y_2(x) \label{eqn:particular_solution}\tag{13}\]<p>gdzie $y_1$, $y_2$ tworzą bazę rozwiązań równania ($\ref{eqn:homogeneous_linear_ode_with_var_coefficients}$) na $I$, a $C_1$, $C_2$ są pewnymi stałymi.<br /> To znaczy, równanie ($\ref{eqn:homogeneous_linear_ode_with_var_coefficients}$) nie ma <strong>rozwiązań osobliwych (singular solution)</strong>, których nie dałoby się uzyskać z rozwiązania ogólnego.</p></blockquote><h4 id="dowód-2">Dowód</h4><p>Niech $y=Y(x)$ będzie dowolnym rozwiązaniem równania ($\ref{eqn:homogeneous_linear_ode_with_var_coefficients}$) na $I$. Z <a href="#istnienie-rozwiazania-ogolnego">twierdzenia o istnieniu rozwiązania ogólnego</a> wiemy, że równanie ($\ref{eqn:homogeneous_linear_ode_with_var_coefficients}$) ma na $I$ rozwiązanie ogólne</p>\[y(x) = c_1y_1(x) + c_2y_2(x) \label{eqn:general_solution}\tag{14}\]<p>Musimy wykazać, że dla dowolnego $Y(x)$ istnieją stałe $c_1$, $c_2$ takie, że na $I$ zachodzi $y(x)=Y(x)$. Najpierw pokażmy, że dla dowolnie wybranego $x_0 \in I$ da się dobrać $c_1$, $c_2$ tak, aby $y(x_0)=Y(x_0)$ oraz $y^{\prime}(x_0)=Y^{\prime}(x_0)$. Z ($\ref{eqn:general_solution}$) wynika</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>Ponieważ $y_1$ i $y_2$ tworzą bazę, wyznacznik macierzy współczynników, tj. $W(y_1(x_0), y_2(x_0))\neq 0$, a więc układ ($\ref{eqn:vector_equation_2}$) można rozwiązać względem $c_1$ i $c_2$. Oznaczmy rozwiązanie przez $(c_1, c_2) = (C_1, C_2)$. Po podstawieniu do ($\ref{eqn:general_solution}$) dostajemy rozwiązanie szczególne</p>\[y^*(x) = C_1y_1(x) + C_2y_2(x).\]<p>Ponieważ $C_1$, $C_2$ spełniają ($\ref{eqn:vector_equation_2}$),</p>\[y^*(x_0) = Y(x_0), \qquad {y^*}^{\prime}(x_0) = Y^{\prime}(x_0)\]<p>Z jednoznaczności w <a href="#twierdzenie-o-istnieniu-i-jednoznacznosci-rozwiazania-zagadnienia-poczatkowego">twierdzeniu o istnieniu i jednoznaczności zagadnienia początkowego</a> wynika, że dla każdego $x \in I$ zachodzi $y^* \equiv Y$. $\blacksquare$</p>]]> </content> </entry> <entry><title xml:lang="pl">Równanie Eulera–Cauchy’ego</title><link href="https://www.yunseo.kim/pl/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-03-28T00:00:00+09:00</updated> <id>https://www.yunseo.kim/pl/posts/euler-cauchy-equation/</id> <author> <name>Yunseo Kim</name> </author> <category term="Mathematics" /> <category term="Differential Equation" /> <summary xml:lang="pl">W zależności od znaku wyróżnika równania pomocniczego omawiamy, jaką postać przyjmuje rozwiązanie ogólne równania Eulera–Cauchy’ego w każdym z trzech przypadków.</summary> <content type="html" xml:lang="pl"> <![CDATA[<p>W zależności od znaku wyróżnika równania pomocniczego omawiamy, jaką postać przyjmuje rozwiązanie ogólne równania Eulera–Cauchy’ego w każdym z trzech przypadków.</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>Równanie Eulera–Cauchy’ego: $x^2y^{\prime\prime} + axy^{\prime} + by = 0$<li><strong>Równanie pomocnicze (auxiliary equation)</strong>: $m^2 + (a-1)m + b = 0$<li>W zależności od znaku wyróżnika równania pomocniczego $(1-a)^2 - 4b$ postać rozwiązania ogólnego można podzielić na trzy przypadki, jak w tabeli</ul><table><thead><tr><th style="text-align: center">Przypadek<th style="text-align: center">Rozwiązania równania pomocniczego<th style="text-align: center">Baza rozwiązań równania Eulera–Cauchy’ego<th style="text-align: center">Rozwiązanie ogólne równania Eulera–Cauchy’ego<tbody><tr><td style="text-align: center">I<td style="text-align: center">dwa różne pierwiastki rzeczywiste<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">podwójny pierwiastek rzeczywisty<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">sprzężone pierwiastki zespolone<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="wymagania-wstępne">Wymagania wstępne</h2><ul><li><a href="/pl/posts/homogeneous-linear-odes-of-second-order/">Jednorodne liniowe równania różniczkowe zwyczajne drugiego rzędu (Homogeneous Linear ODEs of Second Order)</a><li><a href="/pl/posts/homogeneous-linear-odes-with-constant-coefficients/">Jednorodne liniowe RÓZ 2. rzędu o stałych współczynnikach</a><li>wzór Eulera</ul><h2 id="równanie-pomocnicze-auxiliary-equation">Równanie pomocnicze (auxiliary equation)</h2><p><strong>Równanie Eulera–Cauchy’ego (Euler–Cauchy equation)</strong> jest równaniem różniczkowym zwyczajnym postaci</p>\[x^2y^{\prime\prime} + axy^{\prime} + by = 0 \label{eqn:euler_cauchy_eqn}\tag{1}\]<p>z danymi stałymi $a$ i $b$ oraz niewiadomą funkcją $y(x)$.</p><p>Podstawiając do równania ($\ref{eqn:euler_cauchy_eqn}$)</p>\[y=x^m, \qquad y^{\prime}=mx^{m-1}, \qquad y^{\prime\prime}=m(m-1)x^{m-2}\]<p>otrzymujemy</p>\[x^2m(m-1)x^{m-2} + axmx^{m-1} + bx^m = 0,\]<p>czyli</p>\[[m(m-1) + am + b]x^m = 0.\]<p>Stąd dostajemy równanie pomocnicze</p>\[m^2 + (a-1)m + b = 0 \label{eqn:auxiliary_eqn}\tag{2}\]<p>a warunek konieczny i wystarczający na to, by $y=x^m$ było rozwiązaniem równania Eulera–Cauchy’ego ($\ref{eqn:euler_cauchy_eqn}$), jest taki, że $m$ jest pierwiastkiem równania pomocniczego ($\ref{eqn:auxiliary_eqn}$).</p><p>Rozwiązania równania kwadratowego ($\ref{eqn:auxiliary_eqn}$) wynoszą</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>i stąd dwie funkcje</p>\[y_1 = x^{m_1}, \quad y_2 = x^{m_2}\]<p>są rozwiązaniami równania ($\ref{eqn:euler_cauchy_eqn}$).</p><p>Podobnie jak w poście <a href="/pl/posts/homogeneous-linear-odes-with-constant-coefficients/">Jednorodne liniowe RÓZ 2. rzędu o stałych współczynnikach</a>, w zależności od znaku wyróżnika $(1-a)^2 - 4b$ równania pomocniczego ($\ref{eqn:auxiliary_eqn}$) można rozważyć trzy przypadki:</p><ul><li>$(1-a)^2 - 4b &gt; 0$: dwa różne pierwiastki rzeczywiste<li>$(1-a)^2 - 4b = 0$: podwójny pierwiastek rzeczywisty<li>$(1-a)^2 - 4b &lt; 0$: sprzężone pierwiastki zespolone</ul><h2 id="postać-rozwiązania-ogólnego-zależnie-od-znaku-wyróżnika-równania-pomocniczego">Postać rozwiązania ogólnego zależnie od znaku wyróżnika równania pomocniczego</h2><h3 id="i-dwa-różne-pierwiastki-rzeczywiste-m_1-i-m_2">I. Dwa różne pierwiastki rzeczywiste $m_1$ i $m_2$</h3><p>W tym przypadku na dowolnym przedziale baza rozwiązań równania ($\ref{eqn:euler_cauchy_eqn}$) ma postać</p>\[y_1 = x^{m_1}, \quad y_2 = x^{m_2}\]<p>a odpowiadające jej rozwiązanie ogólne to</p>\[y = c_1 x^{m_1} + c_2 x^{m_2} \label{eqn:general_sol_1}\tag{4}\]<p>.</p><h3 id="ii-podwójny-pierwiastek-rzeczywisty-m--cfrac1-a2">II. Podwójny pierwiastek rzeczywisty $m = \cfrac{1-a}{2}$</h3><p>Gdy $(1-a)^2 - 4b = 0$, czyli $b=\cfrac{(1-a)^2}{4}$, równanie kwadratowe ($\ref{eqn:auxiliary_eqn}$) ma tylko jedno rozwiązanie $m = m_1 = m_2 = \cfrac{1-a}{2}$. Zatem jedyne rozwiązanie postaci $y = x^m$, jakie można stąd uzyskać, to</p>\[y_1 = x^{(1-a)/2}\]<p>a równanie Eulera–Cauchy’ego ($\ref{eqn:euler_cauchy_eqn}$) przyjmuje postać</p>\[y^{\prime\prime} + \frac{a}{x}y^{\prime} + \frac{(1-a)^2}{4x^2}y = 0 \label{eqn:standard_form}\tag{5}\]<p>Teraz wyznaczmy inne, liniowo niezależne rozwiązanie $y_2$, korzystając z metody <a href="/pl/posts/homogeneous-linear-odes-of-second-order/#redukcja-rzedu-reduction-of-order">redukcji rzędu</a>.</p><p>Jeśli szukane drugie rozwiązanie zapiszemy jako $y_2=uy_1$, to otrzymujemy</p>\[u = \int U, \qquad U = \frac{1}{y_1^2}\exp\left(-\int \frac{a}{x}\ dx \right).\]<p>Ponieważ $\exp \left(-\int \cfrac{a}{x}\ dx \right) = \exp (-a\ln x) = \exp(\ln{x^{-a}}) = x^{-a}$, mamy</p>\[U = \frac{x^{-a}}{y_1^2} = \frac{x^{-a}}{x^{(1-a)}} = \frac{1}{x},\]<p>a po scałkowaniu dostajemy $u = \ln x$.</p><p>Zatem $y_2 = uy_1 = y_1 \ln x$, a ponieważ ich iloraz nie jest stały, $y_1$ i $y_2$ są liniowo niezależne. Rozwiązanie ogólne odpowiadające bazie $y_1$, $y_2$ wynosi</p>\[y = (c_1 + c_2 \ln x)x^m \label{eqn:general_sol_2}\tag{6}\]<p>.</p><h3 id="iii-sprzężone-pierwiastki-zespolone">III. Sprzężone pierwiastki zespolone</h3><p>W tym przypadku rozwiązania równania pomocniczego ($\ref{eqn:auxiliary_eqn}$) mają postać $m = \cfrac{1}{2}(1-a) \pm i\sqrt{b - \frac{1}{4}(1-a)^2}$. Odpowiadające im dwa zespolone rozwiązania równania ($\ref{eqn:euler_cauchy_eqn}$) można, korzystając z faktu $x=e^{\ln x}$, zapisać następująco:</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>Kładąc $t=\sqrt{b - \frac{1}{4}(1-a)^2}\ln x$ i stosując wzór Eulera $e^{it} = \cos{t} + i\sin{t}$, otrzymujemy</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>a stąd dwa rozwiązania rzeczywiste</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>Ponieważ ich iloraz $\cos\left(\sqrt{b - \frac{1}{4}(1-a)^2}\ln x \right)$ nie jest stały, powyższe dwa rozwiązania są liniowo niezależne, a więc na mocy <a href="/pl/posts/homogeneous-linear-odes-of-second-order/#zasada-superpozycji">zasady superpozycji</a> tworzą bazę rozwiązań równania Eulera–Cauchy’ego ($\ref{eqn:euler_cauchy_eqn}$). Stąd dostajemy następujące rzeczywiste rozwiązanie ogólne:</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>Należy jednak zauważyć, że przypadek sprzężonych pierwiastków zespolonych w równaniu Eulera–Cauchy’ego nie ma zwykle szczególnie dużego znaczenia praktycznego.</p><h2 id="sprowadzenie-do-jednorodnego-liniowego-róz-2-rzędu-o-stałych-współczynnikach">Sprowadzenie do jednorodnego liniowego RÓZ 2. rzędu o stałych współczynnikach</h2><p>Równanie Eulera–Cauchy’ego można przez podstawienie zmiennej sprowadzić do <a href="/pl/posts/homogeneous-linear-odes-with-constant-coefficients/">jednorodnego liniowego RÓZ 2. rzędu o stałych współczynnikach</a>.</p><p>Podstawiając $x = e^t$, dostajemy</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>więc równanie Eulera–Cauchy’ego ($\ref{eqn:euler_cauchy_eqn}$) przechodzi w następujące jednorodne liniowe równanie różniczkowe zwyczajne o stałych współczynnikach względem $t$:</p>\[y^{\prime\prime}(t) + (a-1)y^{\prime}(t) + by(t) = 0. \label{eqn:substituted}\tag{11}\]<p>Rozwiązując równanie ($\ref{eqn:substituted}$) metodami dla <a href="/pl/posts/homogeneous-linear-odes-with-constant-coefficients/">jednorodnych liniowych RÓZ 2. rzędu o stałych współczynnikach</a> względem $t$, a następnie przechodząc z powrotem do zmiennej $x$, używając $t = \ln{x}$, otrzymamy <a href="#postac-rozwiazania-ogolnego-zaleznie-od-znaku-wyroznika-rownania-pomocniczego">dokładnie ten sam wynik co wcześniej</a>.</p>]]> </content> </entry> <entry><title xml:lang="pl">Kryteria zbieżności/rozbieżności szeregu (Testing for Convergence or Divergence of a Series)</title><link href="https://www.yunseo.kim/pl/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-03-18T00:00:00+09:00</updated> <id>https://www.yunseo.kim/pl/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="pl">Przegląd najważniejszych metod badania zbieżności i rozbieżności szeregów.</summary> <content type="html" xml:lang="pl"> <![CDATA[<p>Przegląd najważniejszych metod badania zbieżności i rozbieżności szeregów.</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>Kryterium wyrazu ogólnego ($n$th-term test for divergence)</strong>: $\lim_{n\to\infty} a_n \neq 0 \Rightarrow \text{szereg }\sum a_n \text{ jest rozbieżny}$<li><strong>Zbieżność/rozbieżność szeregu geometrycznego</strong>: szereg geometryczny $\sum ar^{n-1}$ jest<ul><li>zbieżny, gdy $|r| &lt; 1$<li>rozbieżny, gdy $|r| \geq 1$</ul><li><strong>Zbieżność/rozbieżność $p$-szeregu</strong>: $p$-szereg $\sum \cfrac{1}{n^p}$ jest<ul><li>zbieżny, gdy $p&gt;1$<li>rozbieżny, gdy $p\leq 1$</ul><li><strong>Test porównawczy (Comparison Test)</strong>: gdy $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>Test porównawczy graniczny (Limit Comparison Test)</strong>: jeśli $\lim_{n\to\infty} \frac{a_n}{b_n} = c \text{ (}c\text{ jest skończoną liczbą dodatnią)}$, to oba szeregi $\sum a_n$ i $\sum b_n$ albo są zbieżne, albo oba są rozbieżne<li>Dla szeregu o wyrazach dodatnich $\sum a_n$ i dodatniej liczby $\epsilon &lt; 1$<ul><li>jeśli dla każdego $n$ zachodzi $\sqrt[n]{a_n}&lt; 1-\epsilon$, to szereg $\sum a_n$ jest zbieżny<li>jeśli dla każdego $n$ zachodzi $\sqrt[n]{a_n}&gt; 1+\epsilon$, to szereg $\sum a_n$ jest rozbieżny</ul><li><strong>Kryterium pierwiastkowe (Root Test)</strong>: dla szeregu o wyrazach dodatnich $\sum a_n$, gdy istnieje granica $\lim_{n\to\infty} \sqrt[n]{a_n} =: r$,<ul><li>jeśli $r&lt;1$, to szereg $\sum a_n$ jest zbieżny<li>jeśli $r&gt;1$, to szereg $\sum a_n$ jest rozbieżny</ul><li><strong>Kryterium ilorazowe (Ratio Test)</strong>: dla dodatniego ciągu $(a_n)$ i $0 &lt; r &lt; 1$<ul><li>jeśli dla każdego $n$ zachodzi $a_{n+1}/a_n \leq r$, to szereg $\sum a_n$ jest zbieżny<li>jeśli dla każdego $n$ zachodzi $a_{n+1}/a_n \geq 1$, to szereg $\sum a_n$ jest rozbieżny</ul><li>Jeśli dla dodatniego ciągu $(a_n)$ istnieje granica $\rho := \lim_{n\to\infty} \cfrac{a_{n+1}}{a_n}$, to<ul><li>gdy $\rho &lt; 1$, szereg $\sum a_n$ jest zbieżny<li>gdy $\rho &gt; 1$, szereg $\sum a_n$ jest rozbieżny</ul><li><strong>Kryterium całkowe (Integral Test)</strong>: gdy funkcja ciągła $f: \left[1,\infty \right) \rightarrow \mathbb{R}$ jest malejąca i zawsze $f(x)&gt;0$, warunkiem koniecznym i wystarczającym zbieżności szeregu $\sum f(n)$ jest zbieżność całki $\int_1^\infty f(x)\ dx := \lim_{b\to\infty} \int_1^b f(x)\ dx$<li><strong>Kryterium Leibniza dla szeregu naprzemiennego (Alternating Series Test)</strong>: jeśli spełnione są warunki:<ol><li>dla każdego $n$ wyrazy $a_n$ i $a_{n+1}$ mają różne znaki,<li>dla każdego $n$ zachodzi $|a_n| \geq |a_{n+1}|$,<li>$\lim_{n\to\infty} a_n = 0$,</ol><p>to szereg naprzemienny $\sum a_n$ jest zbieżny</p><li>Szereg zbieżny bezwzględnie jest zbieżny. Odwrotność nie zachodzi.</ul></blockquote><h2 id="wymagania-wstępne">Wymagania wstępne</h2><ul><li><a href="/pl/posts/sequences-and-series/">Ciągi i szeregi</a></ul><h2 id="wprowadzenie">Wprowadzenie</h2><p>Wcześniej, w tekście <a href="/pl/posts/sequences-and-series/#zbieznosc-i-rozbieznosc-szeregu">Ciągi i szeregi</a>, omówiliśmy definicje zbieżności i rozbieżności szeregu. W tym wpisie porządkuję różne metody, których można użyć do rozstrzygania o zbieżności/rozbieżności szeregów. Zwykle sprawdzenie zbieżności/rozbieżności jest dużo łatwiejsze niż dokładne wyznaczenie sumy szeregu.</p><h2 id="kryterium-wyrazu-ogólnego">Kryterium wyrazu ogólnego</h2><p>Dla szeregu $\sum a_n$ wyraz $a_n$ nazywa się <strong>wyrazem ogólnym</strong> tego szeregu.</p><p>Z poniższego twierdzenia wynika, że dla pewnych szeregów bardzo łatwo stwierdzić ich rozbieżność. Dlatego, oceniając zbieżność/rozbieżność danego szeregu, rozsądnie jest zacząć właśnie od tego sprawdzenia — pozwala to uniknąć marnowania czasu.</p><blockquote class="prompt-info"><p><strong>Kryterium wyrazu ogólnego ($n$th-term test for divergence)</strong><br /> Jeśli szereg $\sum a_n$ jest zbieżny, to</p>\[\lim_{n\to\infty} a_n=0\]<p>czyli</p>\[\lim_{n\to\infty} a_n \neq 0 \Rightarrow \text{szereg }\sum a_n \text{ jest rozbieżny}\]<p>.</p></blockquote><h3 id="dowód">Dowód</h3><p>Niech suma pewnego zbieżnego szeregu $\sum a_n$ wynosi $l$, a suma częściowa do $n$-tego wyrazu będzie równa</p>\[s_n := a_1 + a_2 + \cdots + a_n\]<p>Wtedy</p>\[\forall \epsilon &gt; 0,\, \exists N \in \mathbb{N}\ (n &gt; N \Rightarrow |s_n - l| &lt; \epsilon).\]<p>Zatem dla dostatecznie dużego ($&gt;N$) $n$ zachodzi</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>a więc, z definicji zbieżności ciągu,</p>\[\lim_{n\to\infty} |a_n| = 0. \quad \blacksquare\]<h3 id="uwaga">Uwaga</h3><p>Odwrotność tego twierdzenia na ogół nie jest prawdziwa. Klasycznym przykładem jest <strong>szereg harmoniczny (harmonic series)</strong>.</p><p>Szereg harmoniczny jest szeregiem otrzymanym z <strong>ciągu harmonicznego</strong>, tj. z ciągu, którego wyrazy są odwrotnościami wyrazów <strong>ciągu arytmetycznego</strong>. Reprezentatywny przykład to</p>\[H_n := 1 + \frac{1}{2} + \cdots + \frac{1}{n} \quad (n=1,2,3,\dots)\]<p>Można pokazać, że jest to szereg rozbieżny, np. tak:</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>Widzimy więc, że mimo iż szereg $H_n$ jest rozbieżny, jego wyraz ogólny $1/n$ dąży do $0$.</p><blockquote class="prompt-danger"><p>Jeśli $\lim_{n\to\infty} a_n \neq 0$, to szereg $\sum a_n$ na pewno jest rozbieżny, ale samo $\lim_{n\to\infty} a_n = 0$ nie gwarantuje zbieżności szeregu $\sum a_n$. W takim przypadku należy użyć innych metod oceny zbieżności/rozbieżności.</p></blockquote><h2 id="szereg-geometryczny">Szereg geometryczny</h2><p><strong>Szereg geometryczny (geometric series)</strong> otrzymany z ciągu geometrycznego o pierwszym wyrazie równym 1 i <strong>ilorazie</strong> $r$:</p>\[1 + r + r^2 + r^3 + \cdots \label{eqn:geometric_series}\tag{5}\]<p>jest <u>najważniejszym i najbardziej podstawowym szeregiem</u>. Z tożsamości</p>\[(1-r)(1+r+\cdots + r^{n-1}) = 1 - r^n\]<p>wynika</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>Ponieważ</p>\[\lim_{n\to\infty} r^n = 0 \quad \Leftrightarrow \quad |r| &lt; 1\]<p>to warunkiem koniecznym i wystarczającym zbieżności szeregu geometrycznego ($\ref{eqn:geometric_series}$) jest $|r| &lt; 1$.</p><blockquote class="prompt-info"><p><strong>Zbieżność/rozbieżność szeregu geometrycznego</strong><br /> Szereg geometryczny $\sum ar^{n-1}$ jest</p><ul><li>zbieżny, gdy $|r| &lt; 1$<li>rozbieżny, gdy $|r| \geq 1$</ul></blockquote><p>Stąd otrzymujemy</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="szereg-geometryczny-i-wartości-przybliżone">Szereg geometryczny i wartości przybliżone</h3><p>Tożsamość ($\ref{eqn:sum_of_geometric_series}$) jest użyteczna do znajdowania przybliżeń $\cfrac{1}{1-r}$, gdy $|r| &lt; 1$.</p><p>Podstawiając $r=-\epsilon$, $n=2$, otrzymujemy</p>\[\frac{1}{1+\epsilon} - (1 - \epsilon) = \frac{\epsilon^2}{1 + \epsilon}\]<p>Zatem dla $0 &lt; \epsilon &lt; 1$ zachodzi</p>\[0 &lt; \frac{1}{1 + \epsilon} - (1 - \epsilon) &lt; \epsilon^2\]<p>a więc</p>\[\frac{1}{1 + \epsilon} \approx (1 - \epsilon) \pm \epsilon^2 \qquad (0 &lt; \epsilon &lt; 1)\]<p>Wynika z tego, że dla dostatecznie małego dodatniego $\epsilon$ można przybliżać $\cfrac{1}{1 + \epsilon}$ przez $1 - \epsilon$.</p><h2 id="kryterium-p-szeregu-p-series-test">Kryterium $p$-szeregu ($p$-Series Test)</h2><p>Dla dodatniej liczby rzeczywistej $p$ szereg postaci</p>\[\sum_{n=1}^{\infty} \frac{1}{n^p}\]<p>nazywa się <strong>$p$-szeregiem</strong>.</p><blockquote class="prompt-info"><p><strong>Zbieżność/rozbieżność $p$-szeregu</strong><br /> $p$-szereg $\sum \cfrac{1}{n^p}$ jest</p><ul><li>zbieżny, gdy $p&gt;1$<li>rozbieżny, gdy $p\leq 1$</ul></blockquote><p>Dla $p=1$ otrzymujemy szereg harmoniczny, o którym już pokazaliśmy, że jest rozbieżny.<br /> Problem obliczenia wartości $p$-szeregu dla $p=2$, tj. $\sum \cfrac{1}{n^2}$, nazywa się „problemem bazylejskim” (Bazylea, Basel) — od nazwy miejsca związanego z rodziną Bernoullich, która odegrała znaczącą rolę w historii tego zagadnienia. Wiadomo, że odpowiedź wynosi $\cfrac{\pi^2}{6}$.</p><p>Co więcej, w ujęciu ogólniejszym, dla $p$-szeregu z $p&gt;1$ mówi się o <strong>funkcji dzeta (zeta function)</strong>. Jest to jedna z funkcji szczególnych wprowadzona przez Leonharda Eulera w <a href="https://en.wikipedia.org/wiki/Holocene_calendar">erze holoceńskiej</a> w roku 11740 HE, a później nazwana przez Riemanna:</p>\[\zeta(s) := \sum_{n=1}^{\infty} \frac{1}{n^s} \qquad (s&gt;1)\]<p>Temat ten nieco odbiega od głównego wątku, a poza tym — szczerze mówiąc — jestem studentem kierunku inżynierskiego, nie matematykiem, więc sam też nie znam go dobrze i nie będę go tu rozwijał. Warto jednak wspomnieć, że Euler pokazał możliwość przedstawienia funkcji dzeta jako nieskończonego iloczynu po liczbach pierwszych, znanego jako <strong>iloczyn Eulera (Euler Product)</strong>, a sama funkcja dzeta zajmuje dziś kluczowe miejsce w wielu działach analitycznej teorii liczb. Jednym z najsłynniejszych przykładów jest <strong>funkcja dzeta Riemanna (Riemann zeta function)</strong> (rozszerzenie dziedziny na liczby zespolone) oraz ważny nierozwiązany problem: <strong>hipoteza Riemanna (Riemann hypothesis)</strong>.</p><p>Wracając do tematu: do dowodu kryterium $p$-szeregu potrzebujemy omówionego niżej <a href="#test-porownawczy">testu porównawczego</a> i <a href="#test-calkowy">kryterium całkowego</a>. Jednak zbieżność/rozbieżność $p$-szeregu jest (obok szeregu geometrycznego) szczególnie użyteczna w samym <a href="#test-porownawczy">teście porównawczym</a>, dlatego celowo umieszczam ją wcześniej.</p><h3 id="dowód-1">Dowód</h3><h4 id="i-gdy-p1">i) Gdy $p&gt;1$</h4><p>Całka</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>jest zbieżna, więc na mocy <a href="#test-calkowy">kryterium całkowego</a> szereg $\sum \cfrac{1}{n^p}$ także jest zbieżny.</p><h4 id="ii-gdy-pleq-1">ii) Gdy $p\leq 1$</h4><p>W tym przypadku</p>\[0 \leq \frac{1}{n} \leq \frac{1}{n^p}\]<p>Ponieważ wiemy, że szereg harmoniczny $\sum \cfrac{1}{n}$ jest rozbieżny, to z <a href="#test-porownawczy">testu porównawczego</a> wynika, że $\sum \cfrac{1}{n^p}$ również jest rozbieżny.</p><h4 id="wniosek">Wniosek</h4><p>Z punktów i), ii) wynika, że $p$-szereg $\sum \cfrac{1}{n^p}$ jest zbieżny dla $p&gt;1$ i rozbieżny dla $p \leq 1$. $\blacksquare$</p><h2 id="test-porównawczy">Test porównawczy</h2><p>Przy rozstrzyganiu zbieżności/rozbieżności szeregu o wyrazach nieujemnych, czyli <strong>szeregu o wyrazach dodatnich (series of positive terms)</strong>, użyteczny jest <strong>test porównawczy (Comparison Test)</strong> autorstwa Jakoba Bernoulliego.</p><p>Ponieważ szereg o wyrazach dodatnich $\sum a_n$ ma sumy częściowe tworzące ciąg rosnący, to jeśli nie jest rozbieżny do nieskończoności ($\sum a_n = \infty$), musi być zbieżny. Dlatego w przypadku szeregu o wyrazach dodatnich zapis</p>\[\sum a_n &lt; \infty\]<p>oznacza po prostu, że jest on <u>zbieżny</u>.</p><blockquote class="prompt-info"><p><strong>Test porównawczy (Comparison Test)</strong><br /> Gdy $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>W szczególności, wśród szeregów o wyrazach dodatnich takich jak $\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}}$ itp. — czyli mających postać podobną do omawianych wcześniej szeregu geometrycznego $\sum ar^{n-1}$ lub $p$-szeregu $\sum \cfrac{1}{n^p}$ — warto aktywnie próbować właśnie testu porównawczego.</p><p>Wiele innych kryteriów zbieżności/rozbieżności można wyprowadzić z <strong>testu porównawczego</strong>; w tym sensie jest to najważniejsze z nich.</p><h3 id="test-porównawczy-graniczny">Test porównawczy graniczny</h3><p>Dla szeregów o wyrazach dodatnich $\sum a_n$ i $\sum b_n$ załóżmy, że w ilorazie $a_n/b_n$ dominujące składniki (dominant term) w liczniku i mianowniku się redukują, tak że $\lim_{n\to\infty} \cfrac{a_n}{b_n}=c \text{ (}c\text{ jest skończoną liczbą dodatnią)}$. Jeśli znamy zbieżność/rozbieżność szeregu $\sum b_n$, możemy zastosować poniższy <strong>test porównawczy graniczny (Limit Comparison Test)</strong>.</p><blockquote class="prompt-info"><p><strong>Test porównawczy graniczny (Limit Comparison Test)</strong><br /> Jeśli</p>\[\lim_{n\to\infty} \frac{a_n}{b_n} = c \text{ (}c\text{ jest skończoną liczbą dodatnią)}\]<p>to oba szeregi $\sum a_n$ i $\sum b_n$ albo są zbieżne, albo oba są rozbieżne. Tzn. $ \sum a_n &lt; \infty \ \Leftrightarrow \ \sum b_n &lt; \infty$.</p></blockquote><h2 id="kryterium-pierwiastkowe">Kryterium pierwiastkowe</h2><blockquote class="prompt-info"><p><strong>Twierdzenie</strong><br /> Dla szeregu o wyrazach dodatnich $\sum a_n$ oraz dodatniej liczby $\epsilon &lt; 1$</p><ul><li>jeśli dla każdego $n$ zachodzi $\sqrt[n]{a_n}&lt; 1-\epsilon$, to szereg $\sum a_n$ jest zbieżny<li>jeśli dla każdego $n$ zachodzi $\sqrt[n]{a_n}&gt; 1+\epsilon$, to szereg $\sum a_n$ jest rozbieżny</ul></blockquote><blockquote class="prompt-info"><p><strong>Wniosek: kryterium pierwiastkowe (Root Test)</strong><br /> Załóżmy, że dla szeregu o wyrazach dodatnich $\sum a_n$ istnieje granica</p>\[\lim_{n\to\infty} \sqrt[n]{a_n} =: r\]<p>Wtedy</p><ul><li>jeśli $r&lt;1$, to szereg $\sum a_n$ jest zbieżny<li>jeśli $r&gt;1$, to szereg $\sum a_n$ jest rozbieżny</ul></blockquote><blockquote class="prompt-warning"><p>W powyższym wniosku przypadek $r=1$ nie pozwala rozstrzygnąć zbieżności/rozbieżności, więc trzeba użyć innych metod.</p></blockquote><h2 id="kryterium-ilorazowe">Kryterium ilorazowe</h2><blockquote class="prompt-info"><p><strong>Kryterium ilorazowe (Ratio Test)</strong><br /> Dla dodatniego ciągu $(a_n)$ oraz $0 &lt; r &lt; 1$</p><ul><li>jeśli dla każdego $n$ zachodzi $a_{n+1}/a_n \leq r$, to szereg $\sum a_n$ jest zbieżny<li>jeśli dla każdego $n$ zachodzi $a_{n+1}/a_n \geq 1$, to szereg $\sum a_n$ jest rozbieżny</ul></blockquote><blockquote class="prompt-info"><p><strong>Wniosek</strong><br /> Załóżmy, że dla dodatniego ciągu $(a_n)$ istnieje granica $\rho := \lim_{n\to\infty} \cfrac{a_{n+1}}{a_n}$. Wtedy</p><ul><li>jeśli $\rho &lt; 1$, to szereg $\sum a_n$ jest zbieżny<li>jeśli $\rho &gt; 1$, to szereg $\sum a_n$ jest rozbieżny</ul></blockquote><h2 id="kryterium-całkowe">Kryterium całkowe</h2><p>Za pomocą całek można rozstrzygać zbieżność/rozbieżność szeregu utworzonego z dodatnich wyrazów ciągu malejącego.</p><blockquote class="prompt-info"><p><strong>Kryterium całkowe (Integral Test)</strong><br /> Gdy funkcja ciągła $f: \left[1,\infty \right) \rightarrow \mathbb{R}$ jest malejąca i zawsze $f(x)&gt;0$, to warunkiem koniecznym i wystarczającym zbieżności szeregu $\sum f(n)$ jest zbieżność całki</p>\[\int_1^\infty f(x)\ dx := \lim_{b\to\infty} \int_1^b f(x)\ dx\]<p>.</p></blockquote><h3 id="dowód-2">Dowód</h3><p>Ponieważ $f(x)$ jest funkcją ciągłą i malejącą oraz zawsze dodatnią, zachodzi nierówność</p>\[f(n+1) \leq \int_n^{n+1} f(x)\ dx \leq f(n)\]<p>Sumując stronami tę nierówność od $n=1$ do dowolnego wyrazu, otrzymujemy</p>\[f(2) + \cdots + f(n+1) \leq \int_1^{n+1} f(x)\ dx \leq f(1) + \cdots + f(n)\]<p>Teraz, stosując <a href="#test-porownawczy">test porównawczy</a>, dostajemy żądany wynik. $\blacksquare$</p><h2 id="szereg-naprzemienny">Szereg naprzemienny</h2><p>Szereg $\sum a_n$, w którym wyraz ogólny jest niezerowy, a znaki kolejnych wyrazów $a_n$ i $a_{n+1}$ są różne (tzn. wyrazy dodatnie i ujemne występują na przemian), nazywa się <strong>szeregiem naprzemiennym (alternating series)</strong>.</p><p>Dla szeregu naprzemiennego można z pożytkiem użyć następującego twierdzenia odkrytego przez niemieckiego matematyka Gottfrieda Wilhelma Leibniza.</p><blockquote class="prompt-info"><p><strong>Kryterium Leibniza dla szeregu naprzemiennego (Alternating Series Test)</strong><br /> Jeśli</p><ol><li>dla każdego $n$ wyrazy $a_n$ i $a_{n+1}$ mają różne znaki,<li>dla każdego $n$ zachodzi $|a_n| \geq |a_{n+1}|$,<li>$\lim_{n\to\infty} a_n = 0$,</ol><p>to szereg naprzemienny $\sum a_n$ jest zbieżny.</p></blockquote><h2 id="szeregi-zbieżne-bezwzględnie">Szeregi zbieżne bezwzględnie</h2><p>Dla szeregu $\sum a_n$ mówimy, że „szereg $\sum a_n$ jest <strong>zbieżny bezwzględnie</strong> (converge absolutely)”, jeśli szereg $\sum |a_n|$ jest zbieżny.</p><p>Wtedy zachodzi następujące twierdzenie.</p><blockquote class="prompt-info"><p><strong>Twierdzenie</strong><br /> Szereg zbieżny bezwzględnie jest zbieżny.</p></blockquote><blockquote class="prompt-warning"><p>Odwrotność powyższego twierdzenia nie zachodzi.<br /> Jeśli szereg jest zbieżny, ale nie jest zbieżny bezwzględnie, to mówimy, że jest „<strong>zbieżny warunkowo</strong> (converge conditionally)”.</p></blockquote><h3 id="dowód-3">Dowód</h3><p>Dla liczby rzeczywistej $a$ zdefiniujmy</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>Wtedy</p>\[a = a^+ - a^-, \qquad |a| = a^+ + a^-\]<p>Ponieważ $0 \leq a^\pm \leq |a|$, to na mocy <a href="#test-porownawczy">testu porównawczego</a>, jeżeli szereg $\sum |a_n|$ jest zbieżny, to oba szeregi $\sum a_n^+$ oraz $\sum a_n^-$ również są zbieżne. W konsekwencji, na mocy <a href="/pl/posts/sequences-and-series/#podstawowe-wlasnosci-zbieznych-szeregow">podstawowych własności szeregów zbieżnych</a>,</p>\[\sum a_n = \sum (a_n^+ - a_n^-) = \sum a_n^+ - \sum a_n^-\]<p>też jest zbieżny. $\blacksquare$</p>]]> </content> </entry> <entry><title xml:lang="pl">Ciągi i szeregi</title><link href="https://www.yunseo.kim/pl/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>2026-02-02T08:31:26+09:00</updated> <id>https://www.yunseo.kim/pl/posts/sequences-and-series/</id> <author> <name>Yunseo Kim</name> </author> <category term="Mathematics" /> <category term="Calculus" /> <summary xml:lang="pl">Omawiamy podstawowe pojęcia analizy matematycznej: definicje ciągów i szeregów, zbieżność i rozbieżność ciągów oraz szeregów, a także definicję liczby e jako podstawy logarytmu naturalnego.</summary> <content type="html" xml:lang="pl"> <![CDATA[<p>Omawiamy podstawowe pojęcia analizy matematycznej: definicje ciągów i szeregów, zbieżność i rozbieżność ciągów oraz szeregów, a także definicję liczby e jako podstawy logarytmu naturalnego.</p><em><p>* Mathematical equations and diagrams included in posts may not display properly when viewed with a feed reader.</p></em><h2 id="ciągi">Ciągi</h2><p>W analizie matematycznej <strong>ciąg (sequence)</strong> oznacza najczęściej ciąg nieskończony. Innymi słowy, ciąg to funkcja określona na zbiorze wszystkich <strong>liczb naturalnych (natural number)</strong></p>\[\mathbb{N} := \{1,2,3,\dots\}\]<p>.* Jeśli wartościami tej funkcji są liczby rzeczywiste (real number), mówimy o „ciągu rzeczywistym”, jeśli zespolone (complex number) — o „ciągu zespolonym”, jeśli punkty (point) — o „ciągu punktów”, jeśli macierze (matrix) — o „ciągu macierzy”, jeśli funkcje (function) — o „ciągu funkcji”, jeśli zbiory (set) — o „ciągu zbiorów” itd.; wszystkie te przypadki można jednak zbiorczo nazywać po prostu „ciągiem”.</p><p>Zwykle, dla <strong>ciała liczb rzeczywistych (the field of real numbers)</strong> $\mathbb{R}$, dla ciągu $\mathbf{a}: \mathbb{N} \to \mathbb{R}$ przyjmuje się oznaczenia</p>\[a_1 := \mathbf{a}(1), \quad a_2 := \mathbf{a}(2), \quad a_3 := \mathbf{a}(3)\]<p>itd., a sam ciąg zapisuje się jako</p>\[a_1,\, a_2,\, a_3,\, \dots\]<p>albo</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>itd.</p><blockquote class="prompt-info"><p>*W procesie definiowania ciągu, zamiast dziedziny będącej zbiorem wszystkich liczb naturalnych $\mathbb{N}$, można przyjąć zbiór liczb całkowitych nieujemnych</p>\[\mathbb{N}_0 := \{0\} \cup \mathbb{N} = \{0,1,2,\dots\}\]<p>albo</p>\[\{2,3,4,\dots \}\]<p>itd. Na przykład w teorii szeregów potęgowych bardziej naturalne jest, by dziedziną było $\mathbb{N}_0$.</p></blockquote><h2 id="zbieżność-i-rozbieżność">Zbieżność i rozbieżność</h2><p>Jeśli ciąg $(a_n)$ jest zbieżny do liczby rzeczywistej $l$, to piszemy</p>\[\lim_{n\to \infty} a_n = l\]<p>a liczbę $l$ nazywamy <strong>granicą</strong> ciągu $(a_n)$.</p><blockquote class="prompt-info"><p>Ścisła definicja z użyciem <strong>argumentu epsilon-delta (epsilon-delta argument)</strong> jest następująca.</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)\]<table><tbody><tr><td>To znaczy: dla dowolnie małego dodatniego $\epsilon$, jeśli zawsze istnieje taka liczba naturalna $N$, że dla $n&gt;N$ zachodzi $<td>a_n-l<td>&lt;\epsilon$, to dla dostatecznie dużych $n$ różnica między $a_n$ i $l$ staje się dowolnie mała; wówczas definiujemy, że ciąg $(a_n)$ jest zbieżny do liczby rzeczywistej $l$.</table></blockquote><p>Ciąg, który nie jest zbieżny, nazywamy <strong>rozbieżnym</strong>. <em>Zbieżność lub rozbieżność ciągu nie zmienia się, nawet jeśli zmienimy skończoną liczbę jego wyrazów.</em></p><p>Jeśli kolejne wyrazy ciągu $(a_n)$ rosną bez ograniczeń, to piszemy</p>\[\lim_{n\to \infty} a_n = \infty\]<p>i mówimy, że <em>ciąg jest rozbieżny do dodatniej nieskończoności</em>. Analogicznie, jeśli wyrazy ciągu $(a_n)$ maleją bez ograniczeń, to piszemy</p>\[\lim_{n\to \infty} a_n = -\infty\]<p>i mówimy, że <em>ciąg jest rozbieżny do ujemnej nieskończoności</em>.</p><h2 id="podstawowe-własności-ciągów-zbieżnych">Podstawowe własności ciągów zbieżnych</h2><p>Jeśli ciągi $(a_n)$ oraz $(b_n)$ są zbieżne (tj. mają granice), to ciągi $(a_n + b_n)$ oraz $(a_n \cdot b_n)$ również są zbieżne, przy czym</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>Ponadto dla dowolnej liczby rzeczywistej $t$ zachodzi</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>Własności te nazywa się <strong>podstawowymi własnościami ciągów zbieżnych</strong> albo <strong>podstawowymi własnościami granic</strong>.</p><h2 id="podstawa-logarytmu-naturalnego-e">Podstawa logarytmu naturalnego $e$</h2><p><strong>Podstawę logarytmu naturalnego</strong> definiuje się jako</p>\[e := \lim_{n\to \infty} \left(1+\frac{1}{n} \right)^n \approx 2.718\]<p>Jest to jedna z najważniejszych stałych w matematyce.</p><blockquote class="prompt-tip"><p>Co ciekawe, praktycznie tylko w Korei dość szeroko używa się określenia „stała naturalna”, jednak nie jest to termin standardowy. Oficjalnym terminem, umieszczonym w słowniku terminów matematycznych Koreańskiego Towarzystwa Matematycznego, jest <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">‘podstawa logarytmu naturalnego’</a>, natomiast określenia „stała naturalna” nie da się w tym słowniku znaleźć. Co więcej, nawet w standardowym słowniku Narodowego Instytutu Języka Koreańskiego nie występuje hasło „stała naturalna”; w <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">definicji słownikowej „logarytmu naturalnego”</a> wspomina się jedynie o „pewnej liczbie, którą często oznacza się przez e”.<br /> W krajach anglojęzycznych i w Japonii również nie funkcjonuje odpowiadający temu termin; po angielsku najczęściej mówi się „the base of the natural logarithm”, w skrócie „natural base”, albo „Euler’s number” czy po prostu „the number $e$”.<br /> Ponieważ jest to określenie o niejasnym pochodzeniu, nigdy nieuznane za termin oficjalny przez Koreańskie Towarzystwo Matematyczne i nieużywane nigdzie na świecie poza Koreą, nie ma żadnego powodu, by się go upierać; dlatego także tutaj będę odtąd używać określenia „podstawa logarytmu naturalnego” lub po prostu zapisywać $e$.</p></blockquote><h2 id="szeregi">Szeregi</h2><p>Dla ciągu</p>\[\mathbf{a} = (a_1, a_2, a_3, \dots)\]<p>definiujemy inny ciąg, złożony z sum częściowych tego ciągu:</p>\[a_1, \quad a_1 + a_2, \quad a_1 + a_2 + a_3, \quad \dots\]<p>Nazywa się go <strong>szeregiem</strong> ciągu $\mathbf{a}$. Szereg ciągu $(a_n)$ zapisuje się jako</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>itd.</p><h2 id="zbieżność-i-rozbieżność-szeregów">Zbieżność i rozbieżność szeregów</h2><p>Jeśli szereg otrzymany z ciągu $(a_n)$</p>\[a_1, \quad a_1 + a_2, \quad a_1 + a_2 + a_3, \quad \dots\]<p>jest zbieżny do pewnej liczby rzeczywistej $l$, to zapisujemy</p>\[\sum_{n=1}^{\infty} a_n = l\]<p>Wówczas granicę $l$ nazywa się <strong>sumą</strong> szeregu $\sum a_n$. Symbol</p>\[\sum a_n\]<p>w zależności od kontekstu może oznaczać zarówno <u>szereg</u>, jak i <u>sumę tego szeregu</u>.</p><p>Szereg, który nie jest zbieżny, nazywamy <strong>rozbieżnym</strong>.</p><h2 id="podstawowe-własności-szeregów-zbieżnych">Podstawowe własności szeregów zbieżnych</h2><p>Z <a href="#podstawowe-własności-ciągów-zbieżnych">podstawowych własności ciągów zbieżnych</a> wynikają następujące podstawowe własności szeregów zbieżnych. Dla liczby rzeczywistej $t$ oraz dwóch zbieżnych szeregów $\sum a_n$, $\sum b_n$ zachodzi</p>\[\sum(a_n + b_n) = \sum a_n + \sum b_n, \qquad \sum ta_n = t\sum a_n \tag{4}\]<p>Zbieżność szeregu nie zależy od zmiany skończonej liczby wyrazów. To znaczy: jeśli dla dwóch ciągów $(a_n)$ oraz $(b_n)$ zachodzi $a_n=b_n$ dla wszystkich $n$ z wyjątkiem skończonej ich liczby, to warunkiem koniecznym i wystarczającym zbieżności szeregu $\sum a_n$ jest zbieżność szeregu $\sum b_n$.</p>]]> </content> </entry> <entry><title xml:lang="pl">Prawa ruchu Newtona</title><link href="https://www.yunseo.kim/pl/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/pl/posts/newtons-laws-of-motion/</id> <author> <name>Yunseo Kim</name> </author> <category term="Physics" /> <category term="Classical Dynamics" /> <summary xml:lang="pl">Omówienie praw ruchu Newtona i znaczenia trzech zasad, definicji masy bezwładnej i grawitacyjnej oraz zasady równoważności, kluczowej nie tylko w mechanice klasycznej, ale też w ogólnej teorii względności.</summary> <content type="html" xml:lang="pl"> <![CDATA[<p>Omówienie praw ruchu Newtona i znaczenia trzech zasad, definicji masy bezwładnej i grawitacyjnej oraz zasady równoważności, kluczowej nie tylko w mechanice klasycznej, ale też w ogólnej teorii względności.</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>Prawa ruchu Newtona</strong></p><ol><li>O ile nie działa siła zewnętrzna, ciało pozostaje w spoczynku albo porusza się ruchem jednostajnym prostoliniowym.<li>Szybkość zmian pędu ciała w czasie jest równa sile działającej na to ciało.<ul><li>$\vec{F} = \cfrac{d\vec{p}}{dt} = \cfrac{d}{dt}(m\vec{v}) = m\vec{a}$</ul><li>Gdy dwa ciała oddziałują na siebie siłami, siły te mają jednakową wartość i przeciwny zwrot.<ul><li>$\vec{F_1} = -\vec{F_2}$</ul></ol></blockquote><blockquote class="prompt-info"><p><strong>Zasada równoważności (principle of equivalence)</strong></p><ul><li>masa bezwładna: masa, która — dla zadanej siły — wyznacza przyspieszenie ciała<li>masa grawitacyjna: masa, która wyznacza oddziaływanie grawitacyjne między danym ciałem a innym ciałem<li>obecnie wiadomo, że masa bezwładna i grawitacyjna są jednoznacznie zgodne z dokładnością rzędu $10^{-12}$<li>twierdzenie, że masa bezwładna i masa grawitacyjna są dokładnie równe, nazywa się <strong>zasadą równoważności</strong></ul></blockquote><h2 id="prawa-ruchu-newtona">Prawa ruchu Newtona</h2><p>Prawa ruchu Newtona to trzy zasady ogłoszone przez Isaaca Newtona (Issac Newton) w roku 11687 <a href="https://en.wikipedia.org/wiki/Holocene_calendar">kalendarza holoceńskiego</a> w dziele <em>Philosophiæ Naturalis Principia Mathematica</em> (matematyczne zasady filozofii przyrody, w skrócie „<em>Principia</em>”); stanowią one fundament mechaniki newtonowskiej (Newtonian mechanics).</p><ol><li>O ile nie działa siła zewnętrzna, ciało pozostaje w spoczynku albo porusza się ruchem jednostajnym prostoliniowym.<li>Szybkość zmian pędu ciała w czasie jest równa sile działającej na to ciało.<li>Gdy dwa ciała oddziałują na siebie siłami, siły te mają jednakową wartość i przeciwny zwrot.</ol><h3 id="pierwsze-prawo-newtona">Pierwsze prawo Newtona</h3><blockquote><p>I. O ile nie działa siła zewnętrzna, ciało pozostaje w spoczynku albo porusza się ruchem jednostajnym prostoliniowym.</p></blockquote><p>Ciało, na które nie działa siła zewnętrzna, nazywa się <strong>ciałem swobodnym (free body)</strong> albo <strong>cząstką swobodną (free particle)</strong>. Należy jednak zauważyć, że samo pierwsze prawo dostarcza jedynie jakościowego pojęcia siły.</p><h3 id="drugie-prawo-newtona">Drugie prawo Newtona</h3><blockquote><p>II. Szybkość zmian pędu ciała w czasie jest równa sile działającej na to ciało.</p></blockquote><p>Newton zdefiniował <strong>pęd (momentum)</strong> jako iloczyn masy i prędkości</p>\[\vec{p} \equiv m\vec{v} \label{eqn:momentum}\tag{1}\]<p>Z tego drugie prawo Newtona można zapisać następująco:</p>\[\vec{F} = \frac{d\vec{p}}{dt} = \frac{d}{dt}(m\vec{v}) = m\vec{a}. \label{eqn:2nd_law}\tag{2}\]<p>Pierwsze i drugie prawo Newtona — wbrew nazwie — są w istocie bliższe „definicji” siły niż „prawu”. Można też zauważyć, że definicja siły zależy od definicji „masy”.</p><h3 id="trzecie-prawo-newtona">Trzecie prawo Newtona</h3><blockquote><p>III. Gdy dwa ciała oddziałują na siebie siłami, siły te mają jednakową wartość i przeciwny zwrot.</p></blockquote><p>Jest to prawo fizyczne znane również jako „zasada akcji i reakcji” i ma zastosowanie w przypadku, gdy siła wywierana przez jedno ciało na drugie jest skierowana wzdłuż prostej łączącej dwa punkty przyłożenia. Tego typu siłę nazywa się <strong>siłą centralną (central force)</strong>; trzecie prawo zachodzi niezależnie od tego, czy siła centralna jest przyciągająca, czy odpychająca. Przykładami sił centralnych są grawitacja lub siła elektrostatyczna między dwoma spoczywającymi ciałami, a także siła sprężystości. Z kolei siły między poruszającymi się ładunkami, grawitacja między poruszającymi się ciałami itp., czyli siły zależne od prędkości dwóch oddziałujących obiektów, należą do sił niecentralnych — w takich przypadkach nie da się zastosować trzeciego prawa.</p><p>Uwzględniając omówioną wcześniej definicję masy, trzecie prawo można przeformułować następująco:</p><blockquote><p>III$^\prime$. Jeżeli dwa ciała tworzą idealny układ izolowany, to ich przyspieszenia mają przeciwne zwroty, a stosunek ich wartości bezwzględnych jest równy odwrotnemu stosunkowi mas tych ciał.</p></blockquote><p>Z trzeciego prawa Newtona wynika</p>\[\vec{F_1} = -\vec{F_2} \label{eqn:3rd_law}\tag{3}\]<p>a podstawiając do tego drugie prawo ($\ref{eqn:2nd_law}$), otrzymujemy</p>\[\frac{d\vec{p_1}}{dt} = -\frac{d\vec{p_2}}{dt} \label{eqn:3rd-1_law}\tag{4}\]<p>Stąd widać, że w izolowanym oddziaływaniu dwóch cząstek pęd jest zachowany.</p>\[\frac{d}{dt}(\vec{p_1}+\vec{p_2}) = 0 \label{eqn:conservation_of_momentum}\tag{5}\]<p>Ponadto w równaniu ($\ref{eqn:3rd-1_law}$) mamy $\vec{p}=m\vec{v}$, a masa $m$ jest stała, zatem</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>co prowadzi do</p>\[\frac{m_2}{m_1} = -\frac{a_1}{a_2}. \tag{7}\]<p>Trzecie prawo Newtona opisuje sytuację, w której dwa ciała tworzą układ izolowany, jednak w praktyce zrealizowanie tak idealnych warunków jest niemożliwe — dlatego twierdzenie Newtona w ramach trzeciego prawa można uznać za dość zuchwałe. Mimo że wniosek ten został wyprowadzony z ograniczonych obserwacji, dzięki głębokiej intuicji fizycznej Newtona mechanika newtonowska przez niemal 300 lat utrzymywała mocną pozycję i nie wykazywała błędów w weryfikacjach eksperymentalnych. Dopiero w latach 11900. stały się możliwe na tyle precyzyjne pomiary, by wykazać różnice między przewidywaniami teorii Newtona a rzeczywistością — co doprowadziło do narodzin teorii względności i mechaniki kwantowej.</p><h2 id="masa-bezwładna-i-masa-grawitacyjna">Masa bezwładna i masa grawitacyjna</h2><p>Jednym ze sposobów wyznaczania masy ciała jest użycie narzędzia takiego jak waga szalkowa i porównanie ciężaru badanego obiektu ze wzorcem. Metoda ta wykorzystuje fakt, że ciężar ciała w polu grawitacyjnym jest równy wartości siły grawitacji działającej na to ciało; w tym przypadku drugie prawo $\vec{F}=m\vec{a}$ przyjmuje postać $\vec{W}=m\vec{g}$. Metoda ta opiera się na podstawowym założeniu, że masa $m$ zdefiniowana w III$^\prime$ jest równa masie $m$ występującej w równaniu grawitacji. Te dwie masy nazywa się odpowiednio <strong>masą bezwładną (inertial mass)</strong> i <strong>masą grawitacyjną (gravitational mass)</strong> i definiuje następująco:</p><ul><li>masa bezwładna: masa, która — dla zadanej siły — wyznacza przyspieszenie ciała<li>masa grawitacyjna: masa, która wyznacza oddziaływanie grawitacyjne między danym ciałem a innym ciałem</ul><p>Choć jest to opowieść wymyślona później i niezwiązana bezpośrednio z Galileuszem (Galileo Galilei), eksperyment myślowy zrzucania ciał z wieży w Pizie był pierwszym, który sugerował, że masa bezwładna i masa grawitacyjna mogą być równe. Newton również próbował wykazać brak różnic między tymi masami, mierząc okresy wahadeł o tej samej długości, lecz o różnych masach ciężarków; jednak ze względu na prymitywną metodę i niewystarczającą dokładność nie udało mu się tego jednoznacznie potwierdzić.</p><p>Później, pod koniec lat 11800., węgierski fizyk Eötvös Loránd Ágoston przeprowadził eksperyment Eötvösa, aby precyzyjnie zmierzyć różnicę między masą bezwładną a grawitacyjną, i potwierdził ich równość z dość dużą dokładnością (błąd nie większy niż 1 na 20 milionów).</p><p>W jeszcze nowszych eksperymentach, przeprowadzanych m.in. przez Roberta Henry’ego Dicke’a (Robert Henry Dicke), dokładność tę dodatkowo poprawiono; obecnie wiadomo, że masa bezwładna i masa grawitacyjna są jednoznacznie zgodne w granicach błędu rzędu $10^{-12}$. Wynik ten ma ogromne znaczenie w ogólnej teorii względności, a twierdzenie, że masa bezwładna i masa grawitacyjna są dokładnie równe, nazywa się <strong>zasadą równoważności (principle of equivalence)</strong>.</p>]]> </content> </entry> <entry><title xml:lang="pl">Jednorodne liniowe równanie różniczkowe zwyczajne 2. rzędu o stałych współczynnikach</title><link href="https://www.yunseo.kim/pl/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-02-22T00:00:00+09:00</updated> <id>https://www.yunseo.kim/pl/posts/homogeneous-linear-odes-with-constant-coefficients/</id> <author> <name>Yunseo Kim</name> </author> <category term="Mathematics" /> <category term="Differential Equation" /> <summary xml:lang="pl">Zobacz, jak znak wyróżnika równania charakterystycznego wpływa na postać rozwiązania ogólnego jednorodnego liniowego RÓZ 2. rzędu o stałych współczynnikach.</summary> <content type="html" xml:lang="pl"> <![CDATA[<p>Zobacz, jak znak wyróżnika równania charakterystycznego wpływa na postać rozwiązania ogólnego jednorodnego liniowego RÓZ 2. rzędu o stałych współczynnikach.</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>Jednorodne liniowe RÓZ 2. rzędu o stałych współczynnikach: $y^{\prime\prime} + ay^{\prime} + by = 0$<li><strong>Równanie charakterystyczne (characteristic equation)</strong>: $\lambda^2 + a\lambda + b = 0$<li>W zależności od znaku wyróżnika równania charakterystycznego $a^2 - 4b$ postać rozwiązania ogólnego można podzielić na trzy przypadki (jak w tabeli)</ul><table><thead><tr><th style="text-align: center">Przypadek<th style="text-align: center">Rozwiązania równania charakterystycznego<th style="text-align: center">Baza rozwiązań RÓZ<th style="text-align: center">Rozwiązanie ogólne RÓZ<tbody><tr><td style="text-align: center">I<td style="text-align: center">Dwa różne pierwiastki rzeczywiste<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">Podwójny pierwiastek rzeczywisty<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">Sprzężone pierwiastki zespolone<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="wymagania-wstępne">Wymagania wstępne</h2><ul><li><a href="/pl/posts/Bernoulli-Equation/">Równanie Bernoulliego (Bernoulli Equation)</a><li><a href="/pl/posts/homogeneous-linear-odes-of-second-order/">Jednorodne liniowe równania różniczkowe zwyczajne drugiego rzędu (Homogeneous Linear ODEs of Second Order)</a><li>wzór Eulera</ul><h2 id="równanie-charakterystyczne-characteristic-equation">Równanie charakterystyczne (characteristic equation)</h2><p>Rozważmy jednorodne liniowe równanie różniczkowe zwyczajne 2. rzędu o stałych współczynnikach $a$ i $b$</p>\[y^{\prime\prime} + ay^{\prime} + by = 0 \label{eqn:ode_with_constant_coefficients}\tag{1}\]<p>Równania tej postaci mają istotne zastosowania m.in. w drganiach mechanicznych i elektrycznych.</p><p>Wcześniej, w poście <a href="/pl/posts/Bernoulli-Equation/">Równanie Bernoulliego (Bernoulli Equation)</a>, wyznaczyliśmy rozwiązanie ogólne równania logistycznego; wynika z tego, że rozwiązaniem jednorodnego liniowego RÓZ 1. rzędu o stałym współczynniku $k$</p>\[y^\prime + ky = 0\]<p>jest funkcja wykładnicza $y = ce^{-kx}$. (względem równania (4) z tamtego wpisu: przypadek $A=-k$, $B=0$)</p><p>Zatem dla równania o podobnej postaci, tj. ($\ref{eqn:ode_with_constant_coefficients}$), również możemy najpierw spróbować rozwiązania w postaci</p>\[y=e^{\lambda x}\label{eqn:general_sol}\tag{2}\]<blockquote class="prompt-info"><p>Oczywiście jest to jedynie hipoteza i nie ma żadnej gwarancji, że rozwiązanie ogólne rzeczywiście będzie miało taką postać. Jednak niezależnie od tego, wystarczy znaleźć dwa liniowo niezależne rozwiązania, a wtedy — jak widzieliśmy w poście <a href="/pl/posts/homogeneous-linear-odes-of-second-order/#baza-i-rozwiazanie-ogolne">Jednorodne liniowe RÓZ 2. rzędu</a> — na mocy <a href="/pl/posts/homogeneous-linear-odes-of-second-order/#zasada-superpozycji">zasady superpozycji</a> można otrzymać rozwiązanie ogólne.<br /> Jak za chwilę zobaczymy, zdarzają się też sytuacje, w których trzeba szukać <a href="#ii-podwojny-pierwiastek-rzeczywisty-lambda---cfraca2">rozwiązania innej postaci</a>.</p></blockquote><p>Podstawiając ($\ref{eqn:general_sol}$) oraz jego pochodne</p>\[y^\prime = \lambda e^{\lambda x}, \quad y^{\prime\prime} = \lambda^2 e^{\lambda x}\]<p>do równania ($\ref{eqn:ode_with_constant_coefficients}$), otrzymujemy</p>\[(\lambda^2 + a\lambda + b)e^{\lambda x} = 0\]<p>Zatem jeśli $\lambda$ jest rozwiązaniem <strong>równania charakterystycznego (characteristic equation)</strong></p>\[\lambda^2 + a\lambda + b = 0 \label{eqn:characteristic_eqn}\tag{3}\]<p>to funkcja wykładnicza ($\ref{eqn:general_sol}$) jest rozwiązaniem RÓZ ($\ref{eqn:ode_with_constant_coefficients}$). Rozwiązując równanie kwadratowe ($\ref{eqn:characteristic_eqn}$), dostajemy</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>a stąd dwie funkcje</p>\[y_1 = e^{\lambda_1 x}, \quad y_2 = e^{\lambda_2 x} \tag{5}\]<p>są rozwiązaniami równania ($\ref{eqn:ode_with_constant_coefficients}$).</p><blockquote class="prompt-tip"><p>Terminy <strong>równanie charakterystyczne (characteristic equation)</strong> oraz <strong>równanie pomocnicze (auxiliary equation)</strong> często są używane zamiennie, ale znaczą dokładnie to samo. Można stosować dowolne z tych określeń.</p></blockquote><p>Teraz, w zależności od znaku wyróżnika równania charakterystycznego ($\ref{eqn:characteristic_eqn}$), tj. $a^2 - 4b$, można rozważyć trzy przypadki:</p><ul><li>$a^2 - 4b &gt; 0$: dwa różne pierwiastki rzeczywiste<li>$a^2 - 4b = 0$: podwójny pierwiastek rzeczywisty<li>$a^2 - 4b &lt; 0$: sprzężone pierwiastki zespolone</ul><h2 id="postać-rozwiązania-ogólnego-w-zależności-od-znaku-wyróżnika-równania-charakterystycznego">Postać rozwiązania ogólnego w zależności od znaku wyróżnika równania charakterystycznego</h2><h3 id="i-dwa-różne-pierwiastki-rzeczywiste-lambda_1-i-lambda_2">I. Dwa różne pierwiastki rzeczywiste $\lambda_1$ i $\lambda_2$</h3><p>W tym przypadku na dowolnym przedziale bazą rozwiązań równania ($\ref{eqn:ode_with_constant_coefficients}$) jest</p>\[y_1 = e^{\lambda_1 x}, \quad y_2 = e^{\lambda_2 x}\]<p>a odpowiadające rozwiązanie ogólne ma postać</p>\[y = c_1 e^{\lambda_1 x} + c_2 e^{\lambda_2 x} \label{eqn:general_sol_1}\tag{6}\]<h3 id="ii-podwójny-pierwiastek-rzeczywisty-lambda---cfraca2">II. Podwójny pierwiastek rzeczywisty $\lambda = -\cfrac{a}{2}$</h3><p>Gdy $a^2 - 4b = 0$, równanie kwadratowe ($\ref{eqn:characteristic_eqn}$) ma tylko jedno rozwiązanie $\lambda = \lambda_1 = \lambda_2 = -\cfrac{a}{2}$, a więc rozwiązanie postaci $y = e^{\lambda x}$ jest tylko jedno:</p>\[y_1 = e^{-(a/2)x}\]<p>Aby otrzymać bazę, musimy znaleźć drugie rozwiązanie $y_2$ o innej postaci, liniowo niezależne od $y_1$.</p><p>W takiej sytuacji można wykorzystać poznaną wcześniej metodę <a href="/pl/posts/homogeneous-linear-odes-of-second-order/#redukcja-rzedu-reduction-of-order">redukcji rzędu</a>. Przyjmijmy, że szukane drugie rozwiązanie ma postać $y_2=uy_1$. Wówczas</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>Po podstawieniu do równania ($\ref{eqn:ode_with_constant_coefficients}$) otrzymujemy</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>Grupując wyrazy przy $u^{\prime\prime}$, $u^\prime$, $u$, dostajemy</p>\[y_1u^{\prime\prime} + (2y_1^\prime + ay_1)u^\prime + (y_1^{\prime\prime} + ay_1^\prime + by_1)u = 0\]<p>Ponieważ $y_1$ jest rozwiązaniem równania ($\ref{eqn:ode_with_constant_coefficients}$), wyrażenie w ostatnim nawiasie wynosi $0$, a ponadto</p>\[2y_1^\prime = -ae^{-ax/2} = -ay_1\]<p>więc także wyrażenie w pierwszym nawiasie jest równe $0$. Zostaje zatem tylko $u^{\prime\prime}y_1 = 0$, skąd $u^{\prime\prime}=0$. Całkując dwukrotnie, otrzymujemy $u = c_1x + c_2$. Ponieważ stałe całkowania $c_1$ i $c_2$ mogą być dowolne, możemy po prostu wybrać $c_1=1$, $c_2=0$ i przyjąć $u=x$. Wtedy $y_2 = uy_1 = xy_1$. Ponieważ $y_1$ i $y_2$ są liniowo niezależne, tworzą bazę. Zatem w przypadku, gdy równanie charakterystyczne ($\ref{eqn:characteristic_eqn}$) ma pierwiastek podwójny, bazą rozwiązań równania ($\ref{eqn:ode_with_constant_coefficients}$) na dowolnym przedziale jest</p>\[e^{-ax/2}, \quad xe^{-ax/2}\]<p>a odpowiadające rozwiązanie ogólne to</p>\[y = (c_1 + c_2x)e^{-ax/2} \label{eqn:general_sol_2}\tag{7}\]<h3 id="iii-sprzężone-pierwiastki-zespolone--cfrac12a--iomega-oraz--cfrac12a---iomega">III. Sprzężone pierwiastki zespolone $-\cfrac{1}{2}a + i\omega$ oraz $-\cfrac{1}{2}a - i\omega$</h3><p>W tym przypadku $a^2 - 4b &lt; 0$ i $\sqrt{-1} = i$, więc z ($\ref{eqn:lambdas}$) mamy</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>Zdefiniujmy teraz liczbę rzeczywistą $\omega$ przez $\sqrt{b-\cfrac{1}{4}a^2} = \omega$.</p><p>Przy takiej definicji $\omega$ rozwiązaniami równania charakterystycznego ($\ref{eqn:characteristic_eqn}$) są sprzężone pierwiastki zespolone $\lambda = -\cfrac{1}{2}a \pm i\omega$, a odpowiadające im dwa zespolone rozwiązania równania ($\ref{eqn:ode_with_constant_coefficients}$) to</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>Także w tym przypadku można jednak uzyskać bazę rozwiązań rzeczywistych (nieurojonych), jak poniżej.</p><p>Korzystając ze wzoru Eulera (Euler formula)</p>\[e^{it} = \cos t + i\sin t \label{eqn:euler_formula}\tag{8}\]<p>oraz z równania otrzymanego po podstawieniu $t \mapsto -t$,</p>\[e^{-it} = \cos t - i\sin t\]<p>a następnie dodając i odejmując stronami te dwa równania, dostajemy</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>Dla liczby zespolonej $z = r + it$ (z częścią rzeczywistą $r$ i urojoną $it$) funkcję wykładniczą zespoloną $e^z$ można zdefiniować za pomocą funkcji rzeczywistych $e^r$, $\cos t$ i $\sin t$ następująco:</p>\[e^z = e^{r + it} = e^r e^{it} = e^r(\cos t + i\sin t) \label{eqn:complex_exp}\tag{10}\]<p>Podstawiając $r=-\cfrac{1}{2}ax$, $t=\omega x$, możemy napisać</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>Z <a href="/pl/posts/homogeneous-linear-odes-of-second-order/#zasada-superpozycji">zasady superpozycji</a> wynika, że suma tych rozwiązań zespolonych oraz ich mnożenie przez stałą także daje rozwiązanie. Dodając stronami oba równania i mnożąc obie strony przez $\cfrac{1}{2}$, otrzymujemy pierwsze rozwiązanie rzeczywiste $y_1$:</p>\[y_1 = e^{-(a/2)x} \cos{\omega x}. \label{eqn:basis_1}\tag{11}\]<p>Analogicznie, odejmując stronami drugie równanie od pierwszego i mnożąc obie strony przez $\cfrac{1}{2i}$, dostajemy drugie rozwiązanie rzeczywiste $y_2$:</p>\[y_2 = e^{-(a/2)x} \sin{\omega x}. \label{eqn:basis_2}\tag{12}\]<p>Ponieważ $\cfrac{y_1}{y_2} = \cot{\omega x}$ nie jest stałe, funkcje $y_1$ i $y_2$ są liniowo niezależne na każdym przedziale, a więc tworzą bazę rozwiązań rzeczywistych równania ($\ref{eqn:ode_with_constant_coefficients}$). Stąd otrzymujemy rozwiązanie ogólne</p>\[y = e^{-ax/2}(A\cos{\omega x} + B\sin{\omega x}) \quad \text{(}A,\, B\text{ są dowolnymi stałymi)} \label{eqn:general_sol_3}\tag{13}\] ]]> </content> </entry> <entry><title xml:lang="pl">Jak dodać obsługę wielu języków w blogu Jekyll za pomocą Polyglot (3) – troubleshooting: błąd budowania motywu Chirpy i usterki wyszukiwania</title><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="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-02-05T00:00:00+09:00</updated> <id>https://www.yunseo.kim/pl/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="pl">Opisuję wdrożenie wielojęzyczności w blogu Jekyll opartym o jekyll-theme-chirpy z użyciem wtyczki Polyglot. To 3. część serii: identyfikacja przyczyn błędów przy integracji Polyglot z Chirpy oraz naprawa problemów z buildem i wyszukiwaniem.</summary> <content type="html" xml:lang="pl"> <![CDATA[<p>Opisuję wdrożenie wielojęzyczności w blogu Jekyll opartym o jekyll-theme-chirpy z użyciem wtyczki Polyglot. To 3. część serii: identyfikacja przyczyn błędów przy integracji Polyglot z Chirpy oraz naprawa problemów z buildem i wyszukiwaniem.</p><em><p>* Mathematical equations and diagrams included in posts may not display properly when viewed with a feed reader.</p></em><h2 id="przegląd">Przegląd</h2><p>Na początku lipca 12024, na tym blogu opartym o Jekyll i hostowanym przez GitHub Pages zastosowałem wtyczkę <a href="https://github.com/untra/polyglot">Polyglot</a>, aby dodać obsługę wielu języków. Ta seria dzieli się bugami, które wystąpiły podczas stosowania Polyglot w motywie Chirpy, procesem ich naprawy oraz sposobem przygotowania nagłówka HTML i <code class="language-plaintext filepath highlighter-rouge">sitemap.xml</code> z uwzględnieniem SEO. Seria składa się z 3 wpisów; czytany teraz tekst to trzecia część.</p><ul><li>Część 1: <a href="/pl/posts/how-to-support-multi-language-on-jekyll-blog-with-polyglot-1">Zastosowanie wtyczki Polyglot &amp; modyfikacje nagłówka html oraz sitemap</a><li>Część 2: <a href="/pl/posts/how-to-support-multi-language-on-jekyll-blog-with-polyglot-2">Implementacja przycisku wyboru języka &amp; lokalizacja języka layoutu</a><li>Część 3: Troubleshooting błędu budowania motywu Chirpy oraz błędów funkcji wyszukiwania (ten wpis)</ul><blockquote class="prompt-info"><p>Pierwotnie seria miała składać się z 2 części, jednak po późniejszych uzupełnieniach objętość znacznie wzrosła, więc przebudowałem ją do 3 części.</p></blockquote><h2 id="wymagania">Wymagania</h2><ul class="task-list"><li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked" />Zbudowany wynik (strony WWW) musi dać się serwować z rozdzieleniem na ścieżki per język (np. <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" />Aby możliwie zminimalizować dodatkowy czas i wysiłek związany z wielojęzycznością, podczas budowania język powinien być rozpoznawany automatycznie na podstawie lokalnej ścieżki pliku (np. <code class="language-plaintext filepath highlighter-rouge">/_posts/ko/</code>, <code class="language-plaintext filepath highlighter-rouge">/_posts/ja/</code>), bez ręcznego ustawiania tagów <code class="language-plaintext highlighter-rouge">lang</code> i <code class="language-plaintext highlighter-rouge">permalink</code> w YAML front matter każdego pliku źródłowego.<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked" />Nagłówek każdej strony powinien zawierać właściwy meta tag Content-Language, alternatywne tagi <code class="language-plaintext highlighter-rouge">hreflang</code> oraz link canonical, spełniając wytyczne Google SEO dla wyszukiwania wielojęzycznego.<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked" />Linki do stron dla każdej wersji językowej muszą być bez braków dostarczane przez <code class="language-plaintext filepath highlighter-rouge">sitemap.xml</code>, a sam <code class="language-plaintext filepath highlighter-rouge">sitemap.xml</code> ma istnieć tylko raz, w katalogu głównym (bez duplikatów).<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked" />Wszystkie funkcje dostarczane przez <a href="https://github.com/cotes2020/jekyll-theme-chirpy">motyw Chirpy</a> muszą działać poprawnie na stronach w każdym języku; a jeśli nie, trzeba je poprawić, aby działały.<ul class="task-list"><li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked" />Poprawne działanie funkcji „Recently Updated” i „Trending Tags”<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked" />Brak błędów podczas procesu build w GitHub Actions<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked" />Poprawne działanie wyszukiwarki postów w prawym górnym rogu bloga</ul></ul><h2 id="zanim-zaczniesz">Zanim zaczniesz</h2><p>Ten wpis jest kontynuacją <a href="/pl/posts/how-to-support-multi-language-on-jekyll-blog-with-polyglot-1">części 1</a> i <a href="/pl/posts/how-to-support-multi-language-on-jekyll-blog-with-polyglot-2">części 2</a>, więc jeśli jeszcze ich nie czytałeś(-aś), polecam najpierw nadrobić poprzednie.</p><h2 id="troubleshooting-relative_url_regex-target-of-repeat-operator-is-not-specified">Troubleshooting (‘relative_url_regex’: target of repeat operator is not specified)</h2><p>(+ aktualizacja 12025.10.08.) <a href="https://polyglot.untra.io/2025/09/20/polyglot.1.11.0/">Ten błąd został naprawiony w Polyglot 1.11</a>.</p><p>Po przejściu poprzednich kroków uruchomiłem testowy build poleceniem <code class="language-plaintext highlighter-rouge">bundle exec jekyll serve</code>, ale build zakończył się niepowodzeniem z błędem: <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>pominięto<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)

...(pominięto)
</span></pre></div></div><p>Sprawdziłem, czy ktoś zgłaszał podobny problem — i okazało się, że w repozytorium Polyglot istnieje już <a href="https://github.com/untra/polyglot/issues/204">dokładnie to samo zgłoszenie</a> oraz jest też rozwiązanie.</p><p>W pliku <code class="language-plaintext filepath highlighter-rouge">_config.yml</code> używanego na tym blogu <a href="https://github.com/cotes2020/jekyll-theme-chirpy/blob/master/_config.yml">motywu Chirpy</a> znajduje się m.in. taki fragment:</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>Źródło problemu polega na tym, że wyrażenia regularne w dwóch funkcjach w pliku <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> nie potrafią poprawnie przetworzyć wzorców globbing zawierających wildcardy, takich jak <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><div file="(polyglot root path)/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="/pl/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>Są dwa sposoby rozwiązania tego problemu.</p><h3 id="1-sfrokować-polyglot-i-poprawić-problematyczny-fragment">1. Sfrokować Polyglot i poprawić problematyczny fragment</h3><p>W momencie pisania tego tekstu (12024.11.) <a href="https://jekyllrb.com/docs/configuration/options/#global-configuration">oficjalna dokumentacja Jekyll</a> jasno mówi, że konfiguracja <code class="language-plaintext highlighter-rouge">exclude</code> wspiera wzorce globbing.</p><blockquote><p>“This configuration option supports Ruby’s File.fnmatch filename globbing patterns to match multiple entries to exclude.”</p></blockquote><p>To znaczy, że winny nie jest motyw Chirpy, tylko funkcje <code class="language-plaintext highlighter-rouge">relative_url_regex()</code> oraz <code class="language-plaintext highlighter-rouge">absolute_url_regex()</code> w Polyglot — więc fundamentalnym rozwiązaniem jest poprawienie ich tak, by nie generowały błędów.</p><p><del>W Polyglot ten bug nie był jeszcze naprawiony,</del> ale jak wspomniałem wyżej, <a href="https://polyglot.untra.io/2025/09/20/polyglot.1.11.0/">od Polyglot 1.11 problem jest rozwiązany</a>. Gdy problem występował, rozwiązanie polegało na skorzystaniu z <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">tego wpisu</a>(strona już nie istnieje) oraz</del> <a href="https://github.com/untra/polyglot/issues/204#issuecomment-2143270322">odpowiedzi w powyższym zgłoszeniu GitHub</a>: należało sforkować repozytorium Polyglot i zmienić problematyczny fragment tak, jak poniżej, a następnie używać tej wersji zamiast upstreamowego Polyglot.</p><div file="(polyglot root path)/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-w-pliku-konfiguracyjnym-_configyml-motywu-chirpy-zastąpić-wzorce-globbing-konkretnymi-nazwami-plików">2. W pliku konfiguracyjnym ‘_config.yml’ motywu Chirpy zastąpić wzorce globbing konkretnymi nazwami plików</h3><p>W praktyce najbardziej eleganckie i „kanoniczne” podejście to włączenie powyższej poprawki do głównego Polyglot. Jednak zanim to nastąpi, trzeba używać wersji sforkowanej — a wtedy za każdym razem, gdy upstream Polyglot podnosi wersję, robi się kłopotliwe śledzenie i wciąganie zmian, żeby niczego nie przegapić. Dlatego zastosowałem inną metodę.</p><p>Jeśli sprawdzić pliki w katalogu głównym repozytorium <a href="https://github.com/cotes2020/jekyll-theme-chirpy">motywu Chirpy</a>, to wzorcom <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> odpowiadają i tak tylko te 3 pliki:</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>Wystarczy więc usunąć wzorce globbing z sekcji <code class="language-plaintext highlighter-rouge">exclude</code> w <code class="language-plaintext filepath highlighter-rouge">_config.yml</code> i przepisać to tak jak poniżej — wtedy Polyglot jest w stanie to przetworzyć bez błędów.</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"># Zmodyfikowane w oparciu o issue https://github.com/untra/polyglot/issues/204</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="poprawka-funkcji-wyszukiwania">Poprawka funkcji wyszukiwania</h2><p>Po wykonaniu powyższych kroków niemal wszystkie funkcje witryny działały satysfakcjonująco i zgodnie z zamierzeniem. Jednak później odkryłem problem: pasek wyszukiwania w prawym górnym rogu stron z motywem Chirpy nie indeksował stron w językach innych niż <code class="language-plaintext highlighter-rouge">site.default_lang</code> (w moim przypadku angielski). Co więcej, nawet jeśli wyszukiwać na stronach w innym języku, wyniki zwracały linki do stron angielskich.</p><p>Aby zrozumieć przyczynę, zobaczmy, które pliki biorą udział w wyszukiwaniu i gdzie powstaje problem.</p><h3 id="_layoutsdefaulthtml">‘_layouts/default.html’</h3><p>Gdy zajrzeć do pliku <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>, który buduje szkielet wszystkich stron bloga, widać, że wewnątrz elementu <code class="language-plaintext highlighter-rouge">&lt;body&gt;</code> ładowane są treści <code class="language-plaintext filepath highlighter-rouge">search-results.html</code> oraz <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;
        
        (...pominięto...)

        <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;

    (...pominięto...)

    <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>Plik <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> konfiguruje kontener <code class="language-plaintext highlighter-rouge">search-results</code>, w którym przechowywane są wyniki wyszukiwania dla wpisanego słowa kluczowego.</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;!-- The Search results --&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>Plik <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> to kluczowa część implementacji wyszukiwania opartej o bibliotekę <a href="https://github.com/christian-fei/Simple-Jekyll-Search">Simple-Jekyll-Search</a>. Widać tu, że JavaScript po stronie przeglądarki (Client-Side) przeszukuje plik indeksu <code class="language-plaintext filepath highlighter-rouge">search.json</code> (poniżej w sekcji <a href="#assetsjsdatasearchjson"> <code class="language-plaintext filepath highlighter-rouge">/assets/js/data/search.json</code></a>) i zwraca dopasowane posty jako elementy <code class="language-plaintext highlighter-rouge">&lt;article&gt;</code>.</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="nl">Note</span><span class="p">:</span> <span class="nx">dependent</span> <span class="nx">library</span> <span class="nx">will</span> <span class="nx">be</span> <span class="nx">loaded</span> <span class="k">in</span> <span class="s2">`js-selector.html`</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>To plik JSON tworzony z użyciem składni Liquid Jekyll, definiujący: tytuł, URL, kategorie i tagi, datę, pierwsze 200 znaków jako snippet oraz pełną treść dla wszystkich postów w serwisie.</p><h3 id="jak-działa-wyszukiwanie-i-gdzie-powstaje-problem">Jak działa wyszukiwanie i gdzie powstaje problem</h3><p>Podsumowując: przy hostowaniu motywu Chirpy na GitHub Pages wyszukiwanie działa w takim procesie.</p><pre><code class="language-mermaid">stateDiagram
  state "Changes" as CH
  state "Build start" as BLD
  state "Create search.json" as IDX
  state "Static Website" as DEP
  state "In Test" as TST
  state "Search Loader" as SCH
  state "Results" as R
    
  [*] --&gt; CH: Make Changes
  CH --&gt; BLD: Commit &amp; Push origin
  BLD --&gt; IDX: jekyll build
  IDX --&gt; TST: Build Complete
  TST --&gt; CH: Error Detected
  TST --&gt; DEP: Deploy
  DEP --&gt; SCH: Search Input
  SCH --&gt; R: Return Results
  R --&gt; [*]
</code></pre><p>W tym miejscu potwierdziłem, że <code class="language-plaintext filepath highlighter-rouge">search.json</code> jest generowany przez Polyglot osobno dla każdego języka, np.:</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>Zatem winny jest element „Search Loader”. Problem polega na tym, że <code class="language-plaintext filepath highlighter-rouge">_includes/search-loader.html</code> statycznie ładuje wyłącznie angielski plik indeksu (<code class="language-plaintext filepath highlighter-rouge">/assets/js/data/search.json</code>), niezależnie od języka aktualnie oglądanej strony — przez co strony w innych językach nie są przeszukiwane.</p><blockquote class="prompt-warning"><ul><li>Natomiast w przypadku plików JSON (w odróżnieniu od Markdown/HTML) wrapper Polyglot dla zmiennych Jekyll takich jak <code class="language-plaintext highlighter-rouge">post.title</code>, <code class="language-plaintext highlighter-rouge">post.content</code> działa, ale wygląda na to, że funkcja <a href="https://github.com/untra/polyglot?tab=readme-ov-file#relativized-local-urls">Relativized Local Urls</a> nie działa.<li>Podobnie, w testach potwierdziłem, że w szablonie JSON nie da się odwołać do tagów Liquid dostarczanych przez Polyglot ponad standardowe zmienne Jekyll: <a href="https://github.com/untra/polyglot?tab=readme-ov-file#features"><code class="language-plaintext highlighter-rouge">{{ site.default_lang }}</code>, <code class="language-plaintext highlighter-rouge">{{ site.active_lang }}</code></a>.</ul><p>W efekcie wartości <code class="language-plaintext highlighter-rouge">title</code>, <code class="language-plaintext highlighter-rouge">snippet</code>, <code class="language-plaintext highlighter-rouge">content</code> są generowane inaczej per język, ale <code class="language-plaintext highlighter-rouge">url</code> zwraca bazową ścieżkę bez uwzględnienia języka — i trzeba to odpowiednio obsłużyć w „Search Loader”.</p></blockquote><h3 id="rozwiązanie">Rozwiązanie</h3><p>Aby to naprawić, wystarczy zmienić <code class="language-plaintext filepath highlighter-rouge">_includes/search-loader.html</code> tak jak poniżej.</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 %}

(...pominięto...)

&lt;script&gt;
  {% comment %} Note: dependent library will be loaded in `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 }}',

(...pominięto)
</pre></div></div><ul><li>Jeśli <code class="language-plaintext highlighter-rouge">site.active_lang</code> (język bieżącej strony) różni się od <code class="language-plaintext highlighter-rouge">site.default_lang</code> (domyślny język witryny), zmodyfikowałem część Liquid w <code class="language-plaintext highlighter-rouge">{% capture result_elem %}</code>, aby do URL posta wczytanego z JSON doklejać prefix <code class="language-plaintext highlighter-rouge">"/{{ site.active_lang }}"</code>.<li>Analogicznie, w części <code class="language-plaintext highlighter-rouge">&lt;script&gt;</code> build porównuje język bieżącej strony z domyślnym językiem witryny: jeśli są równe, używany jest domyślny indeks (<code class="language-plaintext filepath highlighter-rouge">/assets/js/data/search.json</code>); jeśli nie — ustawiany jest <code class="language-plaintext highlighter-rouge">search_path</code> na ścieżkę dla danego języka (np. <code class="language-plaintext filepath highlighter-rouge">/ko/assets/js/data/search.json</code>).</ul><p>Po tej zmianie i ponownym zbudowaniu witryny potwierdziłem, że wyniki wyszukiwania wyświetlają się poprawnie dla każdego języka.</p><blockquote class="prompt-tip"><p><code class="language-plaintext highlighter-rouge">{url}</code> nie jest poprawnym URL na etapie builda — to miejsce, w które JS podczas wyszukiwania wstawi URL odczytany z pliku JSON. Polyglot nie traktuje tego więc jako obiektu do lokalizacji, dlatego trzeba to obsłużyć ręcznie. Problem w tym, że szablon <code class="language-plaintext highlighter-rouge">"/{{ site.active_lang }}{url}"</code> na etapie builda jest rozpoznawany jako względny URL; mimo że lokalizacja została już wykonana, Polyglot o tym „nie wie” i próbuje wykonać lokalizację ponownie (np. <code class="language-plaintext filepath highlighter-rouge">"/ko/ko/posts/example-post"</code>). Żeby temu zapobiec, jawnie użyłem taga <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>
