<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl">
	<id>http://brain.fuw.edu.pl/edu/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=SuperAdmin</id>
	<title>Brain-wiki - Wkład użytkownika [pl]</title>
	<link rel="self" type="application/atom+xml" href="http://brain.fuw.edu.pl/edu/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=SuperAdmin"/>
	<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php/Specjalna:Wk%C5%82ad/SuperAdmin"/>
	<updated>2026-04-20T08:34:01Z</updated>
	<subtitle>Wkład użytkownika</subtitle>
	<generator>MediaWiki 1.34.1</generator>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG&amp;diff=11632</id>
		<title>Laboratorium EEG</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG&amp;diff=11632"/>
		<updated>2026-03-03T13:07:10Z</updated>

		<summary type="html">&lt;p&gt;SuperAdmin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Pracownie specjalistyczne]]&lt;br /&gt;
__NOTOC__&lt;br /&gt;
==Informacje bieżące==&lt;br /&gt;
&amp;lt;!--:[[Laboratorium_EEG/Info_1| Grupa 1: MK+JR]]&lt;br /&gt;
:[[Laboratorium_EEG/Info_2| Grupa 2: JZ+AG]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zajęcia są prowadzone przez Macieja Kamińskiego i Jarosława Żygierewicza&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zajęcia odbywają się w sali 4.59:&lt;br /&gt;
* we wtorki w godzinach 11:15 - 13:45&lt;br /&gt;
* w czwartki w godzinach 13:15 - 15:45&lt;br /&gt;
&lt;br /&gt;
== Warunki zaliczenia ==&lt;br /&gt;
Ćwiczenia zostaną zaliczone osobom, które spełnią dwa niezwykle proste warunki:&lt;br /&gt;
* Posiadanie maksymalnie dwóch nieusprawiedliwionych nieobecności na ćwiczeniach,&lt;br /&gt;
* Posiadanie przynajmniej połowy sumy punktów ze wszystkich prezentacji,&lt;br /&gt;
* ... ''(do ustalenia).''&lt;br /&gt;
&lt;br /&gt;
=== Elementy oceniane w prezentacji:===&lt;br /&gt;
* poprawność zastosowanego algorytmu -&amp;gt; należy przygotować opis ideowy algorytmu w punktach/na schemacie &lt;br /&gt;
* prezentacja wykonanych testów pokazujacych, że algorytm działa poprawnie &lt;br /&gt;
* jakość kodu (czytelność, komentarze, struktura, czy ktoś komu mielibyśmy przekazać ten kod ma sznsę go zrozumieć)&lt;br /&gt;
* wykazanie się zrozumieniem otrzymanych wyników.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--* Posiadanie przynajmniej połowy sumy punktów ze wszystkich kartkówek&lt;br /&gt;
* Osobom spełniającym powyższe warunki zaproponowana zostanie pozytywna ocena końcowa z Laboratorium.&lt;br /&gt;
* Osoby nie mające tego szczęścia, otrzymają ocenę negatywną.&lt;br /&gt;
&lt;br /&gt;
* Możliwe będzie poprawienie zaproponowanej oceny na wyższą poprzez zrealizowanie dodatkowego projektu. Jego cel zostanie ustalony indywidualnie.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Materiały dydaktyczne==&lt;br /&gt;
Zestaw przykładowych materiałów dotyczących analizy danych w Matlabie towarzyszący książce autorstwa Katarzyny J. Blinowskiej i Jarosława Żygierewicza zatytułowanej &amp;quot;Practical Biomedical Signal Analysis Using MATLAB® Second Edition]&amp;quot; ([https://books.google.pl/books?id=hSpHEAAAQBAJ&amp;amp;pg=PA1&amp;amp;hl=pl&amp;amp;source=gbs_toc_r&amp;amp;cad=3#v=onepage&amp;amp;q&amp;amp;f=false spis treści]):&lt;br /&gt;
 &lt;br /&gt;
https://static.routledge.com/9781138364417/matlab.zip&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Wprowadzenie do przetwarzania sygnałów online===&lt;br /&gt;
* [[Laboratorium_EEG/Wprowadzenie_do_syg_online|ONLINE]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 10.03.2021 Pomiar EEG spoczynkowe, artefakty i alfa +P300 ===&lt;br /&gt;
Proszę powtórzyć informacje z : &lt;br /&gt;
* [[Pracownia_Sygnałów_Biologicznych/Zajecia_9]]. W szczególności proszę zwrócić uwagę na:&lt;br /&gt;
** porcedurę zakładania czepka&lt;br /&gt;
** przygotowanie skóry do pomiaru&lt;br /&gt;
** kolejność mocowania elektrod w czepku&lt;br /&gt;
* [[Pracownia_EEG/EEG_spoczynkowe]]&lt;br /&gt;
** Jakie wyróżniamy rytmy i na jakiej podstawie?&lt;br /&gt;
** Jakie są główne źródła artefaktów?&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* [[Pracownia_EEG/Potencjały_wywołane#Zadanie_3:_rejestracja_i_analiza_potencja.C5.82u_P3]]&lt;br /&gt;
** Co to jest potencjał P300&lt;br /&gt;
Lektura uzupełniająca o P300:&lt;br /&gt;
Linden, D. E. J. (2005). The P300: Where in the Brain Is It Produced and What Does It Tell Us? The Neuroscientist, 11(6), 563–576. https://doi.org/10.1177/1073858405280524&lt;br /&gt;
(Z IP wydziałowego można pobrać ten art. w pdf)&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Wprowadzenie do Matlaba===&lt;br /&gt;
* [[Laboratorium_EEG/Wprowadzenie_do_Matlaba|Wprowadzenie do Matlaba]]&amp;lt;br&amp;gt;&lt;br /&gt;
* [[Laboratorium_EEG/Konwerter_plików_Svarog–Matlab|Wczytywanie do Matlaba plików binarnych z programu Svarog]]&lt;br /&gt;
===EEGLAB===&lt;br /&gt;
* [[Laboratorium_EEG/EEGLAB|Pakiet EEGLAB]]&lt;br /&gt;
&lt;br /&gt;
===Metody czas-częstość===&lt;br /&gt;
&amp;lt;!--* [[Wstęp do analizy obrazu]]--&amp;gt;&lt;br /&gt;
Motywacja - główne paradygmaty BCI:&lt;br /&gt;
&lt;br /&gt;
https://drive.google.com/file/d/1hMbkzn07pVDfeJ4fk9JPHhZaIckz-PVL/view?usp=share_link&lt;br /&gt;
&lt;br /&gt;
Wstęp o analizie ERD/ERS:&lt;br /&gt;
&lt;br /&gt;
https://drive.google.com/file/d/1hP5VglC8jYnoGHJ2j06m1AOMe8ItwCkb/view?usp=share_link&lt;br /&gt;
&lt;br /&gt;
* [[Laboratorium_EEG/Analiza czas-częstość w matlabie|Analiza czas-częstość w matlabie]]&lt;br /&gt;
* [[Laboratorium_EEG/Analiza zjawiska ERD/ERS|Analiza zjawiska ERD/ERS]]&lt;br /&gt;
&lt;br /&gt;
===Filtry przestrzenne===&lt;br /&gt;
* [[Laboratorium_EEG/CSP|Filtry przestrzenne]]:  metody ślepej separacji źródeł&lt;br /&gt;
&lt;br /&gt;
===Zależności przyczynowe===&lt;br /&gt;
* [[Laboratorium_EEG/AR_1|Wielokanałowa analiza parametryczna/Zależności przyczynowe]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Słuchowe potencjały stanu ustalonego: zmiany mocy pasmowej i metody ślepej separacji źródeł===&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MP===&lt;br /&gt;
* [[Laboratorium_EEG/MMP|MMP]]&lt;/div&gt;</summary>
		<author><name>SuperAdmin</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG&amp;diff=11631</id>
		<title>Laboratorium EEG</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG&amp;diff=11631"/>
		<updated>2026-03-03T13:04:45Z</updated>

		<summary type="html">&lt;p&gt;SuperAdmin: /* Informacje bieżące */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Pracownie specjalistyczne]]&lt;br /&gt;
__NOTOC__&lt;br /&gt;
==Informacje bieżące==&lt;br /&gt;
&amp;lt;!--:[[Laboratorium_EEG/Info_1| Grupa 1: MK+JR]]&lt;br /&gt;
:[[Laboratorium_EEG/Info_2| Grupa 2: JZ+AG]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zajęcia są prowadzone przez Macieja Kamińskiego i Jarosława Żygierewicza&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zajęcia odbywają się w sali 4.59:&lt;br /&gt;
* we wtorki w godzinach 11:15 - 13:45&lt;br /&gt;
* w czwartki w godzinach 13:15 - 15:45&lt;br /&gt;
&lt;br /&gt;
== Warunki zaliczenia ==&lt;br /&gt;
Ćwiczenia zostaną zaliczone osobom, które spełnią dwa niezwykle proste warunki:&lt;br /&gt;
* Posiadanie maksymalnie dwóch nieusprawiedliwionych nieobecności na ćwiczeniach,&lt;br /&gt;
* Posiadanie przynajmniej połowy sumy punktów ze wszystkich prezentacji,&lt;br /&gt;
* ... ''(do ustalenia).''&lt;br /&gt;
&lt;br /&gt;
=== Elementy oceniane w prezentacji:===&lt;br /&gt;
* poprawność zastosowanego algorytmu -&amp;gt; należy przygotować opis ideowy algorytmu w punktach/na schemacie &lt;br /&gt;
* prezentacja wykonanych testów pokazujacych, że algorytm działa poprawnie &lt;br /&gt;
* jakość kodu (czytelność, komentarze, struktura, czy ktoś komu mielibyśmy przekazać ten kod ma sznsę go zrozumieć)&lt;br /&gt;
* wykazanie się zrozumieniem otrzymanych wyników.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--* Posiadanie przynajmniej połowy sumy punktów ze wszystkich kartkówek&lt;br /&gt;
* Osobom spełniającym powyższe warunki zaproponowana zostanie pozytywna ocena końcowa z Laboratorium.&lt;br /&gt;
* Osoby nie mające tego szczęścia, otrzymają ocenę negatywną.&lt;br /&gt;
&lt;br /&gt;
* Możliwe będzie poprawienie zaproponowanej oceny na wyższą poprzez zrealizowanie dodatkowego projektu. Jego cel zostanie ustalony indywidualnie.--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Materiały dydaktyczne==&lt;br /&gt;
Zestaw przykładowych materiałów dotyczących analizy danych w Matlabie towarzyszący książce autorstwa Katarzyny J. Blinowskiej i Jarosława Żygierewicza zatytułowanej &amp;quot;Practical Biomedical Signal Analysis Using MATLAB® Second Edition]&amp;quot; ([https://books.google.pl/books?id=hSpHEAAAQBAJ&amp;amp;pg=PA1&amp;amp;hl=pl&amp;amp;source=gbs_toc_r&amp;amp;cad=3#v=onepage&amp;amp;q&amp;amp;f=false spis treści]):&lt;br /&gt;
 &lt;br /&gt;
https://static.routledge.com/9781138364417/matlab.zip&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Wprowadzenie do przetwarzania sygnałów online===&lt;br /&gt;
* [[Laboratorium_EEG/Wprowadzenie_do_syg_online|ONLINE]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 10.03.2021 Pomiar EEG spoczynkowe, artefakty i alfa +P300 ===&lt;br /&gt;
Proszę powtórzyć informacje z : &lt;br /&gt;
* [[Pracownia_Sygnałów_Biologicznych/Zajecia_9]]. W szczególności proszę zwrócić uwagę na:&lt;br /&gt;
** porcedurę zakładania czepka&lt;br /&gt;
** przygotowanie skóry do pomiaru&lt;br /&gt;
** kolejność mocowania elektrod w czepku&lt;br /&gt;
* [[Pracownia_EEG/EEG_spoczynkowe]]&lt;br /&gt;
** Jakie wyróżniamy rytmy i na jakiej podstawie?&lt;br /&gt;
** Jakie są główne źródła artefaktów?&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* [[Pracownia_EEG/Potencjały_wywołane#Zadanie_3:_rejestracja_i_analiza_potencja.C5.82u_P3]]&lt;br /&gt;
** Co to jest potencjał P300&lt;br /&gt;
Lektura uzupełniająca o P300:&lt;br /&gt;
Linden, D. E. J. (2005). The P300: Where in the Brain Is It Produced and What Does It Tell Us? The Neuroscientist, 11(6), 563–576. https://doi.org/10.1177/1073858405280524&lt;br /&gt;
(Z IP wydziałowego można pobrać ten art. w pdf)&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Wprowadzenie do Matlaba===&lt;br /&gt;
* [[Laboratorium_EEG/Wprowadzenie_do_Matlaba|Wprowadzenie do Matlaba]]&amp;lt;br&amp;gt;&lt;br /&gt;
* [[Laboratorium_EEG/Konwerter_plików_Svarog–Matlab|Wczytywanie do Matlaba plików binarnych z programu Svarog]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Metody czas-częstość===&lt;br /&gt;
&amp;lt;!--* [[Wstęp do analizy obrazu]]--&amp;gt;&lt;br /&gt;
Motywacja - główne paradygmaty BCI:&lt;br /&gt;
&lt;br /&gt;
https://drive.google.com/file/d/1hMbkzn07pVDfeJ4fk9JPHhZaIckz-PVL/view?usp=share_link&lt;br /&gt;
&lt;br /&gt;
Wstęp o analizie ERD/ERS:&lt;br /&gt;
&lt;br /&gt;
https://drive.google.com/file/d/1hP5VglC8jYnoGHJ2j06m1AOMe8ItwCkb/view?usp=share_link&lt;br /&gt;
&lt;br /&gt;
* [[Laboratorium_EEG/Analiza czas-częstość w matlabie|Analiza czas-częstość w matlabie]]&lt;br /&gt;
* [[Laboratorium_EEG/Analiza zjawiska ERD/ERS|Analiza zjawiska ERD/ERS]]&lt;br /&gt;
&lt;br /&gt;
===Filtry przestrzenne===&lt;br /&gt;
* [[Laboratorium_EEG/CSP|Filtry przestrzenne]]:  metody ślepej separacji źródeł&lt;br /&gt;
&lt;br /&gt;
===Zależności przyczynowe===&lt;br /&gt;
* [[Laboratorium_EEG/AR_1|Wielokanałowa analiza parametryczna/Zależności przyczynowe]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Słuchowe potencjały stanu ustalonego: zmiany mocy pasmowej i metody ślepej separacji źródeł===&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* [[Laboratorium_EEG/EEGLAB|Pakiet EEGLAB]]&lt;br /&gt;
=== MP===&lt;br /&gt;
* [[Laboratorium_EEG/MMP|MMP]]&lt;/div&gt;</summary>
		<author><name>SuperAdmin</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=ZasadyZaliczenia&amp;diff=11608</id>
		<title>ZasadyZaliczenia</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=ZasadyZaliczenia&amp;diff=11608"/>
		<updated>2026-01-15T16:47:52Z</updated>

		<summary type="html">&lt;p&gt;SuperAdmin: /* Kolokwia */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Analiza_sygnałów_-_ćwiczenia]]/Zasady zaliczenia&lt;br /&gt;
&lt;br /&gt;
== Zasady zaliczenia ćwiczeń z [[Analiza_sygnałów - exercises|Analizy Sygnałów]] ==&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Kartkówki===&lt;br /&gt;
Na początku większości zajęć będą kartkówki. Z kartkówek można uzyskać ''k'' procent.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
=== Kolokwia ===&lt;br /&gt;
W trakcie semestru odbędą się dwa kolokwia. Z każdego z nich będzie można uzyskać ''1/2 x'' procent, z czego do zaliczenia przedmiotu konieczne będzie zdobycie łącznie 50% z kolokwiów. Kolokwia będą wspólne dla wszystkich grup, będą się odbywać w następujących terminach:&lt;br /&gt;
* 2025.11.17	10:00 – 13:00	1.27komp. + 1.28komp.	Kolokwium I	&lt;br /&gt;
* 2026.01.12	10:00 – 13:00	1.29komp. + 1.28komp.	Kolokwium II&lt;br /&gt;
* 2026.01.26    10:00 – 13:00	1.27komp. + 1.28komp.	Kolokwium poprawkowe/dodatkowe dla osób, które nie mogły uczestniczyć w jednym ze standardowych terminów. Wiedza wymagana dotyczy tego samego zakresu materiału, który obowiązywał na I i II kolokwium łącznie.&lt;br /&gt;
&lt;br /&gt;
Zasady dotyczące kolokwium poprawkowego/dodatkowego:&lt;br /&gt;
&lt;br /&gt;
* Jeśli ktoś nie był na którymś z kolokwiów, to powinien pisać kolokwium dodatkowe 26 stycznia,&lt;br /&gt;
* Jeśli ktoś ma średnią poniżej 50% ale chociaż na jednym z dwóch kolokwiów uzyskał co najmniej 50% może przystąpić do poprawy, a w tym przypadku wynik uzyskany z poprawki z wagą 0.9 zastąpi dotychczasową średnią z kolokwiów.&lt;br /&gt;
* Jeśli ktoś na żadnym z kolokwiów nie uzyskał minimum 50%, to powinien powtórzyć przedmiot.&lt;br /&gt;
&lt;br /&gt;
=== Materiały dostępne w czasie kolokwium ===&lt;br /&gt;
Jedynym materiałem dostępnym w trakcie trwania kolokwium jest oficjalna dokumentacja Python oraz własnoręczne notatki.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* '''Kolokwium poprawkowe: 27 stycznia 2020, 10:00-13, sale: 1.27, 1.28''' &lt;br /&gt;
Wiedza wymagana dotyczy tego samego zakresu materiału, który obowiązywał na I i II kolokwium łącznie.&lt;br /&gt;
W trakcie kolokwium możliwe jest poprawienie łącznej sumy punktów na kolokwia, czyli 20 pkt.&lt;br /&gt;
** [https://www.fuw.edu.pl/~jarekz/KOLOKWIUM_AS/AS_Kolokwium_Poprawkowe_xxxx.ipynb AS_Kolokwium_Poprawkowe_xxxx.ipynb]&lt;br /&gt;
** [https://www.fuw.edu.pl/~jarekz/KOLOKWIUM_AS/zad1_syg.bin zad1_syg.bin]&lt;br /&gt;
** [https://www.fuw.edu.pl/~jarekz/KOLOKWIUM_AS/zad2_syg.bin zad2_syg.bin]&lt;br /&gt;
** [https://www.fuw.edu.pl/~jarekz/KOLOKWIUM_AS/zad3_syg.bin zad3_syg.bin]&lt;br /&gt;
** [https://www.fuw.edu.pl/~jarekz/KOLOKWIUM_AS/zad4_syg.bin zad4_syg.bin]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--[https://drive.google.com/drive/folders/0B7k6Z_ViZid5ZXNac0swalRuMkk?usp=sharing]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--[[STATLAB/kolokwium2_wymagania|Zakres wymagań do II kolokwium.]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== Projekt ===&lt;br /&gt;
Wymagane będzie wykonanie jednego z projektów indywidualnych. Termin wykonania - 10 stycznia 2024. Projekty będą oceniane w procentach.&lt;br /&gt;
&lt;br /&gt;
# Pierwszy projekt [[STATLAB/Zadanie zaliczeniowe3|Analiza spektralna sygnału audio]] &lt;br /&gt;
&lt;br /&gt;
# Drugi projekt: [[Zjawisko ERDS]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
[[STATLAB/Zadanie_zaliczeniowe6| Detekcja wrzecion snu ]] &lt;br /&gt;
# Drugi projekt: [[STATLAB/Zadanie_zaliczeniowe5|Filtrowanie i przepróbkowanie sygnału]] należy oddać do końca zajęć dydaktycznych.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Praca w domu ===&lt;br /&gt;
Do większości  zajęć są przygotowane skrypty w jupyter-notebook.  Zawierają one opisy teoretyczne i fragmenty kodu. &lt;br /&gt;
&lt;br /&gt;
* Zadaniem studentów będzie '''przeczytanie ze zrozumieniem''' skryptu oraz '''uzupełnienie kodów w zadaniach'''. &lt;br /&gt;
* To co się liczy to '''próba samodzielnego rozwiązania''' zadania, lub '''sformułowanie konkretnego pytania'''  na temat zadania, które jest niezrozumiałe w notebooku.&lt;br /&gt;
* Rozwiązania i wątpliwości będą omawiane w trakcie zajęć.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* Dodatkowo na platformie kampus będą pojawiać się zadania domowe do rozwiązania.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
=== Skala ocen ===&lt;br /&gt;
&amp;lt;!--Punkty z kolokwiów i projektów uśredniają się. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W sesji porawkowej przewidujemy kolokwium poprawkowe umożliwiające poprawę obu kolokwiów.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Wynik procentowy z kolokwiów i kartkówek się sumuje w sposób ważony:&lt;br /&gt;
&lt;br /&gt;
''w = 0.2 k +0.8 x''&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Wynik średni z kolokwiów przelicza się na ocenę z ćwiczeń:&lt;br /&gt;
# [50–60) %: 3.0 (dst)&lt;br /&gt;
# [60-70) %: 3.5 (dst+)&lt;br /&gt;
# [70-80) %: 4.0 (db)&lt;br /&gt;
# [80-90) %: 4.5 (db+)&lt;br /&gt;
# [100-90] %: 5.0 (bdb)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== Nieobecności ===&lt;br /&gt;
Dozwolone są maksymalnie dwie nieusprawiedliwione nieobecności.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 kilka dodatkowych funkcji, które zostały udostępnione na  [[STATLAB/ListaFunkcji|oddzielnej stronie]].&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
[[Analiza_sygnałów_-_ćwiczenia]]/Zasady zaliczenia&lt;/div&gt;</summary>
		<author><name>SuperAdmin</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=ZasadyZaliczenia&amp;diff=11607</id>
		<title>ZasadyZaliczenia</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=ZasadyZaliczenia&amp;diff=11607"/>
		<updated>2026-01-15T16:46:59Z</updated>

		<summary type="html">&lt;p&gt;SuperAdmin: /* Kolokwia */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Analiza_sygnałów_-_ćwiczenia]]/Zasady zaliczenia&lt;br /&gt;
&lt;br /&gt;
== Zasady zaliczenia ćwiczeń z [[Analiza_sygnałów - exercises|Analizy Sygnałów]] ==&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Kartkówki===&lt;br /&gt;
Na początku większości zajęć będą kartkówki. Z kartkówek można uzyskać ''k'' procent.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
=== Kolokwia ===&lt;br /&gt;
W trakcie semestru odbędą się dwa kolokwia. Z każdego z nich będzie można uzyskać ''1/2 x'' procent, z czego do zaliczenia przedmiotu konieczne będzie zdobycie łącznie 50% z kolokwiów. Kolokwia będą wspólne dla wszystkich grup, będą się odbywać w następujących terminach:&lt;br /&gt;
* 2025.11.17	10:00 – 13:00	1.27komp. + 1.28komp.	Kolokwium I	&lt;br /&gt;
* 2026.01.12	10:00 – 13:00	1.29komp. + 1.28komp.	Kolokwium II&lt;br /&gt;
* 2026.01.26    10:00 – 13:00	1.27komp. + 1.28komp.	Kolokwium poprawkowe/dodatkowe dla osób, które nie mogły uczestniczyć w jednym ze standardowych terminów. Wiedza wymagana dotyczy tego samego zakresu materiału, który obowiązywał na I i II kolokwium łącznie.&lt;br /&gt;
&lt;br /&gt;
Zasady dotyczące kolokwium poprawkowego/dodatkowego:&lt;br /&gt;
&lt;br /&gt;
* Jeśli ktoś nie był na którymś z kolokwiów, to może pisać kolokwium dodatkowe 26 stycznia,&lt;br /&gt;
* Jeśli ktoś ma średnią poniżej 50% ale chociaż na jednym z dwóch kolokwiów uzyskał co najmniej 50% może przystąpić do poprawy, a w tym przypadku wynik uzyskany z poprawki z wagą 0.9 zastąpi dotychczasową średnią z kolokwiów.&lt;br /&gt;
* Jeśli ktoś na żadnym z kolokwiów nie uzyskał minimum 50%, to powinien powtórzyć przedmiot.&lt;br /&gt;
&lt;br /&gt;
=== Materiały dostępne w czasie kolokwium ===&lt;br /&gt;
Jedynym materiałem dostępnym w trakcie trwania kolokwium jest oficjalna dokumentacja Python oraz własnoręczne notatki.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* '''Kolokwium poprawkowe: 27 stycznia 2020, 10:00-13, sale: 1.27, 1.28''' &lt;br /&gt;
Wiedza wymagana dotyczy tego samego zakresu materiału, który obowiązywał na I i II kolokwium łącznie.&lt;br /&gt;
W trakcie kolokwium możliwe jest poprawienie łącznej sumy punktów na kolokwia, czyli 20 pkt.&lt;br /&gt;
** [https://www.fuw.edu.pl/~jarekz/KOLOKWIUM_AS/AS_Kolokwium_Poprawkowe_xxxx.ipynb AS_Kolokwium_Poprawkowe_xxxx.ipynb]&lt;br /&gt;
** [https://www.fuw.edu.pl/~jarekz/KOLOKWIUM_AS/zad1_syg.bin zad1_syg.bin]&lt;br /&gt;
** [https://www.fuw.edu.pl/~jarekz/KOLOKWIUM_AS/zad2_syg.bin zad2_syg.bin]&lt;br /&gt;
** [https://www.fuw.edu.pl/~jarekz/KOLOKWIUM_AS/zad3_syg.bin zad3_syg.bin]&lt;br /&gt;
** [https://www.fuw.edu.pl/~jarekz/KOLOKWIUM_AS/zad4_syg.bin zad4_syg.bin]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--[https://drive.google.com/drive/folders/0B7k6Z_ViZid5ZXNac0swalRuMkk?usp=sharing]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--[[STATLAB/kolokwium2_wymagania|Zakres wymagań do II kolokwium.]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== Projekt ===&lt;br /&gt;
Wymagane będzie wykonanie jednego z projektów indywidualnych. Termin wykonania - 10 stycznia 2024. Projekty będą oceniane w procentach.&lt;br /&gt;
&lt;br /&gt;
# Pierwszy projekt [[STATLAB/Zadanie zaliczeniowe3|Analiza spektralna sygnału audio]] &lt;br /&gt;
&lt;br /&gt;
# Drugi projekt: [[Zjawisko ERDS]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
[[STATLAB/Zadanie_zaliczeniowe6| Detekcja wrzecion snu ]] &lt;br /&gt;
# Drugi projekt: [[STATLAB/Zadanie_zaliczeniowe5|Filtrowanie i przepróbkowanie sygnału]] należy oddać do końca zajęć dydaktycznych.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Praca w domu ===&lt;br /&gt;
Do większości  zajęć są przygotowane skrypty w jupyter-notebook.  Zawierają one opisy teoretyczne i fragmenty kodu. &lt;br /&gt;
&lt;br /&gt;
* Zadaniem studentów będzie '''przeczytanie ze zrozumieniem''' skryptu oraz '''uzupełnienie kodów w zadaniach'''. &lt;br /&gt;
* To co się liczy to '''próba samodzielnego rozwiązania''' zadania, lub '''sformułowanie konkretnego pytania'''  na temat zadania, które jest niezrozumiałe w notebooku.&lt;br /&gt;
* Rozwiązania i wątpliwości będą omawiane w trakcie zajęć.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* Dodatkowo na platformie kampus będą pojawiać się zadania domowe do rozwiązania.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
=== Skala ocen ===&lt;br /&gt;
&amp;lt;!--Punkty z kolokwiów i projektów uśredniają się. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W sesji porawkowej przewidujemy kolokwium poprawkowe umożliwiające poprawę obu kolokwiów.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Wynik procentowy z kolokwiów i kartkówek się sumuje w sposób ważony:&lt;br /&gt;
&lt;br /&gt;
''w = 0.2 k +0.8 x''&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Wynik średni z kolokwiów przelicza się na ocenę z ćwiczeń:&lt;br /&gt;
# [50–60) %: 3.0 (dst)&lt;br /&gt;
# [60-70) %: 3.5 (dst+)&lt;br /&gt;
# [70-80) %: 4.0 (db)&lt;br /&gt;
# [80-90) %: 4.5 (db+)&lt;br /&gt;
# [100-90] %: 5.0 (bdb)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== Nieobecności ===&lt;br /&gt;
Dozwolone są maksymalnie dwie nieusprawiedliwione nieobecności.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 kilka dodatkowych funkcji, które zostały udostępnione na  [[STATLAB/ListaFunkcji|oddzielnej stronie]].&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
[[Analiza_sygnałów_-_ćwiczenia]]/Zasady zaliczenia&lt;/div&gt;</summary>
		<author><name>SuperAdmin</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=ZasadyZaliczenia&amp;diff=11483</id>
		<title>ZasadyZaliczenia</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=ZasadyZaliczenia&amp;diff=11483"/>
		<updated>2025-11-12T08:20:47Z</updated>

		<summary type="html">&lt;p&gt;SuperAdmin: /* Zasady zaliczenia ćwiczeń z Analizy Sygnałów */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Analiza_sygnałów_-_ćwiczenia]]/Zasady zaliczenia&lt;br /&gt;
&lt;br /&gt;
== Zasady zaliczenia ćwiczeń z [[Analiza_sygnałów - exercises|Analizy Sygnałów]] ==&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Kartkówki===&lt;br /&gt;
Na początku większości zajęć będą kartkówki. Z kartkówek można uzyskać ''k'' procent.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
=== Kolokwia ===&lt;br /&gt;
W trakcie semestru odbędą się dwa kolokwia. Z każdego z nich będzie można uzyskać ''1/2 x'' procent, z czego do zaliczenia przedmiotu konieczne będzie zdobycie łącznie 50% z kolokwiów. Kolokwia będą wspólne dla wszystkich grup, będą się odbywać w następujących terminach:&lt;br /&gt;
* 2025.11.17	10:00 – 13:00	1.27komp. + 1.28komp.	Kolokwium I	&lt;br /&gt;
  * Zakres materiału:&lt;br /&gt;
   - generacja sygnałów o zadanych parametrach&lt;br /&gt;
   - wczytywanie sygnałów z pliku&lt;br /&gt;
   - zjawisko aliasingu&lt;br /&gt;
   - długość sygnału a rozdzielczość widma&lt;br /&gt;
   - testowanie podobieństwa sygnałów za pomocą rzutowania (iloczynów skalarnych)&lt;br /&gt;
   - twierdzenie o splocie&lt;br /&gt;
   - transformata fouriera fft vs rfft&lt;br /&gt;
   - okienka i ich własności&lt;br /&gt;
   - widmo_dB&lt;br /&gt;
   - moc i energia sygnału w dziedzinie czasu i w dziedzinie częstości&lt;br /&gt;
   - metoda Welcha&lt;br /&gt;
   - metoda multitaper&lt;br /&gt;
&lt;br /&gt;
* 2026.01.12	10:00 – 13:00	1.29komp. + 1.28komp.	Kolokwium II&lt;br /&gt;
* 2026.01.26    10:00 – 13:00	1.27komp. + 1.28komp.	Kolokwium poprawkowe/dodatkowe dla osób, które nie mogły uczestniczyć w jednym ze standardowych terminów. Wiedza wymagana dotyczy tego samego zakresu materiału, który obowiązywał na I i II kolokwium łącznie.&lt;br /&gt;
&lt;br /&gt;
=== Materiały dostępne w czasie kolokwium ===&lt;br /&gt;
Jedynym materiałem dostępnym w trakcie trwania kolokwium jest oficjalna dokumentacja Python oraz własnoręczne notatki.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* '''Kolokwium poprawkowe: 27 stycznia 2020, 10:00-13, sale: 1.27, 1.28''' &lt;br /&gt;
Wiedza wymagana dotyczy tego samego zakresu materiału, który obowiązywał na I i II kolokwium łącznie.&lt;br /&gt;
W trakcie kolokwium możliwe jest poprawienie łącznej sumy punktów na kolokwia, czyli 20 pkt.&lt;br /&gt;
** [https://www.fuw.edu.pl/~jarekz/KOLOKWIUM_AS/AS_Kolokwium_Poprawkowe_xxxx.ipynb AS_Kolokwium_Poprawkowe_xxxx.ipynb]&lt;br /&gt;
** [https://www.fuw.edu.pl/~jarekz/KOLOKWIUM_AS/zad1_syg.bin zad1_syg.bin]&lt;br /&gt;
** [https://www.fuw.edu.pl/~jarekz/KOLOKWIUM_AS/zad2_syg.bin zad2_syg.bin]&lt;br /&gt;
** [https://www.fuw.edu.pl/~jarekz/KOLOKWIUM_AS/zad3_syg.bin zad3_syg.bin]&lt;br /&gt;
** [https://www.fuw.edu.pl/~jarekz/KOLOKWIUM_AS/zad4_syg.bin zad4_syg.bin]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--[https://drive.google.com/drive/folders/0B7k6Z_ViZid5ZXNac0swalRuMkk?usp=sharing]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--[[STATLAB/kolokwium2_wymagania|Zakres wymagań do II kolokwium.]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== Projekt ===&lt;br /&gt;
Wymagane będzie wykonanie jednego z projektów indywidualnych. Termin wykonania - 10 stycznia 2024. Projekty będą oceniane w procentach.&lt;br /&gt;
&lt;br /&gt;
# Pierwszy projekt [[STATLAB/Zadanie zaliczeniowe3|Analiza spektralna sygnału audio]] &lt;br /&gt;
&lt;br /&gt;
# Drugi projekt: [[Zjawisko ERDS]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
[[STATLAB/Zadanie_zaliczeniowe6| Detekcja wrzecion snu ]] &lt;br /&gt;
# Drugi projekt: [[STATLAB/Zadanie_zaliczeniowe5|Filtrowanie i przepróbkowanie sygnału]] należy oddać do końca zajęć dydaktycznych.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Praca w domu ===&lt;br /&gt;
Do większości  zajęć są przygotowane skrypty w jupyter-notebook.  Zawierają one opisy teoretyczne i fragmenty kodu. &lt;br /&gt;
&lt;br /&gt;
* Zadaniem studentów będzie '''przeczytanie ze zrozumieniem''' skryptu oraz '''uzupełnienie kodów w zadaniach'''. &lt;br /&gt;
* To co się liczy to '''próba samodzielnego rozwiązania''' zadania, lub '''sformułowanie konkretnego pytania'''  na temat zadania, które jest niezrozumiałe w notebooku.&lt;br /&gt;
* Rozwiązania i wątpliwości będą omawiane w trakcie zajęć.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* Dodatkowo na platformie kampus będą pojawiać się zadania domowe do rozwiązania.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
=== Skala ocen ===&lt;br /&gt;
&amp;lt;!--Punkty z kolokwiów i projektów uśredniają się. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W sesji porawkowej przewidujemy kolokwium poprawkowe umożliwiające poprawę obu kolokwiów.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Wynik procentowy z kolokwiów i kartkówek się sumuje w sposób ważony:&lt;br /&gt;
&lt;br /&gt;
''w = 0.2 k +0.8 x''&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Wynik średni z kolokwiów przelicza się na ocenę z ćwiczeń:&lt;br /&gt;
# [50–60) %: 3.0 (dst)&lt;br /&gt;
# [60-70) %: 3.5 (dst+)&lt;br /&gt;
# [70-80) %: 4.0 (db)&lt;br /&gt;
# [80-90) %: 4.5 (db+)&lt;br /&gt;
# [100-90] %: 5.0 (bdb)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== Nieobecności ===&lt;br /&gt;
Dozwolone są maksymalnie dwie nieusprawiedliwione nieobecności.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 kilka dodatkowych funkcji, które zostały udostępnione na  [[STATLAB/ListaFunkcji|oddzielnej stronie]].&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
[[Analiza_sygnałów_-_ćwiczenia]]/Zasady zaliczenia&lt;/div&gt;</summary>
		<author><name>SuperAdmin</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=ZasadyZaliczenia&amp;diff=11442</id>
		<title>ZasadyZaliczenia</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=ZasadyZaliczenia&amp;diff=11442"/>
		<updated>2025-10-19T07:36:36Z</updated>

		<summary type="html">&lt;p&gt;SuperAdmin: /* Kolokwia */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Analiza_sygnałów_-_ćwiczenia]]/Zasady zaliczenia&lt;br /&gt;
&lt;br /&gt;
== Zasady zaliczenia ćwiczeń z [[Analiza_sygnałów - exercises|Analizy Sygnałów]] ==&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Kartkówki===&lt;br /&gt;
Na początku większości zajęć będą kartkówki. Z kartkówek można uzyskać ''k'' procent.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
=== Kolokwia ===&lt;br /&gt;
W trakcie semestru odbędą się dwa kolokwia. Z każdego z nich będzie można uzyskać ''1/2 x'' procent, z czego do zaliczenia przedmiotu konieczne będzie zdobycie łącznie 50% z kolokwiów. Kolokwia będą wspólne dla wszystkich grup, będą się odbywać w następujących terminach:&lt;br /&gt;
* 2025.11.17	10:00 – 13:00	1.27komp. + 1.28komp.	Kolokwium I	&lt;br /&gt;
* 2026.01.12	10:00 – 13:00	1.27komp. + 1.28komp.	Kolokwium II&lt;br /&gt;
* 2026.01.26    10:00 – 13:00	1.27komp. + 1.28komp.	Kolokwium poprawkowe/dodatkowe dla osób, które nie mogły uczestniczyć w jednym ze standardowych terminów. Wiedza wymagana dotyczy tego samego zakresu materiału, który obowiązywał na I i II kolokwium łącznie.&lt;br /&gt;
&lt;br /&gt;
=== Materiały dostępne w czasie kolokwium ===&lt;br /&gt;
Jedynym materiałem dostępnym w trakcie trwania kolokwium jest oficjalna dokumentacja Python oraz własnoręczne notatki.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* '''Kolokwium poprawkowe: 27 stycznia 2020, 10:00-13, sale: 1.27, 1.28''' &lt;br /&gt;
Wiedza wymagana dotyczy tego samego zakresu materiału, który obowiązywał na I i II kolokwium łącznie.&lt;br /&gt;
W trakcie kolokwium możliwe jest poprawienie łącznej sumy punktów na kolokwia, czyli 20 pkt.&lt;br /&gt;
** [https://www.fuw.edu.pl/~jarekz/KOLOKWIUM_AS/AS_Kolokwium_Poprawkowe_xxxx.ipynb AS_Kolokwium_Poprawkowe_xxxx.ipynb]&lt;br /&gt;
** [https://www.fuw.edu.pl/~jarekz/KOLOKWIUM_AS/zad1_syg.bin zad1_syg.bin]&lt;br /&gt;
** [https://www.fuw.edu.pl/~jarekz/KOLOKWIUM_AS/zad2_syg.bin zad2_syg.bin]&lt;br /&gt;
** [https://www.fuw.edu.pl/~jarekz/KOLOKWIUM_AS/zad3_syg.bin zad3_syg.bin]&lt;br /&gt;
** [https://www.fuw.edu.pl/~jarekz/KOLOKWIUM_AS/zad4_syg.bin zad4_syg.bin]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--[https://drive.google.com/drive/folders/0B7k6Z_ViZid5ZXNac0swalRuMkk?usp=sharing]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--[[STATLAB/kolokwium2_wymagania|Zakres wymagań do II kolokwium.]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== Projekt ===&lt;br /&gt;
Wymagane będzie wykonanie jednego z projektów indywidualnych. Termin wykonania - 10 stycznia 2024. Projekty będą oceniane w procentach.&lt;br /&gt;
&lt;br /&gt;
# Pierwszy projekt [[STATLAB/Zadanie zaliczeniowe3|Analiza spektralna sygnału audio]] &lt;br /&gt;
&lt;br /&gt;
# Drugi projekt: [[Zjawisko ERDS]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
[[STATLAB/Zadanie_zaliczeniowe6| Detekcja wrzecion snu ]] &lt;br /&gt;
# Drugi projekt: [[STATLAB/Zadanie_zaliczeniowe5|Filtrowanie i przepróbkowanie sygnału]] należy oddać do końca zajęć dydaktycznych.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Praca w domu ===&lt;br /&gt;
Do większości  zajęć są przygotowane skrypty w jupyter-notebook.  Zawierają one opisy teoretyczne i fragmenty kodu. &lt;br /&gt;
&lt;br /&gt;
* Zadaniem studentów będzie '''przeczytanie ze zrozumieniem''' skryptu oraz '''uzupełnienie kodów w zadaniach'''. &lt;br /&gt;
* To co się liczy to '''próba samodzielnego rozwiązania''' zadania, lub '''sformułowanie konkretnego pytania'''  na temat zadania, które jest niezrozumiałe w notebooku.&lt;br /&gt;
* Rozwiązania i wątpliwości będą omawiane w trakcie zajęć.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* Dodatkowo na platformie kampus będą pojawiać się zadania domowe do rozwiązania.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
=== Skala ocen ===&lt;br /&gt;
&amp;lt;!--Punkty z kolokwiów i projektów uśredniają się. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W sesji porawkowej przewidujemy kolokwium poprawkowe umożliwiające poprawę obu kolokwiów.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Wynik procentowy z kolokwiów i kartkówek się sumuje w sposób ważony:&lt;br /&gt;
&lt;br /&gt;
''w = 0.2 k +0.8 x''&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Wynik średni z kolokwiów przelicza się na ocenę z ćwiczeń:&lt;br /&gt;
# [50–60) %: 3.0 (dst)&lt;br /&gt;
# [60-70) %: 3.5 (dst+)&lt;br /&gt;
# [70-80) %: 4.0 (db)&lt;br /&gt;
# [80-90) %: 4.5 (db+)&lt;br /&gt;
# [100-90] %: 5.0 (bdb)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== Nieobecności ===&lt;br /&gt;
Dozwolone są maksymalnie dwie nieusprawiedliwione nieobecności.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 kilka dodatkowych funkcji, które zostały udostępnione na  [[STATLAB/ListaFunkcji|oddzielnej stronie]].&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
[[Analiza_sygnałów_-_ćwiczenia]]/Zasady zaliczenia&lt;/div&gt;</summary>
		<author><name>SuperAdmin</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=ZasadyZaliczenia&amp;diff=11441</id>
		<title>ZasadyZaliczenia</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=ZasadyZaliczenia&amp;diff=11441"/>
		<updated>2025-10-19T07:36:00Z</updated>

		<summary type="html">&lt;p&gt;SuperAdmin: /* Zasady zaliczenia ćwiczeń z Analizy Sygnałów */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Analiza_sygnałów_-_ćwiczenia]]/Zasady zaliczenia&lt;br /&gt;
&lt;br /&gt;
== Zasady zaliczenia ćwiczeń z [[Analiza_sygnałów - exercises|Analizy Sygnałów]] ==&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Kartkówki===&lt;br /&gt;
Na początku większości zajęć będą kartkówki. Z kartkówek można uzyskać ''k'' procent.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
=== Kolokwia ===&lt;br /&gt;
W trakcie semestru odbędą się dwa kolokwia. Z każdego z nich będzie można uzyskać ''1/2 x'' procent, z czego do zaliczenia przedmiotu konieczne będzie zdobycie łącznie 50% z kolokwiów. Kolokwia będą wspólne dla wszystkich grup, będą się odbywać w następujących terminach:&lt;br /&gt;
* 2025.11.17	10:00 – 13:00	1.27komp. + 1.28komp.		&lt;br /&gt;
* 2026.01.12	10:00 – 13:00	1.27komp. + 1.28komp.	&lt;br /&gt;
* 2026.01.26    10:00 – 13:00	1.27komp. + 1.28komp.	Kolokwium poprawkowe/dodatkowe dla osób, które nie mogły uczestniczyć w jednym ze standardowych terminów. Wiedza wymagana dotyczy tego samego zakresu materiału, który obowiązywał na I i II kolokwium łącznie.&lt;br /&gt;
&lt;br /&gt;
=== Materiały dostępne w czasie kolokwium ===&lt;br /&gt;
Jedynym materiałem dostępnym w trakcie trwania kolokwium jest oficjalna dokumentacja Python oraz własnoręczne notatki.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* '''Kolokwium poprawkowe: 27 stycznia 2020, 10:00-13, sale: 1.27, 1.28''' &lt;br /&gt;
Wiedza wymagana dotyczy tego samego zakresu materiału, który obowiązywał na I i II kolokwium łącznie.&lt;br /&gt;
W trakcie kolokwium możliwe jest poprawienie łącznej sumy punktów na kolokwia, czyli 20 pkt.&lt;br /&gt;
** [https://www.fuw.edu.pl/~jarekz/KOLOKWIUM_AS/AS_Kolokwium_Poprawkowe_xxxx.ipynb AS_Kolokwium_Poprawkowe_xxxx.ipynb]&lt;br /&gt;
** [https://www.fuw.edu.pl/~jarekz/KOLOKWIUM_AS/zad1_syg.bin zad1_syg.bin]&lt;br /&gt;
** [https://www.fuw.edu.pl/~jarekz/KOLOKWIUM_AS/zad2_syg.bin zad2_syg.bin]&lt;br /&gt;
** [https://www.fuw.edu.pl/~jarekz/KOLOKWIUM_AS/zad3_syg.bin zad3_syg.bin]&lt;br /&gt;
** [https://www.fuw.edu.pl/~jarekz/KOLOKWIUM_AS/zad4_syg.bin zad4_syg.bin]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--[https://drive.google.com/drive/folders/0B7k6Z_ViZid5ZXNac0swalRuMkk?usp=sharing]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--[[STATLAB/kolokwium2_wymagania|Zakres wymagań do II kolokwium.]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== Projekt ===&lt;br /&gt;
Wymagane będzie wykonanie jednego z projektów indywidualnych. Termin wykonania - 10 stycznia 2024. Projekty będą oceniane w procentach.&lt;br /&gt;
&lt;br /&gt;
# Pierwszy projekt [[STATLAB/Zadanie zaliczeniowe3|Analiza spektralna sygnału audio]] &lt;br /&gt;
&lt;br /&gt;
# Drugi projekt: [[Zjawisko ERDS]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
[[STATLAB/Zadanie_zaliczeniowe6| Detekcja wrzecion snu ]] &lt;br /&gt;
# Drugi projekt: [[STATLAB/Zadanie_zaliczeniowe5|Filtrowanie i przepróbkowanie sygnału]] należy oddać do końca zajęć dydaktycznych.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Praca w domu ===&lt;br /&gt;
Do większości  zajęć są przygotowane skrypty w jupyter-notebook.  Zawierają one opisy teoretyczne i fragmenty kodu. &lt;br /&gt;
&lt;br /&gt;
* Zadaniem studentów będzie '''przeczytanie ze zrozumieniem''' skryptu oraz '''uzupełnienie kodów w zadaniach'''. &lt;br /&gt;
* To co się liczy to '''próba samodzielnego rozwiązania''' zadania, lub '''sformułowanie konkretnego pytania'''  na temat zadania, które jest niezrozumiałe w notebooku.&lt;br /&gt;
* Rozwiązania i wątpliwości będą omawiane w trakcie zajęć.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* Dodatkowo na platformie kampus będą pojawiać się zadania domowe do rozwiązania.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
=== Skala ocen ===&lt;br /&gt;
&amp;lt;!--Punkty z kolokwiów i projektów uśredniają się. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W sesji porawkowej przewidujemy kolokwium poprawkowe umożliwiające poprawę obu kolokwiów.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Wynik procentowy z kolokwiów i kartkówek się sumuje w sposób ważony:&lt;br /&gt;
&lt;br /&gt;
''w = 0.2 k +0.8 x''&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
Wynik średni z kolokwiów przelicza się na ocenę z ćwiczeń:&lt;br /&gt;
# [50–60) %: 3.0 (dst)&lt;br /&gt;
# [60-70) %: 3.5 (dst+)&lt;br /&gt;
# [70-80) %: 4.0 (db)&lt;br /&gt;
# [80-90) %: 4.5 (db+)&lt;br /&gt;
# [100-90] %: 5.0 (bdb)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== Nieobecności ===&lt;br /&gt;
Dozwolone są maksymalnie dwie nieusprawiedliwione nieobecności.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 kilka dodatkowych funkcji, które zostały udostępnione na  [[STATLAB/ListaFunkcji|oddzielnej stronie]].&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
[[Analiza_sygnałów_-_ćwiczenia]]/Zasady zaliczenia&lt;/div&gt;</summary>
		<author><name>SuperAdmin</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Analiza_sygna%C5%82%C3%B3w_-_%C4%87wiczenia&amp;diff=11428</id>
		<title>Analiza sygnałów - ćwiczenia</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Analiza_sygna%C5%82%C3%B3w_-_%C4%87wiczenia&amp;diff=11428"/>
		<updated>2025-10-06T14:33:24Z</updated>

		<summary type="html">&lt;p&gt;SuperAdmin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Przedmioty specjalizacyjne]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[ZasadyZaliczenia|Zasady zaliczenia ćwiczeń]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dla grupy o 10:15 link do podłączania się: Analiza Sygnałów &lt;br /&gt;
https://meet.google.com/inx-rxqe-fku&lt;br /&gt;
&lt;br /&gt;
# [https://drive.google.com/file/d/1Cr8CCPoh_G-iAq8x2Bm0YxwAcsrNwqir/view?usp=sharing Sygnały AS_1.ipynb]  &lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
[https://drive.google.com/file/d/1J_7pyTO00r-OyhyrMd1v_dAoiIU0C-3k/view?usp=sharing notebook wypełniony]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
#  [https://colab.research.google.com/drive/1y81wGZHwpUf4J6IIApPdqahgUN9Bad0p?usp=sharing Transformata Fouriera 1 (FFT) AS2_Transformata_fouriera.ipynb]&lt;br /&gt;
#[https://colab.research.google.com/drive/18nU5rWKinO697M3Pgnp6luiC-NcBYD-9?usp=sharing Transformata Fouriera 2 AS3_Transformata_fouriera_2.ipynb]&lt;br /&gt;
#[https://colab.research.google.com/drive/1b6djG2_uE_yc0-QEyD1Yl-dd8Ezelf2m?usp=sharing Okienkowanie AS4_okienkowanie.ipynb]&lt;br /&gt;
#[https://colab.research.google.com/drive/1Lr-fkC4oFl2Tf4Y2w2w27bARpvwWRSmG?usp=sharing Estymacja widma mocy AS5_Widmo_mocy.ipynb ] &lt;br /&gt;
# kontynuacja notebook AS5&lt;br /&gt;
#[https://colab.research.google.com/drive/1mKjXYKICL1vp5z0MpWrfM8JuXCDlc_HK?usp=sharing Model AR AS6_1_ProcesyAR.ipynb]&lt;br /&gt;
#[https://colab.research.google.com/drive/1NRzWBr5j5YzwfaZDwJC5yaPEVgi6rc6U?usp=sharing Estymacja parametryczna widma procesu AS6_2_Widmo_Procesu_AR.ipynb]&lt;br /&gt;
#[https://colab.research.google.com/drive/1e8_SIPFqAJA7WGsPiWudplubHtrgkSq0?usp=sharing Filtry notebook7] &lt;br /&gt;
# kontynuacja notebook7  -&amp;gt; notebook z grupy porannej: https://colab.research.google.com/drive/1bBzlxf7krP7KI_SYIgZLMPfD0bnleXVo?usp=sharing&lt;br /&gt;
#[https://drive.google.com/file/d/1Ey1yYgVMbu3n9djb2LzPZ4dT03gYFcAw/view?usp=sharing Metody czas-częstość STFT i falki: notebook8]      &amp;lt;br&amp;gt;[https://drive.google.com/open?id=0BzwQ_Lscn8yDdUlLVXp1XzF0elE notebook 10] &amp;lt;br&amp;gt;lektura uzupełniająca: [https://www.math.ucdavis.edu/~saito/data/sonar/boashash1.pdf  Estimating and Interpreting The Instantaneous Frequency of a Signal-Part 1: Fundamentals ]&lt;br /&gt;
# [https://drive.google.com/file/d/13Jvt1po_Brk49fRe-dOxOvVfRz1VVieW/view?usp=sharing Notebook o metodzie MP]&lt;br /&gt;
&lt;br /&gt;
== Materiały pomocnicze do samokształcenia: ==&lt;br /&gt;
&lt;br /&gt;
* Zbiór zadań z Analizy sygnałów wraz z rozwiązaniami przygotowany w ramach Projektu zespołowego przez Monikę Tutaj i Marcina Syca pod kierunkiem mgr. Piotra Biegańskiego https://www.fuw.edu.pl/~jarekz/ZadaniaAS/Zadania_Analiza_Sygnałów.zip&lt;br /&gt;
* Zbiór zadań z pythona, które mają na celu pomoc w opanowaniu podstaw Pythona, ze szczególnym naciskiem na rozwinięcie kompetencji potrzebnych w analizie sygnałów, takich jak: pogłębiona znajomość biblioteki numpy, praca z plikami multipleksowanymi, wykorzystanie Pythona jako narzędzia do analizy danych. https://gitlab.com/pbieganski/podstawy-pythona&lt;br /&gt;
* Notatnik z kolokwium poprawkowym 2025: https://colab.research.google.com/drive/1_DQ7rG7aIMq_XgkPZIM4bGAAf8VlFVGc?usp=sharing&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
https://colab.research.google.com/drive/1WZwnu_YgmsRfBdC6Oy5AHULT6b4RInn5?usp=sharing&lt;br /&gt;
&lt;br /&gt;
https://drive.google.com/file/d/1IlY0KsqxMuW7s-Aic_hnChc5sN7QCIgL/view?usp=sharing &lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Okladka.jpeg|thumb|upright=0.25| Dostępna w bibliotece]] W bibliotece Wydziału Fizyki dostępne są książki: Practical biomedical signal analysis using Matlab / K. J. Blinowska J. Żygierewicz. (katalog: https://chamo.buw.uw.edu.pl:8443/lib/item?id=chamo:895791&amp;amp;fromLocationLink=false&amp;amp;theme=system)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Materiały dodatkowe: ==&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/playlist?list=PLXJDR4jmaWX795PLOwLt5pR59H2BrZAsK playlista na YouTube z filmami nagranymi w czasie zdalnych ćwiczeń w roku 2020/21]&lt;br /&gt;
&lt;br /&gt;
[https://tftb.nongnu.org/tutorial.pdf Tutorial o technikach analizy czas-częstość]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Przed kolokwium 1&lt;br /&gt;
# [[kolokwia2014_2015_kol1|Zagadnienia przygotowawcze do 1 kolokwium]] &lt;br /&gt;
# [https://drive.google.com/open?id=1RKIHgfuqtBvg65PUpIuQI3rYeyvdIXMi zadania powtórzeniowe do kolokwium  1]&lt;br /&gt;
&lt;br /&gt;
autorzy: Jarosław Żygierewicz, Maciej Kamiński, Magdalena Zieleniewska, wersja z notebookami Jan Mąka i Piotr Biegański&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== INFORMACJE DODATKOWE ==&lt;br /&gt;
Materiały 2014/2015&lt;br /&gt;
# [[kolokwia2013_2014|Informacje o zaliczeniu ćwiczeń]] &lt;br /&gt;
# [[kolokwia2014_2015_kol1|Zagadnienia przygotowawcze do 1 kolokwium]] &lt;br /&gt;
# [[Projekt2014|Projekt zaliczeniowy]]&lt;br /&gt;
&lt;br /&gt;
Materiały 2013/2014&lt;br /&gt;
# [[Plik:Zadania_powtorzeniowe.pdf|Zadania powtorzeniowe do 2 kolokwium]]&lt;br /&gt;
&lt;br /&gt;
#[[Systemy liniowe niezmiennicze w czasie | Systemy liniowe niezmiennicze w czasie]]&lt;br /&gt;
[[Ćwiczenia 8|Filtrowanie obrazów]]&lt;br /&gt;
[[Ćwiczenia 9|Analiza czas-częstość]]&lt;br /&gt;
[[Ćwiczenia 10|Analiza czas-częstość &amp;amp;mdash; STFT i transformata falkowa]]&lt;br /&gt;
[[Ćwiczenia 11|Analiza czas-częstość &amp;amp;mdash; reprezentacje energetyczne]]&lt;br /&gt;
#[[AS cwiczenia ICA| ICA]] montaże, ICA &lt;br /&gt;
#[[AS cwiczenia DTF| DTF]]wielokanałowy AR , DTF &lt;br /&gt;
&lt;br /&gt;
#[[AS cwiczeniaMP|Matching pursuit]] MP w Svarogu, zabawa parametrami dekompozycji, zabawa filtrowaniem map w Svarogu, postprocessing w Pythonie &lt;br /&gt;
&lt;br /&gt;
# Uśrednianie gęstości energii vs gęstość energii uśrednionego sygnału: symulacje, ERD/S&lt;br /&gt;
#[[Ćwiczenia UNIFIKACJA]] ostatnie ćwiczenia na ktrych porównujemy na tych samych sygnałach rzeczywistych i symulowanych działanie różnych metod -- MMP vs DTF vs ICA, STFT vs WT vs MP itp, potrzebne fajne przykłady&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>SuperAdmin</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_Sygna%C5%82%C3%B3w_Biologicznych/Zajecia_2_4&amp;diff=7981</id>
		<title>Pracownia Sygnałów Biologicznych/Zajecia 2 4</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_Sygna%C5%82%C3%B3w_Biologicznych/Zajecia_2_4&amp;diff=7981"/>
		<updated>2019-03-05T11:53:06Z</updated>

		<summary type="html">&lt;p&gt;SuperAdmin: /* Ćwiczenia */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Rejestracja i analiza sygnału EKG==&lt;br /&gt;
&lt;br /&gt;
Lektura:  [http://www.bem.fi/book/15/15.htm Electric and Magnetic Measurement of the Electric Activity of the Heart/12-Lead ECG System]&lt;br /&gt;
[[Plik:einthoven_ekg.png|250px|thumb|right|&amp;lt;figure id=&amp;quot;fig:einthoven_ekg&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt; Aparat do rejestracji czynności elektrycznej serca skonstruowany przez W. Einthovena. Proszę zauważyć w jakich miejscach na ciele zbierana jest sygnał.]]&lt;br /&gt;
[[Plik:ekg_animacja.gif|250px|thumb|right|&amp;lt;figure id=&amp;quot;fig:ekg_animacja&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt; Rozchodzenie się sygnału stymulujacego pracę serca i związane z tym powstawanie sygnału EKG. Rysunek po brany ze strony Wikipedii.]]&lt;br /&gt;
[[Plik:ekg_opis.png|250px|thumb|right|&amp;lt;figure id=&amp;quot;fig:ekg_opis&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt; Oznaczenia kolejnych składowych sygnału EKG.]]&lt;br /&gt;
[[Plik:wilson.png|250px|thumb|right|&amp;lt;figure id=&amp;quot;fig:wilson&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt; Umiejscowienie elektrod do pomiaru czynności elektrycznej serca z powierzchni klatki piersiowej, rysunek pobrany ze stron Wikipedii.]]&lt;br /&gt;
 &lt;br /&gt;
Mechanizm powstawania czynności elektrycznej serca został omówiony na zajęciach &amp;amp;bdquo;Sygnały Bioelektryczne&amp;quot;. W tym miejscu przypomnimy tylko kilka ważnych (i ciekawych) faktów.&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Czynność elektryczna serca znana jest od połowy XIX, jednakże za początek narodzin elektrokardiografii uznaje się rok 1903, kiedy to W. Einthoven dokonał pomiaru czynności elektrycznej serca z powierzchni ciała (&amp;lt;xr id=&amp;quot;fig:einthoven_ekg&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt;). Jako metoda diagnostyczna, elektrokardiografia zaczęła się szybko rozwijać po roku 1936, kiedy to do rejestracji czynności elektrycznej serca zastosowano wzmacniacz lampowy oraz system zapisu pomiaru na papierze.&lt;br /&gt;
&amp;lt;li&amp;gt; Serce posiada specjalny, wzbudzany samoczynnie układ, który generuje i przewodzi bodźce elektryczne. Następstwem działania tego układu jest rytmiczna praca serca o częstości od 70 do 180 cykli na minutę (częstość ta ulega zmianom pod wpływem czynników biochemicznych, powstałych np. w skutek stresu).&lt;br /&gt;
&amp;lt;li&amp;gt; Elektroda rejestrująca sygnał EKG zbiera czynność elektryczną wszystkich komórek serca, a zatem zarówno komórek wchodzących w skład układu generującego i przewodzącego impulsy elektryczne oraz kurczących się pod wpływem impulsów sterujących mięśni, które kurcząc się, również wytwarzają sygnał elektryczny. Jednakże, z uwagi na nieporównywalnie dużo większą masę mięśni serca w porównaniu z masą komórek układu stymulującego przyjmuje się, że głównym składnikiem sygnału EKG jest czynność elektryczna mięśnia sercowego.&lt;br /&gt;
&amp;lt;li&amp;gt; W przybliżeniu, sygnał stymulujący pracę serca rozchodzi się z jego prawej górnej części w kierunku dolnym i na lewą stronę. Na skutek pobudzania kolejnych partii mięśnia sercowego, powstaje charakterystyczny kształt sygnału EKG (&amp;lt;xr id=&amp;quot;fig:ekg_animacja&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt;, &amp;lt;xr id=&amp;quot;fig:ekg_opis&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt;). &lt;br /&gt;
&amp;lt;li&amp;gt; Oznaczenia kolejnych składowych sygnału EKG:&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; odchylenia od linii poziomej (izoelektrycznej) nazywamy załamkami,&lt;br /&gt;
&amp;lt;li&amp;gt; odległość w czasie pomiędzy końcem załamka P i początkiem załamka Q oraz końcem załamka S i początkiem załamka T nazywamy odcinkami &amp;amp;mdash; odpowiednio PQ i ST.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Elektrody pomiarowe połączone do aparatury rejestrujących nazywamy odprowadzeniami. Uwaga &amp;amp;mdash; przyjęto odprowadzeniami oznaczać także sygnały EKG będące liniowymi kombinacjami sygnałów zebranych przez elektrody.&lt;br /&gt;
&amp;lt;li&amp;gt; W konwencjonalnej elektroencefalografii stosuje się 12 tzw. odprowadzeń klasycznych:&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Trzy odprowadzenia kończynowe biegunowe, zaproponowane jeszcze przez Einthoven i oznaczane rzymskimi cyframi I, II i III. Elektrody w tym systemie umieszcza się prawej (R) (ang. ''right'') i lewej (L) (ang. ''left'') kończynie górnej (najczęściej w okolicy nadgarstka, czasem ramieniu lub czy barku) oraz lewej nodze w okolicy stopy (F) (ang. ''foot''). Elektrodę umieszczaną na prawym nadgarstku oznacza się kolorem czerwonym, na lewym żółtym, na lewej kostce zielonym. Elektrodę masy umieszcza się zwykle na lewej kostce (choć teoretycznie można ją aplikować gdziekolwiek) i jest ona oznaczona kolorem czarnym. Odprowadzenia kończynowe mierzą różnicę napięć pomiędzy miejscami przyłożenia elektrod w następujący sposób:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;equation id = &amp;quot;eq_1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{ll}&lt;br /&gt;
I   &amp;amp; = V_{L} - V_{R} \\&lt;br /&gt;
II  &amp;amp; = V_{F} - V_{R} \\&lt;br /&gt;
III &amp;amp; = V_{F} - V_{L}&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
gdzie: &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;V_{R}, V_{L}, V_{F}&amp;lt;/math&amp;gt; to potencjały odpowiednio na prawym i lewym nadgarstku oraz stopie mierzone względem elektrody masy.&amp;lt;br/&amp;gt;&lt;br /&gt;
Jak łatwo zauważyć, tylko dwa spośród powyższych napięć są liniowo niezależne, co można zapisać w postaci związku:&lt;br /&gt;
&amp;lt;equation id = &amp;quot;eq_2&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;I + III = II&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
który nazywany jest prawem Einthovena. Proszę zauważyć, iż w tym przypadku wzmacniane jest sygnał będący różnicą napięć dwóch kolejnych elektrod, stąd też te odprowadzenia nazywamy dwubiegunowymi (bipolarnymi).&lt;br /&gt;
&amp;lt;li&amp;gt; Trzy odprowadzenia jednobiegunowe Goldberga. W odprowadzeniach tych sygnał w danym odprowadzeniu jest różnicą napięć pomiędzy elektrodą pomiarową a średnim napięciem na dwóch pozostałych elektrodach:&lt;br /&gt;
&amp;lt;equation id = &amp;quot;eq_3&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{ll}&lt;br /&gt;
aV_{L} &amp;amp; = V_{L} - \frac{V_{R}+V_{F}}{2} \\&lt;br /&gt;
aV_{R} &amp;amp; = V_{R} - \frac{V_{L}+V_{F}}{2} \\&lt;br /&gt;
aV_{F} &amp;amp; = V_{F} - \frac{V_{L}+V_{R}}{2}&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Sześć odprowadzeń jednobiegunowych Wilsona. W przypadku warto zapoznać się z z historią tych odprowadzeń. Początkowo Wilson zaproponował układ jednobiegunowych doniesień dla kończyn w następujący sposób:&lt;br /&gt;
&amp;lt;equation id = &amp;quot;eq_4&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{ll}&lt;br /&gt;
V_{LW} &amp;amp; = V_{L} - \frac{V_{R}+V_{L}+ V_{F}}{3} \\&lt;br /&gt;
V_{RW} &amp;amp; = V_{R} - \frac{V_{R}+V_{L}+ V_{F}}{3} \\&lt;br /&gt;
V_{FW} &amp;amp; = V_{F} - \frac{V_{R}+V_{L}+ V_{F}}{3}&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
Jak widzimy, jako elektrodę odniesienia wybrał on średnie napięcie rejestrowane przez elektrody. Niestety, sygnały prezentowane w tym systemie miały małą amplitudę, w związku z czym tego rodzaju odprowadzenia nie stosowano w praktyce. Z systemu zaproponowanego przez Wilsona wywodzi się jednak system odniesień Goldbergera, który zauważył, że napięcie na trzeciej kończynie można zwiększyć o 50% jeśli do wyznaczenia napięcia odniesienia zastosuje się dwie, a nie trzy elektrody. Metoda wyznaczania potencjału odniesienia zaproponowana przez Wilsona znalazła jednak zastosowanie przy mierzeniu czynności elektrycznej serca mierzonej z powierzchni klatki piersiowej. W tym celu elektrody umieszcza się w pewnych ustalonych miejscach (&amp;lt;xr id=&amp;quot;fig:wilson&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt;, zaś odprowadzenia oznacza się symbolami &amp;lt;math&amp;gt;V_1, V_2, \dots, V_6&amp;lt;/math&amp;gt;. Odniesieniem w tym przypadku jest średni sygnał rejestrowany na kończynach górnych i lewej stopie. &lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ćwiczenia==&lt;br /&gt;
&lt;br /&gt;
Aby uruchomić zbieranie sygnału należy wykonać następujące operacje:&lt;br /&gt;
* przykleić elektrody do badanego;&lt;br /&gt;
* włożyć przewody do elektrod, a potem do wzmacniacza;&lt;br /&gt;
* podłączyć zasilanie wzmacniacza;&lt;br /&gt;
* podłączyć wzmacniacz do komputera (przejściówka optyczna i kabel USB);&lt;br /&gt;
* otworzyć Terminal i wpisać polecenia:&lt;br /&gt;
** &amp;lt;tt&amp;gt;obci launch ../administrator/obci/scenarios/porti7_ekg.ini&amp;lt;/tt&amp;gt;. Po tym poleceniu wzmacniacz powinien wyświetlać napis &amp;amp;bdquo;Fiber&amp;amp;rdquo;; napis &amp;amp;bdquo;Connect&amp;amp;rdquo; oznacza, że połączenie wzmacniacza z komputerem nie udało się. W takim przypadku wykonujemy polecenie &amp;lt;tt&amp;gt;obci srv_kill&amp;lt;/tt&amp;gt; i powtarzamy próbę połączenia.&lt;br /&gt;
** &amp;lt;tt&amp;gt;svarog&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Ćwiczenie 1: Podaj związek pomiędzy sygnałami mierzonymi w systemie Goldbergera, a systemem Einthovena. Podaj analogiczny związek pomiędzy sygnałami w odniesieniach Goldberga co ''Prawo Einthovena''. Pokaż, że w systemie Goldbergera uzyskuje się sygnały o amplitudzie o 50% wyższej niż w pierwotnym systemie Wilsona. &lt;br /&gt;
&lt;br /&gt;
;Ćwiczenie 2: Umieść po jednej elektrodzie na prawej i lewej kończynie górnej oraz w okolicy kostki na lewej nodze. Elektrodę GND umieść na brzuchu i podłącz ją do wejścia GND wzmacniacza. Elektrody pomiarowe podłącz do unipolarnych wejść wzmacniacza. Uruchom aplikację SVAROG do rejestracji i oglądania sygnałów bioelektrycznych. Korzystając zakładki &amp;amp;bdquo;Montaż&amp;amp;rdquo; utwórz I i II odprowadzenia Einthovena. Spróbuj zaobserwować sygnał EKG. Jeśli Ci się to nie udało, podaj przyczynę i zaproponuj rozwiązanie. Zaprojektuj filtr górnoprzepustowy i zastosuj go do zbieranego sygnału. Znajdź w sygnale EKG poszczególne załamki. &lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
;Ćwiczenie 3: Obok elektrod umieszczonych na prawym i lewym nadgarstku w poprzednim ćwiczeniu doklej kolejne dwie elektrody i połącz je tym razem do wejścia bipolarnego wzmacniacza. Porównaj uzyskany sygnał z sygnałem rejestrowanym z elektrod monopolarnych.&lt;br /&gt;
&lt;br /&gt;
;Ćwiczenie 4: Odłącz elektrody od wejścia bipolarnego.Za pomocą elektrod połączonych z wejściami monopolarnymi zbierz sygnał EKG w odniesieniu Goldbergera.&lt;br /&gt;
 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Ćwiczenie 3: Zbierz fragment sygnału EKG przy pomocy Svaroga. Napisz program który:&lt;br /&gt;
* wczytuje &lt;br /&gt;
* wykonuje stosowne filtracje&lt;br /&gt;
* rysuje sygnał w odprowadzeniach Einthovena i Goldberga,&lt;br /&gt;
* wybierz &amp;quot;czysty&amp;quot; fragment sygnału i zidentyfikuj poszczególne załamki.&lt;br /&gt;
&lt;br /&gt;
;Ćwiczenie 4: Zaproponuj metodę rozpoznawania początku kolejnego cyklu pracy serca. Wyznacz widmo sygnału EKG, zebranego w ćwiczeniu 5 w kolejnych cyklach pracy serca.&lt;br /&gt;
&lt;br /&gt;
;Ćwiczenie 5: Napisz program, który wczyta plik z sygnałem i na jego podstawie wyznaczy tętno (ang. ''heart rate'').&lt;br /&gt;
;Ćwiczenie 6: HRV - heart rate variability. &lt;br /&gt;
* zapoznaj się z koncepcją [https://en.wikipedia.org/wiki/Heart_rate_variability#cite_note-29 HRV]&lt;br /&gt;
* Literatura [https://link.springer.com/article/10.1007/s11517-006-0119-0 Heart rate variability: a review]. &lt;br /&gt;
* napisz program, który przedstawiwa interwały R-R jako szereg czasowy&lt;br /&gt;
* wyestymuj widmo częstotliwościowe tego sygnału&lt;br /&gt;
** uwaga: próbki są pobierane w różnych odstępach! MOżliwa do zastosowania technika to periodogram Lomb-Scarglea https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.lombscargle.html#r0520a0371844-2&lt;br /&gt;
&lt;br /&gt;
==Literatura uzupełniająca==&lt;br /&gt;
&lt;br /&gt;
[http://www.bem.fi/book/19/19.htm#00 podstawowa diagnostyka EKG]&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;!--;Ćwiczenie 8: Wykorzystując poniższe fragmenty kodu, stwórz program, który będzie wyrysowywał zmiany tętna w czasie rzeczywistym.&lt;br /&gt;
Pierwszy fragment kodu, to moduł buforujący sygnał, drugi to moduł pobierający dane z bufora. Należy dopisać do modułu pobierającego dane z bufora przetwarzanie ich (wyrysowywanie tętna) we wskazanym miejscu. &lt;br /&gt;
Uruchamianie całości będzie polegało na:&lt;br /&gt;
* uruchomieniu wzmacniacza&lt;br /&gt;
* uruchomieniu modułu &amp;lt;tt&amp;gt;signal_catcher.py&amp;lt;/tt&amp;gt;&lt;br /&gt;
* uruchomienie &amp;lt;tt&amp;gt;heartrate.py&amp;lt;/tt&amp;gt;, ktory jest dostepny [http://escher.fuw.edu.pl/~mm/zajecia/heartrate.py tu], po wstawieniu do niego w odpowiednie miejsce oznaczone w komentarzu własnego kodu obliczającego tętno.&lt;br /&gt;
* Trochę zmieniona wersja &amp;amp;mdash; [http://escher.fuw.edu.pl/~mm/zajecia/heartrate_new.py &amp;lt;tt&amp;gt;heartrate_new.py&amp;lt;/tt&amp;gt;] oraz  [http://escher.fuw.edu.pl/~mm/zajecia/signal_catcher_pracownia.py &amp;lt;tt&amp;gt;signal_catcher_pracownia.py&amp;lt;/tt&amp;gt;]&lt;br /&gt;
(moduły importują inne moduły, więc trzeba się upewnić że zmienna środowiskowa &amp;lt;tt&amp;gt;PYTHONPATH&amp;lt;/tt&amp;gt; ma odpowiednią wartość, w szczególności musi się w niej znaleźć ścieżka do &amp;lt;tt&amp;gt;azouk-libraries/build/&amp;lt;/tt&amp;gt; aby można było zaimportować moduł &amp;lt;tt&amp;gt;multiplexer&amp;lt;/tt&amp;gt;. Eksportować ścieżki można np tak:&lt;br /&gt;
&amp;lt;tt&amp;gt;export PYTHONPATH=./:openbci/:azouk-libraries/build/:PYTHONPATH&amp;lt;/tt&amp;gt;, tzn. dodajemy ścieżki oddzielone dwukropkiem, tylko należy się upewnić, że dodajemy odpowiednie ścieżki)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/env python&lt;br /&gt;
# signal_catcher.py&lt;br /&gt;
&lt;br /&gt;
import time&lt;br /&gt;
from multiplexer.multiplexer_constants import peers, types&lt;br /&gt;
from multiplexer.clients import BaseMultiplexerServer&lt;br /&gt;
import collections, variables_pb2&lt;br /&gt;
&lt;br /&gt;
class SignalCatcher(BaseMultiplexerServer):&lt;br /&gt;
    def __init__(self, addresses):&lt;br /&gt;
        super(SignalCatcher, self).__init__(addresses=addresses, type=peers.SIGNAL_CATCHER)&lt;br /&gt;
        self.number_of_channels = len(self.conn.query(message=&amp;quot;AmplifierChannelsToRecord&amp;quot;, type=types.DICT_GET_REQUEST_MESSAGE).message.split(&amp;amp;rdquo; &amp;amp;bdquo;))&lt;br /&gt;
        self.buffer = [collections.deque() for z in range(self.number_of_channels)]&lt;br /&gt;
        self.buffer_size = int(self.conn.query(message=&amp;quot;SignalCatcherBufferSize&amp;quot;, type=types.DICT_GET_REQUEST_MESSAGE).message)&lt;br /&gt;
&lt;br /&gt;
    def add(self, value):&lt;br /&gt;
        sampleVector = variables_pb2.SampleVector()&lt;br /&gt;
        sampleVector.ParseFromString(value)&lt;br /&gt;
&lt;br /&gt;
        i = 0&lt;br /&gt;
        for s in values:&lt;br /&gt;
            self.buffer[i].append(s)&lt;br /&gt;
            if len(self.buffer[i]) &amp;gt; self.buffer_size:&lt;br /&gt;
                self.buffer[i].popleft()&lt;br /&gt;
            i += 1&lt;br /&gt;
      &lt;br /&gt;
    def handle_message(self, mxmsg):&lt;br /&gt;
        if mxmsg.type == types.SIGNAL_CATCHER_REQUEST_MESSAGE:&lt;br /&gt;
            vector = variables_pb2.SampleVector()&lt;br /&gt;
            ind = int(mxmsg.message)&lt;br /&gt;
            &lt;br /&gt;
            for i in range(len(self.buffer[ind])):&lt;br /&gt;
                s = vector.samples.add()&lt;br /&gt;
                s.CopyFrom(self.buffer[ind][i])&lt;br /&gt;
            m = vector.SerializeToString()&lt;br /&gt;
            self.send_message(message = m, type = types.SIGNAL_CATCHER_RESPONSE_MESSAGE)&lt;br /&gt;
        elif mxmsg.type == types.AMPLIFIER_SIGNAL_MESSAGE:&lt;br /&gt;
            self.add(mxmsg.message)&lt;br /&gt;
            self.no_response()&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;amp;bdquo;__main__&amp;quot;:&lt;br /&gt;
    SignalCatcher(settings.MULTIPLEXER_ADDRESSES).loop()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* próba obejrzenia zmiany tętna po wysiłku fizycznym, bądź w spoczynku--&amp;gt;&lt;/div&gt;</summary>
		<author><name>SuperAdmin</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_Sygna%C5%82%C3%B3w_Biologicznych/Zajecia_2_4&amp;diff=7980</id>
		<title>Pracownia Sygnałów Biologicznych/Zajecia 2 4</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Pracownia_Sygna%C5%82%C3%B3w_Biologicznych/Zajecia_2_4&amp;diff=7980"/>
		<updated>2019-03-05T11:52:10Z</updated>

		<summary type="html">&lt;p&gt;SuperAdmin: /* Ćwiczenia */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Rejestracja i analiza sygnału EKG==&lt;br /&gt;
&lt;br /&gt;
Lektura:  [http://www.bem.fi/book/15/15.htm Electric and Magnetic Measurement of the Electric Activity of the Heart/12-Lead ECG System]&lt;br /&gt;
[[Plik:einthoven_ekg.png|250px|thumb|right|&amp;lt;figure id=&amp;quot;fig:einthoven_ekg&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt; Aparat do rejestracji czynności elektrycznej serca skonstruowany przez W. Einthovena. Proszę zauważyć w jakich miejscach na ciele zbierana jest sygnał.]]&lt;br /&gt;
[[Plik:ekg_animacja.gif|250px|thumb|right|&amp;lt;figure id=&amp;quot;fig:ekg_animacja&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt; Rozchodzenie się sygnału stymulujacego pracę serca i związane z tym powstawanie sygnału EKG. Rysunek po brany ze strony Wikipedii.]]&lt;br /&gt;
[[Plik:ekg_opis.png|250px|thumb|right|&amp;lt;figure id=&amp;quot;fig:ekg_opis&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt; Oznaczenia kolejnych składowych sygnału EKG.]]&lt;br /&gt;
[[Plik:wilson.png|250px|thumb|right|&amp;lt;figure id=&amp;quot;fig:wilson&amp;quot;&amp;gt;&amp;lt;/figure&amp;gt; Umiejscowienie elektrod do pomiaru czynności elektrycznej serca z powierzchni klatki piersiowej, rysunek pobrany ze stron Wikipedii.]]&lt;br /&gt;
 &lt;br /&gt;
Mechanizm powstawania czynności elektrycznej serca został omówiony na zajęciach &amp;amp;bdquo;Sygnały Bioelektryczne&amp;quot;. W tym miejscu przypomnimy tylko kilka ważnych (i ciekawych) faktów.&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Czynność elektryczna serca znana jest od połowy XIX, jednakże za początek narodzin elektrokardiografii uznaje się rok 1903, kiedy to W. Einthoven dokonał pomiaru czynności elektrycznej serca z powierzchni ciała (&amp;lt;xr id=&amp;quot;fig:einthoven_ekg&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt;). Jako metoda diagnostyczna, elektrokardiografia zaczęła się szybko rozwijać po roku 1936, kiedy to do rejestracji czynności elektrycznej serca zastosowano wzmacniacz lampowy oraz system zapisu pomiaru na papierze.&lt;br /&gt;
&amp;lt;li&amp;gt; Serce posiada specjalny, wzbudzany samoczynnie układ, który generuje i przewodzi bodźce elektryczne. Następstwem działania tego układu jest rytmiczna praca serca o częstości od 70 do 180 cykli na minutę (częstość ta ulega zmianom pod wpływem czynników biochemicznych, powstałych np. w skutek stresu).&lt;br /&gt;
&amp;lt;li&amp;gt; Elektroda rejestrująca sygnał EKG zbiera czynność elektryczną wszystkich komórek serca, a zatem zarówno komórek wchodzących w skład układu generującego i przewodzącego impulsy elektryczne oraz kurczących się pod wpływem impulsów sterujących mięśni, które kurcząc się, również wytwarzają sygnał elektryczny. Jednakże, z uwagi na nieporównywalnie dużo większą masę mięśni serca w porównaniu z masą komórek układu stymulującego przyjmuje się, że głównym składnikiem sygnału EKG jest czynność elektryczna mięśnia sercowego.&lt;br /&gt;
&amp;lt;li&amp;gt; W przybliżeniu, sygnał stymulujący pracę serca rozchodzi się z jego prawej górnej części w kierunku dolnym i na lewą stronę. Na skutek pobudzania kolejnych partii mięśnia sercowego, powstaje charakterystyczny kształt sygnału EKG (&amp;lt;xr id=&amp;quot;fig:ekg_animacja&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt;, &amp;lt;xr id=&amp;quot;fig:ekg_opis&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt;). &lt;br /&gt;
&amp;lt;li&amp;gt; Oznaczenia kolejnych składowych sygnału EKG:&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; odchylenia od linii poziomej (izoelektrycznej) nazywamy załamkami,&lt;br /&gt;
&amp;lt;li&amp;gt; odległość w czasie pomiędzy końcem załamka P i początkiem załamka Q oraz końcem załamka S i początkiem załamka T nazywamy odcinkami &amp;amp;mdash; odpowiednio PQ i ST.&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Elektrody pomiarowe połączone do aparatury rejestrujących nazywamy odprowadzeniami. Uwaga &amp;amp;mdash; przyjęto odprowadzeniami oznaczać także sygnały EKG będące liniowymi kombinacjami sygnałów zebranych przez elektrody.&lt;br /&gt;
&amp;lt;li&amp;gt; W konwencjonalnej elektroencefalografii stosuje się 12 tzw. odprowadzeń klasycznych:&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Trzy odprowadzenia kończynowe biegunowe, zaproponowane jeszcze przez Einthoven i oznaczane rzymskimi cyframi I, II i III. Elektrody w tym systemie umieszcza się prawej (R) (ang. ''right'') i lewej (L) (ang. ''left'') kończynie górnej (najczęściej w okolicy nadgarstka, czasem ramieniu lub czy barku) oraz lewej nodze w okolicy stopy (F) (ang. ''foot''). Elektrodę umieszczaną na prawym nadgarstku oznacza się kolorem czerwonym, na lewym żółtym, na lewej kostce zielonym. Elektrodę masy umieszcza się zwykle na lewej kostce (choć teoretycznie można ją aplikować gdziekolwiek) i jest ona oznaczona kolorem czarnym. Odprowadzenia kończynowe mierzą różnicę napięć pomiędzy miejscami przyłożenia elektrod w następujący sposób:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;equation id = &amp;quot;eq_1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{ll}&lt;br /&gt;
I   &amp;amp; = V_{L} - V_{R} \\&lt;br /&gt;
II  &amp;amp; = V_{F} - V_{R} \\&lt;br /&gt;
III &amp;amp; = V_{F} - V_{L}&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
gdzie: &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;V_{R}, V_{L}, V_{F}&amp;lt;/math&amp;gt; to potencjały odpowiednio na prawym i lewym nadgarstku oraz stopie mierzone względem elektrody masy.&amp;lt;br/&amp;gt;&lt;br /&gt;
Jak łatwo zauważyć, tylko dwa spośród powyższych napięć są liniowo niezależne, co można zapisać w postaci związku:&lt;br /&gt;
&amp;lt;equation id = &amp;quot;eq_2&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;I + III = II&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
który nazywany jest prawem Einthovena. Proszę zauważyć, iż w tym przypadku wzmacniane jest sygnał będący różnicą napięć dwóch kolejnych elektrod, stąd też te odprowadzenia nazywamy dwubiegunowymi (bipolarnymi).&lt;br /&gt;
&amp;lt;li&amp;gt; Trzy odprowadzenia jednobiegunowe Goldberga. W odprowadzeniach tych sygnał w danym odprowadzeniu jest różnicą napięć pomiędzy elektrodą pomiarową a średnim napięciem na dwóch pozostałych elektrodach:&lt;br /&gt;
&amp;lt;equation id = &amp;quot;eq_3&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{ll}&lt;br /&gt;
aV_{L} &amp;amp; = V_{L} - \frac{V_{R}+V_{F}}{2} \\&lt;br /&gt;
aV_{R} &amp;amp; = V_{R} - \frac{V_{L}+V_{F}}{2} \\&lt;br /&gt;
aV_{F} &amp;amp; = V_{F} - \frac{V_{L}+V_{R}}{2}&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt; Sześć odprowadzeń jednobiegunowych Wilsona. W przypadku warto zapoznać się z z historią tych odprowadzeń. Początkowo Wilson zaproponował układ jednobiegunowych doniesień dla kończyn w następujący sposób:&lt;br /&gt;
&amp;lt;equation id = &amp;quot;eq_4&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{ll}&lt;br /&gt;
V_{LW} &amp;amp; = V_{L} - \frac{V_{R}+V_{L}+ V_{F}}{3} \\&lt;br /&gt;
V_{RW} &amp;amp; = V_{R} - \frac{V_{R}+V_{L}+ V_{F}}{3} \\&lt;br /&gt;
V_{FW} &amp;amp; = V_{F} - \frac{V_{R}+V_{L}+ V_{F}}{3}&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
Jak widzimy, jako elektrodę odniesienia wybrał on średnie napięcie rejestrowane przez elektrody. Niestety, sygnały prezentowane w tym systemie miały małą amplitudę, w związku z czym tego rodzaju odprowadzenia nie stosowano w praktyce. Z systemu zaproponowanego przez Wilsona wywodzi się jednak system odniesień Goldbergera, który zauważył, że napięcie na trzeciej kończynie można zwiększyć o 50% jeśli do wyznaczenia napięcia odniesienia zastosuje się dwie, a nie trzy elektrody. Metoda wyznaczania potencjału odniesienia zaproponowana przez Wilsona znalazła jednak zastosowanie przy mierzeniu czynności elektrycznej serca mierzonej z powierzchni klatki piersiowej. W tym celu elektrody umieszcza się w pewnych ustalonych miejscach (&amp;lt;xr id=&amp;quot;fig:wilson&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt;, zaś odprowadzenia oznacza się symbolami &amp;lt;math&amp;gt;V_1, V_2, \dots, V_6&amp;lt;/math&amp;gt;. Odniesieniem w tym przypadku jest średni sygnał rejestrowany na kończynach górnych i lewej stopie. &lt;br /&gt;
&amp;lt;/ul&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ćwiczenia==&lt;br /&gt;
&lt;br /&gt;
Aby uruchomić zbieranie sygnału należy wykonać następujące operacje:&lt;br /&gt;
* przykleić elektrody do badanego;&lt;br /&gt;
* włożyć przewody do elektrod, a potem do wzmacniacza;&lt;br /&gt;
* podłączyć zasilanie wzmacniacza;&lt;br /&gt;
* podłączyć wzmacniacz do komputera (przejściówka optyczna i kabel USB);&lt;br /&gt;
* otworzyć Terminal i wpisać polecenia:&lt;br /&gt;
** &amp;lt;tt&amp;gt;obci launch ../administrator/obci/scenarios/porti7_ekg.ini&amp;lt;/tt&amp;gt;. Po tym poleceniu wzmacniacz powinien wyświetlać napis &amp;amp;bdquo;Fiber&amp;amp;rdquo;; napis &amp;amp;bdquo;Connect&amp;amp;rdquo; oznacza, że połączenie wzmacniacza z komputerem nie udało się. W takim przypadku wykonujemy polecenie &amp;lt;tt&amp;gt;obci srv_kill&amp;lt;/tt&amp;gt; i powtarzamy próbę połączenia.&lt;br /&gt;
** &amp;lt;tt&amp;gt;svarog&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Ćwiczenie 1: Podaj związek pomiędzy sygnałami mierzonymi w systemie Goldbergera, a systemem Einthovena. Podaj analogiczny związek pomiędzy sygnałami w odniesieniach Goldberga co ''Prawo Einthovena''. Pokaż, że w systemie Goldbergera uzyskuje się sygnały o amplitudzie o 50% wyższej niż w pierwotnym systemie Wilsona. &lt;br /&gt;
&lt;br /&gt;
;Ćwiczenie 2: Umieść po jednej elektrodzie na prawej i lewej kończynie górnej oraz w okolicy kostki na lewej nodze. Elektrodę GND umieść na brzuchu i podłącz ją do wejścia GND wzmacniacza. Elektrody pomiarowe podłącz do unipolarnych wejść wzmacniacza. Uruchom aplikację SVAROG do rejestracji i oglądania sygnałów bioelektrycznych. Korzystając zakładki &amp;amp;bdquo;Montaż&amp;amp;rdquo; utwórz I i II odprowadzenia Einthovena. Spróbuj zaobserwować sygnał EKG. Jeśli Ci się to nie udało, podaj przyczynę i zaproponuj rozwiązanie. Zaprojektuj filtr górnoprzepustowy i zastosuj go do zbieranego sygnału. Znajdź w sygnale EKG poszczególne załamki. &lt;br /&gt;
&lt;br /&gt;
;Ćwiczenie 3: &amp;lt;!--Obok elektrod umieszczonych na prawym i lewym nadgarstku w poprzednim ćwiczeniu doklej kolejne dwie elektrody i połącz je tym razem do wejścia bipolarnego wzmacniacza. Porównaj uzyskany sygnał z sygnałem rejestrowanym z elektrod monopolarnych.&lt;br /&gt;
&lt;br /&gt;
;Ćwiczenie 4: Odłącz elektrody od wejścia bipolarnego.Za pomocą elektrod połączonych z wejściami monopolarnymi zbierz sygnał EKG w odniesieniu Goldbergera.&lt;br /&gt;
 --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;Ćwiczenie 5: Zbierz fragment sygnału EKG przy pomocy Svaroga. Napisz program który:&lt;br /&gt;
* wczytuje &lt;br /&gt;
* wykonuje stosowne filtracje&lt;br /&gt;
* rysuje sygnał w odprowadzeniach Einthovena i Goldberga,&lt;br /&gt;
* wybierz &amp;quot;czysty&amp;quot; fragment sygnału i zidentyfikuj poszczególne załamki.&lt;br /&gt;
&lt;br /&gt;
;Ćwiczenie 6: Zaproponuj metodę rozpoznawania początku kolejnego cyklu pracy serca. Wyznacz widmo sygnału EKG, zebranego w ćwiczeniu 5 w kolejnych cyklach pracy serca.&lt;br /&gt;
&lt;br /&gt;
;Ćwiczenie 7: Napisz program, który wczyta plik z sygnałem i na jego podstawie wyznaczy tętno (ang. ''heart rate'').&lt;br /&gt;
;Ćwiczenie 8: HRV - heart rate variability. &lt;br /&gt;
* zapoznaj się z koncepcją [https://en.wikipedia.org/wiki/Heart_rate_variability#cite_note-29 HRV]&lt;br /&gt;
* Literatura [https://link.springer.com/article/10.1007/s11517-006-0119-0 Heart rate variability: a review]. &lt;br /&gt;
* napisz program, który przedstawiwa interwały R-R jako szereg czasowy&lt;br /&gt;
* wyestymuj widmo częstotliwościowe tego sygnału&lt;br /&gt;
** uwaga: próbki są pobierane w różnych odstępach! MOżliwa do zastosowania technika to periodogram Lomb-Scarglea https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.lombscargle.html#r0520a0371844-2&lt;br /&gt;
&lt;br /&gt;
==Literatura uzupełniająca==&lt;br /&gt;
&lt;br /&gt;
[http://www.bem.fi/book/19/19.htm#00 podstawowa diagnostyka EKG]&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;!--;Ćwiczenie 8: Wykorzystując poniższe fragmenty kodu, stwórz program, który będzie wyrysowywał zmiany tętna w czasie rzeczywistym.&lt;br /&gt;
Pierwszy fragment kodu, to moduł buforujący sygnał, drugi to moduł pobierający dane z bufora. Należy dopisać do modułu pobierającego dane z bufora przetwarzanie ich (wyrysowywanie tętna) we wskazanym miejscu. &lt;br /&gt;
Uruchamianie całości będzie polegało na:&lt;br /&gt;
* uruchomieniu wzmacniacza&lt;br /&gt;
* uruchomieniu modułu &amp;lt;tt&amp;gt;signal_catcher.py&amp;lt;/tt&amp;gt;&lt;br /&gt;
* uruchomienie &amp;lt;tt&amp;gt;heartrate.py&amp;lt;/tt&amp;gt;, ktory jest dostepny [http://escher.fuw.edu.pl/~mm/zajecia/heartrate.py tu], po wstawieniu do niego w odpowiednie miejsce oznaczone w komentarzu własnego kodu obliczającego tętno.&lt;br /&gt;
* Trochę zmieniona wersja &amp;amp;mdash; [http://escher.fuw.edu.pl/~mm/zajecia/heartrate_new.py &amp;lt;tt&amp;gt;heartrate_new.py&amp;lt;/tt&amp;gt;] oraz  [http://escher.fuw.edu.pl/~mm/zajecia/signal_catcher_pracownia.py &amp;lt;tt&amp;gt;signal_catcher_pracownia.py&amp;lt;/tt&amp;gt;]&lt;br /&gt;
(moduły importują inne moduły, więc trzeba się upewnić że zmienna środowiskowa &amp;lt;tt&amp;gt;PYTHONPATH&amp;lt;/tt&amp;gt; ma odpowiednią wartość, w szczególności musi się w niej znaleźć ścieżka do &amp;lt;tt&amp;gt;azouk-libraries/build/&amp;lt;/tt&amp;gt; aby można było zaimportować moduł &amp;lt;tt&amp;gt;multiplexer&amp;lt;/tt&amp;gt;. Eksportować ścieżki można np tak:&lt;br /&gt;
&amp;lt;tt&amp;gt;export PYTHONPATH=./:openbci/:azouk-libraries/build/:PYTHONPATH&amp;lt;/tt&amp;gt;, tzn. dodajemy ścieżki oddzielone dwukropkiem, tylko należy się upewnić, że dodajemy odpowiednie ścieżki)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/env python&lt;br /&gt;
# signal_catcher.py&lt;br /&gt;
&lt;br /&gt;
import time&lt;br /&gt;
from multiplexer.multiplexer_constants import peers, types&lt;br /&gt;
from multiplexer.clients import BaseMultiplexerServer&lt;br /&gt;
import collections, variables_pb2&lt;br /&gt;
&lt;br /&gt;
class SignalCatcher(BaseMultiplexerServer):&lt;br /&gt;
    def __init__(self, addresses):&lt;br /&gt;
        super(SignalCatcher, self).__init__(addresses=addresses, type=peers.SIGNAL_CATCHER)&lt;br /&gt;
        self.number_of_channels = len(self.conn.query(message=&amp;quot;AmplifierChannelsToRecord&amp;quot;, type=types.DICT_GET_REQUEST_MESSAGE).message.split(&amp;amp;rdquo; &amp;amp;bdquo;))&lt;br /&gt;
        self.buffer = [collections.deque() for z in range(self.number_of_channels)]&lt;br /&gt;
        self.buffer_size = int(self.conn.query(message=&amp;quot;SignalCatcherBufferSize&amp;quot;, type=types.DICT_GET_REQUEST_MESSAGE).message)&lt;br /&gt;
&lt;br /&gt;
    def add(self, value):&lt;br /&gt;
        sampleVector = variables_pb2.SampleVector()&lt;br /&gt;
        sampleVector.ParseFromString(value)&lt;br /&gt;
&lt;br /&gt;
        i = 0&lt;br /&gt;
        for s in values:&lt;br /&gt;
            self.buffer[i].append(s)&lt;br /&gt;
            if len(self.buffer[i]) &amp;gt; self.buffer_size:&lt;br /&gt;
                self.buffer[i].popleft()&lt;br /&gt;
            i += 1&lt;br /&gt;
      &lt;br /&gt;
    def handle_message(self, mxmsg):&lt;br /&gt;
        if mxmsg.type == types.SIGNAL_CATCHER_REQUEST_MESSAGE:&lt;br /&gt;
            vector = variables_pb2.SampleVector()&lt;br /&gt;
            ind = int(mxmsg.message)&lt;br /&gt;
            &lt;br /&gt;
            for i in range(len(self.buffer[ind])):&lt;br /&gt;
                s = vector.samples.add()&lt;br /&gt;
                s.CopyFrom(self.buffer[ind][i])&lt;br /&gt;
            m = vector.SerializeToString()&lt;br /&gt;
            self.send_message(message = m, type = types.SIGNAL_CATCHER_RESPONSE_MESSAGE)&lt;br /&gt;
        elif mxmsg.type == types.AMPLIFIER_SIGNAL_MESSAGE:&lt;br /&gt;
            self.add(mxmsg.message)&lt;br /&gt;
            self.no_response()&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;amp;bdquo;__main__&amp;quot;:&lt;br /&gt;
    SignalCatcher(settings.MULTIPLEXER_ADDRESSES).loop()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* próba obejrzenia zmiany tętna po wysiłku fizycznym, bądź w spoczynku--&amp;gt;&lt;/div&gt;</summary>
		<author><name>SuperAdmin</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/Analiza_czas-cz%C4%99sto%C5%9B%C4%87_w_matlabie&amp;diff=6796</id>
		<title>Laboratorium EEG/Analiza czas-częstość w matlabie</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/Analiza_czas-cz%C4%99sto%C5%9B%C4%87_w_matlabie&amp;diff=6796"/>
		<updated>2017-03-21T07:52:22Z</updated>

		<summary type="html">&lt;p&gt;SuperAdmin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Laboratorium_EEG]]/Czas-częstość&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/open?id=0BzwQ_Lscn8yDRlBmOGRoVkEydEE paczka z materiałami do pierwszej części ćwiczeń]&lt;br /&gt;
&lt;br /&gt;
[http://www.fuw.edu.pl/~suffa/LabEEG/TF.zip Moduł czas-częstość w Matlabie]&lt;br /&gt;
&lt;br /&gt;
=Zasada nieoznaczoności dla przestrzeni czas-częstość=&lt;br /&gt;
Poniższy rysunek obrazuje koncepcję zasady nieoznaczoności w przypadku analizy czas-częstość: im dokładniej znamy lokalizację interesującego nas fragmentu sygnału (struktury) w czasie tym mniej dokładnie możemy poznać jego częstość.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Zasada_nieoznaczonosci_tf.png|400px]]&lt;br /&gt;
&lt;br /&gt;
Zasadę tą można wyrazić formalnie w następujący sposób. &lt;br /&gt;
Potraktujmy moc sygnału &amp;lt;math&amp;gt;x(t)&amp;lt;/math&amp;gt; (o skończonej energii) jak rozkład zmiennej losowej. Aby rozkład był unormowany trzeba podzielić go przez energię sygnału: &amp;lt;math&amp;gt;E_x = \int_{-\infty}^{\infty} |x(t)|^2 dt &amp;lt; \infty&amp;lt;/math&amp;gt;. Zatem rozkład ten jest postaci: &amp;lt;math&amp;gt;p(t) = \frac{1}{E_x}|x(t)|^2 &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Jako lokalizację występowania sygnału w czasie przyjmujemy średnie położenie jego energii:&lt;br /&gt;
: &amp;lt;math&amp;gt;t_0 = \frac{1}{E_x} \int_{-\infty}^{\infty}t |x(t)|^2 dt&amp;lt;/math&amp;gt;&lt;br /&gt;
zaś jako miarę skupienia energii wokół tego położenia przyjmujemy wariancję:&lt;br /&gt;
: &amp;lt;math&amp;gt;\sigma_t^2 = \frac{1}{E_x}\int_{-\infty}^{\infty} (t - t_0)^2 |x(t)|^2 dt &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Analogicznie w dziedzinie częstości (tu traktujemy gęstość widmową mocy jak gęstość prawdopodobieństwa):&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;f_0 = \frac{1}{E_x} \int_{-\infty}^{\infty}f |X(f)|^2 df&amp;lt;/math&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;\sigma_f^2 = \frac{1}{E_x}\int_{-\infty}^{\infty} (f - f_0)^2 |X(f)|^2 df &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Można pokazać (np. Pinsky, 2002), że iloczyn wariancji energii w czasie i w częstości jest ograniczony od dołu:&lt;br /&gt;
: &amp;lt;math&amp;gt;\sigma_t^2 \sigma_f^2 \ge \frac{1}{16 \pi^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Estymatory gęstości widmowej dla przestrzeni czas-częstość=&lt;br /&gt;
Energię sygnału w jednej z dziedzin, czasu bądź częstości, możemy policzyć tak:&lt;br /&gt;
: &amp;lt;math&amp;gt; E_x=\int_{-\infty}^{\infty}{|x(t)|^2 dt} = \int_{-\infty}^{\infty}{|X(f)|^2 df}&amp;lt;/math&amp;gt; &lt;br /&gt;
i interpretujemy &amp;lt;math&amp;gt;|x(t)|^2&amp;lt;/math&amp;gt;  albo &amp;lt;math&amp;gt;|X(f)|^2&amp;lt;/math&amp;gt;  jako gęstości energii.&lt;br /&gt;
Stąd pomysł, żeby rozszerzyć tą koncepcję na obie dziedziny jednocześnie i wprowadzić pojęcie gęstości energii w dziedzinie czas-częstość &amp;lt;math&amp;gt;\rho_x(t,f)&amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; E_x=\int_{-\infty}^{\infty}\int_{-\infty}^{\infty}{\rho_x(t,f) dt df}&amp;lt;/math&amp;gt; &lt;br /&gt;
muszą też być spełnione własności brzegowe:&lt;br /&gt;
: &amp;lt;math&amp;gt; \int_{-\infty}^{\infty}{\rho_x(t,f) dt}=|X(f)|^2&amp;lt;/math&amp;gt; &lt;br /&gt;
: &amp;lt;math&amp;gt; \int_{-\infty}^{\infty}{\rho_x(t,f) df} = |x(t)|^2&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
==Dystrybucja energii==&lt;br /&gt;
Podobnie jak widmo mocy, gęstość energii fizycznego sygnału nie może być obliczona, może być jedynie estymowana. W celu estymacji gęstości energii można posłużyć się dwuwymiarowymi dystrybucjami energii. &lt;br /&gt;
Jedną z podstawowych dystrybucji jest dystrybucja  Wigner-Ville'a (WVD):&lt;br /&gt;
: &amp;lt;math&amp;gt; W_x(t,f)=\int_{-\infty}^{\infty}x(t+\tau/2)x^*(t-\tau/2)e^{-i 2 \pi f \tau} d\tau&amp;lt;/math&amp;gt; &lt;br /&gt;
lub&lt;br /&gt;
: &amp;lt;math&amp;gt; W_x(t,f) = \int_{-\infty}^{\infty} X(f+\xi/2)X^*(f-\xi/2) e^{i 2 \pi \xi t} d\xi&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
===Implementacja===&lt;br /&gt;
Przykładowa implementacja WVD dla sygnału rzeczywistego:&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=wersja w pythonie}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import pylab as py&lt;br /&gt;
import scipy.signal as ss&lt;br /&gt;
&lt;br /&gt;
def wvd(x, Fs, plot=True):&lt;br /&gt;
    samples = len(x)&lt;br /&gt;
    N = samples / 2&lt;br /&gt;
    z = np.zeros(samples)&lt;br /&gt;
    xh = ss.hilbert(x)&lt;br /&gt;
    x_period_h = np.concatenate((z,xh,z));&lt;br /&gt;
 &lt;br /&gt;
    t = range(0, samples, 1)  # czas w samplach&lt;br /&gt;
    tfr = np.zeros((samples , samples), dtype=complex)&lt;br /&gt;
    for ti in t:&lt;br /&gt;
        for tau in range(-samples/2,samples/2):&lt;br /&gt;
	    tfr[samples/2 + tau, ti] =  x_period_h[samples+ti +  tau] * x_period_h[samples+ti - tau].conj() &lt;br /&gt;
    tfr = np.fft.fftshift(tfr,axes = 0)&lt;br /&gt;
    Tfr = np.fft.fft(tfr, samples, axis=0)/samples&lt;br /&gt;
    ts = np.array(t, dtype=float) / (float(Fs))&lt;br /&gt;
    f = np.linspace(0, Fs / 2, N)&lt;br /&gt;
    if plot:&lt;br /&gt;
        py.imshow( Tfr.real, interpolation='nearest', extent=[0, ts[-1], 0, f[-1]], origin='lower', aspect='auto')&lt;br /&gt;
        py.show()&lt;br /&gt;
    return Tfr, ts, f&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
'''Wersja w Matlabie'''&lt;br /&gt;
&amp;lt;source lang = matlab&amp;gt;&lt;br /&gt;
function [Tfr,ts,f]=tf_wvd(x,Fs,varargin)&lt;br /&gt;
&lt;br /&gt;
doplot = true;&lt;br /&gt;
switch nargin&lt;br /&gt;
    case 0:1&lt;br /&gt;
        disp('tf_wvd - not enough input arguments');&lt;br /&gt;
        return&lt;br /&gt;
    case 2&lt;br /&gt;
&lt;br /&gt;
    otherwise&lt;br /&gt;
        doplot=varargin{1};&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
x = hilbert(x);&lt;br /&gt;
samples = length(x);&lt;br /&gt;
N = floor(samples/2);&lt;br /&gt;
t = 0:samples; t(end)= [];&lt;br /&gt;
tfr = zeros(N,samples);&lt;br /&gt;
for ti=t&lt;br /&gt;
    for tau=0:min(ti,samples-ti)-1&lt;br /&gt;
        tfr(tau+1,ti+1) = x(ti+tau+1).*conj(x(ti-tau+1));&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Tfr = fft(tfr,samples,1);&lt;br /&gt;
ts = t./Fs;&lt;br /&gt;
f = linspace(0,Fs/2,N);&lt;br /&gt;
&lt;br /&gt;
if doplot&lt;br /&gt;
    pcolor(linspace(0,ts(end),size(Tfr,2)),linspace(0,f(end),size(Tfr,1)),real(Tfr)); shading interp;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Własności===&lt;br /&gt;
Własności WVD:&lt;br /&gt;
* zachowanie energii &lt;br /&gt;
* własności brzegowe&lt;br /&gt;
* zachowywanie przesunięcia w czasie i w częstości&lt;br /&gt;
: &amp;lt;math&amp;gt; y(t) = x(t-t_0) \Rightarrow W_y(t,f) = W_x(t-t_0,f)&amp;lt;/math&amp;gt; &lt;br /&gt;
: &amp;lt;math&amp;gt; y(t) = x(t)e^{i 2 \pi f_0 t} \Rightarrow W_y(t,f) = W_x(t,f-f_0)&amp;lt;/math&amp;gt; &lt;br /&gt;
* zachowywanie skalowania&lt;br /&gt;
: &amp;lt;math&amp;gt; y(t)=\sqrt{k}x(kt) \Rightarrow W_y(t,f) = W_x(kt, f/k)&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
===Wyrazy mieszane===&lt;br /&gt;
WVD jest reprezentacją kwadratową &amp;amp;mdash; dekompozycja sumy sygnałów nie jest sumą ich dekopozycji. Mamy więc:&lt;br /&gt;
: &amp;lt;math&amp;gt; y(t) = x_1(t)+x_2(t) \Rightarrow W_y(t, f) = W_{x_1}(t, f)+W_{x_2}(t, f)+W_{x_1,x_2}(t, f)+W_{x_2,x_1}(t, f)&amp;lt;/math&amp;gt; &lt;br /&gt;
gdzie &lt;br /&gt;
: &amp;lt;math&amp;gt; W_{x_1,x_2}(t, f) = \int_{-\infty}^{\infty} x_1(t+\tau/2)x_2^*(t-\tau/2)e^{-i 2 \pi f \tau} d\tau&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Rozdzielczość===&lt;br /&gt;
&lt;br /&gt;
* idealnie dla chirpów liniowych (sygnał o liniowo zmieniającej się częstości chwilowej):&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=wersja w pythonie}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import tf as tf&lt;br /&gt;
import pylab as py&lt;br /&gt;
&lt;br /&gt;
Fs = 512.0&lt;br /&gt;
T = 1.0&lt;br /&gt;
t = tf.czas(T,Fs)&lt;br /&gt;
ch = tf.chirp(5,Fs/2-5,T,Fs)&lt;br /&gt;
Tfr,ts,f = tf.wvd(ch,Fs,False)&lt;br /&gt;
py.subplot(2,1,1)&lt;br /&gt;
py.plot(t,ch)&lt;br /&gt;
py.subplot(2,1,2)&lt;br /&gt;
py.imshow(Tfr.real,interpolation= 'nearest',extent=[0,ts[-1],0,f[-1]],origin='lower',aspect='auto')&lt;br /&gt;
py.show() &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
'''Wersja w Matlabie'''&lt;br /&gt;
&amp;lt;source lang = matlab&amp;gt;&lt;br /&gt;
Fs = 512.0;&lt;br /&gt;
T = 1.0;&lt;br /&gt;
t = tf_czas(T,Fs);&lt;br /&gt;
ch = tf_chirp(5,Fs/2-5,T,Fs);&lt;br /&gt;
[Tfr,ts,f] = tf_wvd(ch,Fs,false);&lt;br /&gt;
subplot(2,1,1)&lt;br /&gt;
plot(t,ch)&lt;br /&gt;
subplot(2,1,2)&lt;br /&gt;
pcolor(linspace(0,ts(end),size(Tfr,2)),linspace(0,f(end),size(Tfr,1)),real(Tfr)); shading interp;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* struktura wyrazów mieszanych: zaobserwuj, że niezależnie od tego jak bardzo odseparowane są struktury w przestrzeni czas-częstość, pomiędzy nimi powstają wyrazy mieszane. Zauważ, że wyrazy mieszane mają wysoką częstość przestrzennej zmienności.&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=wersja w pythonie}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import tf as tf&lt;br /&gt;
import pylab as py&lt;br /&gt;
&lt;br /&gt;
Fs = 512.0&lt;br /&gt;
T = 1.0&lt;br /&gt;
t = tf.czas(T,Fs)&lt;br /&gt;
s1 = tf.gabor(t0=0.3, sigma = 0.05, T = 1.0, f=100, phi = 0,Fs=Fs)&lt;br /&gt;
s2 = tf.gabor(t0=0.7, sigma = 0.05, T = 1.0, f=200, phi = 0,Fs=Fs)&lt;br /&gt;
s = s1 + s2&lt;br /&gt;
Tfr,ts,f = tf.wvd(s,Fs,False)&lt;br /&gt;
py.subplot(2,1,1)&lt;br /&gt;
py.plot(t,s)&lt;br /&gt;
py.subplot(2,1,2)&lt;br /&gt;
py.imshow(Tfr.real,interpolation= 'nearest',extent=[0,ts[-1],0,f[-1]],origin='lower',aspect='auto')&lt;br /&gt;
py.show()  &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
'''Wersja w Matlabie'''&lt;br /&gt;
&amp;lt;source lang = matlab&amp;gt;&lt;br /&gt;
Fs = 512.0;&lt;br /&gt;
T = 1.0;&lt;br /&gt;
t = tf_czas(T,Fs);&lt;br /&gt;
s1 = tf_gabor(0.3, 0.05, 1.0, 100, 0, Fs);&lt;br /&gt;
s2 = tf_gabor(0.7, 0.05, 1.0, 200, 0, Fs);&lt;br /&gt;
s = s1 + s2;&lt;br /&gt;
[Tfr,ts,f] = tf_wvd(s,Fs,false);&lt;br /&gt;
subplot(2,1,1)&lt;br /&gt;
plot(t,s)&lt;br /&gt;
subplot(2,1,2)&lt;br /&gt;
pcolor(linspace(0,ts(end),size(Tfr,2)),linspace(0,f(end),size(Tfr,1)),real(Tfr)); shading interp;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Klasa Cohena==&lt;br /&gt;
WVD jest najprostszym elementem klasy Cohena &amp;amp;mdash; klasy kwadratowych rozkładów energii w dziedzinie czas-częstość, niezmienniczych przy translacjach czasu i częstości. &lt;br /&gt;
Ponieważ wyrazy mieszane mają wysoką częstość przestrzenną w płaszczyźnie czas-częstość to można je częściowo zniwelować poprzez zastosowanie odpowiedniego filtra. Koncepcja ta jest wykorzystywana w klasie Cohena.&lt;br /&gt;
Ogólnie klasę tę można zapisać jako:&lt;br /&gt;
: &amp;lt;math&amp;gt; C_x(t,f,\Pi) = \int_{-\infty}^{\infty} \int_{-\infty}^{\infty} \Pi(s-t, \xi - f) W_x(s,\xi) ds d\xi&amp;lt;/math&amp;gt; &lt;br /&gt;
gdzie&lt;br /&gt;
: &amp;lt;math&amp;gt; \Pi(t,f) =  \int_{-\infty}^{\infty}\int_{-\infty}^{\infty} f(\xi, \tau) e^{-i 2 \pi (f\tau + \xi t)} dt df&amp;lt;/math&amp;gt; &lt;br /&gt;
Najczęściej &amp;lt;math&amp;gt; \Pi&amp;lt;/math&amp;gt;  wybiera się jako pewną funkcję gładzącą &amp;amp;mdash; w zależności od tego wyboru będziemy mieli w różnym stopniu osłabiane wyrazy mieszane.&lt;br /&gt;
&lt;br /&gt;
==Krótkoczasowa transformacja Fouriera i spektrogram==&lt;br /&gt;
&lt;br /&gt;
===Definicja krótkoczasowej transformacji Fouriera===&lt;br /&gt;
Krótkoczasowa transformacja Fouriera (ang. ''short-time Fourier transform'', ''STFT'') może być rozumiana jako seria transformacji Fouriera wykonanych na sygnale podzielonym na okienka, przy czym położenie okienka w czasie jest w ramach takiej serii przesuwane monotonicznie. W wersji ciągłej możemy to zapisać tak:&lt;br /&gt;
: &amp;lt;math&amp;gt;F_x(t,f; h)= \int_{-\infty}^{\infty}{x(u) h^*(u-t)e^{- i 2 \pi u f} du} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Własności===&lt;br /&gt;
Jeśli okienko ma skończoną energię to STFT jest transformacją odwracalną i można odzyskać z niej sygnał w reprezentacji czasowej:&lt;br /&gt;
: &amp;lt;math&amp;gt; x(t) = \frac{1}{E_h}\int_{-\infty}^{\infty}\int_{-\infty}^{\infty}F_x(u,f;h)h(t-u)e^{i 2\pi t f}\,du\,df &amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;E_h=\int_{-\infty}^{\infty}|h(t)|^2\,dt &amp;lt;/math&amp;gt;&lt;br /&gt;
Tak więc sygnał może być rozłożony na liniową kombinację elementarnych falek-&amp;amp;bdquo;atomów&amp;amp;rdquo; postaci:&lt;br /&gt;
: &amp;lt;math&amp;gt;h_{t,f}(u)=h(u-t)e^{i 2 \pi f u}&amp;lt;/math&amp;gt;&lt;br /&gt;
Każdy atom uzyskiwany jest przez translację pojedynczego okna &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; w czasie i jego modulację częstością &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Spektrogram===&lt;br /&gt;
====Definicja====&lt;br /&gt;
Spektrogram: kwadrat modułu STFT jest estymatą gęstości energii w przestrzeni czas-częstość:&lt;br /&gt;
: &amp;lt;math&amp;gt;S_x(t, f) =\left|\int_{-\infty}^{\infty}{x(u) h^*(u - t) e^{-i 2\pi f u} du}\right|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Implementacja====&lt;br /&gt;
* Spektrogram zaiplementowany jest w pythonie w module matplotlib.pyplot jako funkcja &amp;lt;tt&amp;gt;specgram&amp;lt;/tt&amp;gt; ([http://matplotlib.sourceforge.net/api/pyplot_api.html#matplotlib.pyplot.specgram dokumentacja]).&lt;br /&gt;
* W matlabie spectrogram jest zaimplementowany w signal procesing toolbox: &lt;br /&gt;
[http://www.mathworks.com/help/signal/ref/spectrogram.html dokumentacja]&lt;br /&gt;
&lt;br /&gt;
====Własności====&lt;br /&gt;
=====Przesunięcia =====&lt;br /&gt;
Spektrogram zachowuje przesunięcie:&lt;br /&gt;
&lt;br /&gt;
w czasie&lt;br /&gt;
:&amp;lt;math&amp;gt;y(t) = x(t - t_0)\Rightarrow  S_y(t, f; h) = S_x(t - t_0, f; h)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=wersja w pythonie}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import matplotlib.pyplot as py&lt;br /&gt;
from tf import czas, gabor&lt;br /&gt;
import numpy as np&lt;br /&gt;
import scipy.signal as ss&lt;br /&gt;
&lt;br /&gt;
# parametry&lt;br /&gt;
t0    = 1.0&lt;br /&gt;
sigma = 0.1&lt;br /&gt;
T     = 4.0&lt;br /&gt;
f     = 10&lt;br /&gt;
phi   = 0&lt;br /&gt;
Fs    = 128.0&lt;br /&gt;
NFFT  = int(Fs)&lt;br /&gt;
&lt;br /&gt;
sig1 = gabor(t0, sigma, T, f, phi, Fs) # sygnał&lt;br /&gt;
sig2 = gabor(t0 + 2, sigma, T, f, phi, Fs) # sygnał przesunięty w czasie&lt;br /&gt;
&lt;br /&gt;
py.subplot(221)&lt;br /&gt;
h = ss.hamming(NFFT)&lt;br /&gt;
sig1_padded = (np.concatenate((np.zeros(NFFT/2),sig1,np.zeros(NFFT/2))))&lt;br /&gt;
P,f,t,im1 = py.specgram(sig1_padded,NFFT = len(h),Fs = Fs,window = h, noverlap = NFFT-1, sides = 'onesided') &lt;br /&gt;
py.imshow(P,aspect='auto',origin='lower',extent=(t[0]-(NFFT/2)/Fs,t[-1]-(NFFT/2)/Fs,f[0],f[-1]),interpolation='nearest')&lt;br /&gt;
&lt;br /&gt;
py.subplot(222)&lt;br /&gt;
sig2_padded = (np.concatenate((np.zeros(NFFT/2),sig2,np.zeros(NFFT/2))))&lt;br /&gt;
P,f,t,im2 = py.specgram(sig2_padded,NFFT = len(h),Fs = Fs,window = h, noverlap = NFFT-1, sides = 'onesided') &lt;br /&gt;
py.imshow(P,aspect='auto',origin='lower',extent=(t[0]-(NFFT/2)/Fs,t[-1]-(NFFT/2)/Fs,f[0],f[-1]),interpolation='nearest')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
py.subplot(223)&lt;br /&gt;
time    = czas(T, Fs)&lt;br /&gt;
py.plot(time,sig1)&lt;br /&gt;
&lt;br /&gt;
py.subplot(224)&lt;br /&gt;
py.plot(time ,sig2)&lt;br /&gt;
&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
'''Wersja w Matlabie'''&lt;br /&gt;
&amp;lt;source lang = matlab&amp;gt;&lt;br /&gt;
% parametry&lt;br /&gt;
t0    = 1.0;&lt;br /&gt;
sigma = 0.1;&lt;br /&gt;
T     = 4.0;&lt;br /&gt;
f     = 10;&lt;br /&gt;
phi   = 0;&lt;br /&gt;
Fs    = 128.0;&lt;br /&gt;
NFFT  = floor(Fs);&lt;br /&gt;
 &lt;br /&gt;
sig1 = tf_gabor(t0, sigma, T, f, phi, Fs); &lt;br /&gt;
        % sygnał&lt;br /&gt;
sig2 = tf_gabor(t0 + 2, sigma, T, f, phi, Fs); &lt;br /&gt;
        % sygnał przesunięty w czasie&lt;br /&gt;
 &lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
sig1_padded = [zeros(1,floor(NFFT/2)), sig1, zeros(1,floor(NFFT/2))];&lt;br /&gt;
P=spectrogram(sig1_padded,NFFT,NFFT-1,NFFT,Fs);&lt;br /&gt;
pcolor(linspace(0,T,size(P,2)),linspace(0,Fs/2,size(P,1)),abs(P)); shading interp;&lt;br /&gt;
&lt;br /&gt;
subplot(2,2,2)&lt;br /&gt;
sig2_padded = [zeros(1,floor(NFFT/2)), sig2, zeros(1,floor(NFFT/2))];&lt;br /&gt;
P=spectrogram(sig2_padded,NFFT,NFFT-1,NFFT,Fs);&lt;br /&gt;
pcolor(linspace(0,T,size(P,2)),linspace(0,Fs/2,size(P,1)),abs(P)); shading interp;&lt;br /&gt;
&lt;br /&gt;
subplot(2,2,3)&lt;br /&gt;
time    = tf_czas(T, Fs);&lt;br /&gt;
plot(time,sig1);&lt;br /&gt;
  &lt;br /&gt;
subplot(2,2,4)&lt;br /&gt;
plot(time ,sig2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
i w częstości:&lt;br /&gt;
: &amp;lt;math&amp;gt;y(t) = x(t) e ^{i 2 \pi f_0 t}\Rightarrow S_y(t, f; h) = S_x(t, f - f_0; h)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=wersja w pythonie}}&lt;br /&gt;
&amp;lt;source lang =python&amp;gt;&lt;br /&gt;
import matplotlib.pyplot as py&lt;br /&gt;
from tf import czas, gabor&lt;br /&gt;
import numpy as np&lt;br /&gt;
import scipy.signal as ss&lt;br /&gt;
&lt;br /&gt;
# parametry&lt;br /&gt;
t0    = 1.0&lt;br /&gt;
sigma = 0.1&lt;br /&gt;
T     = 4.0&lt;br /&gt;
f     = 10&lt;br /&gt;
phi   = 0&lt;br /&gt;
Fs    = 128.0&lt;br /&gt;
NFFT  = int(Fs)&lt;br /&gt;
time    = czas(T, Fs)&lt;br /&gt;
sig1 = gabor(t0, sigma, T, f, phi, Fs) # sygnał&lt;br /&gt;
sig2 = gabor(t0, sigma, T, f+20, phi, Fs)# sygnał przesunięty w częstości&lt;br /&gt;
&lt;br /&gt;
py.subplot(221)&lt;br /&gt;
h = ss.hamming(NFFT)&lt;br /&gt;
sig1_padded = (np.concatenate((np.zeros(NFFT/2),sig1,np.zeros(NFFT/2))))&lt;br /&gt;
P,f,t,im1 = py.specgram(sig1_padded,NFFT = len(h),Fs = Fs,window = h, noverlap = NFFT-1, sides = 'onesided') &lt;br /&gt;
py.imshow(P,aspect='auto',origin='lower',extent=(t[0]-(NFFT/2)/Fs,t[-1]-(NFFT/2)/Fs,f[0],f[-1]),interpolation='nearest')&lt;br /&gt;
&lt;br /&gt;
py.subplot(222)&lt;br /&gt;
sig2_padded = (np.concatenate((np.zeros(NFFT/2),sig2,np.zeros(NFFT/2))))&lt;br /&gt;
P,f,t,im2 = py.specgram(sig2_padded,NFFT = len(h),Fs = Fs,window = h, noverlap = NFFT-1, sides = 'onesided') &lt;br /&gt;
py.imshow(P,aspect='auto',origin='lower',extent=(t[0]-(NFFT/2)/Fs,t[-1]-(NFFT/2)/Fs,f[0],f[-1]),interpolation='nearest')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
py.subplot(223)&lt;br /&gt;
py.plot(time,sig1)&lt;br /&gt;
&lt;br /&gt;
py.subplot(224)&lt;br /&gt;
py.plot(time ,sig2)&lt;br /&gt;
&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
'''Wersja w Matlabie'''&lt;br /&gt;
&amp;lt;source lang =matlab&amp;gt;&lt;br /&gt;
% parametry&lt;br /&gt;
t0    = 1.0;&lt;br /&gt;
sigma = 0.1;&lt;br /&gt;
T     = 4.0;&lt;br /&gt;
f     = 10;&lt;br /&gt;
phi   = 0;&lt;br /&gt;
Fs    = 128.0;&lt;br /&gt;
NFFT  = floor(Fs);&lt;br /&gt;
time    = tf_czas(T, Fs);&lt;br /&gt;
sig1 = tf_gabor(t0, sigma, T, f, phi, Fs); &lt;br /&gt;
        % sygnał&lt;br /&gt;
sig2 = tf_gabor(t0, sigma, T, f+20, phi, Fs);&lt;br /&gt;
        % sygnał przesunięty w częstości&lt;br /&gt;
 &lt;br /&gt;
subplot(2,2,1);&lt;br /&gt;
sig1_padded = [zeros(1,floor(NFFT/2)),sig1,zeros(1,floor(NFFT/2))];&lt;br /&gt;
P=spectrogram(sig1_padded,NFFT,NFFT-1,NFFT,Fs);&lt;br /&gt;
pcolor(linspace(0,T,size(P,2)),linspace(0,Fs/2,size(P,1)),abs(P)); shading interp;&lt;br /&gt;
 &lt;br /&gt;
subplot(2,2,2)&lt;br /&gt;
sig2_padded = [zeros(1,floor(NFFT/2)),sig2,zeros(1,floor(NFFT/2))];&lt;br /&gt;
P=spectrogram(sig2_padded,NFFT,NFFT-1,NFFT,Fs);&lt;br /&gt;
pcolor(linspace(0,T,size(P,2)),linspace(0,Fs/2,size(P,1)),abs(P)); shading interp;&lt;br /&gt;
 &lt;br /&gt;
subplot(2,2,3)&lt;br /&gt;
plot(time,sig1);&lt;br /&gt;
 &lt;br /&gt;
subplot(2,2,4)&lt;br /&gt;
plot(time ,sig2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====Wyrazy mieszane=====&lt;br /&gt;
Spektrogram jest reprezentacją kwadratową. Spektrogram sumy sygnałów nie jest sumą spektrogramów sygnałów składowych, jest tam jeszcze coś: &lt;br /&gt;
: &amp;lt;math&amp;gt;y(t) = x_1(t)+x_2(t) \Rightarrow S_y(t, f) = S_{x_1}(t, f)+S_{x_2}(t, f)+S_{x_1,x_2}(t, f)+S_{x_2,x_1}(t, f)&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie &lt;br /&gt;
: &amp;lt;math&amp;gt;S_{x_1,x_2}(t, f) = F_{x_1}(t, f)F^*_{x_2}(t, f)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jak mogą wyglądać wyrazy mieszane ilustruje poniższy kod. Kolejne subploty pokazują spektrogramy uzyskane dla sygnału będącego sumą dwóch funkcji Gabora o częstościach różniących się o 2 Hz i położeniach różniących się o kolejne wielokrotności 0,1 s.&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=wersja w pythonie}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import matplotlib.pyplot as py&lt;br /&gt;
from tf import czas, gabor&lt;br /&gt;
import numpy as np&lt;br /&gt;
import scipy.signal as ss&lt;br /&gt;
&lt;br /&gt;
# parametry&lt;br /&gt;
t0    = 1.0&lt;br /&gt;
sigma = 0.05&lt;br /&gt;
T     = 2.0&lt;br /&gt;
f0     = 20&lt;br /&gt;
phi   = 0&lt;br /&gt;
Fs    = 128.0&lt;br /&gt;
NFFT  = int(Fs)&lt;br /&gt;
time  = czas(T, Fs)&lt;br /&gt;
h = ss.hamming(NFFT)&lt;br /&gt;
&lt;br /&gt;
for i in range(9):&lt;br /&gt;
    py.subplot(3,3,i+1)&lt;br /&gt;
    sig1  = gabor(t0, sigma, T, f0, phi, Fs) # sygnal&lt;br /&gt;
    sig2  = gabor(t0+i*0.1, sigma, T, f0+2, phi, Fs)# sygnał przesunięty w częstości o 2 Hz i w czasie o i*0.1 s&lt;br /&gt;
    sig1_padded = (np.concatenate((np.zeros(NFFT/2),sig1,np.zeros(NFFT/2))))&lt;br /&gt;
    sig2_padded = (np.concatenate((np.zeros(NFFT/2),sig2,np.zeros(NFFT/2))))&lt;br /&gt;
    P,f,t,im1 = py.specgram(sig1_padded+sig2_padded,NFFT = len(h),Fs = Fs,window = h, noverlap = NFFT-1, sides = 'onesided') &lt;br /&gt;
    py.imshow(P,aspect='auto',origin='lower',extent=(t[0]-(NFFT/2)/Fs,t[-1]-(NFFT/2)/Fs,f[0],f[-1]),interpolation='nearest')&lt;br /&gt;
    &lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
'''Wersja w Matlabie'''&lt;br /&gt;
&amp;lt;source lang = matlab&amp;gt;&lt;br /&gt;
% parametry&lt;br /&gt;
t0    = 1.0;&lt;br /&gt;
sigma = 0.05;&lt;br /&gt;
T     = 2.0;&lt;br /&gt;
f0    = 20;&lt;br /&gt;
phi   = 0;&lt;br /&gt;
Fs    = 128.0;&lt;br /&gt;
NFFT  = floor(Fs);&lt;br /&gt;
time  = tf_czas(T, Fs);&lt;br /&gt;
 &lt;br /&gt;
for i=0:8&lt;br /&gt;
    subplot(3,3,i+1)&lt;br /&gt;
    sig1  = tf_gabor(t0, sigma, T, f0, phi, Fs); % sygnal&lt;br /&gt;
    sig2  = tf_gabor(t0+i*0.1, sigma, T, f0+2, phi, Fs);&lt;br /&gt;
        % sygnał przesunięty w częstości o 2 Hz i w czasie o i*0.1 s&lt;br /&gt;
    sig1_padded = [zeros(1,floor(NFFT/2)),sig1,zeros(1,floor(NFFT/2))];&lt;br /&gt;
    sig2_padded = [zeros(1,floor(NFFT/2)),sig2,zeros(1,floor(NFFT/2))];&lt;br /&gt;
    P=spectrogram(sig1_padded+sig2_padded,NFFT,NFFT-1,NFFT,Fs);&lt;br /&gt;
    pcolor(linspace(0,T,size(P,2)),linspace(0,Fs/2,size(P,1)),abs(P)); shading interp;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wyrazy mieszane występują także w przypadku pojedynczej struktury dla sygnału rzeczywistego. &amp;amp;bdquo;Mieszające się&amp;amp;rdquo; obiekty to energia zlokalizowana w dodatniej i ujemnej części widma częstości. Efekt jest stosunkowo słaby i uwidacznia się dopiero na mapach czas-częstość logarytmu gęstości energii. Problem ten można obejść stosując transformację Hilberta, gdyż po tej transformacji cała energia skupiona jest w dodatniej części widma. Własność tę ilustruje poniższy program:&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=wersja w pythonie}}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from matplotlib.pyplot import specgram, plot, subplot, show, imshow&lt;br /&gt;
from tf import czas, gabor&lt;br /&gt;
from numpy import pi, log&lt;br /&gt;
from scipy.signal import hamming, hilbert&lt;br /&gt;
&lt;br /&gt;
# parametry&lt;br /&gt;
t0    = 0.5&lt;br /&gt;
sigma = 0.1&lt;br /&gt;
T     = 1.0&lt;br /&gt;
f     = 30&lt;br /&gt;
phi   = 0&lt;br /&gt;
Fs    = 256.0&lt;br /&gt;
&lt;br /&gt;
s = gabor(t0, sigma, T, f, phi, Fs) &lt;br /&gt;
t = czas(T, Fs)&lt;br /&gt;
&lt;br /&gt;
subplot(411)&lt;br /&gt;
plot(t,s)&lt;br /&gt;
&lt;br /&gt;
subplot(412)&lt;br /&gt;
h = hamming(32)&lt;br /&gt;
NFFT =len(h)&lt;br /&gt;
P,f,t,im1 = specgram(s,NFFT = len(h),Fs = Fs,window = h, noverlap = 31,sides = 'twosided') &lt;br /&gt;
imshow(P,aspect='auto',origin='lower',extent=(t[0]-(NFFT/2)/Fs,t[-1]-(NFFT/2)/Fs,f[0],f[-1]),interpolation='nearest')&lt;br /&gt;
&lt;br /&gt;
subplot(413)&lt;br /&gt;
imshow(log(P),aspect='auto',origin='lower',extent=(t[0]-(NFFT/2)/Fs,t[-1]-(NFFT/2)/Fs,f[0],f[-1]),interpolation='nearest')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
subplot(414)&lt;br /&gt;
s_ana = hilbert(s) # sygnał analityczny&lt;br /&gt;
P,f,t,im2 = specgram(s_ana,NFFT = len(h),Fs = Fs,window = h, noverlap = 31, sides = 'twosided') &lt;br /&gt;
imshow(log(P),aspect='auto',origin='lower',extent=(t[0]-(NFFT/2)/Fs,t[-1]-(NFFT/2)/Fs,f[0],f[-1]),interpolation='nearest')&lt;br /&gt;
&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Wersja w Matlabie'''&lt;br /&gt;
&amp;lt;source lang = matlab&amp;gt;&lt;br /&gt;
% parametry&lt;br /&gt;
t0    = 0.5;&lt;br /&gt;
sigma = 0.1;&lt;br /&gt;
T     = 1.0;&lt;br /&gt;
f     = 30;&lt;br /&gt;
phi   = 0;&lt;br /&gt;
Fs    = 256.0;&lt;br /&gt;
NFFT  = 32;&lt;br /&gt;
Fs2   = floor(Fs/2);&lt;br /&gt;
 &lt;br /&gt;
s = tf_gabor(t0, sigma, T, f, phi, Fs);&lt;br /&gt;
t = tf_czas(T, Fs);&lt;br /&gt;
f = linspace(-Fs2,Fs2,NFFT+1); f(end) = [];&lt;br /&gt;
 &lt;br /&gt;
subplot(4,1,1)&lt;br /&gt;
plot(t,s);&lt;br /&gt;
 &lt;br /&gt;
subplot(4,1,2)&lt;br /&gt;
P=spectrogram(s,NFFT,NFFT-1,f,Fs);&lt;br /&gt;
pcolor(linspace(0,T,size(P,2)),linspace(f(1),f(end),size(P,1)),abs(P)); shading interp;&lt;br /&gt;
 &lt;br /&gt;
subplot(4,1,3)&lt;br /&gt;
pcolor(linspace(0,T,size(P,2)),linspace(f(1),f(end),size(P,1)),log(abs(P))); shading interp;&lt;br /&gt;
 &lt;br /&gt;
subplot(4,1,4)&lt;br /&gt;
s_ana = hilbert(s); % sygnał analityczny&lt;br /&gt;
P=spectrogram(s_ana,NFFT,NFFT-1,f,Fs);&lt;br /&gt;
pcolor(linspace(0,T,size(P,2)),linspace(f(1),f(end),size(P,1)),log(abs(P))); shading interp;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Ćwiczenie:====&lt;br /&gt;
&lt;br /&gt;
* Proszę zbadać rozdzielczość czasową spektrogramu posługując się funkcją delta oraz rozdzielczość częstotliwościową posługując się funkcją sinus (Trzeba &amp;amp;bdquo;przeskanować&amp;amp;rdquo; czas funkcją delta, a częstości sinusem). Proszę wykonać to dla kilku długości okienek ''h''.&lt;br /&gt;
* Proszę zbadać rozdzielczość spektrogramu przy pomocy dwóch funkcji Gabora, dla różnych ich odległości w czasie i w częstości. Zaobserwować strukturę wyrazów mieszanych. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Ciągła transformata falkowa i skalogram==&lt;br /&gt;
===Ciągłą transformata falkowa===&lt;br /&gt;
&lt;br /&gt;
====Definicja ====&lt;br /&gt;
Ciągła transformacja falkowa (ang. ''Continuous Wavelet Transform'', ''CWT'') dana jest wzorem:&lt;br /&gt;
: &amp;lt;math&amp;gt; P_x(t,a;\Psi)= \int_{-\infty}^{\infty}{x(s)\Psi^*_{t,a}(s) ds}&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie&lt;br /&gt;
: &amp;lt;math&amp;gt; \Psi_{t,a}(s) = \frac{1}{\sqrt{|a|}} \Psi\left(\frac{s-t}{a}\right)&amp;lt;/math&amp;gt;&lt;br /&gt;
''a'' jest skalą. Od falki &amp;lt;math&amp;gt;\Psi&amp;lt;/math&amp;gt; wymagamy żeby miała średnią 0.&lt;br /&gt;
&lt;br /&gt;
Transformację tę można interpretować jako rzutowanie sygnału na kolejne wersje falki &amp;lt;math&amp;gt;\Psi&amp;lt;/math&amp;gt; przesunięte o ''t'' i przeskalowane o ''a''. &lt;br /&gt;
&lt;br /&gt;
Inne spojrzenie na transformację falkową uwidacznia się gdy połączymy dwa powyższe wzory:&lt;br /&gt;
: &amp;lt;math&amp;gt;P_x(t,a;\Psi)=  \frac{1}{\sqrt{|a|}}\int_{-\infty}^{\infty}{x(s) \Psi^*\left(\frac{s-t}{a}\right) ds} &amp;lt;/math&amp;gt;&lt;br /&gt;
Tu widać, że dla ustalonej skali ''a'' transformacja falkowa jest splotem sygnału z falką o skali ''a''. Ten sposób myślenia o transformacji falkowej umożliwia zastosowanie szybkiego algorytmu obliczeniowego bazującego na tym, że splot w dziedzinie czasu odpowiada mnożeniu w dziedzinie częstości.&lt;br /&gt;
&lt;br /&gt;
===Skalogram===&lt;br /&gt;
Podobnie jak dla STFT i spektrogramu, możemy dla CWT wprowadzić pojęcie skalogramu, będącego estymatą gęstości energii w przestrzeni czas-skala.&lt;br /&gt;
: &amp;lt;math&amp;gt;S_x(t,a;\Psi)=\left| P_x(t,a;\Psi)\right|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dla falek, które są dobrze skupione wokół częstości &amp;lt;math&amp;gt;f_0&amp;lt;/math&amp;gt; dla skali &amp;lt;math&amp;gt;a_0=1&amp;lt;/math&amp;gt; można wprowadzić  utożsamienie &amp;lt;math&amp;gt;f=\frac{f_0}{a}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Utożsamienie to pozwala przekształcić reprezentację czas-skala w reprezentację czas-częstość:&lt;br /&gt;
:&amp;lt;math&amp;gt;S_x(t,f;\Psi)=\left| P_x(t,f_0/f;\Psi)\right|^2&amp;lt;/math&amp;gt;&lt;br /&gt;
====Implementacja====&lt;br /&gt;
Przykładowa implementacja obliczania skalogramu dla falek Morleta przedstawiona jest poniżej. Korzysta ona z własności splotu.&lt;br /&gt;
&lt;br /&gt;
{{hidden begin|title=wersja w pythonie}}&lt;br /&gt;
&amp;lt;source lang =python&amp;gt;&lt;br /&gt;
def cwt(x, MinF,MaxF,Fs,w=7.0,df =1.0,plot = True):&lt;br /&gt;
    '''w - parametr falki Morleta,&lt;br /&gt;
      wiąże się z jej częstościa centralną i skalą w następujacy sposób:&lt;br /&gt;
      f = 2*a*w / T&lt;br /&gt;
      gdzie: a-skala,  T-długość sygnału w sek.'''&lt;br /&gt;
    T= len(x)/Fs&lt;br /&gt;
    M = len(x)&lt;br /&gt;
    t = np.arange(0,T,1./Fs)&lt;br /&gt;
    freqs = np.arange(MinF,MaxF,df)&lt;br /&gt;
    P = np.zeros((len(freqs),M))&lt;br /&gt;
    X = np.fft.fft(x) # transformacja sygnału do dziedziny czestosci&lt;br /&gt;
    for i,f in enumerate(freqs): # petla po kolejnych czestosciach&lt;br /&gt;
        a = T*f/(2*w)            # obliczenie skali dla danej czestosci&lt;br /&gt;
        psi = np.fft.fft(ss.morlet(M, w=w, s=a, complete=True)) # transformacja falki Morleta do dziedziny czestosci. W bardziej wydajnym kodzie moznaby zastosowac analityczna postac tej falki w dziedzinie czestosci. &lt;br /&gt;
        psi /= np.sqrt(np.sum(psi*psi.conj()))  # normalizacja energii falki  &lt;br /&gt;
        CWT = np.fft.fftshift(ss.ifft(X*psi))   &lt;br /&gt;
        P[i,:] = (CWT*CWT.conj()).real&lt;br /&gt;
    &lt;br /&gt;
    if plot:&lt;br /&gt;
        py.imshow(P,aspect='auto',origin='lower',extent=(0,T,MinF, MaxF))&lt;br /&gt;
        py.show()&lt;br /&gt;
    return P,f,t&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{hidden end}}&lt;br /&gt;
&lt;br /&gt;
'''Wersja w Matlabie'''&lt;br /&gt;
&amp;lt;source lang =matlab&amp;gt;&lt;br /&gt;
function [P,f,t]=tf_cwt(x,MinF,MaxF,Fs,varargin)&lt;br /&gt;
&lt;br /&gt;
w = 7;&lt;br /&gt;
df = 1;&lt;br /&gt;
doplot = true;&lt;br /&gt;
switch nargin&lt;br /&gt;
    case 0:3&lt;br /&gt;
        disp('tf_cwt - not enough input arguments');&lt;br /&gt;
        return&lt;br /&gt;
    case 4&lt;br /&gt;
&lt;br /&gt;
    case 5&lt;br /&gt;
        w=varargin{1};&lt;br /&gt;
    case 2&lt;br /&gt;
        w=varargin{1};&lt;br /&gt;
        df=varargin{2};&lt;br /&gt;
    otherwise&lt;br /&gt;
        w=varargin{1};&lt;br /&gt;
        df=varargin{2};&lt;br /&gt;
        doplot=varargin{3};&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
T = length(x)/Fs;&lt;br /&gt;
M = length(x);&lt;br /&gt;
t = 0:1/Fs:T; t(end) = [];&lt;br /&gt;
freqs = MinF:df:MaxF; freqs(end) = [];&lt;br /&gt;
P = zeros(length(freqs),M);&lt;br /&gt;
X = fft(x);&lt;br /&gt;
&lt;br /&gt;
for i=1:length(freqs)&lt;br /&gt;
    f = freqs(i);&lt;br /&gt;
    s = T*f/(2*w);&lt;br /&gt;
    psi = fft(tf_morlet(M,w,s,true));&lt;br /&gt;
    psi = psi./sqrt(sum(abs(psi).^2));&lt;br /&gt;
    tmp = fftshift(ifft(X.*psi));&lt;br /&gt;
    P(i,:) = abs(tmp).^2;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
if doplot&lt;br /&gt;
    pcolor(linspace(0,T,size(P,2)),linspace(MinF,MaxF,size(P,1)),P); shading interp;&lt;br /&gt;
end&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Matching pursuit (MP) &amp;amp;mdash; dopasowanie kroczące==&lt;br /&gt;
===Definicja===&lt;br /&gt;
Dopasowanie kroczące (ang. ''matching pursuit'', MP) jest procedurą polegającą na rozłożeniu sygnału &amp;lt;math&amp;gt;s(t)&amp;lt;/math&amp;gt; na funkcje składowe &amp;lt;math&amp;gt;g_{\gamma_n}&amp;lt;/math&amp;gt; pochodzące z określonego zbioru funkcji &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt; (tzw. słownika). Słowniki wykorzystywane w metodach czas-częstość często składają się z funkcji Gabora tj. funkcji sinus modulowanej funkcją Gaussa. MP jest algorytmem iteracyjnym. W pierwszym kroku wybierana jest funkcja  dająca największy iloczyn skalarny z sygnałem. W każdym następnym kroku funkcja jest analogicznie dopasowywana do residuum sygnału, pozostałego po odjęciu wyniku poprzedniej iteracji.&lt;br /&gt;
&lt;br /&gt;
Formalnie wygląda to następująco:&lt;br /&gt;
: &amp;lt;math&amp;gt;&lt;br /&gt;
\left \{&lt;br /&gt;
 \begin{array}{l}&lt;br /&gt;
  R^0s =  s\\&lt;br /&gt;
  R^ns = \langle R^ns,g_{\gamma_n} \rangle g_{\gamma_n}+R^{n+1}s\\&lt;br /&gt;
  g_{\gamma_n} = \arg \max_{g_{\gamma_i} \in D } |\langle R^ns, g_{\gamma_i}\rangle|&lt;br /&gt;
 \end{array}&lt;br /&gt;
\right .&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie:&lt;br /&gt;
&amp;lt;math&amp;gt;\arg \max_{g_{\gamma_i} \in D }&amp;lt;/math&amp;gt; oznacza tego &amp;lt;math&amp;gt; g_{\gamma_i}&amp;lt;/math&amp;gt;, który daje największy iloczyn skalarny z aktualnym residuum:  &amp;lt;math&amp;gt;|\langle R^ns, g_{\gamma_i}\rangle|&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Słowniki mogą być dowolne, ale najczęściej składamy je z funkcji Diraca, sinus i Gabora:&lt;br /&gt;
: &amp;lt;math&amp;gt;&lt;br /&gt;
g_\gamma (t) = K(\gamma)e^{ -\pi\left( \frac{t-u}{\sigma} \right)^2}&lt;br /&gt;
\sin\left(2 \pi  f (t-u)+\phi\right)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
normalizacja &amp;lt;math&amp;gt; K(\gamma)&amp;lt;/math&amp;gt;   jest taka, że &amp;lt;math&amp;gt; ||g_{\gamma}||=1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\gamma=\{ u, f, \sigma,&lt;br /&gt;
\phi \}&amp;lt;/math&amp;gt; to parametry funkcji w słowniku (&amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; &amp;amp;mdash; translacja w czasie, &amp;lt;math&amp;gt; f&amp;lt;/math&amp;gt; &amp;amp;mdash; częstość, &amp;lt;math&amp;gt; \sigma&amp;lt;/math&amp;gt; &amp;amp;mdash; szerokość w czasie, &amp;lt;math&amp;gt; \phi&amp;lt;/math&amp;gt; &amp;amp;mdash; faza).&lt;br /&gt;
&lt;br /&gt;
===Dystrybucja energii===&lt;br /&gt;
Reprezentację czas-częstość uzyskujemy z dekompozycji MP sumując dystrybucje WVD pojedynczych atomów:&lt;br /&gt;
: &amp;lt;math&amp;gt;&lt;br /&gt;
W_{ g_{\gamma_n}}(t, f)=\int g_{\gamma_n} \bigl (t + \frac{\tau}{2} \bigr)\;&lt;br /&gt;
g_{\gamma_n}^*\left(t- \frac{\tau}{2} \right) e^{- i 2 \pi f \tau } d \tau&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;&lt;br /&gt;
E^{MP}  = \sum_{n=0}^M |\langle R^n s, \;g_{\gamma_n} \rangle|^2 \; W_{g_{\gamma_n}} (t, f)&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
 &lt;br /&gt;
W wyrażeniu tym nie ma wyrazów mieszanych :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
[https://brain.fuw.edu.pl/~suffa/LabEEG/mp.tar.gz Moduł czas-częstość metodą MP]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wersja udostępniona powyżej wykorzystuje procedurę napisaną w C przez dr Stephane Mallata i dr Zhifeng Zhanga (1993), nazwaną &amp;lt;tt&amp;gt;mpp&amp;lt;/tt&amp;gt; (matching pursuit program), która została udostępniona wraz ze źródłową publikacją. W pakiecie dostępny jest kod źródłowy algorytmu MP napisany w C oraz procedury Matlaba do wywoływania algorytmu, rekonstrukcji sygnału i rysowania map energii w przestrzeni czas-częstość. Aby uruchomić program należy:&lt;br /&gt;
*Pobrać i rozpakować pakiet (np. w swoim domowym katalogu).&lt;br /&gt;
*Przeczytać instrukcje instalacji i uruchamiania w pliku &amp;lt;tt&amp;gt;readme.txt&amp;lt;/tt&amp;gt;.&lt;br /&gt;
*Skompilować program &amp;lt;tt&amp;gt;gabord.c&amp;lt;/tt&amp;gt; wykonując polecenia w konsoli:&lt;br /&gt;
**&amp;lt;tt&amp;gt;cd gabord-0.1&amp;lt;/tt&amp;gt;&lt;br /&gt;
**&amp;lt;tt&amp;gt;./configure&amp;lt;/tt&amp;gt;&lt;br /&gt;
**&amp;lt;tt&amp;gt;make&amp;lt;/tt&amp;gt;&lt;br /&gt;
**plik wykonywalny powinien być zlokalizowany w katalogu &amp;lt;tt&amp;gt;src&amp;lt;/tt&amp;gt;, co sprawdzamy pisząc: &amp;lt;tt&amp;gt;ls src/gabord&amp;lt;/tt&amp;gt;&lt;br /&gt;
*Podać lokalizację (tzn. ścieżkę dostępu) pliku wykonywalnego &amp;lt;tt&amp;gt;gabord&amp;lt;/tt&amp;gt; w procedurze &amp;lt;tt&amp;gt;runGabor.m&amp;lt;/tt&amp;gt;, w linii 21.&lt;br /&gt;
*Do definicji ścieżek w Matlabie dołączyć katalog z pakietem MP.&lt;br /&gt;
*Uruchomić skrypt &amp;lt;tt&amp;gt;example.m&amp;lt;/tt&amp;gt; w celu przetestowania działania programu MP.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Implementacja MP, jest dostępna bezpośrednio w środowisku Matlab, jako plugin do EEGLAB. Program można pobrać ze strony [git.nimitz.pl/mp-eeglab-plugin.git/snapshot/18ad395338572078632297cd071ba5e925b7b22e.tar.gz], jednak wygodniejsze wydaje się bezpośrednie skopiowanie repozytorium. W tym celu należy:&lt;br /&gt;
*otworzyć terminal,&lt;br /&gt;
*przejść do folderu, gdzie zainstalowany został EEGLAB,&lt;br /&gt;
*odnaleźć katalog plugins i przejść do niego,&lt;br /&gt;
*wpisać komendę: git clone git://git.nimitz.pl/mp-eeglab-plugin.git.&lt;br /&gt;
&lt;br /&gt;
Po ponownym uruchomieniu EEGLABa, MP będzie dostępne w zakładce &amp;lt;i&amp;gt;tools&amp;lt;/i&amp;gt;. Wynik działania skryptu zapisywany jest do struktury BOOK. Przed wykonaniem kolejnych obliczeń, należy zapisać wyniki poprzednich. W przeciwnym razie zostaną one nadpisane. Do programu dołączone zostały stosowne narzędzia wizualizujące wyniki.&lt;br /&gt;
&lt;br /&gt;
=Ćwiczenia=&lt;br /&gt;
== Zadanie 1 ==&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
* Ściągnąć pakiet plików Matlaba do analizy czas-częstość:&lt;br /&gt;
  https://brain.fuw.edu.pl/~suffa/LabEEG/TF.zip&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
* Zapoznać się z implementacją matlabową analiz czas-częstość.&lt;br /&gt;
* Zapoznać się z opisem metod czas-częstość, wykonując polecenia opisane przy każdej z metod.&lt;br /&gt;
* Zbadać własności metod czas-częstość, m.in.:&lt;br /&gt;
** Proszę przyjrzeć się definicjom transformaty falkowej i STFT i opowiedzieć o analogiach i różnicach.&lt;br /&gt;
** Proszę zbadać własności przesunięć w czasie i w częstości dla skalogramu w sposób analogiczny jak było to pokazane dla spektrogramu.&lt;br /&gt;
** Proszę zbadać strukturę wyrazów mieszanych w sposób analogiczny jak było to pokazane dla spektrogramu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Zadanie 2 ==&lt;br /&gt;
Korzystając z danych SSVEP zebranych podczas zajęć w semestrze zimowym:&lt;br /&gt;
* Uśrednić odcinki sygnałów zbierane dla tych samych częstości stymulacji, zostawiając przed i po sygnale okres referencyjny (np. 2 s).&lt;br /&gt;
* Wykonać mapy czas-częstość za pomocą spektrogramu, korzystając z reprezentacji falek Morleta i Wignera-Villa. &lt;br /&gt;
* Wykonać analizę czas-częstość posługując się pakietem EEGLAB.&amp;lt;br&amp;gt;&lt;br /&gt;
Rysunki poniżej przedstawiają przykład analizy danych EEG zebranych podczas stymulacji SSVEP o częstości 15 Hz.&lt;br /&gt;
[[Plik:eeglab_ssvep1.png|200px|left]][[Plik:eeglab_ssvep2.png|200px]]&lt;br /&gt;
&lt;br /&gt;
== Zadanie 3 ==&lt;br /&gt;
Pobrać plik z danymi:&lt;br /&gt;
http://www.fuw.edu.pl/~suffa/LabEEG/Characterize_ch4_F50_G4.mat&lt;br /&gt;
&lt;br /&gt;
Opis danych:&lt;br /&gt;
dane zawierają zapisy z lokalnych potencjałów polowych (LFP) z kory czuciowej małpy podczas podawania bodźca wibracyjnego do palca.&lt;br /&gt;
Macierz zawiera 50 powtórzeń po 3 sekundy. Częstość próbkowania wynosi 5000 Hz. Bodziec podawany był pomiędzy 1 a 2 sekundą.&lt;br /&gt;
&lt;br /&gt;
[[Plik:MP_LFP_13_02.jpg|500px|thumb|right|&amp;lt;figure id=&amp;quot;fig:1&amp;quot;/&amp;gt; Analiza zapisów LFP z kory czuciowej małpy podczas podawania bodźca wibracyjnego do palca, o częstości 50 Hz. Mapa czas-częstość przedstawia względną gęstość energii (w skali dB) względem okresu referencyjnego 200-50 ms przed początkiem stymulacji. Dane opisane są w pracy: Supratim Ray, Steven S. Hsiao, Nathan E. Crone, Piotr J. Franaszczuk, and Ernst Niebur. Effect of Stimulus Intensity on the Spike&amp;amp;mdash;Local Field Potential Relationship in the Secondary Somatosensory Cortex. The Journal of Neuroscience, 2008, 28(29):7334-7343.]]&lt;br /&gt;
&lt;br /&gt;
Zadania do wykonania:&lt;br /&gt;
* Otrzymać mapy czas-częstość dla pojedynczych realizacji a następnie uśrednić je po realizacjach.&lt;br /&gt;
* Na średniej mapie poszukać występowania odpowiedzi w częstościach high-gamma (100-200 Hz).&lt;br /&gt;
* W przypadku braku widocznej odpowiedzi, rozważyć następujące operacje:&lt;br /&gt;
** usunąć częstości sieci (60 Hz i wyższe harmoniczne);&lt;br /&gt;
** zastosować logarytmiczną skalę energii;&lt;br /&gt;
** policzyć zmiany gęstości energii względem jej wartości w okresie referencyjnym.&lt;br /&gt;
&lt;br /&gt;
Mapa czas-częstość średniej gęstości energii otrzymaną metodą Matching Pursuit jest przedstawiona na &amp;lt;xr id=&amp;quot;fig:1&amp;quot;&amp;gt;rys. %i&amp;lt;/xr&amp;gt;.&lt;br /&gt;
{{clear}}&lt;br /&gt;
&lt;br /&gt;
==Zadanie 4 ==&lt;br /&gt;
Wykonać analizę metodą MP dla danych z zadania 2.&lt;br /&gt;
&lt;br /&gt;
=Literatura=&lt;br /&gt;
S. Mallat and Z. Zhang (1993) Matching pursuit with time-frequency dictionaries. IEEE Transactions on Signal Processing, 41:3397-3415. &lt;br /&gt;
&lt;br /&gt;
Pinsky, Mark (2002), Introduction to Fourier Analysis and Wavelets, Brooks/Cole, ISBN 0-534-37660-6&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Laboratorium_EEG]]/Czas-częstość&lt;/div&gt;</summary>
		<author><name>SuperAdmin</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Uczenie_maszynowe_i_sztuczne_sieci_neuronowe_cw&amp;diff=6704</id>
		<title>Uczenie maszynowe i sztuczne sieci neuronowe cw</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Uczenie_maszynowe_i_sztuczne_sieci_neuronowe_cw&amp;diff=6704"/>
		<updated>2017-03-13T11:48:58Z</updated>

		<summary type="html">&lt;p&gt;SuperAdmin: /* Ćwiczenia: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Przedmioty specjalizacyjne]]&lt;br /&gt;
Przejście do [[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe|Wykładów]]&lt;br /&gt;
=Ćwiczenia:=&lt;br /&gt;
# [[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Ćwiczenia 1|Regresja liniowa]]. ([https://drive.google.com/open?id=0BzwQ_Lscn8yDWnZVeHU1MjluWFU Wersja w jupyter  notebook]) Dla chętnych praca domowa:  [[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Ćwiczenia 2|Regresja liniowa jako filtr i zastosowanie do modelowania szeregu czasowego]]&lt;br /&gt;
# [[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Ćwiczenia 8|Regresja logistyczna (W2), walidacja, krzywe ROC(W3)]]&lt;br /&gt;
# [[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Ćwiczenia 9|Klasyfikacja Bayesowska, modele generatywne (irysy i klasyfikacja tekstów)]]&lt;br /&gt;
# [[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Ćwiczenia 10|Klasyfikacja z użyciem SVM]]&lt;br /&gt;
# [[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/SVM2 | Klasyfikacja z użuciem SVM 2]]&lt;br /&gt;
# [[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Wybor_cech |Wybor optymalnych cech]]&lt;br /&gt;
# [[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/DrzewaDecyzyjne_cw|Drzewa decyzyjne]]&lt;br /&gt;
# [[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Ćwiczenia 11|Uczenie bez nadzoru i analiza skupień]]&lt;br /&gt;
# [[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Ćwiczenia 4|Nieliniowe sieci neuronowe: problem XOR]]&lt;br /&gt;
# [[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Ćwiczenia 5|Regresja nieliniowa]]&lt;br /&gt;
# [[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Ćwiczenia 7|Klasyfikacja z użyciem nieliniowej sieci neuronowej]]&lt;br /&gt;
# [[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Projekty|Projekty]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--# [[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Ćwiczenia 3|Ćwiczenia 3: Neuron liniowy jako filtr adaptywny]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
# [[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Ćwiczenia 12|Klasyfikacja obrazów]]&lt;br /&gt;
# [[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Ćwiczenia 13|Ćwiczenia 12: Uczenie ze wzmocnieniem]]&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>SuperAdmin</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Wyk%C5%82ad_6&amp;diff=6703</id>
		<title>Uczenie maszynowe i sztuczne sieci neuronowe/Wykład 6</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Wyk%C5%82ad_6&amp;diff=6703"/>
		<updated>2017-03-13T11:42:21Z</updated>

		<summary type="html">&lt;p&gt;SuperAdmin: /* Rozkład Bernouliego */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe|powrót]]&lt;br /&gt;
=Wstęp=&lt;br /&gt;
W tym wykładzie zajmiemy się problemem konstrukcji Uogulnionych Modeli Liniowych (ang. ''generalized linear models'' - GML). Metodologia ta pozwala objąć w jednym formaliźmie zarówno problemy regresji jak i klasyfikacji. W pewnym sensie klasyfikacja jest podobna do regresji, z tą różnicą, że zmienne które chcemy przewidywać mogą przybierać tylko niewielką ilość dyskretnych wartości. Na początek skupimy się na dwóch nieco już oswojonych przykładach, pod koniec dołożymy jeden bardzo przydatny przykład klasyfikacji wielorakiej (z więcej niż dwoma klasami). &lt;br /&gt;
&lt;br /&gt;
Zaczniemy od problemu klasyfikacji binarnej, czyli takiej w której wejściom mamy przypisywać jedną z dwóch klas (podobnie jak to było dla preceptronu Rosenblatta), np. oznaczonych 0 i 1. Na chwilę też odłożymy na bok sieci i zajmiemy się tym zagadnieniem bardziej z punktu widzenia statystyki.&lt;br /&gt;
&lt;br /&gt;
=Regresja logistyczna=&lt;br /&gt;
==Hipoteza==&lt;br /&gt;
W tym podejściu ignorujemy fakt, że zbiór wartości jest dyskretny. Jako funkcję pełniącą rolę [[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Wyk%C5%82ad_1#Uczenie_z_nadzorem|hipotezy]] wybierzemy sigmiodę uzyskaną z funkcji logistycznej, znaną nam już jako jedną z popularnych form nieliniowości neuronów:&lt;br /&gt;
:&amp;lt;math&amp;gt;g(s) = \frac{1}{1+ \exp(-s)}&amp;lt;/math&amp;gt;&lt;br /&gt;
która wraz z parametrami &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; i wejściami &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; jest postaci:&lt;br /&gt;
:&amp;lt;math&amp;gt;h_\theta(x) = g(\theta^T x) =  \frac{1}{1+ \exp(-\theta^T x)}&amp;lt;/math&amp;gt;&lt;br /&gt;
Pod koniec wykładu okaże się dlaczego taki akurat wybór hipotezy jest bardzo naturalny.&lt;br /&gt;
&lt;br /&gt;
==Estymacja parametrów==&lt;br /&gt;
Jak znaleźć parametry &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt;? W języku funkcji kosztu  moglibyśmy oczywiście zapostulować odpowiednią funkcję kosztu i zastosować do niej minimalizację gradientową. Tu jednak spróbujemy pokazać, że analogiczny algorytm można też wyprowadzić z interpretacji probabilistycznej. Dzięki temu będziemy mogli nabrać nowego wglądu w proces doboru parametrów. &lt;br /&gt;
&lt;br /&gt;
Hipotezę wybraliśmy tak, że:&lt;br /&gt;
:&amp;lt;math&amp;gt; P(y=1|x;\theta) = h_\theta(x)  &amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt; P(y=0|x;\theta) = 1- h_\theta(x) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zauważmy, że powyższe wyrażenia można zapisać w zwartej formie:&lt;br /&gt;
:&amp;lt;math&amp;gt;P(y|x;\theta) = \left(h_\theta(x)\right)^y \left(1-h_\theta(x)\right)^{1-y}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Funkcja wiarygodności===&lt;br /&gt;
Zakładając, że przykłady zbioru uczącego są niezależne od siebie prawdopodobieństwo zaobserwowania całego zbioru uczącego &amp;lt;math&amp;gt;{\left(X^{(j)},Y^{(j)}\right)}_{j=1,\dots,m}&amp;lt;/math&amp;gt; wynosi:&lt;br /&gt;
:&amp;lt;math&amp;gt;P(Y|X;\theta) = \prod_{j=1}^m P(y^{(j)}|x^{(j)};\theta)&amp;lt;/math&amp;gt;&lt;br /&gt;
Możemy to prawdopodobieństwo potraktować jako funkcję parametrów &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt;, nazywamy ją wówczas ''funkcją wiarygodności'' i oznaczamy &amp;lt;math&amp;gt;L(\theta)&amp;lt;/math&amp;gt;.&lt;br /&gt;
:&amp;lt;math&amp;gt;L(\theta)= \prod_{j=1}^m P(y^{(j)}|x^{(j)};\theta) = &lt;br /&gt;
\prod_{j=1}^m \left(h_\theta(x^{(j)})\right)&lt;br /&gt;
^{y^{(j)}} \left(1-h_\theta(x^{(j)})\right)^{1-y^{(j)}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Łatwiejsza w posługiwaniu się jest funkcja log-wiarygodności:&lt;br /&gt;
:&amp;lt;math&amp;gt;l(\theta) = \log L(\theta) = \sum_{j=1}^m y^{(j)} \log h_{\theta}(x^{(j)}) + (1 - y^{(j)}) \log (1 - h_{\theta}(x^{(j)}))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dobre parametry &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; to te, dla których zaobserwowanie ciągu uczącego jest największe. Aby je znaleźć należy zmaksymalizować funkcję wiarygodności, czy też dowolną monotonicznie rosnącą funkcję funkcji wiarygodności np. log-wiarygodność. Robimy to modyfikując parametry zgodnie z jej pochodną:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{lcl}&lt;br /&gt;
\frac{\partial}{\partial \theta_i} l(\theta) &amp;amp;=&amp;amp;  \sum_{j=1}^m\left(y^{(j)}\frac{1}{g(\theta^T x^{(j)})} - (1-y^{(j)})\frac{1}{1-g(\theta^Tx^{(j)})} \right) \frac{\partial}{\partial \theta_i} g(\theta^T x^{(j)})\\&lt;br /&gt;
&amp;amp;=&amp;amp; \sum_{j=1}^m \left(y^{(j)}\frac{1}{g(\theta^T x^{(j)})} - (1-y^{(j)})\frac{1}{1-g(\theta^Tx^{(j)})} \right) g(\theta^T x^{(j)})(1-g(\theta^T x^{(j)})) \frac{\partial}{\partial \theta_i} (\theta^T x^{(j)})\\&lt;br /&gt;
&amp;amp;=&amp;amp; \sum_{j=1}^m \left( y^{(j)} (1-g(\theta^T x^{(j)})) - (1-y^{(j)})g(\theta^T x^{(j)})\right)x_i^{(j)}\\&lt;br /&gt;
&amp;amp;=&amp;amp; \sum_{j=1}^m (y^{(j)}-h_\theta(x^{(j)}))x_i^{(j)}&lt;br /&gt;
\end{array}&lt;br /&gt;
 &amp;lt;/math&amp;gt;&lt;br /&gt;
skorzystaliśmy po drodze z postaci pochodnej funkcji logistycznej.&lt;br /&gt;
Zatem aby zwiększać funkcję wiarygodności powinniśmy parametry zmieniać zgodnie z obliczoną pochodną:&lt;br /&gt;
:&amp;lt;math&amp;gt;\theta_i^{(j+1)} =\theta_i^{(j)} &lt;br /&gt;
 + \alpha \sum_{j=1}^m (y^{(j)} - h_\theta( x^{(j)}) )x_i^{(j)} &amp;lt;/math&amp;gt;&lt;br /&gt;
Może to się wydać dziwne, ale startując z zupełnie innych założeń i stosując optymalizację innej funkcji dostaliśmy taką samą regułę zmiany parametrów jak przy gradientowej minimalizacji funkcji (średniokwadratowej) kosztu&lt;br /&gt;
 ([[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Wykład_4#Pojedynczy_neuron:_regu.C5.82a_delta|proszę porównać]])!&lt;br /&gt;
&lt;br /&gt;
=Uogólnione modele liniowe=&lt;br /&gt;
Dotychczas rozważaliśmy przykłady [[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Wykład_1#Interpretacja_probabilistyczna|regresji]] gdzie zwykle &amp;lt;math&amp;gt;y \in \mathcal{N}(\mu,\sigma^2)&amp;lt;/math&amp;gt; oraz klasyfikacji gdzie &amp;lt;math&amp;gt;y \in \text{Bernoulli}(\phi)&amp;lt;/math&amp;gt;. Wkrótce przekonamy się, że oba te problemy sa szczególnymi przypadkami większej rodziny modleli, tzw. uogólnionych modeli liniowych.&lt;br /&gt;
==Rodzina wykładnicza==&lt;br /&gt;
Mówimy, że dany rozkład należy do rodziny wykładniczej jeśli da się go zapisać w postaci:&lt;br /&gt;
:&amp;lt;math&amp;gt; p(y;\eta) = b(y) \exp(\eta^T T(y) - a(\eta))&amp;lt;/math&amp;gt; (*)&lt;br /&gt;
tutaj:&lt;br /&gt;
* &amp;lt;math&amp;gt;\eta&amp;lt;/math&amp;gt; nazywana jest parametrem naturalnym lub kanonicznym dystrybucji; &lt;br /&gt;
* &amp;lt;math&amp;gt;T(y)&amp;lt;/math&amp;gt; jest tzw. statystyką wystarczającą (często &amp;lt;math&amp;gt;T(y) = y&amp;lt;/math&amp;gt;); &lt;br /&gt;
*  wielkość &amp;lt;math&amp;gt;\exp(-a(\eta))&amp;lt;/math&amp;gt; jest czynnikiem normalizującym, takim aby rozkład &amp;lt;math&amp;gt;p(y;\eta)&amp;lt;/math&amp;gt; sumował/całkował się do 1.&lt;br /&gt;
Tak więc członka rodziny wykładniczej określamy podając konkretne postaci &amp;lt;math&amp;gt;\eta,\, T(y),\, a(\eta)\, \text{oraz} \, b(y)&amp;lt;/math&amp;gt;.&lt;br /&gt;
===Rozkład Bernouliego ===&lt;br /&gt;
Pokażemy teraz, że rozkład Bernouliego należy do rodziny wykładniczej. &amp;lt;math&amp;gt;\text{Bernouli}(\phi)&amp;lt;/math&amp;gt; to taki rozkład wartości &amp;lt;math&amp;gt;y \in \{0,1\}&amp;lt;/math&amp;gt;, że &amp;lt;math&amp;gt;p(y=1;\phi) = \phi&amp;lt;/math&amp;gt; zaś &amp;lt;math&amp;gt;p(y=0;\phi) = 1-\phi&amp;lt;/math&amp;gt;. w sposób zwarty możemy napisać ten rozkład tak:&lt;br /&gt;
:&amp;lt;math&amp;gt; &lt;br /&gt;
\begin{array}{lcl}&lt;br /&gt;
p(y;\phi) &amp;amp;=&amp;amp; \phi^y(1-\phi)^{1-y} \\&lt;br /&gt;
&amp;amp;=&amp;amp; ﻿\exp(y \log \phi + (1-y) \log (1-\phi))\\&lt;br /&gt;
&amp;amp;=&amp;amp; \exp\left( y \log \frac{\phi}{1-\phi} + \log(1-\phi)\right)&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Zatem w rozkładzie Bernouliego parametrem naturalnym jest &amp;lt;math&amp;gt; \eta = \log \frac{\phi}{1-\phi}&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Warto zauważyć, że jeśli przekształcić to wyrażenie ze względu na &amp;lt;math&amp;gt;\phi&amp;lt;/math&amp;gt; to dostaniemy dobrzez znaną funkcję logistyczną: &amp;lt;math&amp;gt;\phi = \frac{1}{1+\exp(-\eta)} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Widzimy też, że:&lt;br /&gt;
:&amp;lt;math&amp;gt;T(y) = y&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;a(\eta) = -\log(1-\phi) = \log (1+exp(-\eta))&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;b(y) = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
Czyli możemy przedstawić ten rozkład w postaci (*).&lt;br /&gt;
&lt;br /&gt;
===Rozkład Gaussa===&lt;br /&gt;
Teraz rozważymy rozkład  Gaussa. Do estymacji parametrów regresji liniowej nie musieliśmy używać jego wariancji, więc dla uproszczenia obliczeń przyjmiemy, że nasz rozkład Gaussa ma wariancję &amp;lt;math&amp;gt;\sigma^2 = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Mamy:&lt;br /&gt;
:&amp;lt;math&amp;gt; &lt;br /&gt;
\begin{array}{lcl}&lt;br /&gt;
p(y;\mu) &amp;amp;=&amp;amp; \frac{1}{\sqrt{2 \pi}} \exp\left( -\frac{1}{2} (y-\mu)^2\right)\\&lt;br /&gt;
&amp;amp;=&amp;amp; \frac{1}{\sqrt{2 \pi}} \exp\left(-\frac{1}{2}y^2 \right) \exp\left(\mu y - \frac{1}{2}\mu^2 \right)&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Widzimy więc, że rozkład Gaussa należy do rodziny wykładniczej z następującymi parametrami:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{lcl}&lt;br /&gt;
\eta &amp;amp;=&amp;amp; \mu \\&lt;br /&gt;
T(y) &amp;amp;=&amp;amp; y \\&lt;br /&gt;
a(\eta) &amp;amp;=&amp;amp; \mu^2/2 = \eta^2/2 \\&lt;br /&gt;
b(y) &amp;amp;=&amp;amp; \frac{1}{\sqrt{2 \pi}} \exp\left( -\frac{1}{2} y^2\right)&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Rodzina wykładnicza jest znacznie bogatsza. Zawiera w sobie rozkłady wielorakie, Poissona (do modelowania zliczeń), gamma i wykładnicze (np. interwałów czasowych) i wiele innych. W kolejnej sekcji podamy ogólny sposób na konstruowanie modeli, w których &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; pochodzi z rozkładów wykładniczych.&lt;br /&gt;
&lt;br /&gt;
=Konstrukcja uogólnionego modelu liniowego=&lt;br /&gt;
Załóżmy, że chcemy zbudować model służący do szacowania  liczby (''y'') klientów odwiedzających sklep (lub witrynę) w dowolnej godzinie, na podstawie pewnych cech ''x'', takich jak promocje, ostatnie reklamy, prognoza pogody, dzień tygodnia, itd. Wiemy, że rozkład Poissona zwykle daje dobry model zliczeń np. liczby odwiedzających. Wiedząc o tym, jak możemy wymyślić model dla naszego problemu? Na szczęście, rozkład Poissona należy do rodziny rozkładów wykładniczych, więc możemy zastosować uogólniony model liniowy (GLM). W tej sekcji opiszemy metodę konstruowania modeli GLM.&lt;br /&gt;
&lt;br /&gt;
W ogólności chcielibyśmy przewidywać wartość zmiennej losowej (zależnej) ''y'' traktując ją jako funkcję zmiennej (niezależnej) ''x''. Aby móc zastosować tu metodologię GLM musimy poczynić następujące założenia:&lt;br /&gt;
# Zmienna ''y'' przy ustalonych ''x''  i &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; podlega pewnemu rozkładowi wykładniczemu z parametrem &amp;lt;math&amp;gt;\eta&amp;lt;/math&amp;gt; tzn.: &amp;lt;math&amp;gt;(y|x;\theta) \sim&amp;lt;/math&amp;gt; RodzinaWykładnicza(&amp;lt;math&amp;gt;\eta&amp;lt;/math&amp;gt;) &lt;br /&gt;
# Naszym celem jest estymacja wartości oczekiwanej &amp;lt;math&amp;gt;T(y)&amp;lt;/math&amp;gt; mając dany &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;. W wielu przypadkach mamy &amp;lt;math&amp;gt;T(y) = y&amp;lt;/math&amp;gt;, co oznacza, że chcielibyśmy aby hipoteza otrzymana w wyniku uczenia spełniałą warunek &amp;lt;math&amp;gt;h(x)= E[y|x]&amp;lt;/math&amp;gt;. (Zauważmy, że własność ta jest spełniona dla regresji liniowej i logistycznej. Np. dla regresji logistycznej mamy &amp;lt;math&amp;gt;h_\theta(x) = p(y=1|x;\theta) = 0 \cdot p(y=0|x;\theta) + 1\cdot p(y=1|x;\theta) = E[y|x;\theta]&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Parametr naturalny &amp;lt;math&amp;gt;\eta&amp;lt;/math&amp;gt; jest '''liniowo''' związany z wejściem &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;\eta = \theta^T x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Te trzy założenia pozwalają wyprowadzić klasę algorytmów uczących GLM. Poniżej przedstawimy trzy przykłady.&lt;br /&gt;
== Regresja liniowa jako GLM==&lt;br /&gt;
Przekonajmy się, że regresja liniowa jest szczególnym przykładem GLM. Zmienna zależna &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; jest ciągła i jej prawdopodobieństwo warunkowe dla danego &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; jest modelowane przez rozkład Gaussa &amp;lt;math&amp;gt;N(\mu,\sigma)&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; może zależeć od &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;). Tak więc w tym wypadku wspomnianą w założeniu 1 RodzinąWykładniczą&amp;lt;math&amp;gt;(\eta)&amp;lt;/math&amp;gt; jest rozkład Gaussa. Tak jak widzieliśmy [[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Wykład_6#Rozk.C5.82ad_Gaussa|wcześniej]] w tym przypadku &amp;lt;math&amp;gt;\eta = \mu&amp;lt;/math&amp;gt;. Dalej mamy:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{lcl}&lt;br /&gt;
h_\theta(x) &amp;amp;=&amp;amp; E[y|x;\theta]\\&lt;br /&gt;
&amp;amp;=&amp;amp; \mu \\&lt;br /&gt;
&amp;amp;=&amp;amp; \eta \\&lt;br /&gt;
&amp;amp;=&amp;amp; \theta^T x&lt;br /&gt;
\end{array}&lt;br /&gt;
 &amp;lt;/math&amp;gt;&lt;br /&gt;
* pierwsza równość wynika z założenia 2, &lt;br /&gt;
* druga równość wynika z tego, że &amp;lt;math&amp;gt;(y|x;\theta) \sim N(\mu,\sigma^2)&amp;lt;/math&amp;gt;, tak więc wartość oczekiwana wynosi &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;&lt;br /&gt;
* trzecia równość wynika z założenia 1&lt;br /&gt;
* ostatnia równość wynika  z założenia 3&lt;br /&gt;
&lt;br /&gt;
Zauważmy jak przyjęcie założeń co do postaci rozkładu zmiennej zależnej i metodologi GLM (trzy założenia) prowadzą do konkretnej postaci hipotezy.&lt;br /&gt;
&lt;br /&gt;
== Regresja logistyczna jako GLM==&lt;br /&gt;
Rozważmy teraz regresję logistyczną. Interesuje nas tutaj klasyfikacja binarna, więc &amp;lt;math&amp;gt;y \in \{0,1\}&amp;lt;/math&amp;gt;. Ponieważ &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; przyjmuje wartości binarne to naturalnym rozkładem prawdopodobieństwa do modelowania warunkowego rozkładu &amp;lt;math&amp;gt;(y|x)&amp;lt;/math&amp;gt; jest rozkład Bernoulliego z parametrem &amp;lt;math&amp;gt;\phi&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\phi&amp;lt;/math&amp;gt; jest prawdopodbieństwem tego, że ''y''=1). Pokazaliśmy już wcześniej, że rozkład ten należy do rodziny RozkładówWykładniczych i, że [[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Wykład_6#Rozk.C5.82ad_Bernouliego|w tym przypadku]] &amp;lt;math&amp;gt;\phi = \frac{1}{1+\exp(-\eta)}&amp;lt;/math&amp;gt;. Dalej zauważmy, że jeśli &amp;lt;math&amp;gt;(y|x;\theta) \sim \text{Bernoulli}(\phi)&amp;lt;/math&amp;gt;, to &amp;lt;math&amp;gt;E[y|x;\theta] = \phi&amp;lt;/math&amp;gt;, więc analogicznie jak dla regresji liniowej mamy:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{lcl}&lt;br /&gt;
h_\theta(x) &amp;amp;=&amp;amp; E[y|x;\theta]\\&lt;br /&gt;
&amp;amp;=&amp;amp; \phi \\&lt;br /&gt;
&amp;amp;=&amp;amp; \frac{1}{1+\exp(-\eta)} \\&lt;br /&gt;
&amp;amp;=&amp;amp; \frac{1}{1+\exp(-\theta^T x)}&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Otrzymaliśmy więc funkcję hipotezy w postaci &amp;lt;math&amp;gt;h_\theta(x) = \frac{1}{1+\exp(-\theta^T x)}&amp;lt;/math&amp;gt;. To jest wytłumaczenie dlaczego stosuje się funkcje logistyczne w problemach klasyfikacji: jak tylko założymy, że zmienna zależna podlega rozkładowi Bernoulliego to funkcja logistyczna jest konsekwencją definicji uogólnionych modeli liniowych i rodziny rozkładów wykładniczych.&lt;br /&gt;
&lt;br /&gt;
Wprowadzimy tu jeszcze dwa pojęcia: &lt;br /&gt;
* funkcja &amp;lt;math&amp;gt;g&amp;lt;/math&amp;gt; dająca średnią rozkładu jako funkcję parametru naturalnego, &amp;lt;math&amp;gt;g(\eta) = E[T(y);\eta]&amp;lt;/math&amp;gt; nazywamy ''kanoniczną funkcją odpowiedzi'' (canonical response function)&lt;br /&gt;
* jej odwrotność, &amp;lt;math&amp;gt;g^{-1}&amp;lt;/math&amp;gt; nazywamy ''kanoniczną funkcją łączącą'' (canonical link function.)&lt;br /&gt;
&lt;br /&gt;
==Regresja wieloraka (softmax) jako GLM ==&lt;br /&gt;
Rozważmy jeszcze jeden przypadek modelu GLM. Tym razem nasz problem polega na przydzieleniu zmiennych niezależnych do jednej z ''k'' klas, czyli zmienna zależna nadal jest dyskretna, ale może przyjmować jedną z ''k'' wartości: &amp;lt;math&amp;gt;y \in \{1,2,\dots,k\}&amp;lt;/math&amp;gt;. Mówimy, że zmienne ''y'' podlegają rozkładowi wielorakiemu (ang. ''multinomial'').&lt;br /&gt;
&lt;br /&gt;
Wyprowadzimy teraz GLM do modelowania takich wielorakich danych. Zaczniemy od wyrażenia rozkładu wielorakiego jako rozkładu należącego do rodziny rozkładów wykładniczych.&lt;br /&gt;
&lt;br /&gt;
Aby sparametryzować wielorakość z ''k'' możliwymi wynikami, można by zacząć od ''k'' parametrów &amp;lt;math&amp;gt;\phi_1,\dots,\phi_k&amp;lt;/math&amp;gt; określających prawdopodobieństwo każdego z wyników. Taka parametryzacja jest jednak redundantna, tzn. parametry te nie są niezależne (znając &amp;lt;math&amp;gt;k-1&amp;lt;/math&amp;gt; spośród &amp;lt;math&amp;gt;\phi_i&amp;lt;/math&amp;gt; parametrów ostatni, ''k''-ty, parametr jest jednoznacznie określony bo musi być spełniona równość &amp;lt;math&amp;gt;\sum_{i=1}^k \phi_i =1&amp;lt;/math&amp;gt;.) Tak więc sparametryzujemy rozkład przez ''k-1'' parametrów:&lt;br /&gt;
:&amp;lt;math&amp;gt;\phi_1,\dots,\phi_{k-1}&amp;lt;/math&amp;gt;, &lt;br /&gt;
gdzie:&lt;br /&gt;
* &amp;lt;math&amp;gt;\phi_i = p(y=i;\phi)&amp;lt;/math&amp;gt; &lt;br /&gt;
* &amp;lt;math&amp;gt;p(y=k;\phi) = 1 - \sum_{i=1}^{k-1} \phi_i&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Dla wygody notacji zapiszemy, że &amp;lt;math&amp;gt;\phi_k = 1-\sum_{i=1}^{k-1} \phi_i&amp;lt;/math&amp;gt;, ale będziemy pamiętać, że to nie jest parametr, i że nasz rozkład wieloraki jest w pełni określony przez parametry: &amp;lt;math&amp;gt;\phi_1,\dots,\phi_{k-1}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Aby wyrazić rozkład wieloraki w języku rodziny rozkładów wykładniczych zdefiniujmy &amp;lt;math&amp;gt;T(y) \in \mathcal{R}^{k-1}&amp;lt;/math&amp;gt; w następujący sposób:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
T(1) = \left[&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
1\\&lt;br /&gt;
0\\&lt;br /&gt;
0\\&lt;br /&gt;
\vdots\\&lt;br /&gt;
0&lt;br /&gt;
\end{array}&lt;br /&gt;
 \right],&lt;br /&gt;
T(2) = \left[&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
0\\&lt;br /&gt;
1\\&lt;br /&gt;
0\\&lt;br /&gt;
\vdots\\&lt;br /&gt;
0&lt;br /&gt;
\end{array}&lt;br /&gt;
 \right],&lt;br /&gt;
T(3) = \left[&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
0\\&lt;br /&gt;
0\\&lt;br /&gt;
1\\&lt;br /&gt;
\vdots\\&lt;br /&gt;
0&lt;br /&gt;
\end{array}&lt;br /&gt;
 \right],\dots,&lt;br /&gt;
T(k-1) = \left[&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
0\\&lt;br /&gt;
0\\&lt;br /&gt;
0\\&lt;br /&gt;
\vdots\\&lt;br /&gt;
1&lt;br /&gt;
\end{array}&lt;br /&gt;
 \right], &lt;br /&gt;
T(k) = \left[&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
0\\&lt;br /&gt;
0\\&lt;br /&gt;
0\\&lt;br /&gt;
\vdots\\&lt;br /&gt;
0&lt;br /&gt;
\end{array}&lt;br /&gt;
 \right]&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W odróżnieniu od poprzednich przykładów '''nie''' mamy tu &amp;lt;math&amp;gt;T(y) = y&amp;lt;/math&amp;gt;, ale &amp;lt;math&amp;gt;T(y)&amp;lt;/math&amp;gt; '''jest ''k-1'' wymiarowym wektorem''' a nie skalarem. Aby oznaczyć ''i''-ty element tego wektora będziemy pisać &amp;lt;math&amp;gt;(T(y))_i&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
I jeszcze jedna użyteczna konwencja. Wprowadźmy funkcję &amp;lt;math&amp;gt;1\{\cdot\}&amp;lt;/math&amp;gt;, przyjmuje ona wartość 1 gdy jej argument jest prawdziwy i 0 gdy jest fałszywy, np.: &amp;lt;math&amp;gt;1\{2==3\} = 0&amp;lt;/math&amp;gt; zaś &amp;lt;math&amp;gt;1\{3==7-4\} = 1&amp;lt;/math&amp;gt;. Tak więc &amp;lt;math&amp;gt;(T(y))_i = 1\{y==i\}&amp;lt;/math&amp;gt;. Dalej mamy &amp;lt;math&amp;gt;E[(T(y))_i] = P(y=i) = \phi_i&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Teraz możemy pokazać jak  rozkład wieloraki wyrazić w języku rozkładu wykładniczego i sformułować model klasy GLM.&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{lcl}&lt;br /&gt;
p(y;\phi) &amp;amp;=&amp;amp; \phi_1^{1\{y==1\}}\phi_2^{1\{y==2\}} \dots \phi_k^{1\{y==k\}}\\&lt;br /&gt;
 &amp;amp;=&amp;amp; \phi_1^{1\{y==1\}}\phi_2^{1\{y==2\}} \dots \phi_k^{1-\sum_{i=1}^{k-1}1\{y==i\}}\\&lt;br /&gt;
&amp;amp;=&amp;amp; \phi_1^{(T(y))_1}\phi_2^{(T(y))_2}\dots\phi_k^{1-\sum_{i=1}^{k-1}(T(y))_i}\\&lt;br /&gt;
&amp;amp;=&amp;amp; \exp\left[ (T(y)_1\log(\phi_1)) + (T(y)_2\log(\phi_2)) + \dots + (1-\sum_{i=1}^{k-1} (T(y))_i)\log(\phi_k)\right]\\&lt;br /&gt;
&amp;amp;=&amp;amp; \exp \left[ (T(y))_1 \log \frac{\phi_1}{\phi_k} + (T(y))_2 \log \frac{\phi_2}{\phi_k} + \dots + (T(y))_{k-1} \log \frac{\phi_{k-1}}{\phi_k} + \log(\phi_k)\right]\\&lt;br /&gt;
&amp;amp;=&amp;amp; b(y) \exp(\eta^T(y) - a(\eta))&lt;br /&gt;
\end{array} &lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
gdzie:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{lcl}&lt;br /&gt;
   \eta &amp;amp;=&amp;amp; &lt;br /&gt;
       \left[&lt;br /&gt;
            \begin{array}{c}&lt;br /&gt;
                \log \frac{\phi_1}{\phi_k}\\&lt;br /&gt;
                \log \frac{\phi_2}{\phi_k}\\&lt;br /&gt;
                \vdots \\&lt;br /&gt;
                \log \frac{\phi_{k-1}}{\phi_k}&lt;br /&gt;
            \end{array} &lt;br /&gt;
      \right]\\&lt;br /&gt;
    a(\eta)&amp;amp;=&amp;amp; -\log(\phi_k) \\&lt;br /&gt;
    b(y) &amp;amp;=&amp;amp; 1&lt;br /&gt;
\end{array} &lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
To kończy prezentację rozkładu wielorakiego jako członka rodziny rozkładów wykładniczych.&lt;br /&gt;
&lt;br /&gt;
Funkcja łącząca (dla &amp;lt;math&amp;gt;i = 1,\dots,k&amp;lt;/math&amp;gt;) dana jest przez:&lt;br /&gt;
:&amp;lt;math&amp;gt;\eta_i = \log \frac{\phi_i}{\phi_k}&amp;lt;/math&amp;gt;&lt;br /&gt;
dla wygody zdefiniowaliśmy także &amp;lt;math&amp;gt;\eta_k = \log \frac{\phi_k}{\phi_k}&amp;lt;/math&amp;gt;&lt;br /&gt;
Stąd mamy:&lt;br /&gt;
:&amp;lt;math&amp;gt;\exp(\eta_i) = \frac{\phi_i}{\phi_k}&amp;lt;/math&amp;gt; (**)&lt;br /&gt;
:&amp;lt;math&amp;gt;\phi_k \exp(\eta_i) = \phi_i&amp;lt;/math&amp;gt;&lt;br /&gt;
Suma po wszystkich możliwych zdarzeniach daje zdarzenie pewne:&lt;br /&gt;
:&amp;lt;math&amp;gt;\phi_k \sum_{i=1}^{k} \exp(\eta_i) = \sum_{i=1}^k \phi_i = 1&amp;lt;/math&amp;gt;&lt;br /&gt;
Stąd:&lt;br /&gt;
:&amp;lt;math&amp;gt;\phi_k = \frac{1}{ \sum_{i=1}^{k} \exp(\eta_i)}&amp;lt;/math&amp;gt;&lt;br /&gt;
Podstawiając to wyrażenie do (**) otrzymujemy funkcję odpowiedzi postaci:&lt;br /&gt;
:&amp;lt;math&amp;gt;\phi_i = \frac{\exp(\eta_i)}{\sum_{j=1}^k \exp(\eta_j)}&amp;lt;/math&amp;gt;&lt;br /&gt;
Ta funkcja mapująca &amp;lt;math&amp;gt;\eta&amp;lt;/math&amp;gt; na &amp;lt;math&amp;gt;\phi&amp;lt;/math&amp;gt; nazywa się funkcją softmax. Aby dokończyć formulację modelu użyjemy założenia 3, że &amp;lt;math&amp;gt;\eta&amp;lt;/math&amp;gt; jest liniowo związana ze zmienną niezależną &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;. Tak więc mamy:&lt;br /&gt;
:&amp;lt;math&amp;gt;\eta_i = \theta_i^T x&amp;lt;/math&amp;gt; dla &amp;lt;math&amp;gt;i = 1, \dots,k-1&amp;lt;/math&amp;gt; gdzie &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt; to parametry modelu. Dla wygody notacji definiujemy &amp;lt;math&amp;gt;\theta_k = 0&amp;lt;/math&amp;gt;. Wynika stąd, że &amp;lt;math&amp;gt;\eta_k = \theta_k^T x = 0&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Zatem model nasz zakłada, że rozkład warunkowy &amp;lt;math&amp;gt;(y|x)&amp;lt;/math&amp;gt; dany jest przez:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{lcl}&lt;br /&gt;
p(y=i|x;\theta) &amp;amp;=&amp;amp; \phi_i  \\&lt;br /&gt;
&amp;amp;=&amp;amp;\frac{\exp(\eta_i)}{\sum_{j=1}^k \exp(\eta_j)}  \\&lt;br /&gt;
                &amp;amp;=&amp;amp; \frac{\exp(\theta_i^T x)}{\sum_{j=1}^k \exp(\theta_j^T x)}&lt;br /&gt;
&lt;br /&gt;
\end{array}             &lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
W wyprowadzonym powyżej modelu regresji softmax hipoteza ma postać:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{lcl}&lt;br /&gt;
h_\theta(x) &amp;amp;=&amp;amp; E[T(y)|x;\theta]\\&lt;br /&gt;
            &amp;amp;=&amp;amp; E \left[&lt;br /&gt;
                  \begin{array}{lcl}&lt;br /&gt;
                        1\{y==1\} &amp;amp;|&amp;amp; \\&lt;br /&gt;
                        1\{y==2\} &amp;amp;|&amp;amp; \\&lt;br /&gt;
                         \vdots   &amp;amp;|&amp;amp; \\&lt;br /&gt;
                        1\{y==k-1\} &amp;amp;|&amp;amp;&lt;br /&gt;
                  \end{array} x;\theta&lt;br /&gt;
                 \right]\\&lt;br /&gt;
           &amp;amp;=&amp;amp; \left[&lt;br /&gt;
                  \begin{array}{l}&lt;br /&gt;
                        \phi_1 \\&lt;br /&gt;
                        \phi_2 \\&lt;br /&gt;
                        \vdots \\&lt;br /&gt;
                        \phi_{k-1}                  &lt;br /&gt;
                  \end{array} &lt;br /&gt;
                 \right]\\&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
::&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{lcl}&lt;br /&gt;
          &amp;amp;=&amp;amp; \left[&lt;br /&gt;
                  \begin{array}{l}&lt;br /&gt;
                        \frac {\exp(\theta_1^T x)}{\sum_{j=1}^k \exp(\theta_j^T x)}\\&lt;br /&gt;
                        \frac {\exp(\theta_2^T x)}{\sum_{j=1}^k \exp(\theta_j^T x)} \\&lt;br /&gt;
                        \vdots \\&lt;br /&gt;
                        \frac {\exp(\theta_{k-1}^T x)}{\sum_{j=1}^k \exp(\theta_j^T x)}                  &lt;br /&gt;
                  \end{array} &lt;br /&gt;
                 \right]&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Wyrażając to słowami: nasza hipoteza zwróci prawdopodobieństwo warunkowe przynależności danego ''x'' do każdej z klas ''i'':&lt;br /&gt;
:&amp;lt;math&amp;gt;p(y=i|x;\theta) &amp;lt;/math&amp;gt; dla &amp;lt;math&amp;gt;i = 1, \dots,k&amp;lt;/math&amp;gt;, &lt;br /&gt;
przy czym prawdopodobieństwo przynależności do ostatniej klasy dane jest przez: &lt;br /&gt;
:&amp;lt;math&amp;gt;p(y=k|x;\theta) = 1-\sum_{j=1}^{k-1} \phi_j&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Na koniec zastanówmy się jak estymować parametry tego modelu. Podobnie jak w przypadku regresji liniowej i regresji logistycznej potrzebny jest nam zbiór uczący postaci &amp;lt;math&amp;gt;\left\{(x^{(j)},y^{(j)})\right\}_{ j =1,\dots,m }&amp;lt;/math&amp;gt;. Można ponownie skorzystać z zasady największej wiarygodności i wyznaczyć parametry &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt;, które maksymalizują prawdopodobieństwo zaobserwowania całego zbioru uczącego. Funkcja log-wiarygodności ma postać:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{array}{lcl}&lt;br /&gt;
l(\theta) &amp;amp;=&amp;amp; \sum_{j=1}^m \log p(y{(j)}|x^{(j)};\theta) \\&lt;br /&gt;
&amp;amp;=&amp;amp; \sum_{j=1}^m \log \prod_{i=1}^k \left( \frac{\exp(\theta_i^T x^{(j)} )}{\sum_{n=1}^k \exp (\theta_n^T x^{(j)})} \right)^{1\{y^{(j)}==i\}} &lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Teraz maksymalizację &amp;lt;math&amp;gt;l(\theta)&amp;lt;/math&amp;gt; można przeprowadzić np. za pomocą algorytmu gradientowego (tzn. zmieniamy iteracyjnie parametry  w kierunku zgodnym z gradientem funkcji log-wiarygodności).&lt;/div&gt;</summary>
		<author><name>SuperAdmin</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Uczenie_maszynowe_i_sztuczne_sieci_neuronowe&amp;diff=6695</id>
		<title>Uczenie maszynowe i sztuczne sieci neuronowe</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Uczenie_maszynowe_i_sztuczne_sieci_neuronowe&amp;diff=6695"/>
		<updated>2017-03-11T16:58:37Z</updated>

		<summary type="html">&lt;p&gt;SuperAdmin: /* Wykłady */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Przedmioty specjalizacyjne]]&lt;br /&gt;
&lt;br /&gt;
Przejście do: [[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe_cw|Ćwiczeń]]&lt;br /&gt;
=Wykłady=&lt;br /&gt;
#[[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Wykład 1|Wstęp, regresja liniowa i metoda najmniejszych kwadratów]] [https://drive.google.com/open?id=0BzwQ_Lscn8yDUTFmVnJ1QXpuVGs (wersja w notebooku)]&lt;br /&gt;
#[[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Wykład 6|Klasyfikacja i regresja logistyczna]] [https://drive.google.com/open?id=0BzwQ_Lscn8yDZ3lxUkFCeUxmUlE (wersja w notebooku)]&lt;br /&gt;
#[[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Wykład Ocena jakości klasyfikacji|Ocena jakości klasyfikacji]] [https://drive.google.com/open?id=0BzwQ_Lscn8yDQ3Vpbnd2U2pOd0k (wersja w notebooku)] &lt;br /&gt;
#[[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Wykład 7|Algorytmy generatywne]] [https://drive.google.com/open?id=0BzwQ_Lscn8yDNUpWYTdycWVLa0E (wersja w notebooku)]&lt;br /&gt;
#[[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Wykład 8|Maszyny wektorów wspierających I]] [https://drive.google.com/open?id=0BzwQ_Lscn8yDQ3poLWdZOG90c2M (wersja w notebooku)]&lt;br /&gt;
#[[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Wykład 9|Maszyny wektorów wspierających II]] [https://drive.google.com/open?id=0BzwQ_Lscn8yDQVplcGo3bmllODA (wersja w notebooku)]&lt;br /&gt;
#[[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/DrzewaDecyzyjne|Drzewa decyzyjne]][https://drive.google.com/open?id=0BzwQ_Lscn8yDLU1wUFBsRURzWEk (wersja w notebooku)]&lt;br /&gt;
#[[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Wykład 10|Uczenie bez nadzoru]]&lt;br /&gt;
#[[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Wykład 2|Wstęp o sieciach neuronowych, sieci neuronowe liniowe]]&lt;br /&gt;
#[[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Wykład 3|Perceptron Rosenblatta]]&lt;br /&gt;
#[[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Wykład 4|Nieliniowości różniczkowalne i metoda wstecznej propagacji błędu]]&lt;br /&gt;
#[[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Wykład 5|Wsteczna propagacja błędu: jak poprawić zbieżność?]]&lt;br /&gt;
#[[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Pytania| Zagadnienia do powtórki]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
#[[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Wykład 11|Uczenie ze wzmocnieniem]]&lt;br /&gt;
#[[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Wykład 12|Uczenie ze wzmocnieniem cz.2]]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>SuperAdmin</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Uczenie_maszynowe_i_sztuczne_sieci_neuronowe&amp;diff=6694</id>
		<title>Uczenie maszynowe i sztuczne sieci neuronowe</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Uczenie_maszynowe_i_sztuczne_sieci_neuronowe&amp;diff=6694"/>
		<updated>2017-03-11T16:58:05Z</updated>

		<summary type="html">&lt;p&gt;SuperAdmin: /* Wykłady */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Przedmioty specjalizacyjne]]&lt;br /&gt;
&lt;br /&gt;
Przejście do: [[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe_cw|Ćwiczeń]]&lt;br /&gt;
=Wykłady=&lt;br /&gt;
#[[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Wykład 1|Wstęp, regresja liniowa i metoda najmniejszych kwadratów]] [https://drive.google.com/open?id=0BzwQ_Lscn8yDUTFmVnJ1QXpuVGs (wersja w notebooku)]&lt;br /&gt;
#[[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Wykład 6|Klasyfikacja i regresja logistyczna]] [https://drive.google.com/open?id=0BzwQ_Lscn8yDZ3lxUkFCeUxmUlE (wersja w notebooku)]&lt;br /&gt;
#[[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Wykład Ocena jakości klasyfikacji|Ocena jakości klasyfikacji]] [https://drive.google.com/open?id=0BzwQ_Lscn8yDQ3Vpbnd2U2pOd0k (wersja w notebooku)] &lt;br /&gt;
#[[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Wykład 7|Algorytmy generatywne]] [https://drive.google.com/open?id=0BzwQ_Lscn8yDNUpWYTdycWVLa0E (wersja w notebooku)]&lt;br /&gt;
#[[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Wykład 8|Maszyny wektorów wspierających I]] [https://drive.google.com/open?id=0BzwQ_Lscn8yDQ3poLWdZOG90c2M (wersja w notebooku)]&lt;br /&gt;
#[[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Wykład 9|Maszyny wektorów wspierających II]] [https://drive.google.com/open?id=0BzwQ_Lscn8yDQVplcGo3bmllODA (wersja w notebooku)]&lt;br /&gt;
#[[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/DrzewaDecyzyjne|Drzewa decyzyjne]][ https://drive.google.com/open?id=0BzwQ_Lscn8yDLU1wUFBsRURzWEk (wersja w notebooku)]&lt;br /&gt;
#[[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Wykład 10|Uczenie bez nadzoru]]&lt;br /&gt;
#[[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Wykład 2|Wstęp o sieciach neuronowych, sieci neuronowe liniowe]]&lt;br /&gt;
#[[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Wykład 3|Perceptron Rosenblatta]]&lt;br /&gt;
#[[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Wykład 4|Nieliniowości różniczkowalne i metoda wstecznej propagacji błędu]]&lt;br /&gt;
#[[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Wykład 5|Wsteczna propagacja błędu: jak poprawić zbieżność?]]&lt;br /&gt;
#[[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Pytania| Zagadnienia do powtórki]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
#[[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Wykład 11|Uczenie ze wzmocnieniem]]&lt;br /&gt;
#[[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Wykład 12|Uczenie ze wzmocnieniem cz.2]]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>SuperAdmin</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/DrzewaDecyzyjne&amp;diff=6546</id>
		<title>Uczenie maszynowe i sztuczne sieci neuronowe/DrzewaDecyzyjne</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/DrzewaDecyzyjne&amp;diff=6546"/>
		<updated>2017-03-03T18:07:32Z</updated>

		<summary type="html">&lt;p&gt;SuperAdmin: /* Zarys algorytmu */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe|powrót]]&lt;br /&gt;
=Wstęp=&lt;br /&gt;
&amp;lt;!-- https://class.coursera.org/machlearning-001/lecture WEEK2--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Drzewa decyzyjne to popularne narzędzia do “data mining” nadają się szczególnie dobrze do klasyfikacji, ale można je też przystosować do problemów regresji. My skupimy się na ich zastosowaniach w klasyfikacji (podjęcia decyzji).&lt;br /&gt;
&lt;br /&gt;
=Cechy:=&lt;br /&gt;
* łatwe do zrozumienia&lt;br /&gt;
* generują wyjście, które jest łatwo interpretować&lt;br /&gt;
* dość łatwe w użyciu -&amp;gt; niezbyt dużo parametrów do dopasowywania zanim uda się z nich wycisnąć coś użytecznego&lt;br /&gt;
* dobrze skalowalne&lt;br /&gt;
* są algorytmem typu “white box” - można łatwo wizualizować wiedzę, której wyuczył się algorytm&lt;br /&gt;
* mogą działać zarówno z danymi numerycznymi/ciągłymi jak i kategorycznymi/dyskretnymi&lt;br /&gt;
* algorytmy są typu “konstrukcyjnego poszukiwania” - drzewa “rosną” dopasowując się do danych &lt;br /&gt;
* najczęściej uczone są “wsadowo” (batch mode)&lt;br /&gt;
&lt;br /&gt;
=Jak można wyobrażać sobie drzewo decyzyjne =&lt;br /&gt;
* składa się z węzłów&lt;br /&gt;
* w danym węźle testowana jest wartość jednej cechy z przykładu uczącego &lt;br /&gt;
* węzeł ma rozgałęzienia zależne od wyniku testu&lt;br /&gt;
&lt;br /&gt;
== Przykład z decyzją o spacerze ==&lt;br /&gt;
Załóżmy, że chdzimy na spacer w zależności od pogody. Zobaczmy jak może wyglądać drzewo opisujące podejmowanie decyzji o spacerze. Drzewo takie budujemy w oparciu o zastaw wcześniejszych obserwacji różnych parametrów (cech) i podjętych decyzji. Innymi słowy mamy zbiór uczący.&lt;br /&gt;
&lt;br /&gt;
[[Plik:Drzewo1.svg ]]&lt;br /&gt;
* cechy (Zachmurzenie{słonecznie, pochmurno, pada}, temperatura, wilgotność, wiatr), np. temperatura nie musi być istotna&lt;br /&gt;
* nie wszystkie cechy muszą być wykorzystane w drzewie decyzyjnym, może to wynikać z tego, że cechy są skorelowane/redundantne albo po prostu okazać się nieistotne dla problemu&lt;br /&gt;
* jednym z ważnych pytań, które tu się pojawiają jest to w jakiej kolejność wybierać cechy -&amp;gt; intuicja: od najbardziej informatywnych, tych które najszybciej prowadzą do decyzji&lt;br /&gt;
*jeśli cechy są ciągłe to można wprowadzić próg -&amp;gt; np. wilgotność (próg =75%) , wiatr(próg 20km/h)&lt;br /&gt;
&lt;br /&gt;
= Podział przestrzeni cech=&lt;br /&gt;
* W drzewach decyzyjnych granice między klasami mają postać hiperpowierzchni równoległych do osi cech -&amp;gt; ciężko jest nauczyć separacji klas, które na płaszczyźnie są separowane pochyłą prostą&lt;br /&gt;
** mając dużo danych można taką prostą aproksymować wieloma schodkami (przykład z podziałem przestrzeni 2D na prostokąty )&lt;br /&gt;
** w rzeczywistych zastosowaniach, gdy mamy wielowymiarowe cechy a dane są dość rzadkie, zwykle da się poprowadzić hiperpowierzchnie&lt;br /&gt;
&lt;br /&gt;
* Czy można wyuczyć drzewo dowolnej funkcji logicznej?&lt;br /&gt;
**tak bo funkcje logiczne można reprezentować za pomocą tablic prawdy (matryc logicznych)&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!A!!B!!Y = A [[alternatywa|or]] B&lt;br /&gt;
|- align=center&lt;br /&gt;
|0||0||0&lt;br /&gt;
|- align=center&lt;br /&gt;
|0||1||1&lt;br /&gt;
|- align=center&lt;br /&gt;
|1||0||1&lt;br /&gt;
|- align=center&lt;br /&gt;
|1||1||1&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Jak uczyć drzewo?=&lt;br /&gt;
==Zarys algorytmu==&lt;br /&gt;
* potrzebne jest kryterium ''S'', które powie jak bardzo istotna jest dana cecha ''c''&lt;br /&gt;
* zaczynamy od korzenia i pełnego zbioru danych &lt;br /&gt;
** obliczamy &amp;lt;math&amp;gt;\arg \max_c S(c)&amp;lt;/math&amp;gt;&lt;br /&gt;
** na razie załóżmy, że cecha c jest logiczna: 0 lub 1, &lt;br /&gt;
*** jeśli wartość wybranej cechy jest 0 to idziemy na lewo (i zostaje nam tylko pewien podzbiór danych) &lt;br /&gt;
*** w przeciwnym razie (jeśli 1) to idziemy na prawo (i też pozostaje nam podzbiór - pozostałą część)&lt;br /&gt;
** w tym miejscu mówimy sobie, że ten podzbiór, który nam pozostał to cały zbiór, i że znowu szukamy korzenia poddrzewa -&amp;gt; rekurencja&lt;br /&gt;
** rekurencyjnie podążamy tak długo aż:&lt;br /&gt;
*** zostaje nam podzbiór, który należy tylko do jednej klasy&lt;br /&gt;
*** nie mamy już cech, którymi można by zróżnicować przykłady&lt;br /&gt;
W pseudokodzie wygląda to tak:&lt;br /&gt;
D- dane treningowe&lt;br /&gt;
&lt;br /&gt;
 HodujDrzewo(D)&lt;br /&gt;
 	if ( y=0 dla wszystkich &amp;lt;math&amp;gt;\{x,y\} \in D &amp;lt;/math&amp;gt; ) return nowyLiść(0)&lt;br /&gt;
 	elseif ( y=1 dla wszystkich &amp;lt;math&amp;gt;\{x,y\} \in D &amp;lt;/math&amp;gt;) return nowyLiść(1) &lt;br /&gt;
 	else&lt;br /&gt;
 		wybierz najlepsze &amp;lt;math&amp;gt; x_j&amp;lt;/math&amp;gt;&lt;br /&gt;
 		S_0 = wszystkie &amp;lt;math&amp;gt;\{x,y\} \in S&amp;lt;/math&amp;gt; dla których &amp;lt;math&amp;gt;x_j = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
 		S_1 = wszystkie &amp;lt;math&amp;gt;\{x,y\} \in S&amp;lt;/math&amp;gt; dla których &amp;lt;math&amp;gt;x_j =1 &amp;lt;/math&amp;gt;&lt;br /&gt;
 		return nowyWęzeł(&amp;lt;math&amp;gt;x_j&amp;lt;/math&amp;gt;, HodujDrzewo(&amp;lt;math&amp;gt;S_0&amp;lt;/math&amp;gt;), HodujDrzewo(&amp;lt;math&amp;gt;S_1&amp;lt;/math&amp;gt;))&lt;br /&gt;
&lt;br /&gt;
==Jak wybrać najlepszą cechę? ==&lt;br /&gt;
&lt;br /&gt;
* wybrać tą cechę, która wzięta pod uwagę sama daje najmniejszy błąd przewidywania na zbiorze uczącym (taka cecha, że jeśli podzielimy wg. niej to mamy najmniejszą sumę błędów w lewej i prawej gałęzi)-&amp;gt; w niektórych sytuacjach to nie jest optymalne postępowanie&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!x1!!x2!! x3 !!y &lt;br /&gt;
|- align=center&lt;br /&gt;
|0||0||0||1&lt;br /&gt;
|- align=center&lt;br /&gt;
|0||0||1||0&lt;br /&gt;
|- align=center&lt;br /&gt;
|0||1||0||1&lt;br /&gt;
|- align=center&lt;br /&gt;
|0||1||1||1&lt;br /&gt;
|- align=center&lt;br /&gt;
|1||0||0||0&lt;br /&gt;
|- align=center&lt;br /&gt;
|1||0||1||1&lt;br /&gt;
|- align=center&lt;br /&gt;
|1||1||0||0&lt;br /&gt;
|- align=center&lt;br /&gt;
|1||1||1||0&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
*Podział wzg. X1 (jeśli x1=0 to 1, jeśli x1=1 to 0) dałby łącznie 1+1 =2 błędy&lt;br /&gt;
*Podział wzg. X2 (jeśli x2=0 to 1, jeśli x2=1 to 0) dałby łącznie 2+2 = 4 błędy&lt;br /&gt;
*Podział wzg. X3 (jeśli x2=0 to 1, jeśli x2=1 to 0) dałby łącznie 2+2 = 4 błędy&lt;br /&gt;
&lt;br /&gt;
Podział wzg. ilości błędów może nie być optymalny, &lt;br /&gt;
* NP-zupełny problem aby znaleźć najmniejsze drzewo dla konkretnych danych- &amp;gt; trzeba posługiwać się heurystykami&lt;br /&gt;
* warto skorzystać z miar dostarczanych przez teorię informacji&lt;br /&gt;
&lt;br /&gt;
===Krótkie przypomnienie z teorii informacji===&lt;br /&gt;
Mamy monetę, która ma nierówne prawdopodobieństwa:&lt;br /&gt;
* P(V=0) = 0.2&lt;br /&gt;
* P(V=1) =0.8&lt;br /&gt;
&lt;br /&gt;
(V - zmienna z rozkładu Bernouliego)&lt;br /&gt;
&lt;br /&gt;
Jak bardzo się zdziwimy, dowiadując się, że zmienna V ma jakąś konkretną wartość?&lt;br /&gt;
* bardziej zdziwieni będziemy widząc wartość mniej prawdopodobną&lt;br /&gt;
* jeśli wynik zawsze byłby 1 to jaka powinna być wartość funkcji mierzącej nasze zdziwienie? (0)&lt;br /&gt;
* jeśli otrzymalibyśmy wynik niemożliwy, to nasze zdziwienie powinno być nieskończone&lt;br /&gt;
Te warunki spełnia: &lt;br /&gt;
:&amp;lt;math&amp;gt;S(V=v) = -\log P(V=v)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Entropia====&lt;br /&gt;
*Entropia to średnie zdziwienie (wartość oczekiwana zdziwienia)&lt;br /&gt;
:&amp;lt;math&amp;gt;H(V) = \sum_{v=0}^1 -P(V=v)log P(V=v)&amp;lt;/math&amp;gt;&lt;br /&gt;
* Entropia może być miarą niepewności&lt;br /&gt;
&lt;br /&gt;
Dla zmiennej z rozkładu Bernouliego entropia wygląda tak:&lt;br /&gt;
&lt;br /&gt;
https://www.wolframalpha.com/input/?i=plot+-p*log2(p)+-+(1-p)*log2(1-p),+p+from+0+to+1&lt;br /&gt;
&lt;br /&gt;
Ważne jest to, że kształt wykresu entropii od  P jest gładką funkcją wypukłą i ma gdzieś maksimum&lt;br /&gt;
(inna funkcja o podobnych własnościach to np GINI - używana przez statystyków: &amp;lt;math&amp;gt;\sum_k P(V=k)(1-P(V=k)) &amp;lt;/math&amp;gt;, gdzie k to klasa)&lt;br /&gt;
&lt;br /&gt;
====Informacja wzajemna (Mutual information)====&lt;br /&gt;
Informacja wzajemna pomiędzy dwiema zmiennymi losowymi to redukcja entropii  jednej  z nich (A) kiedy poznamy drugą (B):&lt;br /&gt;
:&amp;lt;math&amp;gt;I(A;B) = H(A)-\sum_b P(B=b)\cdot H(A|B=b)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Innymi mierzy ona nam redukcję niepewności o przynależności do klasy jeśli znamy jedną z cech.&lt;br /&gt;
&lt;br /&gt;
* informacja wzajemna jest dobrą miarą do wskazania, którą z cech należy użyć w danym kroku konstrukcji drzewa, bo użycie tej cechy, która ma największa informacje wzajemną z klasami najbardziej zredukuje naszą niepewność.&lt;br /&gt;
* można łatwo na obrazku pokazać że funkcja o takim kształcie jak entropia (wykres Entropia(P) ) - ze względu na jej wypukły kształt podział zbioru na dwie części zawsze obniża średnią entropię.&lt;br /&gt;
&lt;br /&gt;
== Uczenie drzewa z wartościami, które nie są 0/1 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Wiele wartości dyskretnych ===&lt;br /&gt;
*można wykonać podział zamiast na dwa liście to na tyle ile jest wartości&lt;br /&gt;
*można po kolei przetestować podział względem każdej z wartości po kolei grupując wartości na mniejsze i większe niż pewna wartość&lt;br /&gt;
* dla wartości ciągłych -&amp;gt; wybór progu można oprzeć na przetestowaniu jako możliwego progu każdej z obserwacji w zbiorze uczącym.&lt;br /&gt;
&lt;br /&gt;
=== Problem parzystości ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* rozróżnienie między tym co można reprezentować, a tym co można nauczyć konkretnym algorytmem&lt;br /&gt;
&lt;br /&gt;
* funkcja parzystości = jak wiele bitów jest 1 ? czy to jest liczba parzysta czy nie? &lt;br /&gt;
** np. dla 6-cio bitowych wektorów: [0 1 0 1 1 0] -&amp;gt; nieparzysty ;  [0 1 0 1 1 1] -&amp;gt; parzysty &lt;br /&gt;
** algorytmy drzewiaste nieźle radzą sobie jeśli przestrzeń cech posiada duże obszary należące do danej klasy -&amp;gt; wtedy podziały kolejnymi płaszczyznami są efektywne&lt;br /&gt;
** problemem są odwzorowania wymagające bardzo dużo podziałów &lt;br /&gt;
** gdyby mieć właściwą reprezentację danych zadanie z parzystością jest trywialne&lt;br /&gt;
&lt;br /&gt;
=== Uczenie z wielowartościowymi cechami ===&lt;br /&gt;
&lt;br /&gt;
* kiepskie są cechy o takich wartościach, że są unikalne dla pojedynczych przykładów w zbiorze uczącym (np. NIP) -&amp;gt; nie ma wtedy generalizacji&lt;br /&gt;
* Taka cecha niesie ze sobą sama w sobie bardzo dużo informacji o przykładzie, ale podział zbiory względem tej klasy niekoniecznie musi dawać wiele informacji&lt;br /&gt;
&lt;br /&gt;
==Uczenie z brakującymi wartościami==&lt;br /&gt;
&lt;br /&gt;
* nie zawsze jest tak dobrze, że znamy wartości wszystkich cech dla wszystkich przykładów w ciągu uczącym, (ale dla wszystkich znamy ich klasy). Załóżmy że w przykładzie i-tym brakuje wartości dla cechy A. W węźle n-tym drzewa trzeba testować wartość A:&lt;br /&gt;
** dla brakującej cechy można wymusić jakąś wartość np. najbardziej prawdopodobną w całym zbiorze danych&lt;br /&gt;
** nieco lepiej jest wymusić wartość najbardziej prawdopodobną dla klasy do której należy przykład i-ty&lt;br /&gt;
** w pewnym sensie przy dojściu do takiego niepewnego węzła, dla którego brakuje nam danych możemy “rozmnożyć”  ten przykład proporcjonalnie do częstości występowania różnych wartości brakującej cechy w danej klasie. Tzn. załóżmy, że A przyjmuje wartości &amp;lt;math&amp;gt;v_i&amp;lt;/math&amp;gt; z prawdopodobieństwem &amp;lt;math&amp;gt;p_i&amp;lt;/math&amp;gt; . W dół drzewa wysyłamy frakcje tego przykładu wynoszące &amp;lt;math&amp;gt;p_i&amp;lt;/math&amp;gt; &lt;br /&gt;
** w czasie klasyfikacji po dojściu do liści, patrzymy jak  dużo mamy głosów na daną klasę.&lt;br /&gt;
&lt;br /&gt;
==Problem przeuczenia/ nadmiernego dopasowania ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nadmierne dopasowanie mamy wtedy gdy dopasowana przez nas hipoteza h dobrze pasuje do danych treningowych ale ma złą generalizację , tzn. można by było wymyślić lepszą hipotezę h’, która może na naszym zbiorze treningowym jest porównywalna z h ale na pełnej przestrzeni cech h’ jest lepsza.&lt;br /&gt;
&lt;br /&gt;
* diagnostyka -&amp;gt; musimy podzielić zbiór uczący na treningowy i testowy i patrzeć jak zachowują się miary jakości (np. dokładność ) wraz ze wzrostem skomplikowania drzewa&lt;br /&gt;
* można też sprawdzać czy dołożenie podziału najlepszej cechy faktycznie zmienia rozkład klas &lt;br /&gt;
** co tu znaczy rozkład klas? - w przypadku binarnym czy po podziale w podzbiorze lewym i prawym proporcja pomiędzy klasą 0 i klasą 1 jest istotnie różna do tej proporcji przed podziałem. Na skutek podziałów dążymy do tego żeby np. z lewej wytworzyć same 0 a z prawej same 1)(pre-puning)&lt;br /&gt;
* tak jak w innych technikach wzrost skomplikowania hipotezy prowadzi do coraz lepszego dopasowania na zbiorze treningowym, ale powyżej pewnego progu na zbiorze testowym dopasowanie zaczyna się pogarszać.&lt;br /&gt;
&lt;br /&gt;
==Przycinanie drzew ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* post-prune: wyucz drzewo na zbiorze treningowym. Korzystając ze zbioru testowego znajdź te węzły, których usunięcie (wraz ze wszystkimi dalszymi gałęziami) najmniej popsuje wynik(np. dokładność), postępuj tak długo jak długo miara jakość na zbiorze testowym się poprawia (wycinamy gałęzie stanowiące dopasowanie do szczegółów zbioru treningowego)&lt;br /&gt;
&lt;br /&gt;
* wprowadzenie czynnika każącego za stopień skomplikowania drzewa do funkcji mierzącej poprawę dopasowania (regularyzacja)&lt;br /&gt;
&lt;br /&gt;
==Rule Post pruning==&lt;br /&gt;
&lt;br /&gt;
* zamiast wycinać gałęzie po prostu, są one zamieniane w zestaw “zasad”&lt;br /&gt;
* zasady to zwinięte warunki logiczne. tzn drzewo ma w każdym węźle formułkę “if A&amp;lt;\theta then left” , zasada to zwinięcie tych wszystkich węzłów prowadzących do jednego liścia w jeden warunek logiczny połączony “and” np. “if A&amp;lt;\theta_1 &amp;amp; B&amp;gt; theta_2 &amp;amp; C&amp;lt;theta_3 then klasa =0”&lt;br /&gt;
&lt;br /&gt;
* mamy tyle zasad ile liści&lt;br /&gt;
* można potem usuwać te których usunięcie powoduje wzrost dokładności na zbiorze testowym&lt;br /&gt;
&lt;br /&gt;
* zasady można ułożyć w kolejności od największej do najmniejszej dokładności i wzg. “przekrycia” tzn. jak wiele przypadków z ciągu uczącego dana reguła obejmuje&lt;br /&gt;
&lt;br /&gt;
=Skalowanie=&lt;br /&gt;
* algorytmy wymagające losowego dostępu do danych-&amp;gt; dane powinny mieścić się w pamięci&lt;br /&gt;
* algorytmy wymagające sekwencyjnego dostępu do danych, po każdym przejściu przez dane aktualizujemy model: dane mogą byś zapisane na dysku  (SPRINT, SLIQ)&lt;br /&gt;
* algorytmy działające na strumieniu danych. Założenie jest takie, że algorytm może skorzystać z danych tylko raz (VFDT - very fast decision tree).&lt;/div&gt;</summary>
		<author><name>SuperAdmin</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=ZasadyZaliczenia&amp;diff=5627</id>
		<title>ZasadyZaliczenia</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=ZasadyZaliczenia&amp;diff=5627"/>
		<updated>2016-09-30T11:06:17Z</updated>

		<summary type="html">&lt;p&gt;SuperAdmin: /* Projekt */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Zasady zaliczenia ćwiczeń z [[Analiza_sygnałów - exercises|Analizy Sygnałów]] ==&lt;br /&gt;
&lt;br /&gt;
=== Kolokwia ===&lt;br /&gt;
W trakcie semestru odbędą się dwa kolokwia. Z każdego z nich będzie można uzyskać 10 punktów, z czego do zaliczenia przedmiotu konieczne będzie zdobycie łącznie 10 punktów z kolokwiów (czyli 50%). Kolokwia będą wspólne dla wszystkich grup, będą się odbywać w poniedziałki przed południem.&lt;br /&gt;
&lt;br /&gt;
* '''Kolokwium I:  14 listopada 2016, 10:00-13:00, sale: 1.27, 1.28 ''' &lt;br /&gt;
* '''Kolokwium II: 31 stycznia 2017, 10:00-13, sale: 1.27, 1.28''' &lt;br /&gt;
* '''Kolokwium poprawkowe: 24 lutego 2017, 10:00-13, sale: 1.27, 1.28''' &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wiedza wymagana dotyczy tego samego zakresu materiału, który obowiązywał na I i II kolokwium łącznie.&lt;br /&gt;
W trakcie kolokwium możliwe jest poprawienie łącznej sumy punktów na kolokwia, czyli 20 pkt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--[[STATLAB/kolokwium2_wymagania|Zakres wymagań do II kolokwium.]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Projekt ===&lt;br /&gt;
Wymagane będzie wykonanie dwóch projektów indywidualnych. Jeden z nich będzie wymagany w połowie semestru, a drugi do końca semestru. Nie będzie możliwości oddawania projektów po zakończeniu zajęć semestru zimowego. Z każdego projektu będzie można uzyskać 10 punktów, z czego do zaliczenia przedmiotu konieczne jest zdobycie łącznie 10 punktów z projektów (czyli 50%).&lt;br /&gt;
&lt;br /&gt;
Poniżej orientacyjnie są projekty z ubiegłego roku, nowe zostaną ogłoszone w terminie późniejszym:&lt;br /&gt;
# Pierwszy projekt [[STATLAB/Zadanie zaliczeniowe3|Analiza czasowa sygnału audio]] należy wykonać i oddać '''do końca listopada'''. Dokładniejsze terminy zaliczenia przekażą poszczególni prowadzący grup.&lt;br /&gt;
# Drugi projekt: [[STATLAB/Zadanie_zaliczeniowe5|Filtrowanie i przepróbkowanie sygnału]] należy oddać do końca zajęć dydaktycznych.&lt;br /&gt;
&lt;br /&gt;
=== Kartkówki ===&lt;br /&gt;
Na większości (10) zajęć będą miały miejsce kartkówki na podstawie materiału z zajęć poprzednich. Pytania nie będą wymagające, będą raczej sprawdzać uwagę i systematyczną pracę. Łącznie za kartkówki można uzyskać 10 punktów (maksymalnie 1 punkt za każdą), natomiast przy zaliczeniu przedmiotu dozwolone jest niezaliczenie maksymalnie trzech kartkówek (nieusprawiedliwiona nieobecność również pociąga za sobą niezaliczenie kartkówki). Punktów z kartkówek nie można poprawiać.&lt;br /&gt;
&lt;br /&gt;
=== Skala ocen ===&lt;br /&gt;
Na podstawie łącznej liczby punktów (maksymalnie do zdobycia jest 50) zostanie obliczona ocena z ćwiczeń:&lt;br /&gt;
# [25–30) pkt: 3.0 (dst)&lt;br /&gt;
# [30–35) pkt: 3.5 (dst+)&lt;br /&gt;
# [35–40) pkt: 4.0 (db)&lt;br /&gt;
# [40–45) pkt: 4.5 (db+)&lt;br /&gt;
# [45–50] pkt: 5.0 (bdb)&lt;br /&gt;
&lt;br /&gt;
=== Nieobecności ===&lt;br /&gt;
Dozwolone są maksymalnie dwie nieusprawiedliwione nieobecności.&lt;br /&gt;
&lt;br /&gt;
=== Materiały dostępne w czasie kolokwium ===&lt;br /&gt;
Jedynym materiałem dostępnym w trakcie trwania kolokwium jest oficjalna dokumentacja Python oraz kilka dodatkowych funkcji, które zostały udostępnione na  [[STATLAB/ListaFunkcji|oddzielnej stronie]].&lt;/div&gt;</summary>
		<author><name>SuperAdmin</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=ZasadyZaliczenia&amp;diff=5626</id>
		<title>ZasadyZaliczenia</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=ZasadyZaliczenia&amp;diff=5626"/>
		<updated>2016-09-30T11:05:14Z</updated>

		<summary type="html">&lt;p&gt;SuperAdmin: /* Kolokwia */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Zasady zaliczenia ćwiczeń z [[Analiza_sygnałów - exercises|Analizy Sygnałów]] ==&lt;br /&gt;
&lt;br /&gt;
=== Kolokwia ===&lt;br /&gt;
W trakcie semestru odbędą się dwa kolokwia. Z każdego z nich będzie można uzyskać 10 punktów, z czego do zaliczenia przedmiotu konieczne będzie zdobycie łącznie 10 punktów z kolokwiów (czyli 50%). Kolokwia będą wspólne dla wszystkich grup, będą się odbywać w poniedziałki przed południem.&lt;br /&gt;
&lt;br /&gt;
* '''Kolokwium I:  14 listopada 2016, 10:00-13:00, sale: 1.27, 1.28 ''' &lt;br /&gt;
* '''Kolokwium II: 31 stycznia 2017, 10:00-13, sale: 1.27, 1.28''' &lt;br /&gt;
* '''Kolokwium poprawkowe: 24 lutego 2017, 10:00-13, sale: 1.27, 1.28''' &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wiedza wymagana dotyczy tego samego zakresu materiału, który obowiązywał na I i II kolokwium łącznie.&lt;br /&gt;
W trakcie kolokwium możliwe jest poprawienie łącznej sumy punktów na kolokwia, czyli 20 pkt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--[[STATLAB/kolokwium2_wymagania|Zakres wymagań do II kolokwium.]]--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Projekt ===&lt;br /&gt;
Wymagane będzie wykonanie dwóch projektów indywidualnych. Jeden z nich będzie wymagany w połowie semestru, a drugi do końca semestru. Nie będzie możliwości oddawania projektów po zakończeniu zajęć semestru zimowego. Z każdego projektu będzie można uzyskać 10 punktów, z czego do zaliczenia przedmiotu konieczne jest zdobycie łącznie 10 punktów z projektów (czyli 50%).&lt;br /&gt;
&lt;br /&gt;
# Pierwszy projekt [[STATLAB/Zadanie zaliczeniowe3|Analiza czasowa sygnału audio]] należy wykonać i oddać '''do końca listopada'''. Dokładniejsze terminy zaliczenia przekażą poszczególni prowadzący grup.&lt;br /&gt;
# Drugi projekt: [[STATLAB/Zadanie_zaliczeniowe5|Filtrowanie i przepróbkowanie sygnału]] należy oddać do końca zajęć dydaktycznych.&lt;br /&gt;
&lt;br /&gt;
=== Kartkówki ===&lt;br /&gt;
Na większości (10) zajęć będą miały miejsce kartkówki na podstawie materiału z zajęć poprzednich. Pytania nie będą wymagające, będą raczej sprawdzać uwagę i systematyczną pracę. Łącznie za kartkówki można uzyskać 10 punktów (maksymalnie 1 punkt za każdą), natomiast przy zaliczeniu przedmiotu dozwolone jest niezaliczenie maksymalnie trzech kartkówek (nieusprawiedliwiona nieobecność również pociąga za sobą niezaliczenie kartkówki). Punktów z kartkówek nie można poprawiać.&lt;br /&gt;
&lt;br /&gt;
=== Skala ocen ===&lt;br /&gt;
Na podstawie łącznej liczby punktów (maksymalnie do zdobycia jest 50) zostanie obliczona ocena z ćwiczeń:&lt;br /&gt;
# [25–30) pkt: 3.0 (dst)&lt;br /&gt;
# [30–35) pkt: 3.5 (dst+)&lt;br /&gt;
# [35–40) pkt: 4.0 (db)&lt;br /&gt;
# [40–45) pkt: 4.5 (db+)&lt;br /&gt;
# [45–50] pkt: 5.0 (bdb)&lt;br /&gt;
&lt;br /&gt;
=== Nieobecności ===&lt;br /&gt;
Dozwolone są maksymalnie dwie nieusprawiedliwione nieobecności.&lt;br /&gt;
&lt;br /&gt;
=== Materiały dostępne w czasie kolokwium ===&lt;br /&gt;
Jedynym materiałem dostępnym w trakcie trwania kolokwium jest oficjalna dokumentacja Python oraz kilka dodatkowych funkcji, które zostały udostępnione na  [[STATLAB/ListaFunkcji|oddzielnej stronie]].&lt;/div&gt;</summary>
		<author><name>SuperAdmin</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=%C4%86wiczenia_1&amp;diff=5612</id>
		<title>Ćwiczenia 1</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=%C4%86wiczenia_1&amp;diff=5612"/>
		<updated>2016-09-29T15:05:42Z</updated>

		<summary type="html">&lt;p&gt;SuperAdmin: /* Dokumentacja modułu scipy.signal */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Narzędzia wykorzystywane na ćwiczeniach==&lt;br /&gt;
===Python===&lt;br /&gt;
&lt;br /&gt;
Python jest językiem programowania wysokiego poziomu, który w połączeniu z bibliotekami NumPy i SciPy do obliczeń naukowych pozwala na szybkie i wygodne programowanie lub analizowanie danych w sposób interaktywny. Przykłady prezentowane w ramach zajęć powinny uruchamiać się zarówno w wersji 2 jak i 3 języka Python, jednak zachęcamy Państwa, aby od początku uczyć się i korzystać z wersji 3 języka.&lt;br /&gt;
&lt;br /&gt;
==== Dokumentacja modułu scipy.signal ====&lt;br /&gt;
Proszę zapoznać się z dokumentacją biblioteki scipy.signal:&lt;br /&gt;
&lt;br /&gt;
https://docs.scipy.org/doc/scipy/reference/&lt;br /&gt;
&lt;br /&gt;
===Svarog===&lt;br /&gt;
Przydatnym narzędziem do analizy sygnałów, z którego będziemy korzystać na zajęciach, jest program SVAROG (pierwotnie skrót od Signal Viewer, Analyzer and Recorder On GPL). Program działa w środowisku Java, jest więc niezależny od systemu operacyjnego (Linux, Windows, OS X…). Svarog pozwala na wczytywanie i analizowanie sygnałów (nie tylko bioelektrycznych), zarówno przy użyciu prostych (FFT, spektrogram) jak i bardziej zaawansowanych (matching pursuit, ICA, DTF itd.) narzędzi. Dzięki współpracy z platformą OpenBCI, możliwa jest rejestracja sygnału (łącznie z metadanymi) bezpośrednio z poziomu graficznego interfejsu użytkownika.&lt;br /&gt;
&lt;br /&gt;
====Svarog: uruchamianie i konfiguracja====&lt;br /&gt;
Aktualną wersję programu Svarog można pobrać [http://www.mimuw.edu.pl/~ptr/fid stąd]. Program nie wymaga instalacji. Po rozpakowaniu paczki do dowolnego katalogu należy uruchomić skrypt „run-svarog.sh” lub uruchomić bezpośrednio plik *.jar.&lt;br /&gt;
&lt;br /&gt;
W przypadku pracy na własnych komputerach, do prawidłowego uruchomienia pluginu do analizy sygnałów, z którego będziemy korzystać w dalszej części ćwiczeń, konieczne jest zainstalowanie środowiska Oracle Java SE w wersji 8, które można pobrać [http://www.oracle.com/technetwork/java/javase/downloads/index.html ze strony wydawcy]. Alternatywnie, użytkownicy systemu Ubuntu lub pokrewnych dystrybucji mogą zainstalować środowisko Java według instrukcji [http://www.webupd8.org/2012/09/install-oracle-java-8-in-ubuntu-via-ppa.html dostępnych na tej stronie].&lt;br /&gt;
&lt;br /&gt;
==Sygnały ciągłe i dyskretne ==&lt;br /&gt;
===Próbkowanie w czasie ===&lt;br /&gt;
W tym ćwiczeniu zilustrujemy pojęcia:&lt;br /&gt;
* częstość próbkowania&lt;br /&gt;
* częstość Nyquista&lt;br /&gt;
* aliasing&lt;br /&gt;
&lt;br /&gt;
W poniższym ćwiczeniu chcemy zbadać efekt próbkowania sygnału w czasie. W komputerach nie mamy dostępu do sygnału ciągłego. Na nasze potrzeby wygenerujemy sygnały próbkowane z bardzo dużą częstością, które będą dla nas aproksymacją sygnałów ciągłych. Przy ich pomocy zaprezentujemy efekt utożsamiania (aliasingu).&lt;br /&gt;
&lt;br /&gt;
Proszę wytworzyć wektor reprezentujący czas &amp;amp;bdquo;prawie&amp;amp;rdquo; ciągły. Będzie to u nas 1000 wartości z przedziału [0,1) wziętych z odstępem 0,001.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang =python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
t = np.arange(0,1,0.001) # czas 'prawie ciągły'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Teraz proszę wygenerować dwie sinusoidy: jedną o częstości &amp;lt;tt&amp;gt;-1&amp;lt;/tt&amp;gt; a drugą o częstości &amp;lt;tt&amp;gt;9&amp;lt;/tt&amp;gt;. Dla przypomnienia wyrażenie:&lt;br /&gt;
:&amp;lt;math&amp;gt; s(t) = \sin(2 \pi f t)&amp;lt;/math&amp;gt; możemy w pythonie zapisać:&lt;br /&gt;
&amp;lt;source lang =python&amp;gt;&lt;br /&gt;
s = np.sin(2*np.pi*f*t)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Proszę [[TI/Matplotlib#Kilka_wykres.C3.B3w_we_wsp.C3.B3lnych_osiach|wykreślić]] obie sinusoidy.&lt;br /&gt;
&lt;br /&gt;
Teraz proszę spróbkować czas i nasze &amp;amp;bdquo;prawie&amp;amp;rdquo; ciągłe sinusoidy z okresem próbkowania 0,1. (Trzeba pobrać co 100 element, proszę posłużyć się [[Programowanie_z_Pythonem/Sekwencje#Wycinki|wycinkami]]) &amp;lt;!-- [[TI/Sekwencje|Struktury danych — sekwencje|wycinkami]]. --&amp;gt;&lt;br /&gt;
Na tle &amp;amp;bdquo;prawie&amp;amp;rdquo; ciągłych sinusoid proszę dorysować punkty ze spróbkowanych sygnałów. Aby punkty były dobrze  widoczne proponuję użyć markerów &amp;lt;tt&amp;gt;x&amp;lt;/tt&amp;gt; oraz &amp;lt;tt&amp;gt;+&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Proszę zaobserwować wzajemne położenie punktów. Czy można odróżnić sinusoidę o częstości &amp;amp;minus;1 od sinusoidy o częstości 9, jeśli obie są próbkowane z częstością 10? Jak można uogólnić tą obserwację?&lt;br /&gt;
  &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
t = np.arange(0,1,0.001) # czas 'prawie ciągły'&lt;br /&gt;
f1 = -1 # częstość sygnału 1&lt;br /&gt;
f2 = 9 # częstość sygnału 2&lt;br /&gt;
s1 = np.sin(2*np.pi*f1*t) # prawie ciągły sygnał o częstości f1&lt;br /&gt;
s2 = np.sin(2*np.pi*f2*t) # prawie ciągły sygnał o częstości f2&lt;br /&gt;
&lt;br /&gt;
T = 0.1 # okres próbkowania&lt;br /&gt;
Fs = 1/T # częstość próbkowania&lt;br /&gt;
FN = Fs/2 # częstość Nyquista&lt;br /&gt;
T_samp = t[0::100] # czas pobierania próbek&lt;br /&gt;
s1_samp = s1[0::100] # próbkowany sygnał o częstości f1&lt;br /&gt;
s2_samp = s2[0::100] # próbkowany sygnał o częstości f2&lt;br /&gt;
&lt;br /&gt;
py.plot(t, s1, 'g')&lt;br /&gt;
py.plot(t, s2, 'b')&lt;br /&gt;
py.plot(T_samp, s1_samp, 'gx', markersize=10)&lt;br /&gt;
py.plot(T_samp, s2_samp, 'r+', markersize=10)&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Błąd kwantyzacji ===&lt;br /&gt;
Kiedy mierzymy fizyczne wielkości w celu dalszej analizy najczęściej chcemy przypisać im pewne liczby. Liczby w systemach cyfrowych reprezentowane są ze skończoną dokładnością. Urządzenia dokonujące przypisania liczby do mierzonej wartości to przetworniki analogowo-cyfrowe (ang. ADC, Analog to Digital Converter).&lt;br /&gt;
Charakteryzują się one określoną ilością bitów ''N'', za pomocą których reprezentują liczby. Pełen zakres wartości pomiarowych ''R'' jest dzielony na &amp;lt;math&amp;gt;2^N&amp;lt;/math&amp;gt; poziomów. Błąd kwantyzacji szacujemy jako nie większy niż &amp;lt;math&amp;gt; \frac{R}{2^{N+1}} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
====Zadanie:====&lt;br /&gt;
Proszę oszacować błąd kwantyzacji sygnału EEG mierzonego za pomocą 12-bitowego konwertera. Zakres pomiarowy tego urządzenia to &amp;amp;plusmn;200 &amp;amp;mu;V.&lt;br /&gt;
====Zadanie:====&lt;br /&gt;
Proszę zilustrować efekt kwantyzacji dla trzybitowego przetwornika o zakresie 2.&lt;br /&gt;
W tym celu proszę wykonać następujące kroki:&lt;br /&gt;
# wygenerować &amp;amp;bdquo;prawie&amp;amp;rdquo; ciągłą sinusoidę (częstość 1, czas trwania 1 próbkowanie co 0,001)&lt;br /&gt;
# spróbkować tą sinusoidę co 0,1 (proszę zastosować wycinki)&lt;br /&gt;
# proszę skwantować spróbkowane wartości &lt;br /&gt;
#Proszę wykreślić na jednym rysunku &lt;br /&gt;
#* oryginalny sygnał &lt;br /&gt;
#* sygnał spróbkowany w czasie&lt;br /&gt;
#* sygnał spróbkowany w czasie i o skwantowanej amplitudzie (skorzystać z funkcji &amp;lt;tt&amp;gt;py.step&amp;lt;/tt&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
{{ Wyjaśnienie|title= wskazówka: Kwantowanie | text = &lt;br /&gt;
&amp;lt;source lang =python&amp;gt;&lt;br /&gt;
N_bits = 3&lt;br /&gt;
zakres = 2.0&lt;br /&gt;
dy = zakres/2**N_bits&lt;br /&gt;
s1_kwantowany = np.floor(s1_samp/dy)*dy +0.5*dy&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
t = np.arange(0,1,0.001) # czas 'prawie ciągły'&lt;br /&gt;
f1 = 1 # częstość sygnału 1&lt;br /&gt;
&lt;br /&gt;
s1 = np.sin(2*np.pi*f1*t) # prawie ciągły sygnał o częstości f1&lt;br /&gt;
T_samp = t[0::100]&lt;br /&gt;
s1_samp = s1[0::100]&lt;br /&gt;
&lt;br /&gt;
N_bits = 3&lt;br /&gt;
zakres = 2.0&lt;br /&gt;
dy = zakres/2**N_bits&lt;br /&gt;
s1_kwantowany = np.floor(s1_samp/dy)*dy +0.5*dy&lt;br /&gt;
ax = py.subplot(111)&lt;br /&gt;
py.plot(t,s1)&lt;br /&gt;
py.plot(T_samp,s1_samp,'ko',markersize = 5)&lt;br /&gt;
py.step(T_samp,s1_kwantowany,where = 'post')&lt;br /&gt;
&lt;br /&gt;
ax.set_xticks(T_samp)&lt;br /&gt;
poziomy = np.arange(-1+0.5*dy,1,dy)&lt;br /&gt;
ax.set_yticks(poziomy)&lt;br /&gt;
py.grid('on')&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for i in xrange(0,8):&lt;br /&gt;
	py.text(1.02,poziomy[i],bin(i))&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sygnały testowe==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Generowanie sygnałów testowych ===&lt;br /&gt;
&lt;br /&gt;
Do badania różnych metod analizy sygnałów potrzebne nam będą sygnały o znanych własnościach. W szczególności dobrze jest umnieć nadać sygnałom występującym w postaci cyfrowej, oraz sztucznym sygnałom próbnym pewne własności fizyczne takie jak:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	czętość próbkowania&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	czas trwania&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	amplituda&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
=== Przykład sinus===&lt;br /&gt;
Sinus o zadanej częstości (w Hz), długości trwania, częstości próbkowania i fazie.&lt;br /&gt;
Poniższy kod implementuje i testuje funkcję &lt;br /&gt;
:&amp;lt;math&amp;gt; \sin(f,T,Fs,\phi) = \sin(2*\pi f t)&amp;lt;/math&amp;gt; dla &amp;lt;math&amp;gt;t \in \{0,T\}&amp;lt;/math&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def sin(f = 1, T = 1, Fs = 128, phi =0 ):&lt;br /&gt;
	'''sin o zadanej częstości (w Hz), długości, fazie i częstości próbkowania&lt;br /&gt;
	Domyślnie wytwarzany jest sygnał reprezentujący &lt;br /&gt;
	1 sekundę sinusa o częstości 1 Hz i zerowej fazie próbkowanego 128 Hz&lt;br /&gt;
	'''&lt;br /&gt;
&lt;br /&gt;
	dt = 1.0/Fs&lt;br /&gt;
	t = np.arange(0,T,dt)&lt;br /&gt;
	s = np.sin(2*np.pi*f*t + phi)&lt;br /&gt;
	return (s,t)&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
(s,t) = sin(f=10,Fs=1000)&lt;br /&gt;
py.plot(t,s)&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=== Przykład: eksport sygnału do pliku binarnego ===&lt;br /&gt;
* Poniższy kod ilustruje sposób zapisu dwóch funkcji sinus o częstościach 10 Hz i 21 Hz do pliku binarnego:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
T = 5&lt;br /&gt;
Fs = 128.0&lt;br /&gt;
&lt;br /&gt;
s1 = sin(f=10, T=T, Fs=Fs)&lt;br /&gt;
s2 = sin(f=21, T=T, Fs=Fs)	&lt;br /&gt;
	&lt;br /&gt;
signal = np.zeros((T*Fs, 2), dtype='&amp;lt;f')&lt;br /&gt;
signal[:, 0] = s1&lt;br /&gt;
signal[:, 1] = s2&lt;br /&gt;
&lt;br /&gt;
with open('test_signal.bin', 'wb') as f:&lt;br /&gt;
    signal.tofile(f)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Przykład: wczytanie sygnału do Svaroga ===&lt;br /&gt;
W celu wczytania zapisanego binarnie sygnału do programu Svarog, po wybraniu File -&amp;gt; Open signal, należy wprowadzić częstość próbkowania sygnału oraz liczbę kanałów. &lt;br /&gt;
&lt;br /&gt;
[[Plik:svarog_open_signal.png|center|800px|thumb|&amp;lt;figure id=&amp;quot;uid3&amp;quot; /&amp;gt;Wczytywanie sygnału w programie Svarog.]]&lt;br /&gt;
&lt;br /&gt;
=== Delta ===&lt;br /&gt;
Podobnie można zdefiniować funkcję delta o zadanym czasie trwania, częstości próbkowania i momencie wystąpienia impulsu:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt; \delta(t_0) = \left\{^{1 \quad t=t_0} _{0 \quad t \ne t_0} \right.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang= python&amp;gt;&lt;br /&gt;
def delta(t0=0.5, T=1  ,Fs = 128):&lt;br /&gt;
	dt = 1.0/Fs&lt;br /&gt;
	t = np.arange(0,T,dt)&lt;br /&gt;
	d = np.zeros(len(t))&lt;br /&gt;
	d[np.ceil(t0*Fs)]=1&lt;br /&gt;
	return (d,t)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Zadanie:===&lt;br /&gt;
Analogicznie do powyższych przykładów proszę zaimplementować i przetestować funkcje generujące:&lt;br /&gt;
* funkcję Gabora (funkcja Gaussa modulowana cosinusem) o zadanej częstości i standardowym odchyleniu w czasie, momencie wystąpienia, długości, częstości próbkowania i fazie. &lt;br /&gt;
:&amp;lt;math&amp;gt; g = \exp\left(-\frac{1}{2}\left(\frac{t-t_0}{\sigma}\right)^2 \right) \cdot  \cos(2 \pi f t + \phi); &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* szum gaussowski o zadanej średniej, odchyleniu standardowym, długości i częstości próbkowania.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- * pochodną funkcji Gaussa&lt;br /&gt;
&lt;br /&gt;
* połówkę funkcji Gaussa&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>SuperAdmin</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/Info_2&amp;diff=4859</id>
		<title>Laboratorium EEG/Info 2</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/Info_2&amp;diff=4859"/>
		<updated>2016-03-04T10:54:49Z</updated>

		<summary type="html">&lt;p&gt;SuperAdmin: /* Wyniki kartkówek */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
=Laboratorium EEG - grupa 2 - ćwiczenia=&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ogłoszenia bieżące ==&lt;br /&gt;
&lt;br /&gt;
Terminy prezentacji wyników pracy:&lt;br /&gt;
* 12 kwietnia ERDS&lt;br /&gt;
* 26 kwietnia CSP P300&lt;br /&gt;
* 24 maja ASSR &lt;br /&gt;
*  7 czerwca DTF&lt;br /&gt;
&lt;br /&gt;
Propozycje ocen:&lt;br /&gt;
* 14 czerwca&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Termin zajęć ==&lt;br /&gt;
Zajęcia odbywają się dwa razy w tygodniu, we wtorki w godzinach 12:15 - 14:45 oraz w piątki, w godzinach 09:30 - 12:00. Sala &amp;lt;b&amp;gt;4.59&amp;lt;/b&amp;gt;, ul. Pasteura 5 - &amp;lt;b&amp;gt;&amp;quot;nowy&amp;quot;&amp;lt;/b&amp;gt; budynek dydaktyczny Wydziału Fizyki UW.&lt;br /&gt;
&lt;br /&gt;
== Kontakt z prowadzącym ==&lt;br /&gt;
Zajęcia prowadzi Jarosław Żygierewicz, pokój 4.70 oraz Anita Gardias p. 3.49, ul. Pasteura 5 &lt;br /&gt;
&lt;br /&gt;
Preferowany sposób kontaktu - w czasie zajęć lub dyżuru&lt;br /&gt;
&lt;br /&gt;
== Wyniki kartkówek ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center; clear:both;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;12&amp;quot; style=&amp;quot;text-align: center;&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
!Lp&lt;br /&gt;
!Numer indeksu&lt;br /&gt;
!Zadanie 1&lt;br /&gt;
!Zadanie 2&lt;br /&gt;
!Zadanie 3&lt;br /&gt;
!Zadanie 4&lt;br /&gt;
!Zadanie 5&lt;br /&gt;
!Zadanie 6&lt;br /&gt;
!Zadanie 7&lt;br /&gt;
!Zadanie 8&lt;br /&gt;
!Zadanie 9&lt;br /&gt;
!Zadanie 10&lt;br /&gt;
!Wynik łączny&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|307362&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|341887&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|335477&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|0.5&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|295632&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|5&lt;br /&gt;
|307428&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|-&lt;br /&gt;
|6&lt;br /&gt;
|347461&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|-&lt;br /&gt;
|7&lt;br /&gt;
|335254&lt;br /&gt;
|0.5&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|290829&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|1&lt;br /&gt;
|-&lt;br /&gt;
|9&lt;br /&gt;
|245323&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin:10px 10px 10px 10px; padding:10px;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:left;&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
!#&lt;br /&gt;
!Zagadnienia sprawdzane na kartkówkach&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Manipulacja wierszami i kolumnami macierzy (zmiana kolejności elementów).&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Instrukcje warunkowe oraz pętle&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
|  Proste zagadnienia numeryczne (losowanie liczb spełniających warunek, przeszukiwanie macierzy).&lt;br /&gt;
| Operatory macierzowe i działające na elementach&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| Tworzenie i odwoływanie się do  struktury (konwersja zapisu czasu).&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| Posługiwanie się komórkami (cell)&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| Wczytywanie danych z plików tekstowych do struktur.&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| Wczytywanie zapisów EEG (pliki .raw) do struktur.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wyniki prezentacji==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center; clear:both&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center; float: left;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;11&amp;quot; style=&amp;quot;text-align: center;&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
!Numer indeksu&lt;br /&gt;
!Prezentacja 1&lt;br /&gt;
!Prezentacja 2&lt;br /&gt;
!Projekt&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>SuperAdmin</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/Info_2&amp;diff=4858</id>
		<title>Laboratorium EEG/Info 2</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/Info_2&amp;diff=4858"/>
		<updated>2016-03-03T16:04:20Z</updated>

		<summary type="html">&lt;p&gt;SuperAdmin: /* Wyniki kartkówek */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
=Laboratorium EEG - grupa 2 - ćwiczenia=&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ogłoszenia bieżące ==&lt;br /&gt;
&lt;br /&gt;
Terminy prezentacji wyników pracy:&lt;br /&gt;
* 12 kwietnia ERDS&lt;br /&gt;
* 26 kwietnia CSP P300&lt;br /&gt;
* 24 maja ASSR &lt;br /&gt;
*  7 czerwca DTF&lt;br /&gt;
&lt;br /&gt;
Propozycje ocen:&lt;br /&gt;
* 14 czerwca&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Termin zajęć ==&lt;br /&gt;
Zajęcia odbywają się dwa razy w tygodniu, we wtorki w godzinach 12:15 - 14:45 oraz w piątki, w godzinach 09:30 - 12:00. Sala &amp;lt;b&amp;gt;4.59&amp;lt;/b&amp;gt;, ul. Pasteura 5 - &amp;lt;b&amp;gt;&amp;quot;nowy&amp;quot;&amp;lt;/b&amp;gt; budynek dydaktyczny Wydziału Fizyki UW.&lt;br /&gt;
&lt;br /&gt;
== Kontakt z prowadzącym ==&lt;br /&gt;
Zajęcia prowadzi Jarosław Żygierewicz, pokój 4.70 oraz Anita Gardias p. 3.49, ul. Pasteura 5 &lt;br /&gt;
&lt;br /&gt;
Preferowany sposób kontaktu - w czasie zajęć lub dyżuru&lt;br /&gt;
&lt;br /&gt;
== Wyniki kartkówek ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center; clear:both;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;12&amp;quot; style=&amp;quot;text-align: center;&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
!Lp&lt;br /&gt;
!Numer indeksu&lt;br /&gt;
!Zadanie 1&lt;br /&gt;
!Zadanie 2&lt;br /&gt;
!Zadanie 3&lt;br /&gt;
!Zadanie 4&lt;br /&gt;
!Zadanie 5&lt;br /&gt;
!Zadanie 6&lt;br /&gt;
!Zadanie 7&lt;br /&gt;
!Zadanie 8&lt;br /&gt;
!Zadanie 9&lt;br /&gt;
!Zadanie 10&lt;br /&gt;
!Wynik łączny&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|307362&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|341887&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|335477&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|295632&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|5&lt;br /&gt;
|307428&lt;br /&gt;
|1&lt;br /&gt;
|1&lt;br /&gt;
|-&lt;br /&gt;
|6&lt;br /&gt;
|347461&lt;br /&gt;
|&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|7&lt;br /&gt;
|335254&lt;br /&gt;
|0.5&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|290829&lt;br /&gt;
|1&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|9&lt;br /&gt;
|245323&lt;br /&gt;
|&lt;br /&gt;
|1&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin:10px 10px 10px 10px; padding:10px;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:left;&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
!#&lt;br /&gt;
!Zagadnienia sprawdzane na kartkówkach&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Manipulacja wierszami i kolumnami macierzy (zmiana kolejności elementów).&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Instrukcje warunkowe oraz pętle&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
|  Proste zagadnienia numeryczne (losowanie liczb spełniających warunek, przeszukiwanie macierzy).&lt;br /&gt;
| Operatory macierzowe i działające na elementach&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| Tworzenie i odwoływanie się do  struktury (konwersja zapisu czasu).&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| Posługiwanie się komórkami (cell)&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| Wczytywanie danych z plików tekstowych do struktur.&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| Wczytywanie zapisów EEG (pliki .raw) do struktur.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wyniki prezentacji==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center; clear:both&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center; float: left;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;11&amp;quot; style=&amp;quot;text-align: center;&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
!Numer indeksu&lt;br /&gt;
!Prezentacja 1&lt;br /&gt;
!Prezentacja 2&lt;br /&gt;
!Projekt&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>SuperAdmin</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/Konwerter_plik%C3%B3w_Svarog%E2%80%93Matlab&amp;diff=4857</id>
		<title>Laboratorium EEG/Konwerter plików Svarog–Matlab</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/Konwerter_plik%C3%B3w_Svarog%E2%80%93Matlab&amp;diff=4857"/>
		<updated>2016-03-03T15:55:13Z</updated>

		<summary type="html">&lt;p&gt;SuperAdmin: /* Konwerter plików Svarog-Matlab */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Laboratorium_EEG]]/Konwerter &lt;br /&gt;
=Konwerter plików Svarog-Matlab=&lt;br /&gt;
&lt;br /&gt;
Do zbierania danych podczas eksperymentów używamy na pracowniach programu Svarog. Zapisuje on pliki z danymi w postaci binarnej, natomiast cała informacja o strukturze takiego pliku danych (tzw. metadane) przechowywana jest w osobnym pliku typu XML. Aby móc analizować nasze pliki danych w Matlabie musimy umieć wczytać i odpowiednio interpretować informacje w nich zawarte. Niestety nie mamy gotowej funkcji dla wczytywania plików zapisywanych przez Svaroga, a także dostępne domyślnie funkcje do obróbki zbiorów typu XML nie nadają się do tego celu.&lt;br /&gt;
&lt;br /&gt;
Jak łatwo się domyśleć, pierwszym krokiem musi być „wyciągnięcie” z pliku XML podstawowych informacji o zapisanych danych. Plik XML ma format tekstowy, możemy więc go otworzyć w edytorze tekstu (na przykład matlabowym), ale ta metoda nie jest szczególnie użyteczna, jako bardzo pracochłonna. Wczytajmy więc ten plik do Matlaba i postarajmy się automatycznie znaleźć wszystkie potrzebne informacje. Będą to:&lt;br /&gt;
* nazwa pliku z danymi;&lt;br /&gt;
* liczba zapisanych kanałów;&lt;br /&gt;
* częstość próbkowania danych;&lt;br /&gt;
* format użyty do zapisu liczb;&lt;br /&gt;
* liczba zapisanych próbek;&lt;br /&gt;
* nazwy kanałów;&lt;br /&gt;
* wzmocnienie (''gain'') i poziom (''offset'') w każdym kanale;&lt;br /&gt;
*czas rozpoczęcia rejestracji.&lt;br /&gt;
&lt;br /&gt;
Jak wczytać plik tekstowy do Maltaba? Wskazówką niech będzie przykład ze zliczaniem liter w poprzednim rozdziale. Różnica jest tylko taka, że tam traktowaliśmy litery tekstu jako liczby, a teraz potrzebujemy znaków tekstowych. Musimy zastosować inny typ wczytywanych danych: &amp;lt;tt&amp;gt;*char&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Jeśli udało nam się wczytać plik XML i mamy go w postaci wektora znaków w Matlabie, następnym krokiem będzie wyszukanie w tym tekście potrzebnych nam informacji. Czego będziemy szukać w naszym pliku XML? Jak łatwo zauważyć potrzebne nam informacje „opakowane” są specjalnymi znacznikami. Na przykład nazwa „właściwego” pliku danych zawarta jest pomiędzy znacznikiem &amp;lt;tt&amp;gt;&amp;lt;rs:exportFileName&amp;gt;&amp;lt;/tt&amp;gt; a znacznikiem &amp;lt;tt&amp;gt;&amp;lt;/rs:exportFileName&amp;gt;&amp;lt;/tt&amp;gt;. Wystarczy więc znaleźć początek i koniec każdego znacznika, a następnie „pobrać” informację spomiędzy tych pozycji.&lt;br /&gt;
&lt;br /&gt;
Do przeszukiwania tekstów mamy dostępnych kilka różnych funkcji. Funkcje &amp;lt;tt&amp;gt;findstr&amp;lt;/tt&amp;gt; i &amp;lt;tt&amp;gt;strfind&amp;lt;/tt&amp;gt; mają w naszym przypadku mniejsze zastosowanie, gdyż operują na tekstach jednowierszowych (bez znaków nowego wiersza), a nasz tekst jest wielowierszowy. Na szczęście jest do dyspozycji funkcja &amp;lt;tt&amp;gt;regexp&amp;lt;/tt&amp;gt;, która poszukuje wyrażeń znakowych w wektorach znaków. Na dodatek zwraca indeksy początków i końców każdego znalezionego fragmentu!&lt;br /&gt;
&lt;br /&gt;
Wskazówki:&lt;br /&gt;
* Transpozycję macierzy uzyskujemy dopisując apostrof &amp;lt;tt&amp;gt;'&amp;lt;/tt&amp;gt; na końcu transponowanego wyrażenia.&lt;br /&gt;
* Aby z tekstu (zawierającego cyfry) zrobić liczbę stosujemy funkcję &amp;lt;tt&amp;gt;str2double&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Jeśli już wszystko wiemy na temat naszych danych, możemy je odczytać. Dane są zapisane w formacie binarnym, a jego struktura jest następująca (przy założeniu ''k'' kanałów i długości danych ''N'' próbek):&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; &lt;br /&gt;
| style=&amp;quot;width:35px; text-align:center;&amp;quot; | ''x''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;(''t''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;)&lt;br /&gt;
| style=&amp;quot;width:35px; text-align:center;&amp;quot; | ''x''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;(''t''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;)&lt;br /&gt;
| style=&amp;quot;width:35px; text-align:center;&amp;quot; | ...&lt;br /&gt;
| style=&amp;quot;width:35px; text-align:center;&amp;quot; | ''x''&amp;lt;sub&amp;gt;''k''&amp;lt;/sub&amp;gt;(''t''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;)&lt;br /&gt;
| style=&amp;quot;width:35px; text-align:center;&amp;quot; | ''x''&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;(''t''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;)&lt;br /&gt;
| style=&amp;quot;width:35px; text-align:center;&amp;quot; | ''x''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;(''t''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;)&lt;br /&gt;
| style=&amp;quot;width:35px; text-align:center;&amp;quot; | ...&lt;br /&gt;
| style=&amp;quot;width:35px; text-align:center;&amp;quot; | ''x''&amp;lt;sub&amp;gt;''k''&amp;lt;/sub&amp;gt;(''t''&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;)&lt;br /&gt;
| style=&amp;quot;width:35px; text-align:center;&amp;quot; | ...&lt;br /&gt;
| style=&amp;quot;width:35px; text-align:center;&amp;quot; | ...&lt;br /&gt;
| style=&amp;quot;width:35px; text-align:center;&amp;quot; | ''x''&amp;lt;sub&amp;gt;''k''&amp;lt;/sub&amp;gt;(''t''&amp;lt;sub&amp;gt;''N''&amp;lt;/sub&amp;gt;)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kolejne kratki oznaczają tu kolejne liczby w pliku. Format taki nazywamy przeplatanym lub multipleksowanym.&lt;br /&gt;
&lt;br /&gt;
Jeśli plik nie jest bardzo duży możemy go w całości wczytać do Matlaba. Operacja jest w zasadzie analogiczna do wczytania pliku XML, z taką różnicą, że teraz format wczytywanych danych jest &amp;lt;tt&amp;gt;double&amp;lt;/tt&amp;gt; (lub inny, w zależności od informacji z pliku XML), czyli dane są binarne (nie da się ich przeczytać w edytorze tekstu). Po udanym wczytaniu danych, w pamięci mamy zmienną zawierającą dane z pliku o postaci jednowymiarowego wektora jak na przedstawionym powyżej rysunku. Należy go przekształcić do postaci macierzy o właściwych rozmiarach komendą &amp;lt;tt&amp;gt;reshape(dane,(liczba_kanalow, liczba_probek))&amp;lt;/tt&amp;gt; albo &amp;lt;tt&amp;gt;dane.reshape((liczba_kanalow, liczba_probek))&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Ostatnim etapem przygotowywania danych będzie zastosowanie odpowiedniego montażu — oczywiście jako procedury w Matlabie.&lt;br /&gt;
&lt;br /&gt;
Plik zawierający przykłądowe dane do wczytania: [[Plik:Sygnal_p300_kalib.tar.gz]]. proszę go pobrać i wypakować do osobnego katalogu. Po wypakowaniu powinny się tam pojawić 3 pliki:&lt;br /&gt;
* sygnał binarny: p_6301423_calibration_p300.obci.raw &lt;br /&gt;
* opis xml: p_6301423_calibration_p300.obci.xml&lt;br /&gt;
* plik ze znacznikami: p_6301423_calibration_p300.obci.tag - tym plikiem na dzisiejszych zajęciach nie będziemy się zajmować&lt;br /&gt;
&lt;br /&gt;
Proszę wczytać ten sygnał do SVAROGA żeby przekonać się jak te dane wyglądają, a następnie napisać funkcję wczytującą te dane do Matlaba.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Laboratorium_EEG]]/Konwerter&lt;/div&gt;</summary>
		<author><name>SuperAdmin</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Plik:Sygnal_p300_kalib.tar.gz&amp;diff=4856</id>
		<title>Plik:Sygnal p300 kalib.tar.gz</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Plik:Sygnal_p300_kalib.tar.gz&amp;diff=4856"/>
		<updated>2016-03-03T15:48:37Z</updated>

		<summary type="html">&lt;p&gt;SuperAdmin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>SuperAdmin</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/%C4%86wiczenia_1&amp;diff=4822</id>
		<title>Uczenie maszynowe i sztuczne sieci neuronowe/Ćwiczenia 1</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/%C4%86wiczenia_1&amp;diff=4822"/>
		<updated>2016-03-01T16:20:01Z</updated>

		<summary type="html">&lt;p&gt;SuperAdmin: /* Zapoznanie się z regresją liniową */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Powtórka podstawowych rachunków wektorowych i macierzowych w ptyhonie=&lt;br /&gt;
==Wektor wierszowy i kolumnowy ==&lt;br /&gt;
Natywnym typem zmiennych w numpy są tablice czyli &amp;lt;tt&amp;gt;array&amp;lt;/tt&amp;gt;. Aczkolwiek są one wielowymiarowe i przy pomocy indeksowania i pobierania wycinków można się nimi sprawnie posługiwać to nie są one domyślnie macierzami w sensie matematycznym. Aby uprawiać przy ich pomocy algebrę musimy nadać im kształt :-). Służy do tego metoda &amp;lt;tt&amp;gt;reshape&amp;lt;/tt&amp;gt;.&lt;br /&gt;
Aby zbadać własności tych obiektów proszę wykonać następujący kod:&lt;br /&gt;
&amp;lt;source lang =python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
x = np.array([1,2,3,4])&lt;br /&gt;
print len(x), x.shape&lt;br /&gt;
print 'x: ',x&lt;br /&gt;
print 'transponowany x: ',x.T&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Czy tablica x i transponowana tablica x się różnią?&lt;br /&gt;
&lt;br /&gt;
A teraz proszę wykonać następujący kod:&lt;br /&gt;
&amp;lt;source lang =python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
x = np.array([1,2,3,4]).reshape(4,1)&lt;br /&gt;
print len(x), x.shape&lt;br /&gt;
print 'x: ',x&lt;br /&gt;
print 'transponowany x: ',x.T&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Proszę sprawdzić kształt i transpozycję macierzy 2x2, np. &lt;br /&gt;
::&amp;lt;math&amp;gt;A =&lt;br /&gt;
\left[&lt;br /&gt;
\begin{array}{cc}&lt;br /&gt;
1 &amp;amp; 2 \\&lt;br /&gt;
3 &amp;amp; 4&lt;br /&gt;
\end{array}&lt;br /&gt;
\right]&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang =python&amp;gt;&lt;br /&gt;
A = np.array([[1,2],[3,4]])&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Operator &amp;lt;tt&amp;gt;*&amp;lt;/tt&amp;gt; służy do mnożenia macierzy element po elemencie, albo do mnożenia macierzy przez skalar:&lt;br /&gt;
&amp;lt;source lang =python&amp;gt;&lt;br /&gt;
print A*A&lt;br /&gt;
print 2*A&lt;br /&gt;
v = np.array([3])&lt;br /&gt;
print v*A&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Do wykonywania mnożenia w sensie macierzowym służy funkcja &amp;lt;tt&amp;gt;np.dot&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&amp;lt;source lang =python&amp;gt;&lt;br /&gt;
print np.dot(A,A)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Co robią następujące polecenia:&lt;br /&gt;
&amp;lt;source lang =python&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
x = np.array([1,2,3,4]).reshape(4,1)&lt;br /&gt;
print np.dot(x.T,x)&lt;br /&gt;
print np.dot(x,x.T)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Zapoznanie się z regresją liniową=&lt;br /&gt;
W poniższych ćwiczeniach korzystać będziemy z następującej funkcji generującej dane. Proszę ją wykonać i obejrzeć dane.  &amp;lt;tt&amp;gt;(X,Y)&amp;lt;/tt&amp;gt; to ciąg uczący.&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def symuluj_dane(theta, ile=30, odch_std = 3):&lt;br /&gt;
	# symuowana zalezność ma nastepującą postać y = theta[0] + theta[1]*x &lt;br /&gt;
	# wartości parametrów  &lt;br /&gt;
	X = np.ones((ile,2)).reshape(ile,2) # X ma być macierzą, w której wierszach zapisane są kolejne wejścia ciągu&lt;br /&gt;
	X[:,1] = np.linspace(0, 10,ile)&lt;br /&gt;
	#błąd &lt;br /&gt;
	epsilon = st.norm.rvs(size = ile, loc=0, scale = odch_std).reshape(ile,1)&lt;br /&gt;
	#epsilon = (st.uniform.rvs(size = ile, loc=-0.5, scale = odch_std)**3).reshape(ile,1)&lt;br /&gt;
		&lt;br /&gt;
	Y =  np.dot(X,theta) + epsilon &lt;br /&gt;
	return (X,Y)&lt;br /&gt;
&lt;br /&gt;
theta = np.array([1.,3.]).reshape(2,1) # theta ma być wektorem kolumnowym&lt;br /&gt;
(X,Y) = symuluj_dane(theta,  ile = 7, odch_std = 3) #symulujemy dane&lt;br /&gt;
py.plot(X[:,1], Y,'bo') # przedstawiamy nasze dane na wykresie&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Algorytm równań normalnych ==&lt;br /&gt;
Proszę napisać funkcję, która:&lt;br /&gt;
* na wejściu przyjmuje ciąg uczący, implementuje wzór na parametry optymalne na podstawie [[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Wyk%C5%82ad_1#Minimalizacja_funkcji_kosztu|równań normalnych]]. &lt;br /&gt;
* Funkcja powinna zwracać estymowane parametry theta.&lt;br /&gt;
* Proszę dorysować prostą reprezentującą hipotezę do wykresu punktów ciągu uczącego.&lt;br /&gt;
* dla przypomnienia: odwrotność macierzy można obliczyć w numpy funkcją: &amp;lt;tt&amp;gt;numpy.linalg.inv&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Algorytm gradientowy stochastyczny ==&lt;br /&gt;
Proszę napisać funkcję, która znajduje optymalne parametry theta wg. algorytmu gradientowego stochastycznego. Funkcja jako argumenty przyjmuje ciąg uczący, wartości początkowe theta i parametr szybkości zbiegania alpha.&lt;br /&gt;
Na wyjściu funkcja powinna zwracać wyestymowane wartości parametrów.&lt;br /&gt;
&lt;br /&gt;
W ramach ilustracji po każdej iteracji proszę dorysować prostą parametryzowaną przez aktualne wartości parametrów. Prostą animację można wykonać [[TI/Matplotlib#Prosta_animacja| analogicznie jak tu]].&lt;br /&gt;
&lt;br /&gt;
==Algortym gradientowy zbiorczy ==&lt;br /&gt;
Proszę napisać funkcję, która znajduje optymalne parametry theta wg. algorytmy gradientowego zbiorczego. Funkcja jako argumenty przyjmuje ciąg uczący, wartości początkowe theta i parametr szybkości zbiegania alpha.&lt;br /&gt;
Na wyjściu funkcja powinna zwracać wyestymowane wartości parametrów.&lt;br /&gt;
&lt;br /&gt;
W ramach ilustracji po każdej iteracji proszę dorysować prostą parametryzowaną przez aktualne wartości parametrów. Prostą animację można wykonać [[TI/Matplotlib#Prosta_animacja| analogicznie jak tu]].&lt;br /&gt;
&lt;br /&gt;
==Porównanie algorytmów==&lt;br /&gt;
* Proszę sprawdzić zbieżność algorytmów w zależności od parametrów szybkości zbiegania.&lt;br /&gt;
* Proszę sprawdzić czy algorytmy optymalizacyjne działają poprawnie dla danych gdzie błąd podlega innym rozkładom prawdopodobieństwa niż normalny. np. rozkład jednorodny lub  t o 3 st. swobody.&lt;br /&gt;
 *&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Przykładowe kody ==&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import matplotlib&lt;br /&gt;
matplotlib.use('TkAgg')&lt;br /&gt;
import scipy.stats as st&lt;br /&gt;
import pylab as py&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def symuluj_dane(theta, ile=30, odch_std = 3):&lt;br /&gt;
	# symuowana zalezność ma nastepującą postać y = theta[0] + theta[1]*x &lt;br /&gt;
	# wartości parametrów  &lt;br /&gt;
	X = np.ones((ile,2)).reshape(ile,2) # X ma być macierzą, w której wierszach zapisane są kolejne wejścia ciągu&lt;br /&gt;
	X[:,1] = np.linspace(0, 10,ile)&lt;br /&gt;
	#błąd &lt;br /&gt;
	epsilon = st.norm.rvs(size = ile, loc=0, scale = odch_std).reshape(ile,1)&lt;br /&gt;
	#epsilon = (st.uniform.rvs(size = ile, loc=-0.5, scale = odch_std)**3).reshape(ile,1)&lt;br /&gt;
		&lt;br /&gt;
	Y =  np.dot(X,theta) + epsilon &lt;br /&gt;
	return (X,Y)&lt;br /&gt;
&lt;br /&gt;
def licz_rownania_normalne(X,Y):&lt;br /&gt;
	theta = np.dot( np.dot(np.linalg.inv( np.dot(X.T,X)  ),X.T) ,Y)&lt;br /&gt;
	return theta&lt;br /&gt;
&lt;br /&gt;
def koszt(X,Y,theta):&lt;br /&gt;
	return 0.5* np.dot( ( np.dot(X,theta) - Y).T, ( np.dot(X,theta) -Y) )&lt;br /&gt;
&lt;br /&gt;
def licz_iteracyjnie_stoch(X,Y,theta0 = np.array([0,0]).reshape(2,1), alpha = 0.01):&lt;br /&gt;
	&lt;br /&gt;
	py.ion()	&lt;br /&gt;
	py.plot(X[:,1], Y,'bo')&lt;br /&gt;
	y_reg = np.dot(X,theta0)&lt;br /&gt;
	linia, = py.plot(X[:,1],y_reg,'r')&lt;br /&gt;
	for i in range(200):&lt;br /&gt;
		ind = np.random.randint(X.shape[0])		&lt;br /&gt;
		# mały x to wejście pojedynczego przykładu o indeksie in&lt;br /&gt;
		x = X[ind,:]		&lt;br /&gt;
		x = x.reshape(1,len(x))&lt;br /&gt;
		theta0 = theta0 - alpha * ( np.dot(x,theta0)- Y[ind])*x.T&lt;br /&gt;
		#print 'J: ', koszt(X,Y,theta)&lt;br /&gt;
		linia.set_ydata(np.dot(X,theta0))&lt;br /&gt;
		py.draw()&lt;br /&gt;
	return theta0&lt;br /&gt;
&lt;br /&gt;
def licz_iteracyjnie_batch(X,Y,theta0 = np.array([0,0]).reshape(2,1), alpha = 0.005):&lt;br /&gt;
	py.ion()	&lt;br /&gt;
	py.plot(X[:,1], Y,'bo')&lt;br /&gt;
	y_reg = np.dot(X,theta0)&lt;br /&gt;
	linia, = py.plot(X[:,1],y_reg,'m')&lt;br /&gt;
	delta = np.ones(len(theta0)).reshape(len(theta0),1)&lt;br /&gt;
	while np.max(np.abs(delta)) &amp;gt; 0.001:&lt;br /&gt;
		delta = np.zeros(len(theta0)).reshape(len(theta0),1)&lt;br /&gt;
		for ind, x in enumerate(X):		&lt;br /&gt;
			# mały x to wejście pojedynczego przykładu o indeksie in&lt;br /&gt;
			x = x.reshape(1,len(x))&lt;br /&gt;
			delta += ( np.dot(x,theta0)- Y[ind])*x.T&lt;br /&gt;
		theta0 = theta0 - alpha * delta &lt;br /&gt;
		#print 'J: ', koszt(X,Y,theta)&lt;br /&gt;
		linia.set_ydata(np.dot(X,theta0))&lt;br /&gt;
		py.draw()&lt;br /&gt;
	return theta0&lt;br /&gt;
	&lt;br /&gt;
theta = np.array([1.,3.]).reshape(2,1) # theta ma być wektorem kolumnowym&lt;br /&gt;
(X,Y) = symuluj_dane(theta,  ile = 7, odch_std = 3)&lt;br /&gt;
&lt;br /&gt;
theta_est = licz_rownania_normalne(X,Y)&lt;br /&gt;
theta_est_iter_stoch = licz_iteracyjnie_stoch(X,Y)&lt;br /&gt;
theta_est_iter_batch = licz_iteracyjnie_batch(X,Y)&lt;br /&gt;
&lt;br /&gt;
print theta&lt;br /&gt;
print theta_est&lt;br /&gt;
print theta_est_iter_stoch&lt;br /&gt;
print theta_est_iter_batch&lt;br /&gt;
py.plot(X[:,1], Y,'bo')&lt;br /&gt;
y_reg = np.dot(X,theta_est) &lt;br /&gt;
py.plot(X[:,1],y_reg,'g')&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>SuperAdmin</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Wyk%C5%82ad_1&amp;diff=4821</id>
		<title>Uczenie maszynowe i sztuczne sieci neuronowe/Wykład 1</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Wyk%C5%82ad_1&amp;diff=4821"/>
		<updated>2016-03-01T16:18:30Z</updated>

		<summary type="html">&lt;p&gt;SuperAdmin: /* Algorytm najmniejszych kwadratów */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Uczenie maszynowe==&lt;br /&gt;
&lt;br /&gt;
Na tych zajęciach zapoznamy się z koncepcjami &amp;quot;uczenia maszynowego&amp;quot;. Podejście to jest nieco odmienne od standardowego programowania. Algorytmy, które będziemy omawiać bardziej stanowią &amp;quot;metodologię uczenia&amp;quot; niż sposoby kodowania rozwiązań konkretnych problemów. Zobaczymy jak łącza się pojęcia ze statystyki, algebry z inspiracjami biologicznymi.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
(Kilka przykładów zastosowań: rozpoznawanie pisma ręcznego, data mining,algorytmy podpowiadające co klient mógłby jeszcze chcieć zobaczyć/kupić - w sklepach elektronicznych, itp )&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pierwsze historycznie podejścia: Arthur Samuel (1959):&lt;br /&gt;
&amp;quot; Uczenie maszynowe: dziedzina nauki,która ma umożliwić uczenie komputerów bez bezpośredniego ich programowania. &amp;lt;math&amp;gt;-&amp;gt;&amp;lt;/math&amp;gt; program do gry w szachy, bazował na wynikach kilku tysięcy rozgrywek. Jego program grał w szachy lepiej od autora.&amp;quot;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Na wstępie warto może wspomnieć, że uczenie może przebiegać z nadzorem lub bez nadzoru. Uczenie z nadzorem przypomina typowe uczenie w szkole, gdzie nauczyciel podaje przykłady dla których znane są prawidłowe odpowiedzi i potrafi uczniowi wskazać błędy. Uczenie bez nadzoru przypomina nieco uczenie się postrzegania świata przez małe dziecko. Bazuje ono głównie na obserwowaniu związków przyczynowo skutkowych - korelacji - pomiędzy różnymi bodźcami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Uczenie z nadzorem===&lt;br /&gt;
&lt;br /&gt;
Zaczniemy od najprostszej wersji uczenia z nadzorem jaką jest regresja liniowa. Aby było nam łatwiej ją sobie wyobrażać weźmy konkretny przykład: chcielibyśmy przewidywać zużycie paliwa przez samochody. Załóżmy, że znamy odległość jaką samochód może pokonać i jego masę. Możemy narysować te dane.&lt;br /&gt;
&lt;br /&gt;
[[Plik:reg1.png|350px|thumb|&amp;lt;figure id=&amp;quot;uid2&amp;quot; /&amp;gt;Przykładowe dane]]&lt;br /&gt;
&lt;br /&gt;
Jak na podstawie tych danych można przewidzieć zasięg innych samochodów?&lt;br /&gt;
&lt;br /&gt;
Można potraktować te dane jako punkty reprezentujące pewne odwzorowanie, funkcję.&lt;br /&gt;
Najprostszą funkcję jaką moglibyśmy zaproponować to odwzorowanie liniowe.&lt;br /&gt;
&lt;br /&gt;
W tym miejscu wprowadzimy kilka ważnych pojęć i notację, z której będziemy korzystać w trakcie dalszych wykładów.&lt;br /&gt;
&lt;br /&gt;
; wejście: w naszym przykładzie daną wejściową jest masa samochodu. Oznaczmy ją &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;. W kontekście uczenia maszynowego dane wejściowe często nazywane są &amp;lt;i&amp;gt;cechami&amp;lt;/i&amp;gt; (ang. features).&lt;br /&gt;
; przestrzeń wejść: przestrzeń, z której pochodzą dane wejściowe, oznaczymy ją &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;&lt;br /&gt;
; wyjście: w naszym przykładzie zasięg. Oznaczymy go &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;.&lt;br /&gt;
; przestrzeń wyjść: przestrzeń, z której pochodzą dane wyjściowe, oznaczymy ją &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;&lt;br /&gt;
; przykład: para wejścia i odpowiadającego mu wyjścia: &amp;lt;math&amp;gt;(x,y)&amp;lt;/math&amp;gt; stanowi pojedynczy przykład.&lt;br /&gt;
; ciąg uczący: zbiór przykładów &amp;lt;math&amp;gt;\lbrace (x^{(i)}, y^{(i)}), \quad i = 1, \dots ,m\rbrace &amp;lt;/math&amp;gt;.&lt;br /&gt;
; hipoteza: &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;: odwzorowanie &amp;lt;math&amp;gt;h: X\rightarrow Y&amp;lt;/math&amp;gt;, które &amp;quot;dobrze&amp;quot; pasuje do przykładów ciągu uczącego.&lt;br /&gt;
&lt;br /&gt;
Formalnie proces uczenia z nadzorem polega na tym, żeby mając dany ciąg uczący znaleźć funkcję &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; taką, że jest ona dobrym predyktorem &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; mając dany &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Gdy zmiana &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; jest ciągła problem nazywamy &amp;lt;i&amp;gt;regresją&amp;lt;/i&amp;gt;, gdy zmienna &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; jest dyskretna problem nazywamy &amp;lt;i&amp;gt;klasyfikacją&amp;lt;/i&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Regresja liniowa===&lt;br /&gt;
&lt;br /&gt;
Aby nasz przykład uczynić bardziej interesującym załóżmy, że oprócz masy pojazdu znamy także jego moc. Aby przeprowadzić uczenie z nadzorem musimy zdecydować się jak będziemy reprezentować funkcję &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; w komputerze. Na początek załóżmy, że będzie to funkcja liniowa:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;h_{\theta }(x) = \theta_0 + \theta_1 x_1 + \theta_2 x_2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parametry &amp;lt;math&amp;gt;\theta _i&amp;lt;/math&amp;gt; (zwane także wagami) parametryzują przestrzeń funkcji liniowych &amp;lt;math&amp;gt;X \rightarrow Y&amp;lt;/math&amp;gt;. Tam gdzie nie będzie to powodować niejednoznaczności zamiast &amp;lt;math&amp;gt;h_\theta (x)&amp;lt;/math&amp;gt; będziemy pisać &amp;lt;math&amp;gt;h(x)&amp;lt;/math&amp;gt;. Dla uproszczenia notacji wprowadzimy też &amp;quot;sztuczne&amp;quot; wejście &amp;lt;math&amp;gt;x_0 =1 &amp;lt;/math&amp;gt;, zaś parametr &amp;lt;math&amp;gt;\theta _0&amp;lt;/math&amp;gt; nazywać będziemy obciążeniem.&lt;br /&gt;
Stosując powyższą konwencję możemy napisać:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;h(x) = \sum _{i=0}^n \theta _i x_i &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(u nas n = 2).&lt;br /&gt;
Niektóre rachunki uproszczą się nam jeśli zastosujemy notację wektorową. Oznaczmy:&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf {\theta } = [\theta _0, \dots , \theta _n]^T&amp;lt;/math&amp;gt; , &amp;lt;math&amp;gt;\mathbf {x} = [x_0, \dots ,x_n]^T&amp;lt;/math&amp;gt; (zapisaliśmy oba wektory jako transponowane bo &amp;lt;math&amp;gt;\mathbf {\theta }&amp;lt;/math&amp;gt; i  &amp;lt;math&amp;gt;\mathbf {x}&amp;lt;/math&amp;gt; są wektorami kolumnowymi). Wówczas:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;h(x) = \sum _{i=0}^n \theta _i x_i = \mathbf {\theta }^T \mathbf {x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Problem uczenia maszynowego polega na tym: jak mając zbiór uczący znaleźć &amp;quot;dobre&amp;quot; parametry? Aby sformalizować ten problem wyprowadzimy &amp;lt;i&amp;gt;funkcję kosztu&amp;lt;/i&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;J(\mathbf {\theta }) = \frac{1}{2} \sum _{i=1}^{m} \left( h_\theta (x^{(i)}) - y^{(i)} \right)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(Uwaga: &amp;lt;math&amp;gt;^{(i)}&amp;lt;/math&amp;gt; to indeks przykładu a nie potęga. )&lt;br /&gt;
Teraz możemy powiedzieć, że &amp;quot;dobre&amp;quot; parametry to takie, które minimalizują funkcję kosztu.&lt;br /&gt;
&lt;br /&gt;
===Algorytm najmniejszych kwadratów===&lt;br /&gt;
&lt;br /&gt;
Chcemy znaleźć takie parametry aby zminimalizować funkcję kosztów. Zobaczmy czy zadziała następujący pomysł:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;Zacznijmy od pewniej &amp;quot;odgadniętej&amp;quot; wartości początkowej. Następnie zmieniamy ją zgodnie z kierunkiem przeciwnym do gradientu funkcji kosztu.&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Warto tu przypomnieć, że gradient funkcji to wektor, którego kierunek pokrywa się z kierunkiem, w którym funkcja zmienia się najszybciej, a zwrot wskazuje kierunek, w którym funkcja rośnie. Zatem jeśli wyobrazimy sobie funkcję jako pofałdowany teren, to poruszając się w kierunku przeciwnym do gradientu powinniśmy dotrzeć do niżej położonych partii terenu.&lt;br /&gt;
Formalnie jeden krok algorytmu &amp;lt;i&amp;gt;minimalizacji gradientowej&amp;lt;/i&amp;gt; możemy zapisać:&lt;br /&gt;
&lt;br /&gt;
dla każdego &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;\theta _{j} := \theta _j - \alpha \frac{\partial }{\partial \theta _j } J(\theta ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie parametr &amp;lt;math&amp;gt;\alpha &amp;lt;/math&amp;gt; to szybkość uczenia.&lt;br /&gt;
&lt;br /&gt;
Przyjrzyjmy się pochodnej cząstkowej &amp;lt;math&amp;gt;\frac{\partial }{\partial \theta _j } J(\theta ) &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{matrix}&lt;br /&gt;
\frac{\partial }{\partial \theta _j } J(\theta ) &amp;amp;=&amp;amp;\frac{\partial }{\partial \theta _j } \frac{1}{2} \sum _{i=1}^{m} \left( h_\theta (x^{(i)}) - y^{(i)} \right)^2 \\&lt;br /&gt;
&amp;amp;=&amp;amp;\frac{1}{2} \sum _{i=1}^{m} \frac{\partial }{\partial \theta _j } \left( h_\theta (x^{(i)}) - y^{(i)} \right)^2\\&lt;br /&gt;
&amp;amp;=&amp;amp;\frac{1}{2} \sum _{i=1}^{m} 2 \left( h_\theta (x^{(i)}) - y^{(i)} \right)\frac{\partial }{\partial \theta _j }h_\theta (x^{(i)})\\&lt;br /&gt;
&amp;amp;=&amp;amp; \sum _{i=1}^{m} \left( h_\theta (x^{(i)}) - y^{(i)} \right)\frac{\partial }{\partial \theta _j } \sum _{j=0}^n \theta _j x_j^{(i)}\\&lt;br /&gt;
&amp;amp;=&amp;amp; \sum _{i=1}^{m} \left( h_\theta (x^{(i)}) - y^{(i)} \right) \sum _{j=0}^n \frac{\partial }{\partial \theta _j }\theta _j x_j^{(i)} &lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
::&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{\partial }{\partial \theta _j } J(\theta ) = \sum _{i=1}^{m} \left( h_\theta (x^{(i)}) - y^{(i)} \right) x_j^{(i)}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Czyli zbierając te wyniki otrzymujemy algorytm:&lt;br /&gt;
* Zainicjuj &amp;lt;math&amp;gt;\theta _{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
* powtarzaj, aż zbiegniesz:&lt;br /&gt;
::dla każdego &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;\theta _{j} := \theta _j - \alpha \sum _{i=1}^{m} \left( h_\theta (x^{(i)}) - y^{(i)} \right) x_j^{(i)}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Algorytm najmniejszych kwadratów ma kilka cech, które są intuicyjne i naturalne.&lt;br /&gt;
Wartość zmiany jest proporcjonalna do błędu. Gdy mamy przykład uczący, dla którego przewidywanie prawie zgadza się z &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; to wprowadzane zmiany parametrów są małe. Większa zmiana parametrów będzie dla przykładu, który generuje większy błąd.&lt;br /&gt;
&lt;br /&gt;
Powyższe obliczenia dotyczą sytuacji gdy ciąg uczący zawierają wiele przykładów i poprawki obliczamy biorąc pod uwagę wszystkie przykłady. Jest to tak zwany algorytm gradientowy zbiorczy (ang. batch gradient descent).&lt;br /&gt;
&lt;br /&gt;
Uaktualnianie parametrów funkcji kosztu można też prowadzić po każdej prezentacji elementu ciągu uczącego. Zauważmy, że w pierwszej linijce naszych przekształceń występuje suma po przyczynkach pochodzących od pojedynczych przykładów. Każdy przykład daje przyczynek dodatni. Zatem minimalizując każdy z przyczynków niezależnie również zminimalizujemy funkcję kosztu. Wersja algorytmu, w której zmiany parametrów obliczane są i dla pojedynczych przykładów z ciągu uczącego podawanych w losowej kolejności nosi nazwę &amp;lt;i&amp;gt;stochastycznego&amp;lt;/i&amp;gt; algorytmu minimalizacji gradientowej. Ta wersja algorytmu jest zwykle bardziej wydajna obliczeniowo.&lt;br /&gt;
&lt;br /&gt;
tem otrzymujemy algorytm:&lt;br /&gt;
* Zainicjuj &amp;lt;math&amp;gt;\theta _{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
* powtarzaj, aż zbiegniesz:&lt;br /&gt;
::wylosuj przykład &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;&lt;br /&gt;
::dla każdego &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;\theta _{j} := \theta _j - \alpha  \left( h_\theta (x^{(i)}) - y^{(i)} \right) x_j^{(i)}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Warto w tym miejscu zauważyć, że algorytm gradientowy jest wrażliwy na minima lokalne, tzn. że z danego punktu w przestrzeni parametrów prowadzi do najbliższego minimum lokalnego. Na szczęście w przypadku regresji linowej istnieje tylko jedno minimum i jest to minimum globalne.&lt;br /&gt;
&lt;br /&gt;
===Równania normalne===&lt;br /&gt;
&lt;br /&gt;
Iteracyjna wersja minimalizacji funkcji kosztu przyda nam się jeszcze przy omawianiu algorytmów uczenia sztucznych sieci neuronowych. W pewnych sytuacjach można wykorzystać nieco bardziej narzędzia algebry i analizy matematycznej i znaleźć optymalne parametry analitycznie. W tym celu trzeba znaleźć pochodna funkcji kosztu po parametrach i przyrównać ją do zera.&lt;br /&gt;
&lt;br /&gt;
Aby rachunki poszły nam sprawniej przypomnijmy kilka wzorów z algebry.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Rachunki macierzowe====&lt;br /&gt;
&lt;br /&gt;
Dla danej funkcji &amp;lt;math&amp;gt;f: \mathcal {R}^{n \times m} \rightarrow \mathcal {R}&amp;lt;/math&amp;gt; mapującej macierze &amp;lt;math&amp;gt;n \times m&amp;lt;/math&amp;gt; na liczby rzeczywiste definiujemy pochodną &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; względem &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; jako:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;&lt;br /&gt;
\nabla _A f(A) = \left[&lt;br /&gt;
\begin{array}{ccc}&lt;br /&gt;
\frac{\partial f}{\partial A_{1,1}} &amp;amp; \dots &amp;amp; \frac{\partial f }{\partial A_{1,n}} \\&lt;br /&gt;
\vdots &amp;amp; &amp;amp; \vdots \\&lt;br /&gt;
\frac{\partial f}{\partial A_{n,1}}&amp;amp; \dots &amp;amp;\frac{\partial f}{\partial A_{n,n}}&lt;br /&gt;
\end{array}&lt;br /&gt;
\right]&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zatem gradient &amp;lt;math&amp;gt;\nabla _A f(A) &amp;lt;/math&amp;gt; jest macierzą &amp;lt;math&amp;gt;n \times m&amp;lt;/math&amp;gt;, której element &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt; to pochodna cząstkowa &amp;lt;math&amp;gt; \frac{\partial f}{\partial A_{i,j}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Jako przykład weźmy macierz&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;A =&lt;br /&gt;
\left[&lt;br /&gt;
\begin{array}{cc}&lt;br /&gt;
A_{1,1} &amp;amp; A_{1,2} \\&lt;br /&gt;
A_{2,1} &amp;amp; A_{2,2}&lt;br /&gt;
\end{array}&lt;br /&gt;
\right]&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
i funkcję &amp;lt;math&amp;gt;f: \mathcal {R}^{n \times m} \rightarrow \mathcal {R}&amp;lt;/math&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;&lt;br /&gt;
f(A) = \frac{3}{2} A_{1,1} + 5 A_{1,2}^2 + A_{2,1} A_{2,2}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W tym przypadku otrzymujemy:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;&lt;br /&gt;
\nabla _A f(A) = \left[&lt;br /&gt;
\begin{array}{ccc}&lt;br /&gt;
\frac{3}{2} &amp;amp; 10 A_{1,2} \\&lt;br /&gt;
A_{2,2} &amp;amp; A_{2,1}&lt;br /&gt;
\end{array}&lt;br /&gt;
\right]&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dla przypomnienia operator śladu macierzy kwadratowej &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; to suma elementów diagonalnych:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt; \textrm {tr}A = \sum _{i=1}^{n}A_{i,i}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Operator śladu jest przemienny, tzn.&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt; \textrm {tr}AB = \textrm {tr}BA&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zachodzi również:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\textrm {tr}A =\textrm {tr}A^T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\textrm {tr}(A+B) =\textrm {tr}A + \textrm {tr}B&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\textrm {tr}(aA) = a\textrm {tr}A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dla pochodnych macierzowych zachodzi:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid14&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\nabla _A \textrm {tr}AB = B^T&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid15&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\nabla _{A^T} f(A) = (\nabla _A f(A))^T&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid16&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\nabla _A \textrm {tr} ABA^TC = CAB +C^TAB^T&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid17&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\nabla _A |A| = |A| (A^{-1})^T&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;|A|&amp;lt;/math&amp;gt; to wyznacznik macierzy A.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Minimalizacja funkcji kosztu====&lt;br /&gt;
&lt;br /&gt;
Uzbrojeni w powyższe wzory możemy powrócić do minimalizacji funkcji kosztu.&lt;br /&gt;
Zbudujmy macierz wejść &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; w taki sposób, że wejścia z poszczególnych przykładów są jej wierszami.&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;X =&lt;br /&gt;
\left[&lt;br /&gt;
\begin{array}{ccc}&lt;br /&gt;
-&amp;amp; ( x^{(1)})^T&amp;amp;- \\&lt;br /&gt;
&amp;amp; \vdots &amp;amp; \\&lt;br /&gt;
- &amp;amp;(x^{(m)})^T &amp;amp;-&lt;br /&gt;
\end{array}&lt;br /&gt;
\right]&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Z wartości wyjściowych zbudujemy wektor kolumnowy&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf {y} = \left[&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
y^{(1) }\\&lt;br /&gt;
\vdots \\&lt;br /&gt;
y^{(m)}&lt;br /&gt;
\end{array}&lt;br /&gt;
\right]&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ponieważ &amp;lt;math&amp;gt;h_\theta (x^{(i)} ) = (x^{(i)})^T \theta &amp;lt;/math&amp;gt; możemy zapisać:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;&lt;br /&gt;
X \theta - \mathbf {y} =&lt;br /&gt;
\left[&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
( x^{(1)})^T \theta \\&lt;br /&gt;
\vdots \\&lt;br /&gt;
(x^{(m)})^T \theta \end{array}&lt;br /&gt;
\right]&lt;br /&gt;
-&lt;br /&gt;
\left[&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
y^{(1) }\\&lt;br /&gt;
\vdots \\&lt;br /&gt;
y^{(m)}&lt;br /&gt;
\end{array}&lt;br /&gt;
\right]&lt;br /&gt;
=&lt;br /&gt;
\left[&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
h_\theta (x^{(1)}) - y^{(1) }\\&lt;br /&gt;
\vdots \\&lt;br /&gt;
h_\theta (x^{(m)}) - y^{(m)}&lt;br /&gt;
\end{array}&lt;br /&gt;
\right]&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Korzystając z faktu, że dla wektora &amp;lt;math&amp;gt;\mathbf {z}&amp;lt;/math&amp;gt; mamy &amp;lt;math&amp;gt;\mathbf {z}^T\mathbf {z}=\sum _i z_i^2&amp;lt;/math&amp;gt; możemy zapisać funkcję kosztu w następujący sposób:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;J(\theta ) = \frac{1}{2} \sum _{i=1}^m \left( h_\theta (x^{(i)} ) - y^{(i)}\right)^2 = \frac{1}{2} (X \theta - \mathbf {y})^T (X \theta - \mathbf {y}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Teraz aby zminimalizować funkcję kosztu &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; znajdzmy jej pochodną względem &amp;lt;math&amp;gt;\theta &amp;lt;/math&amp;gt;. Korzystając z równań (&amp;lt;xr id=&amp;quot;uid15&amp;quot;&amp;gt; %i&amp;lt;/xr&amp;gt;) i (&amp;lt;xr id=&amp;quot;uid16&amp;quot;&amp;gt; %i&amp;lt;/xr&amp;gt;) widzimy, że:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid19&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\nabla _{A^T} \textrm {tr}ABA^TC = B^T A^T C^T + B A^T C&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tak więc:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\begin{matrix}&lt;br /&gt;
\nabla _\theta J(\theta ) &amp;amp;=&amp;amp; \nabla _\theta \frac{1}{2} (X \theta - \mathbf {y})^T (X \theta - \mathbf {y}) \\&lt;br /&gt;
&amp;amp;=&amp;amp; \frac{1}{2} \nabla _\theta ( \theta ^T X ^T X \theta -\theta ^T X^T \mathbf {y} - \mathbf {y}^T X \theta + \mathbf {y}^T \mathbf {y}) \\&lt;br /&gt;
&amp;amp;=&amp;amp; \frac{1}{2} \nabla _\theta \textrm {tr}( \theta ^T X ^T X \theta -\theta ^T X^T \mathbf {y} - \mathbf {y}^T X \theta + \mathbf {y}^T \mathbf {y}) \\&lt;br /&gt;
&amp;amp;=&amp;amp; \frac{1}{2} \nabla _\theta (\textrm {tr} \theta ^T X ^T X \theta - 2 \textrm {tr} \mathbf {y}^T X \theta ) \\&lt;br /&gt;
&amp;amp;=&amp;amp; \frac{1}{2} ( X ^T X \theta +X^T X \theta - 2 X^T \mathbf {y}) \\&lt;br /&gt;
&amp;amp;=&amp;amp; X^T X \theta - X^T \mathbf {y}&lt;br /&gt;
\end{matrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Użyte tricki:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	w trzecim kroku skorzystaliśmy z tego, że ślad liczby jest tą samą liczbą&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	w czwartym kroku skorzystaliśmy z tego, że &amp;lt;math&amp;gt;\textrm {tr}A = \textrm {tr}A^T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	w piątym kroku skorzystaliśmy z równania (&amp;lt;xr id=&amp;quot;uid19&amp;quot;&amp;gt; %i&amp;lt;/xr&amp;gt;), podstawiając &amp;lt;math&amp;gt;A^T = \theta &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;B = B^T = X^TX&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;C = I&amp;lt;/math&amp;gt; oraz równanie (&amp;lt;xr id=&amp;quot;uid14&amp;quot;&amp;gt; %i&amp;lt;/xr&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aby zminimalizować funkcję kosztu kładziemy jej pochodną równą 0 i otrzymujemy &amp;lt;i&amp;gt;równanie normalne&amp;lt;/i&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt; X^T X \theta = X^T \mathbf {y}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Z niego możemy obliczyć parametry minimalizujące funkcję kosztu:&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;math&amp;gt; \theta = (X^T X )^{-1} X^T \mathbf {y}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Interpretacja probabilistyczna===&lt;br /&gt;
&lt;br /&gt;
Dlaczego funkcja kosztu &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; w postaci sumy kwadratów błędów dla problemu regresji jest sensowna? W tej sekcji zaprezentuje zestaw założeń probabilistycznych, dla których kwadratowa funkcja błędu jest naturalną konsekwencją.&lt;br /&gt;
&lt;br /&gt;
Załóżmy, że zmienne wejściowe i wyjściowe powiązane są zależnością:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt; y^{(i)} = \theta ^T x^{(i)} + \epsilon ^{(i)}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\epsilon ^{(i)}&amp;lt;/math&amp;gt; jest błędem, który albo pochodzi od pewnych nieuwzględnionych w modelu regresji czynników lub czynnikiem losowym. Załóżmy, że &amp;lt;math&amp;gt;\epsilon ^{(i)}&amp;lt;/math&amp;gt; to zmienne &amp;lt;i&amp;gt;niezależne&amp;lt;/i&amp;gt; i podlegające &amp;lt;i&amp;gt;temu samemu rozkładowi&amp;lt;/i&amp;gt; (ang. IID - independent and identically distributed) normalnemu o średniej zero i wariancji &amp;lt;math&amp;gt;\sigma ^2&amp;lt;/math&amp;gt;. To założenie zapisujemy krótko: &amp;lt;math&amp;gt; \epsilon ^{(i)} \sim \mathcal {N}(0, \sigma ^2)&amp;lt;/math&amp;gt; . Zatem funkcja gęstości prawdopodobieństwa &amp;lt;math&amp;gt;\epsilon ^{(i)}&amp;lt;/math&amp;gt; dana jest wzorem:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;&lt;br /&gt;
p(\epsilon ^{(i)}) = \frac{1}{\sqrt{2 \pi} \sigma } \exp \left( - \frac{ \left(\epsilon ^{(i)} \right)^2}{2 \sigma ^2} \right)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Z tego wynika, że:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt; p(y^{(i)}| x^{(i)}; \theta ) = \frac{1}{\sqrt{2 \pi} \sigma } \exp \left( - \frac{ \left(y^{(i)} - \theta ^Tx^{(i)} \right)^2}{2 \sigma ^2} \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notacja &amp;lt;math&amp;gt;p(y^{(i)}| x^{(i)}; \theta )&amp;lt;/math&amp;gt; oznacza funkcję gęstości prawdopodobieństwa zmiennej &amp;lt;math&amp;gt;y^{(i)}&amp;lt;/math&amp;gt; mając daną zmienną &amp;lt;math&amp;gt;x^{(i)}&amp;lt;/math&amp;gt; sparametryzowaną przez &amp;lt;math&amp;gt;\theta &amp;lt;/math&amp;gt;. Nie mówimy &amp;quot;mając dane &amp;lt;math&amp;gt;\theta &amp;lt;/math&amp;gt;&amp;quot; bo &amp;lt;math&amp;gt;\theta &amp;lt;/math&amp;gt; nie jest zmienną losową. Prawdopodobieństwo danych (całego ciągu uczącego) określone jest przez rozkład &amp;lt;math&amp;gt;p(\mathbf {y}|X;\theta )&amp;lt;/math&amp;gt;. Ten rozkład zazwyczaj rozumiany jest jako funkcja &amp;lt;math&amp;gt;\mathbf {y}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; przy ustalonym &amp;lt;math&amp;gt;\theta &amp;lt;/math&amp;gt;. Możemy jednak spojrzeć na niego inaczej, tzn. jako funkcję &amp;lt;math&amp;gt;\theta &amp;lt;/math&amp;gt; przy ustalonych &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;\mathbf {y}&amp;lt;/math&amp;gt;. Funkcję tą nazywamy &amp;lt;i&amp;gt;funkcją wiarygodności&amp;lt;/i&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;L(\theta ) = L(\theta ;X,\mathbf {y}) = p(\mathbf {y}|X;\theta )&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zauważmy, że dzięki założeniu o niezależności &amp;lt;math&amp;gt;\epsilon ^{(i)}&amp;lt;/math&amp;gt; możemy tą funkcję zapisać jako:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\begin{matrix}&lt;br /&gt;
L(\theta ) &amp;amp;=&amp;amp; \prod _{i=1}^m p(y^{(i)} | x^{(i)};\theta )\\&lt;br /&gt;
&amp;amp;=&amp;amp; \prod _{i=1}^m \frac{1}{\sqrt{2 \pi} \sigma } \exp \left( - \frac{ \left(y^{(i)} - \theta ^Tx^{(i)} \right)^2}{2 \sigma ^2} \right)&lt;br /&gt;
\end{matrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Teraz, mając nasz model probabilistyczny możemy się zapytać: jakie &amp;lt;math&amp;gt;\theta &amp;lt;/math&amp;gt; są sensowne? Chcielibyśmy, aby były to takie parametry, dla których zaobserwowanie naszego ciągu uczącego jest najbardziej prawdopodobne. Jest to zasada &amp;lt;i&amp;gt;największej wiarygodności&amp;lt;/i&amp;gt;. A zatem w myśl tej zasady trzeba znaleźć &amp;lt;math&amp;gt;\theta &amp;lt;/math&amp;gt;, które maksymalizuje funkcję wiarygodności &amp;lt;math&amp;gt;L(\theta )&amp;lt;/math&amp;gt;. Tak naprawdę wystarczy jeśli zmaksymalizujemy dowolną ściśle rosnącą funkcję funkcji wiarygodności. Rachunki znacznie się uproszczą jeśli jako tą funkcję wybierzemy &amp;lt;math&amp;gt;\log &amp;lt;/math&amp;gt; (wówczas iloczyn przejdzie w sumę). Ostatecznie chcemy zmaksymalizować:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\begin{matrix}&lt;br /&gt;
l(\theta ) &amp;amp;=&amp;amp; \log (L(\theta )) \\&lt;br /&gt;
&amp;amp;=&amp;amp; \log \prod _{i=1}^m \frac{1}{\sqrt{2 \pi} \sigma } \exp \left( - \frac{ \left(y^{(i)} - \theta ^Tx^{(i)} \right)^2}{2 \sigma ^2} \right)\\&lt;br /&gt;
&amp;amp;=&amp;amp; \sum _{i=1}^m \log \frac{1}{\sqrt{2 \pi} \sigma } \exp \left( - \frac{ \left(y^{(i)} - \theta ^Tx^{(i)} \right)^2}{2 \sigma ^2} \right) \\&lt;br /&gt;
&amp;amp;=&amp;amp; m \log \frac{1}{\sqrt{2 \pi }\sigma } - \frac{1}{\sigma ^2} \cdot \frac{1}{2} \sum _{i=1}^m \left( y^{(i)} - \theta ^Tx^{(i)} \right)^2&lt;br /&gt;
\end{matrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zauważmy, że aby zmaksymalizować funkcję wiarygodności musimy zminimalizować wyrażenie &amp;lt;math&amp;gt; \frac{1}{2} \sum _{i=1}^m \left( y^{(i)} - \theta ^Tx^{(i)} \right)^2 &amp;lt;/math&amp;gt;, czyli wprowadzoną w poprzednim rozdziale funkcję kosztu &amp;lt;math&amp;gt;J(\theta )&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Podsumowując: zakładając konkretny model probabilistyczny ciągu uczącego udało nam się pokazać, że minimalizacja funkcji kosztu jest konsekwencją zastosowania zasady największej wiarygodności. Warto jednak pamiętać, że procedura minimalizacji średniego błędu kwadratowego daje sensowne wyniki dla znacznie szerszej klasy modeli danych.&lt;/div&gt;</summary>
		<author><name>SuperAdmin</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Wyk%C5%82ad_1&amp;diff=4820</id>
		<title>Uczenie maszynowe i sztuczne sieci neuronowe/Wykład 1</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Wyk%C5%82ad_1&amp;diff=4820"/>
		<updated>2016-03-01T16:11:23Z</updated>

		<summary type="html">&lt;p&gt;SuperAdmin: /* Algorytm najmniejszych kwadratów */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Uczenie maszynowe==&lt;br /&gt;
&lt;br /&gt;
Na tych zajęciach zapoznamy się z koncepcjami &amp;quot;uczenia maszynowego&amp;quot;. Podejście to jest nieco odmienne od standardowego programowania. Algorytmy, które będziemy omawiać bardziej stanowią &amp;quot;metodologię uczenia&amp;quot; niż sposoby kodowania rozwiązań konkretnych problemów. Zobaczymy jak łącza się pojęcia ze statystyki, algebry z inspiracjami biologicznymi.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
(Kilka przykładów zastosowań: rozpoznawanie pisma ręcznego, data mining,algorytmy podpowiadające co klient mógłby jeszcze chcieć zobaczyć/kupić - w sklepach elektronicznych, itp )&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pierwsze historycznie podejścia: Arthur Samuel (1959):&lt;br /&gt;
&amp;quot; Uczenie maszynowe: dziedzina nauki,która ma umożliwić uczenie komputerów bez bezpośredniego ich programowania. &amp;lt;math&amp;gt;-&amp;gt;&amp;lt;/math&amp;gt; program do gry w szachy, bazował na wynikach kilku tysięcy rozgrywek. Jego program grał w szachy lepiej od autora.&amp;quot;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Na wstępie warto może wspomnieć, że uczenie może przebiegać z nadzorem lub bez nadzoru. Uczenie z nadzorem przypomina typowe uczenie w szkole, gdzie nauczyciel podaje przykłady dla których znane są prawidłowe odpowiedzi i potrafi uczniowi wskazać błędy. Uczenie bez nadzoru przypomina nieco uczenie się postrzegania świata przez małe dziecko. Bazuje ono głównie na obserwowaniu związków przyczynowo skutkowych - korelacji - pomiędzy różnymi bodźcami.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Uczenie z nadzorem===&lt;br /&gt;
&lt;br /&gt;
Zaczniemy od najprostszej wersji uczenia z nadzorem jaką jest regresja liniowa. Aby było nam łatwiej ją sobie wyobrażać weźmy konkretny przykład: chcielibyśmy przewidywać zużycie paliwa przez samochody. Załóżmy, że znamy odległość jaką samochód może pokonać i jego masę. Możemy narysować te dane.&lt;br /&gt;
&lt;br /&gt;
[[Plik:reg1.png|350px|thumb|&amp;lt;figure id=&amp;quot;uid2&amp;quot; /&amp;gt;Przykładowe dane]]&lt;br /&gt;
&lt;br /&gt;
Jak na podstawie tych danych można przewidzieć zasięg innych samochodów?&lt;br /&gt;
&lt;br /&gt;
Można potraktować te dane jako punkty reprezentujące pewne odwzorowanie, funkcję.&lt;br /&gt;
Najprostszą funkcję jaką moglibyśmy zaproponować to odwzorowanie liniowe.&lt;br /&gt;
&lt;br /&gt;
W tym miejscu wprowadzimy kilka ważnych pojęć i notację, z której będziemy korzystać w trakcie dalszych wykładów.&lt;br /&gt;
&lt;br /&gt;
; wejście: w naszym przykładzie daną wejściową jest masa samochodu. Oznaczmy ją &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;. W kontekście uczenia maszynowego dane wejściowe często nazywane są &amp;lt;i&amp;gt;cechami&amp;lt;/i&amp;gt; (ang. features).&lt;br /&gt;
; przestrzeń wejść: przestrzeń, z której pochodzą dane wejściowe, oznaczymy ją &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;&lt;br /&gt;
; wyjście: w naszym przykładzie zasięg. Oznaczymy go &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;.&lt;br /&gt;
; przestrzeń wyjść: przestrzeń, z której pochodzą dane wyjściowe, oznaczymy ją &amp;lt;math&amp;gt;Y&amp;lt;/math&amp;gt;&lt;br /&gt;
; przykład: para wejścia i odpowiadającego mu wyjścia: &amp;lt;math&amp;gt;(x,y)&amp;lt;/math&amp;gt; stanowi pojedynczy przykład.&lt;br /&gt;
; ciąg uczący: zbiór przykładów &amp;lt;math&amp;gt;\lbrace (x^{(i)}, y^{(i)}), \quad i = 1, \dots ,m\rbrace &amp;lt;/math&amp;gt;.&lt;br /&gt;
; hipoteza: &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt;: odwzorowanie &amp;lt;math&amp;gt;h: X\rightarrow Y&amp;lt;/math&amp;gt;, które &amp;quot;dobrze&amp;quot; pasuje do przykładów ciągu uczącego.&lt;br /&gt;
&lt;br /&gt;
Formalnie proces uczenia z nadzorem polega na tym, żeby mając dany ciąg uczący znaleźć funkcję &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; taką, że jest ona dobrym predyktorem &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; mając dany &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Gdy zmiana &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; jest ciągła problem nazywamy &amp;lt;i&amp;gt;regresją&amp;lt;/i&amp;gt;, gdy zmienna &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; jest dyskretna problem nazywamy &amp;lt;i&amp;gt;klasyfikacją&amp;lt;/i&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Regresja liniowa===&lt;br /&gt;
&lt;br /&gt;
Aby nasz przykład uczynić bardziej interesującym załóżmy, że oprócz masy pojazdu znamy także jego moc. Aby przeprowadzić uczenie z nadzorem musimy zdecydować się jak będziemy reprezentować funkcję &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; w komputerze. Na początek załóżmy, że będzie to funkcja liniowa:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;h_{\theta }(x) = \theta_0 + \theta_1 x_1 + \theta_2 x_2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parametry &amp;lt;math&amp;gt;\theta _i&amp;lt;/math&amp;gt; (zwane także wagami) parametryzują przestrzeń funkcji liniowych &amp;lt;math&amp;gt;X \rightarrow Y&amp;lt;/math&amp;gt;. Tam gdzie nie będzie to powodować niejednoznaczności zamiast &amp;lt;math&amp;gt;h_\theta (x)&amp;lt;/math&amp;gt; będziemy pisać &amp;lt;math&amp;gt;h(x)&amp;lt;/math&amp;gt;. Dla uproszczenia notacji wprowadzimy też &amp;quot;sztuczne&amp;quot; wejście &amp;lt;math&amp;gt;x_0 =1 &amp;lt;/math&amp;gt;, zaś parametr &amp;lt;math&amp;gt;\theta _0&amp;lt;/math&amp;gt; nazywać będziemy obciążeniem.&lt;br /&gt;
Stosując powyższą konwencję możemy napisać:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;h(x) = \sum _{i=0}^n \theta _i x_i &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(u nas n = 2).&lt;br /&gt;
Niektóre rachunki uproszczą się nam jeśli zastosujemy notację wektorową. Oznaczmy:&lt;br /&gt;
&amp;lt;math&amp;gt;\mathbf {\theta } = [\theta _0, \dots , \theta _n]^T&amp;lt;/math&amp;gt; , &amp;lt;math&amp;gt;\mathbf {x} = [x_0, \dots ,x_n]^T&amp;lt;/math&amp;gt; (zapisaliśmy oba wektory jako transponowane bo &amp;lt;math&amp;gt;\mathbf {\theta }&amp;lt;/math&amp;gt; i  &amp;lt;math&amp;gt;\mathbf {x}&amp;lt;/math&amp;gt; są wektorami kolumnowymi). Wówczas:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;h(x) = \sum _{i=0}^n \theta _i x_i = \mathbf {\theta }^T \mathbf {x}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Problem uczenia maszynowego polega na tym: jak mając zbiór uczący znaleźć &amp;quot;dobre&amp;quot; parametry? Aby sformalizować ten problem wyprowadzimy &amp;lt;i&amp;gt;funkcję kosztu&amp;lt;/i&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;J(\mathbf {\theta }) = \frac{1}{2} \sum _{i=1}^{m} \left( h_\theta (x^{(i)}) - y^{(i)} \right)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(Uwaga: &amp;lt;math&amp;gt;^{(i)}&amp;lt;/math&amp;gt; to indeks przykładu a nie potęga. )&lt;br /&gt;
Teraz możemy powiedzieć, że &amp;quot;dobre&amp;quot; parametry to takie, które minimalizują funkcję kosztu.&lt;br /&gt;
&lt;br /&gt;
===Algorytm najmniejszych kwadratów===&lt;br /&gt;
&lt;br /&gt;
Chcemy znaleźć takie parametry aby zminimalizować funkcję kosztów. Zobaczmy czy zadziała następujący pomysł:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;i&amp;gt;Zacznijmy od pewniej &amp;quot;odgadniętej&amp;quot; wartości początkowej. Następnie zmieniamy ją zgodnie z kierunkiem przeciwnym do gradientu funkcji kosztu.&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Warto tu przypomnieć, że gradient funkcji to wektor, którego kierunek pokrywa się z kierunkiem, w którym funkcja zmienia się najszybciej, a zwrot wskazuje kierunek, w którym funkcja rośnie. Zatem jeśli wyobrazimy sobie funkcję jako pofałdowany teren, to poruszając się w kierunku przeciwnym do gradientu powinniśmy dotrzeć do niżej położonych partii terenu.&lt;br /&gt;
Formalnie jeden krok algorytmu &amp;lt;i&amp;gt;minimalizacji gradientowej&amp;lt;/i&amp;gt; możemy zapisać:&lt;br /&gt;
&lt;br /&gt;
dla każdego &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;\theta _{j} := \theta _j - \alpha \frac{\partial }{\partial \theta _j } J(\theta ) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie parametr &amp;lt;math&amp;gt;\alpha &amp;lt;/math&amp;gt; to szybkość uczenia.&lt;br /&gt;
&lt;br /&gt;
Przyjrzyjmy się pochodnej cząstkowej &amp;lt;math&amp;gt;\frac{\partial }{\partial \theta _j } J(\theta ) &amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{matrix}&lt;br /&gt;
\frac{\partial }{\partial \theta _j } J(\theta ) &amp;amp;=&amp;amp;\frac{\partial }{\partial \theta _j } \frac{1}{2} \sum _{i=1}^{m} \left( h_\theta (x^{(i)}) - y^{(i)} \right)^2 \\&lt;br /&gt;
&amp;amp;=&amp;amp;\frac{1}{2} \sum _{i=1}^{m} \frac{\partial }{\partial \theta _j } \left( h_\theta (x^{(i)}) - y^{(i)} \right)^2\\&lt;br /&gt;
&amp;amp;=&amp;amp;\frac{1}{2} \sum _{i=1}^{m} 2 \left( h_\theta (x^{(i)}) - y^{(i)} \right)\frac{\partial }{\partial \theta _j }h_\theta (x^{(i)})\\&lt;br /&gt;
&amp;amp;=&amp;amp; \sum _{i=1}^{m} \left( h_\theta (x^{(i)}) - y^{(i)} \right)\frac{\partial }{\partial \theta _j } \sum _{j=0}^n \theta _j x_j^{(i)}\\&lt;br /&gt;
&amp;amp;=&amp;amp; \sum _{i=1}^{m} \left( h_\theta (x^{(i)}) - y^{(i)} \right) \sum _{j=0}^n \frac{\partial }{\partial \theta _j }\theta _j x_j^{(i)} &lt;br /&gt;
\end{matrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
::&amp;lt;math&amp;gt;&lt;br /&gt;
\frac{\partial }{\partial \theta _j } J(\theta ) = \sum _{i=1}^{m} \left( h_\theta (x^{(i)}) - y^{(i)} \right) x_j^{(i)}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Czyli zbierając te wyniki otrzymujemy algorytm:&lt;br /&gt;
* Zainicjuj &amp;lt;math&amp;gt;\theta _{j}&amp;lt;/math&amp;gt;&lt;br /&gt;
* powtarzaj, aż zbiegniesz:&lt;br /&gt;
::dla każdego &amp;lt;math&amp;gt;j&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;\theta _{j} := \theta _j - \alpha \sum _{i=1}^{m} \left( h_\theta (x^{(i)}) - y^{(i)} \right) x_j^{(i)}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Algorytm najmniejszych kwadratów ma kilka cech, które są intuicyjne i naturalne.&lt;br /&gt;
Wartość zmiany jest proporcjonalna do błędu. Gdy mamy przykład uczący, dla którego przewidywanie prawie zgadza się z &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; to wprowadzane zmiany parametrów są małe. Większa zmiana parametrów będzie dla przykładu, który generuje większy błąd.&lt;br /&gt;
&lt;br /&gt;
Powyższe obliczenia dotyczą sytuacji gdy ciąg uczący zawierają wiele przykładów i poprawki obliczamy biorąc pod uwagę wszystkie przykłady. Jest to tak zwany algorytm gradientowy zbiorczy (ang. batch gradient descent).&lt;br /&gt;
&lt;br /&gt;
Uaktualnianie parametrów funkcji kosztu można też prowadzić po każdej prezentacji elementu ciągu uczącego. Zauważmy, że w pierwszej linijce naszych przekształceń występuje suma po przyczynkach pochodzących od pojedynczych przykładów. Każdy przykład daje przyczynek dodatni. Zatem minimalizując każdy z przyczynków niezależnie również zminimalizujemy funkcję kosztu. Wersja algorytmu, w której zmiany parametrów obliczane są i dla pojedynczych przykładów z ciągu uczącego podawanych w losowej kolejności nosi nazwę &amp;lt;i&amp;gt;stochastycznego&amp;lt;/i&amp;gt; algorytmu minimalizacji gradientowej. Ta wersja algorytmu jest zwykle bardziej wydajna obliczeniowo.&lt;br /&gt;
&lt;br /&gt;
Warto w tym miejscu zauważyć, że algorytm gradientowy jest wrażliwy na minima lokalne, tzn. że z danego punktu w przestrzeni parametrów prowadzi do najbliższego minimum lokalnego. Na szczęście w przypadku regresji linowej istnieje tylko jedno minimum i jest to minimum globalne.&lt;br /&gt;
&lt;br /&gt;
===Równania normalne===&lt;br /&gt;
&lt;br /&gt;
Iteracyjna wersja minimalizacji funkcji kosztu przyda nam się jeszcze przy omawianiu algorytmów uczenia sztucznych sieci neuronowych. W pewnych sytuacjach można wykorzystać nieco bardziej narzędzia algebry i analizy matematycznej i znaleźć optymalne parametry analitycznie. W tym celu trzeba znaleźć pochodna funkcji kosztu po parametrach i przyrównać ją do zera.&lt;br /&gt;
&lt;br /&gt;
Aby rachunki poszły nam sprawniej przypomnijmy kilka wzorów z algebry.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Rachunki macierzowe====&lt;br /&gt;
&lt;br /&gt;
Dla danej funkcji &amp;lt;math&amp;gt;f: \mathcal {R}^{n \times m} \rightarrow \mathcal {R}&amp;lt;/math&amp;gt; mapującej macierze &amp;lt;math&amp;gt;n \times m&amp;lt;/math&amp;gt; na liczby rzeczywiste definiujemy pochodną &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; względem &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; jako:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;&lt;br /&gt;
\nabla _A f(A) = \left[&lt;br /&gt;
\begin{array}{ccc}&lt;br /&gt;
\frac{\partial f}{\partial A_{1,1}} &amp;amp; \dots &amp;amp; \frac{\partial f }{\partial A_{1,n}} \\&lt;br /&gt;
\vdots &amp;amp; &amp;amp; \vdots \\&lt;br /&gt;
\frac{\partial f}{\partial A_{n,1}}&amp;amp; \dots &amp;amp;\frac{\partial f}{\partial A_{n,n}}&lt;br /&gt;
\end{array}&lt;br /&gt;
\right]&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zatem gradient &amp;lt;math&amp;gt;\nabla _A f(A) &amp;lt;/math&amp;gt; jest macierzą &amp;lt;math&amp;gt;n \times m&amp;lt;/math&amp;gt;, której element &amp;lt;math&amp;gt;(i,j)&amp;lt;/math&amp;gt; to pochodna cząstkowa &amp;lt;math&amp;gt; \frac{\partial f}{\partial A_{i,j}}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Jako przykład weźmy macierz&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;A =&lt;br /&gt;
\left[&lt;br /&gt;
\begin{array}{cc}&lt;br /&gt;
A_{1,1} &amp;amp; A_{1,2} \\&lt;br /&gt;
A_{2,1} &amp;amp; A_{2,2}&lt;br /&gt;
\end{array}&lt;br /&gt;
\right]&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
i funkcję &amp;lt;math&amp;gt;f: \mathcal {R}^{n \times m} \rightarrow \mathcal {R}&amp;lt;/math&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;&lt;br /&gt;
f(A) = \frac{3}{2} A_{1,1} + 5 A_{1,2}^2 + A_{2,1} A_{2,2}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W tym przypadku otrzymujemy:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;&lt;br /&gt;
\nabla _A f(A) = \left[&lt;br /&gt;
\begin{array}{ccc}&lt;br /&gt;
\frac{3}{2} &amp;amp; 10 A_{1,2} \\&lt;br /&gt;
A_{2,2} &amp;amp; A_{2,1}&lt;br /&gt;
\end{array}&lt;br /&gt;
\right]&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dla przypomnienia operator śladu macierzy kwadratowej &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; to suma elementów diagonalnych:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt; \textrm {tr}A = \sum _{i=1}^{n}A_{i,i}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Operator śladu jest przemienny, tzn.&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt; \textrm {tr}AB = \textrm {tr}BA&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zachodzi również:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\textrm {tr}A =\textrm {tr}A^T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\textrm {tr}(A+B) =\textrm {tr}A + \textrm {tr}B&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\textrm {tr}(aA) = a\textrm {tr}A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dla pochodnych macierzowych zachodzi:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid14&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\nabla _A \textrm {tr}AB = B^T&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid15&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\nabla _{A^T} f(A) = (\nabla _A f(A))^T&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid16&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\nabla _A \textrm {tr} ABA^TC = CAB +C^TAB^T&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid17&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\nabla _A |A| = |A| (A^{-1})^T&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;|A|&amp;lt;/math&amp;gt; to wyznacznik macierzy A.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Minimalizacja funkcji kosztu====&lt;br /&gt;
&lt;br /&gt;
Uzbrojeni w powyższe wzory możemy powrócić do minimalizacji funkcji kosztu.&lt;br /&gt;
Zbudujmy macierz wejść &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; w taki sposób, że wejścia z poszczególnych przykładów są jej wierszami.&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;X =&lt;br /&gt;
\left[&lt;br /&gt;
\begin{array}{ccc}&lt;br /&gt;
-&amp;amp; ( x^{(1)})^T&amp;amp;- \\&lt;br /&gt;
&amp;amp; \vdots &amp;amp; \\&lt;br /&gt;
- &amp;amp;(x^{(m)})^T &amp;amp;-&lt;br /&gt;
\end{array}&lt;br /&gt;
\right]&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Z wartości wyjściowych zbudujemy wektor kolumnowy&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\mathbf {y} = \left[&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
y^{(1) }\\&lt;br /&gt;
\vdots \\&lt;br /&gt;
y^{(m)}&lt;br /&gt;
\end{array}&lt;br /&gt;
\right]&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ponieważ &amp;lt;math&amp;gt;h_\theta (x^{(i)} ) = (x^{(i)})^T \theta &amp;lt;/math&amp;gt; możemy zapisać:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;&lt;br /&gt;
X \theta - \mathbf {y} =&lt;br /&gt;
\left[&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
( x^{(1)})^T \theta \\&lt;br /&gt;
\vdots \\&lt;br /&gt;
(x^{(m)})^T \theta \end{array}&lt;br /&gt;
\right]&lt;br /&gt;
-&lt;br /&gt;
\left[&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
y^{(1) }\\&lt;br /&gt;
\vdots \\&lt;br /&gt;
y^{(m)}&lt;br /&gt;
\end{array}&lt;br /&gt;
\right]&lt;br /&gt;
=&lt;br /&gt;
\left[&lt;br /&gt;
\begin{array}{c}&lt;br /&gt;
h_\theta (x^{(1)}) - y^{(1) }\\&lt;br /&gt;
\vdots \\&lt;br /&gt;
h_\theta (x^{(m)}) - y^{(m)}&lt;br /&gt;
\end{array}&lt;br /&gt;
\right]&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Korzystając z faktu, że dla wektora &amp;lt;math&amp;gt;\mathbf {z}&amp;lt;/math&amp;gt; mamy &amp;lt;math&amp;gt;\mathbf {z}^T\mathbf {z}=\sum _i z_i^2&amp;lt;/math&amp;gt; możemy zapisać funkcję kosztu w następujący sposób:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;J(\theta ) = \frac{1}{2} \sum _{i=1}^m \left( h_\theta (x^{(i)} ) - y^{(i)}\right)^2 = \frac{1}{2} (X \theta - \mathbf {y})^T (X \theta - \mathbf {y}) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Teraz aby zminimalizować funkcję kosztu &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; znajdzmy jej pochodną względem &amp;lt;math&amp;gt;\theta &amp;lt;/math&amp;gt;. Korzystając z równań (&amp;lt;xr id=&amp;quot;uid15&amp;quot;&amp;gt; %i&amp;lt;/xr&amp;gt;) i (&amp;lt;xr id=&amp;quot;uid16&amp;quot;&amp;gt; %i&amp;lt;/xr&amp;gt;) widzimy, że:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;equation id=&amp;quot;uid19&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\nabla _{A^T} \textrm {tr}ABA^TC = B^T A^T C^T + B A^T C&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;/equation&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tak więc:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\begin{matrix}&lt;br /&gt;
\nabla _\theta J(\theta ) &amp;amp;=&amp;amp; \nabla _\theta \frac{1}{2} (X \theta - \mathbf {y})^T (X \theta - \mathbf {y}) \\&lt;br /&gt;
&amp;amp;=&amp;amp; \frac{1}{2} \nabla _\theta ( \theta ^T X ^T X \theta -\theta ^T X^T \mathbf {y} - \mathbf {y}^T X \theta + \mathbf {y}^T \mathbf {y}) \\&lt;br /&gt;
&amp;amp;=&amp;amp; \frac{1}{2} \nabla _\theta \textrm {tr}( \theta ^T X ^T X \theta -\theta ^T X^T \mathbf {y} - \mathbf {y}^T X \theta + \mathbf {y}^T \mathbf {y}) \\&lt;br /&gt;
&amp;amp;=&amp;amp; \frac{1}{2} \nabla _\theta (\textrm {tr} \theta ^T X ^T X \theta - 2 \textrm {tr} \mathbf {y}^T X \theta ) \\&lt;br /&gt;
&amp;amp;=&amp;amp; \frac{1}{2} ( X ^T X \theta +X^T X \theta - 2 X^T \mathbf {y}) \\&lt;br /&gt;
&amp;amp;=&amp;amp; X^T X \theta - X^T \mathbf {y}&lt;br /&gt;
\end{matrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Użyte tricki:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	w trzecim kroku skorzystaliśmy z tego, że ślad liczby jest tą samą liczbą&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	w czwartym kroku skorzystaliśmy z tego, że &amp;lt;math&amp;gt;\textrm {tr}A = \textrm {tr}A^T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	w piątym kroku skorzystaliśmy z równania (&amp;lt;xr id=&amp;quot;uid19&amp;quot;&amp;gt; %i&amp;lt;/xr&amp;gt;), podstawiając &amp;lt;math&amp;gt;A^T = \theta &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;B = B^T = X^TX&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;C = I&amp;lt;/math&amp;gt; oraz równanie (&amp;lt;xr id=&amp;quot;uid14&amp;quot;&amp;gt; %i&amp;lt;/xr&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aby zminimalizować funkcję kosztu kładziemy jej pochodną równą 0 i otrzymujemy &amp;lt;i&amp;gt;równanie normalne&amp;lt;/i&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt; X^T X \theta = X^T \mathbf {y}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Z niego możemy obliczyć parametry minimalizujące funkcję kosztu:&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;math&amp;gt; \theta = (X^T X )^{-1} X^T \mathbf {y}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Interpretacja probabilistyczna===&lt;br /&gt;
&lt;br /&gt;
Dlaczego funkcja kosztu &amp;lt;math&amp;gt;J&amp;lt;/math&amp;gt; w postaci sumy kwadratów błędów dla problemu regresji jest sensowna? W tej sekcji zaprezentuje zestaw założeń probabilistycznych, dla których kwadratowa funkcja błędu jest naturalną konsekwencją.&lt;br /&gt;
&lt;br /&gt;
Załóżmy, że zmienne wejściowe i wyjściowe powiązane są zależnością:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt; y^{(i)} = \theta ^T x^{(i)} + \epsilon ^{(i)}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\epsilon ^{(i)}&amp;lt;/math&amp;gt; jest błędem, który albo pochodzi od pewnych nieuwzględnionych w modelu regresji czynników lub czynnikiem losowym. Załóżmy, że &amp;lt;math&amp;gt;\epsilon ^{(i)}&amp;lt;/math&amp;gt; to zmienne &amp;lt;i&amp;gt;niezależne&amp;lt;/i&amp;gt; i podlegające &amp;lt;i&amp;gt;temu samemu rozkładowi&amp;lt;/i&amp;gt; (ang. IID - independent and identically distributed) normalnemu o średniej zero i wariancji &amp;lt;math&amp;gt;\sigma ^2&amp;lt;/math&amp;gt;. To założenie zapisujemy krótko: &amp;lt;math&amp;gt; \epsilon ^{(i)} \sim \mathcal {N}(0, \sigma ^2)&amp;lt;/math&amp;gt; . Zatem funkcja gęstości prawdopodobieństwa &amp;lt;math&amp;gt;\epsilon ^{(i)}&amp;lt;/math&amp;gt; dana jest wzorem:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;&lt;br /&gt;
p(\epsilon ^{(i)}) = \frac{1}{\sqrt{2 \pi} \sigma } \exp \left( - \frac{ \left(\epsilon ^{(i)} \right)^2}{2 \sigma ^2} \right)&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Z tego wynika, że:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt; p(y^{(i)}| x^{(i)}; \theta ) = \frac{1}{\sqrt{2 \pi} \sigma } \exp \left( - \frac{ \left(y^{(i)} - \theta ^Tx^{(i)} \right)^2}{2 \sigma ^2} \right) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notacja &amp;lt;math&amp;gt;p(y^{(i)}| x^{(i)}; \theta )&amp;lt;/math&amp;gt; oznacza funkcję gęstości prawdopodobieństwa zmiennej &amp;lt;math&amp;gt;y^{(i)}&amp;lt;/math&amp;gt; mając daną zmienną &amp;lt;math&amp;gt;x^{(i)}&amp;lt;/math&amp;gt; sparametryzowaną przez &amp;lt;math&amp;gt;\theta &amp;lt;/math&amp;gt;. Nie mówimy &amp;quot;mając dane &amp;lt;math&amp;gt;\theta &amp;lt;/math&amp;gt;&amp;quot; bo &amp;lt;math&amp;gt;\theta &amp;lt;/math&amp;gt; nie jest zmienną losową. Prawdopodobieństwo danych (całego ciągu uczącego) określone jest przez rozkład &amp;lt;math&amp;gt;p(\mathbf {y}|X;\theta )&amp;lt;/math&amp;gt;. Ten rozkład zazwyczaj rozumiany jest jako funkcja &amp;lt;math&amp;gt;\mathbf {y}&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; przy ustalonym &amp;lt;math&amp;gt;\theta &amp;lt;/math&amp;gt;. Możemy jednak spojrzeć na niego inaczej, tzn. jako funkcję &amp;lt;math&amp;gt;\theta &amp;lt;/math&amp;gt; przy ustalonych &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;\mathbf {y}&amp;lt;/math&amp;gt;. Funkcję tą nazywamy &amp;lt;i&amp;gt;funkcją wiarygodności&amp;lt;/i&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;L(\theta ) = L(\theta ;X,\mathbf {y}) = p(\mathbf {y}|X;\theta )&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zauważmy, że dzięki założeniu o niezależności &amp;lt;math&amp;gt;\epsilon ^{(i)}&amp;lt;/math&amp;gt; możemy tą funkcję zapisać jako:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\begin{matrix}&lt;br /&gt;
L(\theta ) &amp;amp;=&amp;amp; \prod _{i=1}^m p(y^{(i)} | x^{(i)};\theta )\\&lt;br /&gt;
&amp;amp;=&amp;amp; \prod _{i=1}^m \frac{1}{\sqrt{2 \pi} \sigma } \exp \left( - \frac{ \left(y^{(i)} - \theta ^Tx^{(i)} \right)^2}{2 \sigma ^2} \right)&lt;br /&gt;
\end{matrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Teraz, mając nasz model probabilistyczny możemy się zapytać: jakie &amp;lt;math&amp;gt;\theta &amp;lt;/math&amp;gt; są sensowne? Chcielibyśmy, aby były to takie parametry, dla których zaobserwowanie naszego ciągu uczącego jest najbardziej prawdopodobne. Jest to zasada &amp;lt;i&amp;gt;największej wiarygodności&amp;lt;/i&amp;gt;. A zatem w myśl tej zasady trzeba znaleźć &amp;lt;math&amp;gt;\theta &amp;lt;/math&amp;gt;, które maksymalizuje funkcję wiarygodności &amp;lt;math&amp;gt;L(\theta )&amp;lt;/math&amp;gt;. Tak naprawdę wystarczy jeśli zmaksymalizujemy dowolną ściśle rosnącą funkcję funkcji wiarygodności. Rachunki znacznie się uproszczą jeśli jako tą funkcję wybierzemy &amp;lt;math&amp;gt;\log &amp;lt;/math&amp;gt; (wówczas iloczyn przejdzie w sumę). Ostatecznie chcemy zmaksymalizować:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\begin{matrix}&lt;br /&gt;
l(\theta ) &amp;amp;=&amp;amp; \log (L(\theta )) \\&lt;br /&gt;
&amp;amp;=&amp;amp; \log \prod _{i=1}^m \frac{1}{\sqrt{2 \pi} \sigma } \exp \left( - \frac{ \left(y^{(i)} - \theta ^Tx^{(i)} \right)^2}{2 \sigma ^2} \right)\\&lt;br /&gt;
&amp;amp;=&amp;amp; \sum _{i=1}^m \log \frac{1}{\sqrt{2 \pi} \sigma } \exp \left( - \frac{ \left(y^{(i)} - \theta ^Tx^{(i)} \right)^2}{2 \sigma ^2} \right) \\&lt;br /&gt;
&amp;amp;=&amp;amp; m \log \frac{1}{\sqrt{2 \pi }\sigma } - \frac{1}{\sigma ^2} \cdot \frac{1}{2} \sum _{i=1}^m \left( y^{(i)} - \theta ^Tx^{(i)} \right)^2&lt;br /&gt;
\end{matrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zauważmy, że aby zmaksymalizować funkcję wiarygodności musimy zminimalizować wyrażenie &amp;lt;math&amp;gt; \frac{1}{2} \sum _{i=1}^m \left( y^{(i)} - \theta ^Tx^{(i)} \right)^2 &amp;lt;/math&amp;gt;, czyli wprowadzoną w poprzednim rozdziale funkcję kosztu &amp;lt;math&amp;gt;J(\theta )&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Podsumowując: zakładając konkretny model probabilistyczny ciągu uczącego udało nam się pokazać, że minimalizacja funkcji kosztu jest konsekwencją zastosowania zasady największej wiarygodności. Warto jednak pamiętać, że procedura minimalizacji średniego błędu kwadratowego daje sensowne wyniki dla znacznie szerszej klasy modeli danych.&lt;/div&gt;</summary>
		<author><name>SuperAdmin</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Plik:SIR.py&amp;diff=4813</id>
		<title>Plik:SIR.py</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Plik:SIR.py&amp;diff=4813"/>
		<updated>2016-03-01T12:24:36Z</updated>

		<summary type="html">&lt;p&gt;SuperAdmin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>SuperAdmin</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/Info_2&amp;diff=3789</id>
		<title>Laboratorium EEG/Info 2</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/Info_2&amp;diff=3789"/>
		<updated>2015-06-16T11:44:57Z</updated>

		<summary type="html">&lt;p&gt;SuperAdmin: /* Wyniki prezentacji */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
=Laboratorium EEG - grupa 2 - ćwiczenia=&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ogłoszenia bieżące ==&lt;br /&gt;
&lt;br /&gt;
Terminy prezentacji wyników pracy:&lt;br /&gt;
* 15.05.2015, sala 4.59, w godzinach 12:00 - 15:00,&lt;br /&gt;
* 12.06.2015, sala 4.59, w godzinach 09:00 - 12:00.&lt;br /&gt;
&lt;br /&gt;
Propozycje ocen:&lt;br /&gt;
* 16.06.2015, sala 4.59, godzina 12:00.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Termin zajęć ==&lt;br /&gt;
Zajęcia odbywają się dwa razy w tygodniu, we wtorki w godzinach 12:15 - 14:45 oraz w piątki, w godzinach 09:30 - 12:00. Sala &amp;lt;b&amp;gt;4.59&amp;lt;/b&amp;gt;, ul. Pasteura 5 - &amp;lt;b&amp;gt;&amp;quot;nowy&amp;quot;&amp;lt;/b&amp;gt; budynek dydaktyczny Wydziału Fizyki UW.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Kontakt z prowadzącym ==&lt;br /&gt;
Zajęcia prowadzi mgr Tomasz Spustek, pokój 4.66, ul. Pasteura 5 - nowy, główny budynek dydaktyczny Wydziału Fizyki UW&lt;br /&gt;
&lt;br /&gt;
Preferowany sposób kontaktu - e-mail: tspus@fuw.edu.pl&lt;br /&gt;
&lt;br /&gt;
Możliwe jest zorganizowanie konsultacji z prowadzącym ćwiczenia, po uprzednim kontakcie e-mailowym.&lt;br /&gt;
&lt;br /&gt;
== Warunki zaliczenia ==&lt;br /&gt;
Ćwiczenia zostaną zaliczone osobom, które spełnią dwa niezwykle proste warunki:&lt;br /&gt;
* Posiadanie maksymalnie dwóch nieusprawiedliwionych nieobecności na ćwiczeniach,&lt;br /&gt;
* Posiadanie sumy punktów z dwóch prezentacji oraz ze wszystkich kartkówek nie mniejszej niż połowa punktów możliwych do zdobycia,&lt;br /&gt;
* Punkty będą przyznawane w sposób uwzględniający nie tylko stan wiedzy, ale także czynione postępy.&lt;br /&gt;
&lt;br /&gt;
* Osobom spełniającym powyższe warunki zaproponowana zostanie pozytywna ocena końcowa z Laboratorium.&lt;br /&gt;
* Osoby nie mające tego szczęścia, otrzymają ocenę negatywną.&lt;br /&gt;
&lt;br /&gt;
* Możliwe będzie poprawienie zaproponowanej oceny na wyższą poprzez zrealizowanie dodatkowego projektu. Jego cel zostanie ustalony indywidualnie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Wyniki kartkówek ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center; clear:both;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;12&amp;quot; style=&amp;quot;text-align: center;&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
!Numer indeksu&lt;br /&gt;
!Zadanie 1&lt;br /&gt;
!Zadanie 2&lt;br /&gt;
!Zadanie 3&lt;br /&gt;
!Zadanie 4&lt;br /&gt;
!Zadanie 5&lt;br /&gt;
!Zadanie 6&lt;br /&gt;
!Zadanie 7&lt;br /&gt;
!Zadanie 8&lt;br /&gt;
!Zadanie 9&lt;br /&gt;
!Zadanie 10&lt;br /&gt;
!Wynik łączny&lt;br /&gt;
|-&lt;br /&gt;
| 317905&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,75&lt;br /&gt;
|-&lt;br /&gt;
| 335252&lt;br /&gt;
| 0,00&lt;br /&gt;
| (1,00)&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,33&lt;br /&gt;
| 0,50&lt;br /&gt;
|-&lt;br /&gt;
| 322929&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,66&lt;br /&gt;
| (1,00)&lt;br /&gt;
| 1,33&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,33&lt;br /&gt;
| 1,00&lt;br /&gt;
|-&lt;br /&gt;
| 306766&lt;br /&gt;
| (1,00)&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,75&lt;br /&gt;
|-&lt;br /&gt;
| 264493&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| (1,00)&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
|-&lt;br /&gt;
| 320367&lt;br /&gt;
| 1,00&lt;br /&gt;
| (1,00)&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,75&lt;br /&gt;
|-&lt;br /&gt;
| 334134&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| (0,66)&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,33&lt;br /&gt;
| 0,75&lt;br /&gt;
|-&lt;br /&gt;
| 335240&lt;br /&gt;
| 0,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,75&lt;br /&gt;
|-&lt;br /&gt;
| 290829&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,50&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin:10px 10px 10px 10px; padding:10px;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:left;&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
!#&lt;br /&gt;
!Zagadnienia sprawdzane na kartkówkach&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Manipulacja wierszami i kolumnami macierzy (zmiana kolejności elementów).&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Instrukcje warunkowe oraz rekurencja (silnia).&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| Manipulacja łańcuchami znaków oraz tworzenie prostej struktury (konwersja zapisu czasu).&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| Zaawansowane przekształcenia macierzowe (macierz zawierająca elementy większe od średniej).&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| Proste zagadnienia numeryczne (losowanie liczb spełniających warunek, przeszukiwanie macierzy).&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| Wczytywanie danych z plików tekstowych do struktur.&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| Wczytywanie zapisów EEG (pliki .raw) do struktur.&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| Operacje macierzowe (elementy zawierające się w dwóch macierzach).&lt;br /&gt;
|-&lt;br /&gt;
| 9&lt;br /&gt;
| Wczytywanie danych z plików tekstowych do struktur (ponownie).&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| Operacje macierzowe (iloczyn zewnętrzny).&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wyniki prezentacji==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center; clear:both&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center; float: left;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;11&amp;quot; style=&amp;quot;text-align: center;&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
!Numer indeksu&lt;br /&gt;
!Prezentacja 1&lt;br /&gt;
!Prezentacja 2&lt;br /&gt;
!Projekt&lt;br /&gt;
|-&lt;br /&gt;
| 317905&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,60&lt;br /&gt;
| ND&lt;br /&gt;
|-&lt;br /&gt;
| 335252&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,50&lt;br /&gt;
| Analiza ASSR na plikach jd*&lt;br /&gt;
|-&lt;br /&gt;
| 322929&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,60&lt;br /&gt;
| ND&lt;br /&gt;
|-&lt;br /&gt;
| 306766&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,75&lt;br /&gt;
| Do ustalenia&lt;br /&gt;
|-&lt;br /&gt;
| 264493&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,75&lt;br /&gt;
| ND&lt;br /&gt;
|-&lt;br /&gt;
| 320367&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,75&lt;br /&gt;
| Porównanie MP5 z MP-matlab&lt;br /&gt;
|-&lt;br /&gt;
| 334134&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,75&lt;br /&gt;
| Porównanie ITC z EEGLAB do analizy fazowej&lt;br /&gt;
|-&lt;br /&gt;
| 335240&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,50&lt;br /&gt;
| Wielozmienne MP (topografia)&lt;br /&gt;
|-&lt;br /&gt;
| 290829&lt;br /&gt;
| 0,50&lt;br /&gt;
| 0,00&lt;br /&gt;
| Do ustalenia&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>SuperAdmin</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/Info_2&amp;diff=3788</id>
		<title>Laboratorium EEG/Info 2</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/Info_2&amp;diff=3788"/>
		<updated>2015-06-16T11:43:38Z</updated>

		<summary type="html">&lt;p&gt;SuperAdmin: /* Wyniki prezentacji */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
=Laboratorium EEG - grupa 2 - ćwiczenia=&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ogłoszenia bieżące ==&lt;br /&gt;
&lt;br /&gt;
Terminy prezentacji wyników pracy:&lt;br /&gt;
* 15.05.2015, sala 4.59, w godzinach 12:00 - 15:00,&lt;br /&gt;
* 12.06.2015, sala 4.59, w godzinach 09:00 - 12:00.&lt;br /&gt;
&lt;br /&gt;
Propozycje ocen:&lt;br /&gt;
* 16.06.2015, sala 4.59, godzina 12:00.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Termin zajęć ==&lt;br /&gt;
Zajęcia odbywają się dwa razy w tygodniu, we wtorki w godzinach 12:15 - 14:45 oraz w piątki, w godzinach 09:30 - 12:00. Sala &amp;lt;b&amp;gt;4.59&amp;lt;/b&amp;gt;, ul. Pasteura 5 - &amp;lt;b&amp;gt;&amp;quot;nowy&amp;quot;&amp;lt;/b&amp;gt; budynek dydaktyczny Wydziału Fizyki UW.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Kontakt z prowadzącym ==&lt;br /&gt;
Zajęcia prowadzi mgr Tomasz Spustek, pokój 4.66, ul. Pasteura 5 - nowy, główny budynek dydaktyczny Wydziału Fizyki UW&lt;br /&gt;
&lt;br /&gt;
Preferowany sposób kontaktu - e-mail: tspus@fuw.edu.pl&lt;br /&gt;
&lt;br /&gt;
Możliwe jest zorganizowanie konsultacji z prowadzącym ćwiczenia, po uprzednim kontakcie e-mailowym.&lt;br /&gt;
&lt;br /&gt;
== Warunki zaliczenia ==&lt;br /&gt;
Ćwiczenia zostaną zaliczone osobom, które spełnią dwa niezwykle proste warunki:&lt;br /&gt;
* Posiadanie maksymalnie dwóch nieusprawiedliwionych nieobecności na ćwiczeniach,&lt;br /&gt;
* Posiadanie sumy punktów z dwóch prezentacji oraz ze wszystkich kartkówek nie mniejszej niż połowa punktów możliwych do zdobycia,&lt;br /&gt;
* Punkty będą przyznawane w sposób uwzględniający nie tylko stan wiedzy, ale także czynione postępy.&lt;br /&gt;
&lt;br /&gt;
* Osobom spełniającym powyższe warunki zaproponowana zostanie pozytywna ocena końcowa z Laboratorium.&lt;br /&gt;
* Osoby nie mające tego szczęścia, otrzymają ocenę negatywną.&lt;br /&gt;
&lt;br /&gt;
* Możliwe będzie poprawienie zaproponowanej oceny na wyższą poprzez zrealizowanie dodatkowego projektu. Jego cel zostanie ustalony indywidualnie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Wyniki kartkówek ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center; clear:both;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;12&amp;quot; style=&amp;quot;text-align: center;&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
!Numer indeksu&lt;br /&gt;
!Zadanie 1&lt;br /&gt;
!Zadanie 2&lt;br /&gt;
!Zadanie 3&lt;br /&gt;
!Zadanie 4&lt;br /&gt;
!Zadanie 5&lt;br /&gt;
!Zadanie 6&lt;br /&gt;
!Zadanie 7&lt;br /&gt;
!Zadanie 8&lt;br /&gt;
!Zadanie 9&lt;br /&gt;
!Zadanie 10&lt;br /&gt;
!Wynik łączny&lt;br /&gt;
|-&lt;br /&gt;
| 317905&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,75&lt;br /&gt;
|-&lt;br /&gt;
| 335252&lt;br /&gt;
| 0,00&lt;br /&gt;
| (1,00)&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,33&lt;br /&gt;
| 0,50&lt;br /&gt;
|-&lt;br /&gt;
| 322929&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,66&lt;br /&gt;
| (1,00)&lt;br /&gt;
| 1,33&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,33&lt;br /&gt;
| 1,00&lt;br /&gt;
|-&lt;br /&gt;
| 306766&lt;br /&gt;
| (1,00)&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,75&lt;br /&gt;
|-&lt;br /&gt;
| 264493&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| (1,00)&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
|-&lt;br /&gt;
| 320367&lt;br /&gt;
| 1,00&lt;br /&gt;
| (1,00)&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,75&lt;br /&gt;
|-&lt;br /&gt;
| 334134&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| (0,66)&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,33&lt;br /&gt;
| 0,75&lt;br /&gt;
|-&lt;br /&gt;
| 335240&lt;br /&gt;
| 0,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,75&lt;br /&gt;
|-&lt;br /&gt;
| 290829&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,50&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin:10px 10px 10px 10px; padding:10px;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:left;&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
!#&lt;br /&gt;
!Zagadnienia sprawdzane na kartkówkach&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Manipulacja wierszami i kolumnami macierzy (zmiana kolejności elementów).&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Instrukcje warunkowe oraz rekurencja (silnia).&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| Manipulacja łańcuchami znaków oraz tworzenie prostej struktury (konwersja zapisu czasu).&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| Zaawansowane przekształcenia macierzowe (macierz zawierająca elementy większe od średniej).&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| Proste zagadnienia numeryczne (losowanie liczb spełniających warunek, przeszukiwanie macierzy).&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| Wczytywanie danych z plików tekstowych do struktur.&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| Wczytywanie zapisów EEG (pliki .raw) do struktur.&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| Operacje macierzowe (elementy zawierające się w dwóch macierzach).&lt;br /&gt;
|-&lt;br /&gt;
| 9&lt;br /&gt;
| Wczytywanie danych z plików tekstowych do struktur (ponownie).&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| Operacje macierzowe (iloczyn zewnętrzny).&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wyniki prezentacji==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center; clear:both&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center; float: left;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;11&amp;quot; style=&amp;quot;text-align: center;&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
!Numer indeksu&lt;br /&gt;
!Prezentacja 1&lt;br /&gt;
!Prezentacja 2&lt;br /&gt;
!Projekt&lt;br /&gt;
|-&lt;br /&gt;
| 317905&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,60&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 335252&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,50&lt;br /&gt;
| Analiza ASSR na plikach jd*&lt;br /&gt;
|-&lt;br /&gt;
| 322929&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,60&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 306766&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,75&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 264493&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,75&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 320367&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,75&lt;br /&gt;
| Porównanie MP5 z MP-matlab&lt;br /&gt;
|-&lt;br /&gt;
| 334134&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,75&lt;br /&gt;
| Porównanie ITC z EEGLAB do analizy fazowej&lt;br /&gt;
|-&lt;br /&gt;
| 335240&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,50&lt;br /&gt;
| Wielozmienne MP (topografia)&lt;br /&gt;
|-&lt;br /&gt;
| 290829&lt;br /&gt;
| 0,50&lt;br /&gt;
| 0,00&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>SuperAdmin</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/Info_2&amp;diff=3787</id>
		<title>Laboratorium EEG/Info 2</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/Info_2&amp;diff=3787"/>
		<updated>2015-06-16T10:50:24Z</updated>

		<summary type="html">&lt;p&gt;SuperAdmin: /* Wyniki prezentacji */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
=Laboratorium EEG - grupa 2 - ćwiczenia=&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ogłoszenia bieżące ==&lt;br /&gt;
&lt;br /&gt;
Terminy prezentacji wyników pracy:&lt;br /&gt;
* 15.05.2015, sala 4.59, w godzinach 12:00 - 15:00,&lt;br /&gt;
* 12.06.2015, sala 4.59, w godzinach 09:00 - 12:00.&lt;br /&gt;
&lt;br /&gt;
Propozycje ocen:&lt;br /&gt;
* 16.06.2015, sala 4.59, godzina 12:00.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Termin zajęć ==&lt;br /&gt;
Zajęcia odbywają się dwa razy w tygodniu, we wtorki w godzinach 12:15 - 14:45 oraz w piątki, w godzinach 09:30 - 12:00. Sala &amp;lt;b&amp;gt;4.59&amp;lt;/b&amp;gt;, ul. Pasteura 5 - &amp;lt;b&amp;gt;&amp;quot;nowy&amp;quot;&amp;lt;/b&amp;gt; budynek dydaktyczny Wydziału Fizyki UW.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Kontakt z prowadzącym ==&lt;br /&gt;
Zajęcia prowadzi mgr Tomasz Spustek, pokój 4.66, ul. Pasteura 5 - nowy, główny budynek dydaktyczny Wydziału Fizyki UW&lt;br /&gt;
&lt;br /&gt;
Preferowany sposób kontaktu - e-mail: tspus@fuw.edu.pl&lt;br /&gt;
&lt;br /&gt;
Możliwe jest zorganizowanie konsultacji z prowadzącym ćwiczenia, po uprzednim kontakcie e-mailowym.&lt;br /&gt;
&lt;br /&gt;
== Warunki zaliczenia ==&lt;br /&gt;
Ćwiczenia zostaną zaliczone osobom, które spełnią dwa niezwykle proste warunki:&lt;br /&gt;
* Posiadanie maksymalnie dwóch nieusprawiedliwionych nieobecności na ćwiczeniach,&lt;br /&gt;
* Posiadanie sumy punktów z dwóch prezentacji oraz ze wszystkich kartkówek nie mniejszej niż połowa punktów możliwych do zdobycia,&lt;br /&gt;
* Punkty będą przyznawane w sposób uwzględniający nie tylko stan wiedzy, ale także czynione postępy.&lt;br /&gt;
&lt;br /&gt;
* Osobom spełniającym powyższe warunki zaproponowana zostanie pozytywna ocena końcowa z Laboratorium.&lt;br /&gt;
* Osoby nie mające tego szczęścia, otrzymają ocenę negatywną.&lt;br /&gt;
&lt;br /&gt;
* Możliwe będzie poprawienie zaproponowanej oceny na wyższą poprzez zrealizowanie dodatkowego projektu. Jego cel zostanie ustalony indywidualnie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Wyniki kartkówek ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center; clear:both;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;12&amp;quot; style=&amp;quot;text-align: center;&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
!Numer indeksu&lt;br /&gt;
!Zadanie 1&lt;br /&gt;
!Zadanie 2&lt;br /&gt;
!Zadanie 3&lt;br /&gt;
!Zadanie 4&lt;br /&gt;
!Zadanie 5&lt;br /&gt;
!Zadanie 6&lt;br /&gt;
!Zadanie 7&lt;br /&gt;
!Zadanie 8&lt;br /&gt;
!Zadanie 9&lt;br /&gt;
!Zadanie 10&lt;br /&gt;
!Wynik łączny&lt;br /&gt;
|-&lt;br /&gt;
| 317905&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,75&lt;br /&gt;
|-&lt;br /&gt;
| 335252&lt;br /&gt;
| 0,00&lt;br /&gt;
| (1,00)&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,33&lt;br /&gt;
| 0,50&lt;br /&gt;
|-&lt;br /&gt;
| 322929&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,66&lt;br /&gt;
| (1,00)&lt;br /&gt;
| 1,33&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,33&lt;br /&gt;
| 1,00&lt;br /&gt;
|-&lt;br /&gt;
| 306766&lt;br /&gt;
| (1,00)&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,75&lt;br /&gt;
|-&lt;br /&gt;
| 264493&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| (1,00)&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
|-&lt;br /&gt;
| 320367&lt;br /&gt;
| 1,00&lt;br /&gt;
| (1,00)&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,75&lt;br /&gt;
|-&lt;br /&gt;
| 334134&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| (0,66)&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,33&lt;br /&gt;
| 0,75&lt;br /&gt;
|-&lt;br /&gt;
| 335240&lt;br /&gt;
| 0,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,75&lt;br /&gt;
|-&lt;br /&gt;
| 290829&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,50&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin:10px 10px 10px 10px; padding:10px;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:left;&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
!#&lt;br /&gt;
!Zagadnienia sprawdzane na kartkówkach&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Manipulacja wierszami i kolumnami macierzy (zmiana kolejności elementów).&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Instrukcje warunkowe oraz rekurencja (silnia).&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| Manipulacja łańcuchami znaków oraz tworzenie prostej struktury (konwersja zapisu czasu).&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| Zaawansowane przekształcenia macierzowe (macierz zawierająca elementy większe od średniej).&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| Proste zagadnienia numeryczne (losowanie liczb spełniających warunek, przeszukiwanie macierzy).&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| Wczytywanie danych z plików tekstowych do struktur.&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| Wczytywanie zapisów EEG (pliki .raw) do struktur.&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| Operacje macierzowe (elementy zawierające się w dwóch macierzach).&lt;br /&gt;
|-&lt;br /&gt;
| 9&lt;br /&gt;
| Wczytywanie danych z plików tekstowych do struktur (ponownie).&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| Operacje macierzowe (iloczyn zewnętrzny).&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wyniki prezentacji==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center; clear:both&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center; float: left;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;11&amp;quot; style=&amp;quot;text-align: center;&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
!Numer indeksu&lt;br /&gt;
!Prezentacja 1&lt;br /&gt;
!Prezentacja 2&lt;br /&gt;
!Projekt&lt;br /&gt;
|-&lt;br /&gt;
| 317905&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,60&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 335252&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,50&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 322929&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,60&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 306766&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,75&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 264493&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,75&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 320367&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,75&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 334134&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,75&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 335240&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,50&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 290829&lt;br /&gt;
| 0,50&lt;br /&gt;
| 0,00&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>SuperAdmin</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/Info_2&amp;diff=3786</id>
		<title>Laboratorium EEG/Info 2</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/Info_2&amp;diff=3786"/>
		<updated>2015-06-16T10:02:33Z</updated>

		<summary type="html">&lt;p&gt;SuperAdmin: /* Ogłoszenia bieżące */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
=Laboratorium EEG - grupa 2 - ćwiczenia=&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ogłoszenia bieżące ==&lt;br /&gt;
&lt;br /&gt;
Terminy prezentacji wyników pracy:&lt;br /&gt;
* 15.05.2015, sala 4.59, w godzinach 12:00 - 15:00,&lt;br /&gt;
* 12.06.2015, sala 4.59, w godzinach 09:00 - 12:00.&lt;br /&gt;
&lt;br /&gt;
Propozycje ocen:&lt;br /&gt;
* 16.06.2015, sala 4.59, godzina 12:00.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Termin zajęć ==&lt;br /&gt;
Zajęcia odbywają się dwa razy w tygodniu, we wtorki w godzinach 12:15 - 14:45 oraz w piątki, w godzinach 09:30 - 12:00. Sala &amp;lt;b&amp;gt;4.59&amp;lt;/b&amp;gt;, ul. Pasteura 5 - &amp;lt;b&amp;gt;&amp;quot;nowy&amp;quot;&amp;lt;/b&amp;gt; budynek dydaktyczny Wydziału Fizyki UW.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Kontakt z prowadzącym ==&lt;br /&gt;
Zajęcia prowadzi mgr Tomasz Spustek, pokój 4.66, ul. Pasteura 5 - nowy, główny budynek dydaktyczny Wydziału Fizyki UW&lt;br /&gt;
&lt;br /&gt;
Preferowany sposób kontaktu - e-mail: tspus@fuw.edu.pl&lt;br /&gt;
&lt;br /&gt;
Możliwe jest zorganizowanie konsultacji z prowadzącym ćwiczenia, po uprzednim kontakcie e-mailowym.&lt;br /&gt;
&lt;br /&gt;
== Warunki zaliczenia ==&lt;br /&gt;
Ćwiczenia zostaną zaliczone osobom, które spełnią dwa niezwykle proste warunki:&lt;br /&gt;
* Posiadanie maksymalnie dwóch nieusprawiedliwionych nieobecności na ćwiczeniach,&lt;br /&gt;
* Posiadanie sumy punktów z dwóch prezentacji oraz ze wszystkich kartkówek nie mniejszej niż połowa punktów możliwych do zdobycia,&lt;br /&gt;
* Punkty będą przyznawane w sposób uwzględniający nie tylko stan wiedzy, ale także czynione postępy.&lt;br /&gt;
&lt;br /&gt;
* Osobom spełniającym powyższe warunki zaproponowana zostanie pozytywna ocena końcowa z Laboratorium.&lt;br /&gt;
* Osoby nie mające tego szczęścia, otrzymają ocenę negatywną.&lt;br /&gt;
&lt;br /&gt;
* Możliwe będzie poprawienie zaproponowanej oceny na wyższą poprzez zrealizowanie dodatkowego projektu. Jego cel zostanie ustalony indywidualnie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Wyniki kartkówek ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center; clear:both;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;12&amp;quot; style=&amp;quot;text-align: center;&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
!Numer indeksu&lt;br /&gt;
!Zadanie 1&lt;br /&gt;
!Zadanie 2&lt;br /&gt;
!Zadanie 3&lt;br /&gt;
!Zadanie 4&lt;br /&gt;
!Zadanie 5&lt;br /&gt;
!Zadanie 6&lt;br /&gt;
!Zadanie 7&lt;br /&gt;
!Zadanie 8&lt;br /&gt;
!Zadanie 9&lt;br /&gt;
!Zadanie 10&lt;br /&gt;
!Wynik łączny&lt;br /&gt;
|-&lt;br /&gt;
| 317905&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,75&lt;br /&gt;
|-&lt;br /&gt;
| 335252&lt;br /&gt;
| 0,00&lt;br /&gt;
| (1,00)&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,33&lt;br /&gt;
| 0,50&lt;br /&gt;
|-&lt;br /&gt;
| 322929&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,66&lt;br /&gt;
| (1,00)&lt;br /&gt;
| 1,33&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,33&lt;br /&gt;
| 1,00&lt;br /&gt;
|-&lt;br /&gt;
| 306766&lt;br /&gt;
| (1,00)&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,75&lt;br /&gt;
|-&lt;br /&gt;
| 264493&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| (1,00)&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
|-&lt;br /&gt;
| 320367&lt;br /&gt;
| 1,00&lt;br /&gt;
| (1,00)&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,75&lt;br /&gt;
|-&lt;br /&gt;
| 334134&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| (0,66)&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,33&lt;br /&gt;
| 0,75&lt;br /&gt;
|-&lt;br /&gt;
| 335240&lt;br /&gt;
| 0,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,75&lt;br /&gt;
|-&lt;br /&gt;
| 290829&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,50&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin:10px 10px 10px 10px; padding:10px;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:left;&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
!#&lt;br /&gt;
!Zagadnienia sprawdzane na kartkówkach&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Manipulacja wierszami i kolumnami macierzy (zmiana kolejności elementów).&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Instrukcje warunkowe oraz rekurencja (silnia).&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| Manipulacja łańcuchami znaków oraz tworzenie prostej struktury (konwersja zapisu czasu).&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| Zaawansowane przekształcenia macierzowe (macierz zawierająca elementy większe od średniej).&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| Proste zagadnienia numeryczne (losowanie liczb spełniających warunek, przeszukiwanie macierzy).&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| Wczytywanie danych z plików tekstowych do struktur.&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| Wczytywanie zapisów EEG (pliki .raw) do struktur.&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| Operacje macierzowe (elementy zawierające się w dwóch macierzach).&lt;br /&gt;
|-&lt;br /&gt;
| 9&lt;br /&gt;
| Wczytywanie danych z plików tekstowych do struktur (ponownie).&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| Operacje macierzowe (iloczyn zewnętrzny).&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wyniki prezentacji==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center; clear:both&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center; float: left;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;11&amp;quot; style=&amp;quot;text-align: center;&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
!Numer indeksu&lt;br /&gt;
!Prezentacja 1&lt;br /&gt;
!Prezentacja 2&lt;br /&gt;
!Projekt&lt;br /&gt;
|-&lt;br /&gt;
| 317905&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,60&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 335252&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,50&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 322929&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,60&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 306766&lt;br /&gt;
| 1,00&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 264493&lt;br /&gt;
| 1,00&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 320367&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,75&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 334134&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,75&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 335240&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,50&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 290829&lt;br /&gt;
| 0,50&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>SuperAdmin</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/Info_2&amp;diff=3785</id>
		<title>Laboratorium EEG/Info 2</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/Info_2&amp;diff=3785"/>
		<updated>2015-06-16T10:01:43Z</updated>

		<summary type="html">&lt;p&gt;SuperAdmin: /* Wyniki prezentacji */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
=Laboratorium EEG - grupa 2 - ćwiczenia=&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ogłoszenia bieżące ==&lt;br /&gt;
&lt;br /&gt;
We wtorek (09.06.15.) studenci będą mieli możliwość poprawienia jednej kartkówki.&lt;br /&gt;
&lt;br /&gt;
Terminy prezentacji wyników pracy:&lt;br /&gt;
* 15.05.2015, sala 4.59, w godzinach 12:00 - 15:00,&lt;br /&gt;
* 12.06.2015, sala 4.59, w godzinach 09:00 - 12:00.&lt;br /&gt;
&lt;br /&gt;
Propozycje ocen:&lt;br /&gt;
* 16.06.2015, sala 4.59, godzina 12:00.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Termin zajęć ==&lt;br /&gt;
Zajęcia odbywają się dwa razy w tygodniu, we wtorki w godzinach 12:15 - 14:45 oraz w piątki, w godzinach 09:30 - 12:00. Sala &amp;lt;b&amp;gt;4.59&amp;lt;/b&amp;gt;, ul. Pasteura 5 - &amp;lt;b&amp;gt;&amp;quot;nowy&amp;quot;&amp;lt;/b&amp;gt; budynek dydaktyczny Wydziału Fizyki UW.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Kontakt z prowadzącym ==&lt;br /&gt;
Zajęcia prowadzi mgr Tomasz Spustek, pokój 4.66, ul. Pasteura 5 - nowy, główny budynek dydaktyczny Wydziału Fizyki UW&lt;br /&gt;
&lt;br /&gt;
Preferowany sposób kontaktu - e-mail: tspus@fuw.edu.pl&lt;br /&gt;
&lt;br /&gt;
Możliwe jest zorganizowanie konsultacji z prowadzącym ćwiczenia, po uprzednim kontakcie e-mailowym.&lt;br /&gt;
&lt;br /&gt;
== Warunki zaliczenia ==&lt;br /&gt;
Ćwiczenia zostaną zaliczone osobom, które spełnią dwa niezwykle proste warunki:&lt;br /&gt;
* Posiadanie maksymalnie dwóch nieusprawiedliwionych nieobecności na ćwiczeniach,&lt;br /&gt;
* Posiadanie sumy punktów z dwóch prezentacji oraz ze wszystkich kartkówek nie mniejszej niż połowa punktów możliwych do zdobycia,&lt;br /&gt;
* Punkty będą przyznawane w sposób uwzględniający nie tylko stan wiedzy, ale także czynione postępy.&lt;br /&gt;
&lt;br /&gt;
* Osobom spełniającym powyższe warunki zaproponowana zostanie pozytywna ocena końcowa z Laboratorium.&lt;br /&gt;
* Osoby nie mające tego szczęścia, otrzymają ocenę negatywną.&lt;br /&gt;
&lt;br /&gt;
* Możliwe będzie poprawienie zaproponowanej oceny na wyższą poprzez zrealizowanie dodatkowego projektu. Jego cel zostanie ustalony indywidualnie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Wyniki kartkówek ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center; clear:both;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;12&amp;quot; style=&amp;quot;text-align: center;&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
!Numer indeksu&lt;br /&gt;
!Zadanie 1&lt;br /&gt;
!Zadanie 2&lt;br /&gt;
!Zadanie 3&lt;br /&gt;
!Zadanie 4&lt;br /&gt;
!Zadanie 5&lt;br /&gt;
!Zadanie 6&lt;br /&gt;
!Zadanie 7&lt;br /&gt;
!Zadanie 8&lt;br /&gt;
!Zadanie 9&lt;br /&gt;
!Zadanie 10&lt;br /&gt;
!Wynik łączny&lt;br /&gt;
|-&lt;br /&gt;
| 317905&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,75&lt;br /&gt;
|-&lt;br /&gt;
| 335252&lt;br /&gt;
| 0,00&lt;br /&gt;
| (1,00)&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,33&lt;br /&gt;
| 0,50&lt;br /&gt;
|-&lt;br /&gt;
| 322929&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,66&lt;br /&gt;
| (1,00)&lt;br /&gt;
| 1,33&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,33&lt;br /&gt;
| 1,00&lt;br /&gt;
|-&lt;br /&gt;
| 306766&lt;br /&gt;
| (1,00)&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,75&lt;br /&gt;
|-&lt;br /&gt;
| 264493&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| (1,00)&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
|-&lt;br /&gt;
| 320367&lt;br /&gt;
| 1,00&lt;br /&gt;
| (1,00)&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,75&lt;br /&gt;
|-&lt;br /&gt;
| 334134&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| (0,66)&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,33&lt;br /&gt;
| 0,75&lt;br /&gt;
|-&lt;br /&gt;
| 335240&lt;br /&gt;
| 0,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,75&lt;br /&gt;
|-&lt;br /&gt;
| 290829&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,50&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin:10px 10px 10px 10px; padding:10px;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:left;&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
!#&lt;br /&gt;
!Zagadnienia sprawdzane na kartkówkach&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Manipulacja wierszami i kolumnami macierzy (zmiana kolejności elementów).&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Instrukcje warunkowe oraz rekurencja (silnia).&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| Manipulacja łańcuchami znaków oraz tworzenie prostej struktury (konwersja zapisu czasu).&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| Zaawansowane przekształcenia macierzowe (macierz zawierająca elementy większe od średniej).&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| Proste zagadnienia numeryczne (losowanie liczb spełniających warunek, przeszukiwanie macierzy).&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| Wczytywanie danych z plików tekstowych do struktur.&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| Wczytywanie zapisów EEG (pliki .raw) do struktur.&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| Operacje macierzowe (elementy zawierające się w dwóch macierzach).&lt;br /&gt;
|-&lt;br /&gt;
| 9&lt;br /&gt;
| Wczytywanie danych z plików tekstowych do struktur (ponownie).&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| Operacje macierzowe (iloczyn zewnętrzny).&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wyniki prezentacji==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center; clear:both&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center; float: left;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;11&amp;quot; style=&amp;quot;text-align: center;&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
!Numer indeksu&lt;br /&gt;
!Prezentacja 1&lt;br /&gt;
!Prezentacja 2&lt;br /&gt;
!Projekt&lt;br /&gt;
|-&lt;br /&gt;
| 317905&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,60&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 335252&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,50&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 322929&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,60&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 306766&lt;br /&gt;
| 1,00&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 264493&lt;br /&gt;
| 1,00&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 320367&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,75&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 334134&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,75&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 335240&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,50&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 290829&lt;br /&gt;
| 0,50&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>SuperAdmin</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/Info_2&amp;diff=3784</id>
		<title>Laboratorium EEG/Info 2</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/Info_2&amp;diff=3784"/>
		<updated>2015-06-16T09:56:16Z</updated>

		<summary type="html">&lt;p&gt;SuperAdmin: /* Wyniki kartkówek */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
=Laboratorium EEG - grupa 2 - ćwiczenia=&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ogłoszenia bieżące ==&lt;br /&gt;
&lt;br /&gt;
We wtorek (09.06.15.) studenci będą mieli możliwość poprawienia jednej kartkówki.&lt;br /&gt;
&lt;br /&gt;
Terminy prezentacji wyników pracy:&lt;br /&gt;
* 15.05.2015, sala 4.59, w godzinach 12:00 - 15:00,&lt;br /&gt;
* 12.06.2015, sala 4.59, w godzinach 09:00 - 12:00.&lt;br /&gt;
&lt;br /&gt;
Propozycje ocen:&lt;br /&gt;
* 16.06.2015, sala 4.59, godzina 12:00.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Termin zajęć ==&lt;br /&gt;
Zajęcia odbywają się dwa razy w tygodniu, we wtorki w godzinach 12:15 - 14:45 oraz w piątki, w godzinach 09:30 - 12:00. Sala &amp;lt;b&amp;gt;4.59&amp;lt;/b&amp;gt;, ul. Pasteura 5 - &amp;lt;b&amp;gt;&amp;quot;nowy&amp;quot;&amp;lt;/b&amp;gt; budynek dydaktyczny Wydziału Fizyki UW.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Kontakt z prowadzącym ==&lt;br /&gt;
Zajęcia prowadzi mgr Tomasz Spustek, pokój 4.66, ul. Pasteura 5 - nowy, główny budynek dydaktyczny Wydziału Fizyki UW&lt;br /&gt;
&lt;br /&gt;
Preferowany sposób kontaktu - e-mail: tspus@fuw.edu.pl&lt;br /&gt;
&lt;br /&gt;
Możliwe jest zorganizowanie konsultacji z prowadzącym ćwiczenia, po uprzednim kontakcie e-mailowym.&lt;br /&gt;
&lt;br /&gt;
== Warunki zaliczenia ==&lt;br /&gt;
Ćwiczenia zostaną zaliczone osobom, które spełnią dwa niezwykle proste warunki:&lt;br /&gt;
* Posiadanie maksymalnie dwóch nieusprawiedliwionych nieobecności na ćwiczeniach,&lt;br /&gt;
* Posiadanie sumy punktów z dwóch prezentacji oraz ze wszystkich kartkówek nie mniejszej niż połowa punktów możliwych do zdobycia,&lt;br /&gt;
* Punkty będą przyznawane w sposób uwzględniający nie tylko stan wiedzy, ale także czynione postępy.&lt;br /&gt;
&lt;br /&gt;
* Osobom spełniającym powyższe warunki zaproponowana zostanie pozytywna ocena końcowa z Laboratorium.&lt;br /&gt;
* Osoby nie mające tego szczęścia, otrzymają ocenę negatywną.&lt;br /&gt;
&lt;br /&gt;
* Możliwe będzie poprawienie zaproponowanej oceny na wyższą poprzez zrealizowanie dodatkowego projektu. Jego cel zostanie ustalony indywidualnie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Wyniki kartkówek ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center; clear:both;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;12&amp;quot; style=&amp;quot;text-align: center;&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
!Numer indeksu&lt;br /&gt;
!Zadanie 1&lt;br /&gt;
!Zadanie 2&lt;br /&gt;
!Zadanie 3&lt;br /&gt;
!Zadanie 4&lt;br /&gt;
!Zadanie 5&lt;br /&gt;
!Zadanie 6&lt;br /&gt;
!Zadanie 7&lt;br /&gt;
!Zadanie 8&lt;br /&gt;
!Zadanie 9&lt;br /&gt;
!Zadanie 10&lt;br /&gt;
!Wynik łączny&lt;br /&gt;
|-&lt;br /&gt;
| 317905&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,75&lt;br /&gt;
|-&lt;br /&gt;
| 335252&lt;br /&gt;
| 0,00&lt;br /&gt;
| (1,00)&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,33&lt;br /&gt;
| 0,50&lt;br /&gt;
|-&lt;br /&gt;
| 322929&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,66&lt;br /&gt;
| (1,00)&lt;br /&gt;
| 1,33&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,33&lt;br /&gt;
| 1,00&lt;br /&gt;
|-&lt;br /&gt;
| 306766&lt;br /&gt;
| (1,00)&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,75&lt;br /&gt;
|-&lt;br /&gt;
| 264493&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| (1,00)&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
|-&lt;br /&gt;
| 320367&lt;br /&gt;
| 1,00&lt;br /&gt;
| (1,00)&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,75&lt;br /&gt;
|-&lt;br /&gt;
| 334134&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| (0,66)&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,33&lt;br /&gt;
| 0,75&lt;br /&gt;
|-&lt;br /&gt;
| 335240&lt;br /&gt;
| 0,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,75&lt;br /&gt;
|-&lt;br /&gt;
| 290829&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,50&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin:10px 10px 10px 10px; padding:10px;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:left;&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
!#&lt;br /&gt;
!Zagadnienia sprawdzane na kartkówkach&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Manipulacja wierszami i kolumnami macierzy (zmiana kolejności elementów).&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Instrukcje warunkowe oraz rekurencja (silnia).&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| Manipulacja łańcuchami znaków oraz tworzenie prostej struktury (konwersja zapisu czasu).&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| Zaawansowane przekształcenia macierzowe (macierz zawierająca elementy większe od średniej).&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| Proste zagadnienia numeryczne (losowanie liczb spełniających warunek, przeszukiwanie macierzy).&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| Wczytywanie danych z plików tekstowych do struktur.&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| Wczytywanie zapisów EEG (pliki .raw) do struktur.&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| Operacje macierzowe (elementy zawierające się w dwóch macierzach).&lt;br /&gt;
|-&lt;br /&gt;
| 9&lt;br /&gt;
| Wczytywanie danych z plików tekstowych do struktur (ponownie).&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| Operacje macierzowe (iloczyn zewnętrzny).&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wyniki prezentacji==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center; clear:both&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center; float: left;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;11&amp;quot; style=&amp;quot;text-align: center;&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
!Numer indeksu&lt;br /&gt;
!Prezentacja 1&lt;br /&gt;
!Prezentacja 2&lt;br /&gt;
!Projekt&lt;br /&gt;
|-&lt;br /&gt;
| 317905&lt;br /&gt;
| 1,00&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 335252&lt;br /&gt;
| 1,00&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 322929&lt;br /&gt;
| 1,00&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 306766&lt;br /&gt;
| 1,00&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 264493&lt;br /&gt;
| 1,00&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 320367&lt;br /&gt;
| 1,00&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 334134&lt;br /&gt;
| 1,00&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 335240&lt;br /&gt;
| 1,00&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 290829&lt;br /&gt;
| 0,50&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>SuperAdmin</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/Info_2&amp;diff=3783</id>
		<title>Laboratorium EEG/Info 2</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/Info_2&amp;diff=3783"/>
		<updated>2015-06-16T09:54:33Z</updated>

		<summary type="html">&lt;p&gt;SuperAdmin: /* Wyniki kartkówek */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
=Laboratorium EEG - grupa 2 - ćwiczenia=&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ogłoszenia bieżące ==&lt;br /&gt;
&lt;br /&gt;
We wtorek (09.06.15.) studenci będą mieli możliwość poprawienia jednej kartkówki.&lt;br /&gt;
&lt;br /&gt;
Terminy prezentacji wyników pracy:&lt;br /&gt;
* 15.05.2015, sala 4.59, w godzinach 12:00 - 15:00,&lt;br /&gt;
* 12.06.2015, sala 4.59, w godzinach 09:00 - 12:00.&lt;br /&gt;
&lt;br /&gt;
Propozycje ocen:&lt;br /&gt;
* 16.06.2015, sala 4.59, godzina 12:00.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Termin zajęć ==&lt;br /&gt;
Zajęcia odbywają się dwa razy w tygodniu, we wtorki w godzinach 12:15 - 14:45 oraz w piątki, w godzinach 09:30 - 12:00. Sala &amp;lt;b&amp;gt;4.59&amp;lt;/b&amp;gt;, ul. Pasteura 5 - &amp;lt;b&amp;gt;&amp;quot;nowy&amp;quot;&amp;lt;/b&amp;gt; budynek dydaktyczny Wydziału Fizyki UW.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Kontakt z prowadzącym ==&lt;br /&gt;
Zajęcia prowadzi mgr Tomasz Spustek, pokój 4.66, ul. Pasteura 5 - nowy, główny budynek dydaktyczny Wydziału Fizyki UW&lt;br /&gt;
&lt;br /&gt;
Preferowany sposób kontaktu - e-mail: tspus@fuw.edu.pl&lt;br /&gt;
&lt;br /&gt;
Możliwe jest zorganizowanie konsultacji z prowadzącym ćwiczenia, po uprzednim kontakcie e-mailowym.&lt;br /&gt;
&lt;br /&gt;
== Warunki zaliczenia ==&lt;br /&gt;
Ćwiczenia zostaną zaliczone osobom, które spełnią dwa niezwykle proste warunki:&lt;br /&gt;
* Posiadanie maksymalnie dwóch nieusprawiedliwionych nieobecności na ćwiczeniach,&lt;br /&gt;
* Posiadanie sumy punktów z dwóch prezentacji oraz ze wszystkich kartkówek nie mniejszej niż połowa punktów możliwych do zdobycia,&lt;br /&gt;
* Punkty będą przyznawane w sposób uwzględniający nie tylko stan wiedzy, ale także czynione postępy.&lt;br /&gt;
&lt;br /&gt;
* Osobom spełniającym powyższe warunki zaproponowana zostanie pozytywna ocena końcowa z Laboratorium.&lt;br /&gt;
* Osoby nie mające tego szczęścia, otrzymają ocenę negatywną.&lt;br /&gt;
&lt;br /&gt;
* Możliwe będzie poprawienie zaproponowanej oceny na wyższą poprzez zrealizowanie dodatkowego projektu. Jego cel zostanie ustalony indywidualnie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Wyniki kartkówek ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center; clear:both;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;11&amp;quot; style=&amp;quot;text-align: center;&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
!Numer indeksu&lt;br /&gt;
!Zadanie 1&lt;br /&gt;
!Zadanie 2&lt;br /&gt;
!Zadanie 3&lt;br /&gt;
!Zadanie 4&lt;br /&gt;
!Zadanie 5&lt;br /&gt;
!Zadanie 6&lt;br /&gt;
!Zadanie 7&lt;br /&gt;
!Zadanie 8&lt;br /&gt;
!Zadanie 9&lt;br /&gt;
!Zadanie 10&lt;br /&gt;
|-&lt;br /&gt;
| 317905&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
|-&lt;br /&gt;
| 335252&lt;br /&gt;
| 0,00&lt;br /&gt;
| (1,00)&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,33&lt;br /&gt;
|-&lt;br /&gt;
| 322929&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,66&lt;br /&gt;
| (1,00)&lt;br /&gt;
| 1,33&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,33&lt;br /&gt;
|-&lt;br /&gt;
| 306766&lt;br /&gt;
| (1,00)&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
|-&lt;br /&gt;
| 264493&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| (1,00)&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
|-&lt;br /&gt;
| 320367&lt;br /&gt;
| 1,00&lt;br /&gt;
| (1,00)&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
|-&lt;br /&gt;
| 334134&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| (0,66)&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,33&lt;br /&gt;
|-&lt;br /&gt;
| 335240&lt;br /&gt;
| 0,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
|-&lt;br /&gt;
| 290829&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,66&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin:10px 10px 10px 10px; padding:10px;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:left;&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
!#&lt;br /&gt;
!Zagadnienia sprawdzane na kartkówkach&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Manipulacja wierszami i kolumnami macierzy (zmiana kolejności elementów).&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Instrukcje warunkowe oraz rekurencja (silnia).&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| Manipulacja łańcuchami znaków oraz tworzenie prostej struktury (konwersja zapisu czasu).&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| Zaawansowane przekształcenia macierzowe (macierz zawierająca elementy większe od średniej).&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| Proste zagadnienia numeryczne (losowanie liczb spełniających warunek, przeszukiwanie macierzy).&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| Wczytywanie danych z plików tekstowych do struktur.&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| Wczytywanie zapisów EEG (pliki .raw) do struktur.&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| Operacje macierzowe (elementy zawierające się w dwóch macierzach).&lt;br /&gt;
|-&lt;br /&gt;
| 9&lt;br /&gt;
| Wczytywanie danych z plików tekstowych do struktur (ponownie).&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| Operacje macierzowe (iloczyn zewnętrzny).&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wyniki prezentacji==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center; clear:both&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center; float: left;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;11&amp;quot; style=&amp;quot;text-align: center;&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
!Numer indeksu&lt;br /&gt;
!Prezentacja 1&lt;br /&gt;
!Prezentacja 2&lt;br /&gt;
!Projekt&lt;br /&gt;
|-&lt;br /&gt;
| 317905&lt;br /&gt;
| 1,00&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 335252&lt;br /&gt;
| 1,00&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 322929&lt;br /&gt;
| 1,00&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 306766&lt;br /&gt;
| 1,00&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 264493&lt;br /&gt;
| 1,00&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 320367&lt;br /&gt;
| 1,00&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 334134&lt;br /&gt;
| 1,00&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 335240&lt;br /&gt;
| 1,00&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 290829&lt;br /&gt;
| 0,50&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>SuperAdmin</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=TI/Programowanie_dla_Fizyk%C3%B3w_Medycznych/RRZ&amp;diff=3781</id>
		<title>TI/Programowanie dla Fizyków Medycznych/RRZ</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=TI/Programowanie_dla_Fizyk%C3%B3w_Medycznych/RRZ&amp;diff=3781"/>
		<updated>2015-06-12T14:04:35Z</updated>

		<summary type="html">&lt;p&gt;SuperAdmin: /* Metoda Eulera */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
==Równania różniczkowe zwyczajne==&lt;br /&gt;
Zajmiemy się teraz problemem numerycznego rozwiązywania równań różniczkowych zwyczajnych o postaci:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{{Hide in print|This text will not be shown in the print.}}&lt;br /&gt;
{{Only in print|This text will only be shown in the print.}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{dy(t)}{dt}  = f(t,y(t))&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
z warunkeim początkowym&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;y(t_0)=y_0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Zauważmy, że przykładowe równanie różniczkowe drugiego rzędu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{d^2 x(t)}{dt^2}  = \omega(t,x(t))&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
można zapisać jako&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{d}{dt} \binom{x(t)}{x'(t)}  = \binom{x'(t)}{\omega(t,x(t))}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
W analogiczny sposób równanie dowolnego rzędy możemy zapisać jako wektorowe równanie różniczkowe pierwszego rzędu. Wystarczy zatem,  że skupimy się na rozwiązywaniu równań pierwszego  rzędu, Rozwiązaniem postawionego problemu są ciągłe funkcje zmiennej czasowej t. Rozwiązanie numeryczne takiego problemu ogranicza się jednak do znalezienia wartości funkcji y(t) w skończonej liczbie punktów czasowych. W najprostrzym przypadku (do którego się tutaj ograniczymy) zakładamy, że punkty te są od siebie równo oddalone, a odległość między nimi nazywamy krokiem czasowym i tradycyjnie oznaczamy literą h. Zatem rozwiązanie równania na przedziale &amp;lt;math&amp;gt;(t_0,t_k)&amp;lt;/math&amp;gt; sprwadzamy do rozwiązania w sekwencji czasów &amp;lt;math&amp;gt;t_0, t+1=t_0+h,t_2=t_0+2h,...,t_k=Nh&amp;lt;/math&amp;gt;. Poprzez &amp;lt;math&amp;gt;x_n&amp;lt;/math&amp;gt; oznaczać będziemy numeryczne przybliżenie  ścisłego rozwiązania &amp;lt;math&amp;gt;x(t_n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Metoda Eulera==&lt;br /&gt;
Najprostszą metodą numeryczną rozwiązywania równań różniczkowych jest metoda Eulera. Przybliżmy pochodną czasową występującą po lewej stronie równania przez iloraz różnicowy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{d x(t)}{dt}  \approx \frac{x(t+h)-x(t)}{h}&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
przekształcając uzyskujemy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x(t+h)  \approx x(t)+ h \frac{d x(t)}{dt} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
a po podstawieniu rozwiązywanego równania mamy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x(t+h)  \approx x(t)+ h f(t,x(t)) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Możemy to zapisać w postaci dyskretnej&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x_{n+1}  = x_n + h f(t_n,x_n) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Wartość w kolejnej chwili czasu dana jest explicite poprzez wartość w chwili poprzedniej. Metoda ta nazywa się Explicit Euler. Możemy teraz zaimplementować ją w pythonie&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;--&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import pylab as py&lt;br /&gt;
&lt;br /&gt;
#rozwiazujemy rownanie dx(t)/dt=f(t,x)&lt;br /&gt;
&lt;br /&gt;
#metoda Explicit Euler&lt;br /&gt;
#f - funkcja f z rownania&lt;br /&gt;
#x0-wartosc poczatkowa&lt;br /&gt;
#t0-czas poczatkowy&lt;br /&gt;
#tk-czas koncowy&lt;br /&gt;
#h-krok czasowy&lt;br /&gt;
&lt;br /&gt;
def EE(f,x0,t0,tk,h):&lt;br /&gt;
    #generujemy wektor czasow&lt;br /&gt;
    t=np.arange(t0,tk,h)&lt;br /&gt;
&lt;br /&gt;
    #liczba krokow czasowych&lt;br /&gt;
    N=len(t)&lt;br /&gt;
&lt;br /&gt;
    #wektor wynikowy&lt;br /&gt;
    if hasattr(x0, &amp;quot;__len__&amp;quot;): x=np.zeros((N,len(x0))) # gdy mamy do czynienia w równaniem wektorowym&lt;br /&gt;
    else: x=np.zeros(N) #dla przypadku skalarnego&lt;br /&gt;
&lt;br /&gt;
    #wpisujemy wartosc poczatkowa&lt;br /&gt;
    x[0]=np.array(x0)&lt;br /&gt;
    #index&lt;br /&gt;
    i=1&lt;br /&gt;
    #petla glowna&lt;br /&gt;
    while (i&amp;lt;N):&lt;br /&gt;
        x[i]=np.array(x[i-1]+h*f(t[i-1],x[i-1]))&lt;br /&gt;
        i+=1&lt;br /&gt;
    return t,x&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;!--&amp;lt;/source&amp;gt;--&amp;gt;&lt;br /&gt;
Najłatwiej będzie przetestować napisaną metodę na równaniu, którego ścisłe rozwiązanie jest znane. Zacznijmy zatem od równania oscylatora harmonicznego&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def oscylator(t,y):&lt;br /&gt;
    x=y[0]&lt;br /&gt;
    xdot=y[1]&lt;br /&gt;
    return np.array([xdot,-x])&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Rozwiążmy to równanie z warunkiem początkowym [1.0,1.0] i od czasu od 0 do 100.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
t,x=EE(oscylator,[1.0,1.0],0.0,100,0.01)&lt;br /&gt;
py.plot(t,x[:,0])&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
rozwiązanie wygląda wówczas następująco&lt;br /&gt;
&lt;br /&gt;
[[Plik:img01.png]]&lt;br /&gt;
&lt;br /&gt;
Jeżeli zaś wydłużymy czas symulacji do 1000 otrzymamy&lt;br /&gt;
&lt;br /&gt;
[[Plik:img2.png]]&lt;br /&gt;
&lt;br /&gt;
Amplituda oscylacji rośnie wykładniczo i rozwiązanie numeryczne bardzo szybko przestaje mieć cokolwiek wspólnego ze ścisłym rozwiązaniem, którego amplituda jest przecież stała. Metoda Explicit Euler już po kilku krokach czasowych przestaje przypominać ścisłe rozwiązanie. Niestety trudno jest zupełnie wyeliminować to zjawisko, za to możemy użyć metody, która znacznie wolniej będzie się oddalać od ścisłego rozwiązania. Zauważmy, że w metodzie Explicit Euler w każdym kroku czasowym tylko raz liczyliśmy wartość funkcji f. Liczbę wywołań funkcji f w każdym kroku czasowym nazywamy rzędem metody, stąd Explicit Euler jest metodą pierwszego rzędu. Wprowadźmy teraz przykładowe metody rzędu drugiego.&lt;br /&gt;
&lt;br /&gt;
==Metoda Żabiego Skoku==  &lt;br /&gt;
W poprzedniej metodzie liczyliśmy wartość funkcji f w chwili &amp;lt;math&amp;gt;t_n&amp;lt;/math&amp;gt;, która była pochodną po czasie naszego ścisłego rozwiązania. Kolejny punkt &amp;lt;math&amp;gt;x_{n+1}&amp;lt;/math&amp;gt; był liczony z przybliżenia liniowego funkcji  w chwili poprzedniej. Jeżeli faktyczna trajektoria ma niezerową drugą pochodną to takie liniowe przybliżenie zawsze będzie nas oddalało od ścisłego rozwiązania. Dosyć prostym pomysłem na poprawienie zbieżności metody jest tak zwany żabi skok. Policzmy najpierw wartość zmiennej x przesuwając się w czasie o h/2 i policzmy wówczas pochodną, którą oznaczmy przez &amp;lt;math&amp;gt;k_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; k_1=f(t_n,x_n) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; k_2=f(t_n+h/2,x_n+h/2*k_1) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Następnie używamy pochodnej &amp;lt;math&amp;gt; k_2 &amp;lt;/math&amp;gt; zamiast pochodnej &amp;lt;math&amp;gt; k_1 &amp;lt;/math&amp;gt; do obliczenia wartości funkcji w kolejnym kroku czasowym.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x_{n+1}  = x_n + h k_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Przykładowa implementacja tej metody wygląda następująco&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def leapfrog(f,x0,t0,tk,h): &lt;br /&gt;
&lt;br /&gt;
    #generujemy wektor czasow&lt;br /&gt;
    t=np.arange(t0,tk,h)&lt;br /&gt;
&lt;br /&gt;
    #liczba krokow czasowych&lt;br /&gt;
    N=len(t)&lt;br /&gt;
&lt;br /&gt;
    #wektor wynikowy&lt;br /&gt;
    if hasattr(x0, &amp;quot;__len__&amp;quot;): x=np.zeros((N,len(x0)))&lt;br /&gt;
    else: x=np.zeros(N)&lt;br /&gt;
&lt;br /&gt;
    #wpisujemy wartosc poczatkowa&lt;br /&gt;
    x[0]=np.array(x0)&lt;br /&gt;
&lt;br /&gt;
    #index&lt;br /&gt;
    i=1&lt;br /&gt;
&lt;br /&gt;
    #petla glowna&lt;br /&gt;
    while (i&amp;lt;N):&lt;br /&gt;
        k1=f(t[i-1],x[i-1])&lt;br /&gt;
        k2=f(t[i-1]+h*0.5,x[i-1]+0.5*h*k1)&lt;br /&gt;
        x[i]=np.array(x[i-1]+h*k2)&lt;br /&gt;
        i+=1&lt;br /&gt;
    return t,x&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Rozwiązanie równania oscylatora tą metodą dla identycznych jak poprzednio czasów da następujące wyniki&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
t,x=leapfrog(oscylator,[1.0,1.0],0.0,100,0.01)&lt;br /&gt;
py.plot(t,x[:,0])&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Plik:img3.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
t,x=leapfrog(oscylator,[1.0,1.0],0.0,1000,0.01)&lt;br /&gt;
py.plot(t,x[:,0])&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Plik:img4.png]]&lt;br /&gt;
&lt;br /&gt;
==Metoda Heuna==&lt;br /&gt;
Kolejną metodą niewiele różniącą się od poprzedniej jest metoda Heuna. Zdefiniowana jest ona przez równania&lt;br /&gt;
&amp;lt;math&amp;gt; k_1=f(t_n,x_n) &amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; k_2=f(t_n+h/2,x_n+h/2*k_1) &amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x_{n+1}  = x_n + h k_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Implementacja wygląda następująco&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
def Heun(f,x0,t0,tk,h): &lt;br /&gt;
    #generujemy wektor czasow&lt;br /&gt;
    t=np.arange(t0,tk,h)&lt;br /&gt;
    #liczba krokow czasowych&lt;br /&gt;
    N=len(t)&lt;br /&gt;
    #wektor wynikowy&lt;br /&gt;
    if hasattr(x0, &amp;quot;__len__&amp;quot;): x=np.zeros((N,len(x0)))&lt;br /&gt;
    else: x=np.zeros(N)&lt;br /&gt;
    #wpisujemy wartosc poczatkowa&lt;br /&gt;
    x[0]=np.array(x0)&lt;br /&gt;
    #index&lt;br /&gt;
    i=1&lt;br /&gt;
    #petla glowna&lt;br /&gt;
    while (i&amp;lt;N):&lt;br /&gt;
        k1=f(t[i-1],x[i-1])&lt;br /&gt;
        k2=f(t[i-1]+h*0.5,x[i-1]+0.5*h*k1)&lt;br /&gt;
        x[i]=np.array(x[i-1]+h*0.5*(k1+k2))&lt;br /&gt;
        i+=1&lt;br /&gt;
    return t,x&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Runge-Kutta czwartego rzędu==&lt;br /&gt;
Ostatnią metodą, którą omówimy jest najbardziej popularna metoda zwana w skrócie RK4. Metoda ta uznawana jest za kanoniczną i w większości zastosowań dającą najlepsze wyniki. Metody wyższego rzędu nie wnoszą już do wyniku znaczącej poprawy. Jak sugeruje nazwa metody, jej rząd to 4, czyli w każdym kroku czasowym czterokrotnie wywołujemy funkcję f. Metoda ta zdefiniowana jest wzorami&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;    k_1 = f \left( t_n, x_n \right) &amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;    k_2 = f \left( t_n + {h \over 2}, x_n + {1 \over 2} k_1 \right) &amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;    k_3 = f \left( t_n + {h \over 2}, x_n + {1 \over 2} k_2 \right) &amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;    k_4 = f \left( t_n + h, x_n + k_3 \right) &amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;    x_{n+1} = x_n + {h \over 6} (k_1 + 2k_2 + 2k_3 + k_4) &amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
a implementacja wygląda następująco&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def RK4(f,x0,t0,tk,h): &lt;br /&gt;
    #generujemy wektor czasow&lt;br /&gt;
    t=np.arange(t0,tk,h)&lt;br /&gt;
    #liczba krokow czasowych&lt;br /&gt;
    N=len(t)&lt;br /&gt;
    #wektor wynikowy&lt;br /&gt;
    if hasattr(x0, &amp;quot;__len__&amp;quot;): x=np.zeros((N,len(x0)))&lt;br /&gt;
    else: x=np.zeros(N)&lt;br /&gt;
    #wpisujemy wartosc poczatkowa&lt;br /&gt;
    x[0]=np.array(x0)&lt;br /&gt;
    #index&lt;br /&gt;
    i=1&lt;br /&gt;
    #petla glowna&lt;br /&gt;
    while (i&amp;lt;N):&lt;br /&gt;
        k1=h*f(t[i-1],x[i-1])&lt;br /&gt;
        k2=h*f(t[i-1]+h*0.5,x[i-1]+0.5*k1)&lt;br /&gt;
        k3=h*f(t[i-1]+h*0.5,x[i-1]+0.5*k2)&lt;br /&gt;
        k4=h*f(t[i-1]+h,x[i-1]+k3)&lt;br /&gt;
        x[i]=np.array(x[i-1]+(k1+2.0*k2+2.0*k3+k4)/6)&lt;br /&gt;
        i+=1&lt;br /&gt;
    return t,x&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Przykłady==&lt;br /&gt;
===Zadanie - Wahadło matematyczne z tłumieniem i siłą wymuszającą===&lt;br /&gt;
&lt;br /&gt;
Rozwiąż numerycznie metodą RK4 równanie różniczkowe oscylatora harmonicznego z tłumieniem i siłą wymuszającą&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{d^2x}{dt^2} + \Gamma \frac{dx}{dt} + w_0^2 x = f_0 \cos(W t) &amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
przyjmując parametry &amp;lt;math&amp;gt; f_0 =1, w_0=1, \Gamma=0.1, h=0.1 &amp;lt;/math&amp;gt;. Wykreśl zależność amplitudy drgań w funkcji częstości siły wymuszającej W, dla W z przedziału [0.1,3].&lt;br /&gt;
===Rozwiązanie===&lt;br /&gt;
Zacznijmy od sprowadzenia równania drugiego stopnia do równania pierwszego stopnia i zapisania go w postaci funkcji&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def oscylator(t,y):&lt;br /&gt;
    f0=1.0&lt;br /&gt;
    w0=1.0&lt;br /&gt;
    Gamma=0.1&lt;br /&gt;
&lt;br /&gt;
    x=y[0]&lt;br /&gt;
    xdot=y[1]&lt;br /&gt;
    return np.array([xdot,f0*np.cos(oscylator.W*t)-oscylator.Gamma*xdot-w0*w0*x])&lt;br /&gt;
&lt;br /&gt;
oscylator.W=1.0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Nieprzypadkowo parametr W nie jest definiowany w samej funkcji jako zmienna wewnętrzna, ale jako atrybut obiektu jakim jest funkcja. Dzięki takiej konstrukcji łatwo będzie nam zmieniać parametr W, czyli częstość siły wymuszającej. Zobaczmy jak wygląda trajektoria będąca rozwiązaniem tego równania dla warunku początkowego [0,1] i czasu końcowego równego 400.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
py.plot(*RK4(oscylator,[0.0,1.0],0.0,400.0,0.1))&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Plik:oscy1.png]]&lt;br /&gt;
&lt;br /&gt;
Widać, że początkowo układ dochodzi do stanu regularnych oscylacji. W analizie amplitudy interesuje nas jedynie końcowa część więc ograniczymy się do analizy trajektorii od czasu 200 do czasu 400. Napiszmy teraz funkcję, która na podstawie trajektorii wyznaczy nam amplitudę oscylacji&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def amplituda(x):&lt;br /&gt;
    lista=x[2000:,0]&lt;br /&gt;
    return (max(lista)-min(lista))*0.5&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Interesować nas będzie amplituda drgań w funkcji częstość W. Wygenerujmy listę wartości W, dla których będziemy liczyć amplitudę.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
Omegas=np.arange(0.1,3.0,0.05)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Możemy teraz dla każdej z wartości W rozwiązać numerycznie równanie różniczkowe i wyznaczyć odpowiadającą amplitudę oscylacji&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
amp=[amplituda(RK4(oscylator,[0.0,1.0],0.0,400.0,0.1)[1]) for oscylator.W in Omegas]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Wynik końcowy wygląda następująco:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
py.plot(Omegas,amp)&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
[[Plik:oscy2.png]]&lt;br /&gt;
&lt;br /&gt;
Jak można było się domyślić amplituda jest największa gdy częstotliwość wymuszania W pokrywa się z wartością częstotliwości drgań własnych &amp;lt;math&amp;gt; w_0=1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadanie - Układ Lorenza===&lt;br /&gt;
Rozwiąż układ równań różniczkowych Lorenza dany wzorami&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \begin{cases}\dot x=\sigma y-\sigma x\\\dot y=-xz+rx-y\\\dot z=xy-bz\end{cases}, &amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
metodą całkowania Rungego–Kutty drugiego rzędu z α = 2/3, czyli&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k_1 = f(t_n,x_n)&amp;lt;/math&amp;gt; , &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k_2 = f(t_n + \tfrac{2}{3}h, x_n + \tfrac{2}{3}h k_1)&amp;lt;/math&amp;gt; , &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;x_{n+1} = x_n + h \left(\tfrac{1}{4}k_1+\tfrac{3}{4} k_2 \right). &amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Przyjmij sigma=10, b=8/3, r=99.96, krok czasowy h=0.005 i warunki początkowe x=1,y=0,z=0. Wykonaj 8000 kroków czasowych. Układ po pewnym czasie zacznie poruszać się po pewnej periodycznej trajektorii. Wykonaj 3 rysunki TEJ PERIODYCZNEJ TRAJEKTORII (bez okresu dochodzenia do niej) w płaszczyznach (x,y), (y,z) i (z,x). Wypisz na ekranie przedziały wartości jakie przyjmują zmienne x,y i z na periodycznej trajektorii oraz okres trajektorii periodycznej.&lt;br /&gt;
===Rozwiązanie===&lt;br /&gt;
Zacznijmy od implementacji podanej w treści zadania metody całkowania RK2&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import pylab as py&lt;br /&gt;
&lt;br /&gt;
#rozwiazujemy rownanie dx(t)/dt=f(t,x)&lt;br /&gt;
&lt;br /&gt;
#metoda Explicit Euler&lt;br /&gt;
#f - funkcja f z rownania&lt;br /&gt;
#x0-wartosc poczatkowa&lt;br /&gt;
#t0-czas poczatkowy&lt;br /&gt;
#tk-czas koncowy&lt;br /&gt;
#h-krok czasowy&lt;br /&gt;
&lt;br /&gt;
def RK2(f,x0,t0,tk,h): &lt;br /&gt;
&lt;br /&gt;
    #generujemy wektor czasow&lt;br /&gt;
    t=np.arange(t0,tk,h)&lt;br /&gt;
&lt;br /&gt;
    #liczba krokow czasowych&lt;br /&gt;
    N=len(t)&lt;br /&gt;
&lt;br /&gt;
    #wektor wynikowy&lt;br /&gt;
    if hasattr(x0, &amp;quot;__len__&amp;quot;): x=np.zeros((N,len(x0)))&lt;br /&gt;
    else: x=np.zeros(N)&lt;br /&gt;
&lt;br /&gt;
    #wpisujemy wartosc poczatkowa&lt;br /&gt;
    x[0]=np.array(x0)&lt;br /&gt;
&lt;br /&gt;
    #index&lt;br /&gt;
    i=1&lt;br /&gt;
&lt;br /&gt;
    #petla glowna&lt;br /&gt;
    while (i&amp;lt;N):&lt;br /&gt;
        k1=h*f(t[i-1],x[i-1])&lt;br /&gt;
        k2=h*f(t[i-1]+h*2.0/3.0,x[i-1]+k1*2.0/3.0)&lt;br /&gt;
        x[i]=np.array(x[i-1]+0.25*k1+0.75*k2)&lt;br /&gt;
        i+=1&lt;br /&gt;
    return t,x&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Następnie napiszmy funkcję opisującą układ Lorenza&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def Lorenza(t,y):&lt;br /&gt;
    sigma=10.0&lt;br /&gt;
    b=8.0/3&lt;br /&gt;
    r=99.96&lt;br /&gt;
    xx=y[0]&lt;br /&gt;
    yy=y[1]&lt;br /&gt;
    zz=y[2]&lt;br /&gt;
    xdot=sigma*(yy-xx)&lt;br /&gt;
    ydot=-xx*zz+r*xx-yy&lt;br /&gt;
    zdot=xx*yy-b*zz&lt;br /&gt;
    return np.array([xdot,ydot,zdot])&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zobaczmy teraz jak wyglądają trajektorie wszystkich trzech współrzędnych  rozwiązania z zadanymi parametrami&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
t,x=RK2(Lorenza,[1.0,0.0,0.0],0.0,40.0,0.005)&lt;br /&gt;
py.plot(t,x[:,1])&lt;br /&gt;
py.show()&lt;br /&gt;
py.plot(t,x[:,2])&lt;br /&gt;
py.show()&lt;br /&gt;
py.plot(t,x[:,0])&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Plik:lor1.png]]&lt;br /&gt;
&lt;br /&gt;
[[Plik:lor2.png]]&lt;br /&gt;
&lt;br /&gt;
[[Plik:lor3.png]]&lt;br /&gt;
&lt;br /&gt;
Możemy zauważyć, że układ początkowo zachowuje się chaotycznie, a potem dąży do pewnego stanu ustalonego (tzw. atraktora). Cała trajektoria składa się z 8000 punktów, przyjmijmy że powyżej punktu o numerze 2500 mamy już do czynienia tylko z periodyczną trajektorią. Wykreślmy zatem portrety fazowe, o których mowa w treści zadania&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
py.plot(x[2500:,0],x[2500:,1])&lt;br /&gt;
py.show()&lt;br /&gt;
py.plot(x[2500:,1],x[2500:,2])&lt;br /&gt;
py.show()&lt;br /&gt;
py.plot(x[2500:,2],x[2500:,0])&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Plik:lor4.png]]&lt;br /&gt;
&lt;br /&gt;
[[Plik:lor5.png]]&lt;br /&gt;
&lt;br /&gt;
[[Plik:lor6.png]]&lt;br /&gt;
&lt;br /&gt;
Wypisanie zakresów jest już tylko formalnością&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
print 'zmienna x przyjmuje wartosci z zakresu: (',min(x[2500:,0]),',',max(x[2500:,0]),')'&lt;br /&gt;
print 'zmienna y przyjmuje wartosci z zakresu: (',min(x[2500:,1]),',',max(x[2500:,1]),')'&lt;br /&gt;
print 'zmienna z przyjmuje wartosci z zakresu: (',min(x[2500:,2]),',',max(x[2500:,2]),')'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Okres trajektorii periodycznej możemy znaleźć na przykład w ten sposób&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
prog=140&lt;br /&gt;
lista=[]&lt;br /&gt;
for i in range(2500,8000):&lt;br /&gt;
    if (x[i-1,2]&amp;lt;prog) and (x[i,2]&amp;gt;prog): lista.append(i)&lt;br /&gt;
print 'okres to:',np.mean(np.diff(lista)*0.005)&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; okres to: 1.0975&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; zmienna x przyjmuje wartosci z zakresu: ( -33.4431203059 , 25.8037953495 )&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; zmienna y przyjmuje wartosci z zakresu: ( -56.7169238157 , 37.3166709986 )&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; zmienna z przyjmuje wartosci z zakresu: ( 53.4652816712 , 144.264397579 )&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[&amp;quot;Programowanie dla Fizyków Medycznych&amp;quot;]]&lt;/div&gt;</summary>
		<author><name>SuperAdmin</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=TI/Programowanie_dla_Fizyk%C3%B3w_Medycznych/RRZ&amp;diff=3780</id>
		<title>TI/Programowanie dla Fizyków Medycznych/RRZ</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=TI/Programowanie_dla_Fizyk%C3%B3w_Medycznych/RRZ&amp;diff=3780"/>
		<updated>2015-06-12T14:03:23Z</updated>

		<summary type="html">&lt;p&gt;SuperAdmin: /* Metoda Eulera */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
==Równania różniczkowe zwyczajne==&lt;br /&gt;
Zajmiemy się teraz problemem numerycznego rozwiązywania równań różniczkowych zwyczajnych o postaci:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{{Hide in print|This text will not be shown in the print.}}&lt;br /&gt;
{{Only in print|This text will only be shown in the print.}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{dy(t)}{dt}  = f(t,y(t))&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
z warunkeim początkowym&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;y(t_0)=y_0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Zauważmy, że przykładowe równanie różniczkowe drugiego rzędu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{d^2 x(t)}{dt^2}  = \omega(t,x(t))&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
można zapisać jako&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{d}{dt} \binom{x(t)}{x'(t)}  = \binom{x'(t)}{\omega(t,x(t))}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
W analogiczny sposób równanie dowolnego rzędy możemy zapisać jako wektorowe równanie różniczkowe pierwszego rzędu. Wystarczy zatem,  że skupimy się na rozwiązywaniu równań pierwszego  rzędu, Rozwiązaniem postawionego problemu są ciągłe funkcje zmiennej czasowej t. Rozwiązanie numeryczne takiego problemu ogranicza się jednak do znalezienia wartości funkcji y(t) w skończonej liczbie punktów czasowych. W najprostrzym przypadku (do którego się tutaj ograniczymy) zakładamy, że punkty te są od siebie równo oddalone, a odległość między nimi nazywamy krokiem czasowym i tradycyjnie oznaczamy literą h. Zatem rozwiązanie równania na przedziale &amp;lt;math&amp;gt;(t_0,t_k)&amp;lt;/math&amp;gt; sprwadzamy do rozwiązania w sekwencji czasów &amp;lt;math&amp;gt;t_0, t+1=t_0+h,t_2=t_0+2h,...,t_k=Nh&amp;lt;/math&amp;gt;. Poprzez &amp;lt;math&amp;gt;x_n&amp;lt;/math&amp;gt; oznaczać będziemy numeryczne przybliżenie  ścisłego rozwiązania &amp;lt;math&amp;gt;x(t_n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Metoda Eulera==&lt;br /&gt;
Najprostszą metodą numeryczną rozwiązywania równań różniczkowych jest metoda Eulera. Przybliżmy pochodną czasową występującą po lewej stronie równania przez iloraz różnicowy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{d x(t)}{dt}  \approx \frac{x(t+h)-x(t)}{h}&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
przekształcając uzyskujemy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x(t+h)  \approx x(t)+ h \frac{d x(t)}{dt} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
a po podstawieniu rozwiązywanego równania mamy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x(t+h)  \approx x(t)+ h f(t,x(t)) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Możemy to zapisać w postaci dyskretnej&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x_{n+1}  = x_n + h f(t_n,x_n) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Wartość w kolejnej chwili czasu dana jest explicite poprzez wartość w chwili poprzedniej. Metoda ta nazywa się Explicit Euler. Możemy teraz zaimplementować ją w pythonie&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;--&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&amp;lt;br&amp;gt;&lt;br /&gt;
import pylab as py&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
#rozwiazujemy rownanie dx(t)/dt=f(t,x)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
#metoda Explicit Euler&amp;lt;br&amp;gt;&lt;br /&gt;
#f - funkcja f z rownania&amp;lt;br&amp;gt;&lt;br /&gt;
#x0-wartosc poczatkowa&amp;lt;br&amp;gt;&lt;br /&gt;
#t0-czas poczatkowy&amp;lt;br&amp;gt;&lt;br /&gt;
#tk-czas koncowy&amp;lt;br&amp;gt;&lt;br /&gt;
#h-krok czasowy&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
def EE(f,x0,t0,tk,h):&amp;lt;br&amp;gt; &lt;br /&gt;
    #generujemy wektor czasow&amp;lt;br&amp;gt;&lt;br /&gt;
    t=np.arange(t0,tk,h)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
    #liczba krokow czasowych&amp;lt;br&amp;gt;&lt;br /&gt;
    N=len(t)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
    #wektor wynikowy&amp;lt;br&amp;gt;&lt;br /&gt;
    if hasattr(x0, &amp;quot;__len__&amp;quot;): x=np.zeros((N,len(x0))) # gdy mamy do czynienia w równaniem wektorowym&amp;lt;br&amp;gt;&lt;br /&gt;
    else: x=np.zeros(N) #dla przypadku skalarnego&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
    #wpisujemy wartosc poczatkowa&amp;lt;br&amp;gt;&lt;br /&gt;
    x[0]=np.array(x0)&amp;lt;br&amp;gt;&lt;br /&gt;
    #index&amp;lt;br&amp;gt;&lt;br /&gt;
    i=1&amp;lt;br&amp;gt;&lt;br /&gt;
    #petla glowna&amp;lt;br&amp;gt;&lt;br /&gt;
    while (i&amp;lt;N):&amp;lt;br&amp;gt;&lt;br /&gt;
        x[i]=np.array(x[i-1]+h*f(t[i-1],x[i-1]))&amp;lt;br&amp;gt;&lt;br /&gt;
        i+=1&amp;lt;br&amp;gt;&lt;br /&gt;
    return t,x&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;!--&amp;lt;/source&amp;gt;--&amp;gt;&lt;br /&gt;
Najłatwiej będzie przetestować napisaną metodę na równaniu, którego ścisłe rozwiązanie jest znane. Zacznijmy zatem od równania oscylatora harmonicznego&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def oscylator(t,y):&lt;br /&gt;
    x=y[0]&lt;br /&gt;
    xdot=y[1]&lt;br /&gt;
    return np.array([xdot,-x])&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Rozwiążmy to równanie z warunkiem początkowym [1.0,1.0] i od czasu od 0 do 100.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
t,x=EE(oscylator,[1.0,1.0],0.0,100,0.01)&lt;br /&gt;
py.plot(t,x[:,0])&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
rozwiązanie wygląda wówczas następująco&lt;br /&gt;
&lt;br /&gt;
[[Plik:img01.png]]&lt;br /&gt;
&lt;br /&gt;
Jeżeli zaś wydłużymy czas symulacji do 1000 otrzymamy&lt;br /&gt;
&lt;br /&gt;
[[Plik:img2.png]]&lt;br /&gt;
&lt;br /&gt;
Amplituda oscylacji rośnie wykładniczo i rozwiązanie numeryczne bardzo szybko przestaje mieć cokolwiek wspólnego ze ścisłym rozwiązaniem, którego amplituda jest przecież stała. Metoda Explicit Euler już po kilku krokach czasowych przestaje przypominać ścisłe rozwiązanie. Niestety trudno jest zupełnie wyeliminować to zjawisko, za to możemy użyć metody, która znacznie wolniej będzie się oddalać od ścisłego rozwiązania. Zauważmy, że w metodzie Explicit Euler w każdym kroku czasowym tylko raz liczyliśmy wartość funkcji f. Liczbę wywołań funkcji f w każdym kroku czasowym nazywamy rzędem metody, stąd Explicit Euler jest metodą pierwszego rzędu. Wprowadźmy teraz przykładowe metody rzędu drugiego.&lt;br /&gt;
&lt;br /&gt;
==Metoda Żabiego Skoku==  &lt;br /&gt;
W poprzedniej metodzie liczyliśmy wartość funkcji f w chwili &amp;lt;math&amp;gt;t_n&amp;lt;/math&amp;gt;, która była pochodną po czasie naszego ścisłego rozwiązania. Kolejny punkt &amp;lt;math&amp;gt;x_{n+1}&amp;lt;/math&amp;gt; był liczony z przybliżenia liniowego funkcji  w chwili poprzedniej. Jeżeli faktyczna trajektoria ma niezerową drugą pochodną to takie liniowe przybliżenie zawsze będzie nas oddalało od ścisłego rozwiązania. Dosyć prostym pomysłem na poprawienie zbieżności metody jest tak zwany żabi skok. Policzmy najpierw wartość zmiennej x przesuwając się w czasie o h/2 i policzmy wówczas pochodną, którą oznaczmy przez &amp;lt;math&amp;gt;k_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; k_1=f(t_n,x_n) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; k_2=f(t_n+h/2,x_n+h/2*k_1) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Następnie używamy pochodnej &amp;lt;math&amp;gt; k_2 &amp;lt;/math&amp;gt; zamiast pochodnej &amp;lt;math&amp;gt; k_1 &amp;lt;/math&amp;gt; do obliczenia wartości funkcji w kolejnym kroku czasowym.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x_{n+1}  = x_n + h k_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Przykładowa implementacja tej metody wygląda następująco&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def leapfrog(f,x0,t0,tk,h): &lt;br /&gt;
&lt;br /&gt;
    #generujemy wektor czasow&lt;br /&gt;
    t=np.arange(t0,tk,h)&lt;br /&gt;
&lt;br /&gt;
    #liczba krokow czasowych&lt;br /&gt;
    N=len(t)&lt;br /&gt;
&lt;br /&gt;
    #wektor wynikowy&lt;br /&gt;
    if hasattr(x0, &amp;quot;__len__&amp;quot;): x=np.zeros((N,len(x0)))&lt;br /&gt;
    else: x=np.zeros(N)&lt;br /&gt;
&lt;br /&gt;
    #wpisujemy wartosc poczatkowa&lt;br /&gt;
    x[0]=np.array(x0)&lt;br /&gt;
&lt;br /&gt;
    #index&lt;br /&gt;
    i=1&lt;br /&gt;
&lt;br /&gt;
    #petla glowna&lt;br /&gt;
    while (i&amp;lt;N):&lt;br /&gt;
        k1=f(t[i-1],x[i-1])&lt;br /&gt;
        k2=f(t[i-1]+h*0.5,x[i-1]+0.5*h*k1)&lt;br /&gt;
        x[i]=np.array(x[i-1]+h*k2)&lt;br /&gt;
        i+=1&lt;br /&gt;
    return t,x&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Rozwiązanie równania oscylatora tą metodą dla identycznych jak poprzednio czasów da następujące wyniki&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
t,x=leapfrog(oscylator,[1.0,1.0],0.0,100,0.01)&lt;br /&gt;
py.plot(t,x[:,0])&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Plik:img3.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
t,x=leapfrog(oscylator,[1.0,1.0],0.0,1000,0.01)&lt;br /&gt;
py.plot(t,x[:,0])&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Plik:img4.png]]&lt;br /&gt;
&lt;br /&gt;
==Metoda Heuna==&lt;br /&gt;
Kolejną metodą niewiele różniącą się od poprzedniej jest metoda Heuna. Zdefiniowana jest ona przez równania&lt;br /&gt;
&amp;lt;math&amp;gt; k_1=f(t_n,x_n) &amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; k_2=f(t_n+h/2,x_n+h/2*k_1) &amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x_{n+1}  = x_n + h k_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Implementacja wygląda następująco&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
def Heun(f,x0,t0,tk,h): &lt;br /&gt;
    #generujemy wektor czasow&lt;br /&gt;
    t=np.arange(t0,tk,h)&lt;br /&gt;
    #liczba krokow czasowych&lt;br /&gt;
    N=len(t)&lt;br /&gt;
    #wektor wynikowy&lt;br /&gt;
    if hasattr(x0, &amp;quot;__len__&amp;quot;): x=np.zeros((N,len(x0)))&lt;br /&gt;
    else: x=np.zeros(N)&lt;br /&gt;
    #wpisujemy wartosc poczatkowa&lt;br /&gt;
    x[0]=np.array(x0)&lt;br /&gt;
    #index&lt;br /&gt;
    i=1&lt;br /&gt;
    #petla glowna&lt;br /&gt;
    while (i&amp;lt;N):&lt;br /&gt;
        k1=f(t[i-1],x[i-1])&lt;br /&gt;
        k2=f(t[i-1]+h*0.5,x[i-1]+0.5*h*k1)&lt;br /&gt;
        x[i]=np.array(x[i-1]+h*0.5*(k1+k2))&lt;br /&gt;
        i+=1&lt;br /&gt;
    return t,x&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Runge-Kutta czwartego rzędu==&lt;br /&gt;
Ostatnią metodą, którą omówimy jest najbardziej popularna metoda zwana w skrócie RK4. Metoda ta uznawana jest za kanoniczną i w większości zastosowań dającą najlepsze wyniki. Metody wyższego rzędu nie wnoszą już do wyniku znaczącej poprawy. Jak sugeruje nazwa metody, jej rząd to 4, czyli w każdym kroku czasowym czterokrotnie wywołujemy funkcję f. Metoda ta zdefiniowana jest wzorami&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;    k_1 = f \left( t_n, x_n \right) &amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;    k_2 = f \left( t_n + {h \over 2}, x_n + {1 \over 2} k_1 \right) &amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;    k_3 = f \left( t_n + {h \over 2}, x_n + {1 \over 2} k_2 \right) &amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;    k_4 = f \left( t_n + h, x_n + k_3 \right) &amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;    x_{n+1} = x_n + {h \over 6} (k_1 + 2k_2 + 2k_3 + k_4) &amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
a implementacja wygląda następująco&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def RK4(f,x0,t0,tk,h): &lt;br /&gt;
    #generujemy wektor czasow&lt;br /&gt;
    t=np.arange(t0,tk,h)&lt;br /&gt;
    #liczba krokow czasowych&lt;br /&gt;
    N=len(t)&lt;br /&gt;
    #wektor wynikowy&lt;br /&gt;
    if hasattr(x0, &amp;quot;__len__&amp;quot;): x=np.zeros((N,len(x0)))&lt;br /&gt;
    else: x=np.zeros(N)&lt;br /&gt;
    #wpisujemy wartosc poczatkowa&lt;br /&gt;
    x[0]=np.array(x0)&lt;br /&gt;
    #index&lt;br /&gt;
    i=1&lt;br /&gt;
    #petla glowna&lt;br /&gt;
    while (i&amp;lt;N):&lt;br /&gt;
        k1=h*f(t[i-1],x[i-1])&lt;br /&gt;
        k2=h*f(t[i-1]+h*0.5,x[i-1]+0.5*k1)&lt;br /&gt;
        k3=h*f(t[i-1]+h*0.5,x[i-1]+0.5*k2)&lt;br /&gt;
        k4=h*f(t[i-1]+h,x[i-1]+k3)&lt;br /&gt;
        x[i]=np.array(x[i-1]+(k1+2.0*k2+2.0*k3+k4)/6)&lt;br /&gt;
        i+=1&lt;br /&gt;
    return t,x&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Przykłady==&lt;br /&gt;
===Zadanie - Wahadło matematyczne z tłumieniem i siłą wymuszającą===&lt;br /&gt;
&lt;br /&gt;
Rozwiąż numerycznie metodą RK4 równanie różniczkowe oscylatora harmonicznego z tłumieniem i siłą wymuszającą&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{d^2x}{dt^2} + \Gamma \frac{dx}{dt} + w_0^2 x = f_0 \cos(W t) &amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
przyjmując parametry &amp;lt;math&amp;gt; f_0 =1, w_0=1, \Gamma=0.1, h=0.1 &amp;lt;/math&amp;gt;. Wykreśl zależność amplitudy drgań w funkcji częstości siły wymuszającej W, dla W z przedziału [0.1,3].&lt;br /&gt;
===Rozwiązanie===&lt;br /&gt;
Zacznijmy od sprowadzenia równania drugiego stopnia do równania pierwszego stopnia i zapisania go w postaci funkcji&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def oscylator(t,y):&lt;br /&gt;
    f0=1.0&lt;br /&gt;
    w0=1.0&lt;br /&gt;
    Gamma=0.1&lt;br /&gt;
&lt;br /&gt;
    x=y[0]&lt;br /&gt;
    xdot=y[1]&lt;br /&gt;
    return np.array([xdot,f0*np.cos(oscylator.W*t)-oscylator.Gamma*xdot-w0*w0*x])&lt;br /&gt;
&lt;br /&gt;
oscylator.W=1.0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Nieprzypadkowo parametr W nie jest definiowany w samej funkcji jako zmienna wewnętrzna, ale jako atrybut obiektu jakim jest funkcja. Dzięki takiej konstrukcji łatwo będzie nam zmieniać parametr W, czyli częstość siły wymuszającej. Zobaczmy jak wygląda trajektoria będąca rozwiązaniem tego równania dla warunku początkowego [0,1] i czasu końcowego równego 400.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
py.plot(*RK4(oscylator,[0.0,1.0],0.0,400.0,0.1))&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Plik:oscy1.png]]&lt;br /&gt;
&lt;br /&gt;
Widać, że początkowo układ dochodzi do stanu regularnych oscylacji. W analizie amplitudy interesuje nas jedynie końcowa część więc ograniczymy się do analizy trajektorii od czasu 200 do czasu 400. Napiszmy teraz funkcję, która na podstawie trajektorii wyznaczy nam amplitudę oscylacji&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def amplituda(x):&lt;br /&gt;
    lista=x[2000:,0]&lt;br /&gt;
    return (max(lista)-min(lista))*0.5&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Interesować nas będzie amplituda drgań w funkcji częstość W. Wygenerujmy listę wartości W, dla których będziemy liczyć amplitudę.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
Omegas=np.arange(0.1,3.0,0.05)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Możemy teraz dla każdej z wartości W rozwiązać numerycznie równanie różniczkowe i wyznaczyć odpowiadającą amplitudę oscylacji&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
amp=[amplituda(RK4(oscylator,[0.0,1.0],0.0,400.0,0.1)[1]) for oscylator.W in Omegas]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Wynik końcowy wygląda następująco:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
py.plot(Omegas,amp)&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
[[Plik:oscy2.png]]&lt;br /&gt;
&lt;br /&gt;
Jak można było się domyślić amplituda jest największa gdy częstotliwość wymuszania W pokrywa się z wartością częstotliwości drgań własnych &amp;lt;math&amp;gt; w_0=1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadanie - Układ Lorenza===&lt;br /&gt;
Rozwiąż układ równań różniczkowych Lorenza dany wzorami&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \begin{cases}\dot x=\sigma y-\sigma x\\\dot y=-xz+rx-y\\\dot z=xy-bz\end{cases}, &amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
metodą całkowania Rungego–Kutty drugiego rzędu z α = 2/3, czyli&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k_1 = f(t_n,x_n)&amp;lt;/math&amp;gt; , &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k_2 = f(t_n + \tfrac{2}{3}h, x_n + \tfrac{2}{3}h k_1)&amp;lt;/math&amp;gt; , &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;x_{n+1} = x_n + h \left(\tfrac{1}{4}k_1+\tfrac{3}{4} k_2 \right). &amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Przyjmij sigma=10, b=8/3, r=99.96, krok czasowy h=0.005 i warunki początkowe x=1,y=0,z=0. Wykonaj 8000 kroków czasowych. Układ po pewnym czasie zacznie poruszać się po pewnej periodycznej trajektorii. Wykonaj 3 rysunki TEJ PERIODYCZNEJ TRAJEKTORII (bez okresu dochodzenia do niej) w płaszczyznach (x,y), (y,z) i (z,x). Wypisz na ekranie przedziały wartości jakie przyjmują zmienne x,y i z na periodycznej trajektorii oraz okres trajektorii periodycznej.&lt;br /&gt;
===Rozwiązanie===&lt;br /&gt;
Zacznijmy od implementacji podanej w treści zadania metody całkowania RK2&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import pylab as py&lt;br /&gt;
&lt;br /&gt;
#rozwiazujemy rownanie dx(t)/dt=f(t,x)&lt;br /&gt;
&lt;br /&gt;
#metoda Explicit Euler&lt;br /&gt;
#f - funkcja f z rownania&lt;br /&gt;
#x0-wartosc poczatkowa&lt;br /&gt;
#t0-czas poczatkowy&lt;br /&gt;
#tk-czas koncowy&lt;br /&gt;
#h-krok czasowy&lt;br /&gt;
&lt;br /&gt;
def RK2(f,x0,t0,tk,h): &lt;br /&gt;
&lt;br /&gt;
    #generujemy wektor czasow&lt;br /&gt;
    t=np.arange(t0,tk,h)&lt;br /&gt;
&lt;br /&gt;
    #liczba krokow czasowych&lt;br /&gt;
    N=len(t)&lt;br /&gt;
&lt;br /&gt;
    #wektor wynikowy&lt;br /&gt;
    if hasattr(x0, &amp;quot;__len__&amp;quot;): x=np.zeros((N,len(x0)))&lt;br /&gt;
    else: x=np.zeros(N)&lt;br /&gt;
&lt;br /&gt;
    #wpisujemy wartosc poczatkowa&lt;br /&gt;
    x[0]=np.array(x0)&lt;br /&gt;
&lt;br /&gt;
    #index&lt;br /&gt;
    i=1&lt;br /&gt;
&lt;br /&gt;
    #petla glowna&lt;br /&gt;
    while (i&amp;lt;N):&lt;br /&gt;
        k1=h*f(t[i-1],x[i-1])&lt;br /&gt;
        k2=h*f(t[i-1]+h*2.0/3.0,x[i-1]+k1*2.0/3.0)&lt;br /&gt;
        x[i]=np.array(x[i-1]+0.25*k1+0.75*k2)&lt;br /&gt;
        i+=1&lt;br /&gt;
    return t,x&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Następnie napiszmy funkcję opisującą układ Lorenza&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def Lorenza(t,y):&lt;br /&gt;
    sigma=10.0&lt;br /&gt;
    b=8.0/3&lt;br /&gt;
    r=99.96&lt;br /&gt;
    xx=y[0]&lt;br /&gt;
    yy=y[1]&lt;br /&gt;
    zz=y[2]&lt;br /&gt;
    xdot=sigma*(yy-xx)&lt;br /&gt;
    ydot=-xx*zz+r*xx-yy&lt;br /&gt;
    zdot=xx*yy-b*zz&lt;br /&gt;
    return np.array([xdot,ydot,zdot])&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zobaczmy teraz jak wyglądają trajektorie wszystkich trzech współrzędnych  rozwiązania z zadanymi parametrami&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
t,x=RK2(Lorenza,[1.0,0.0,0.0],0.0,40.0,0.005)&lt;br /&gt;
py.plot(t,x[:,1])&lt;br /&gt;
py.show()&lt;br /&gt;
py.plot(t,x[:,2])&lt;br /&gt;
py.show()&lt;br /&gt;
py.plot(t,x[:,0])&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Plik:lor1.png]]&lt;br /&gt;
&lt;br /&gt;
[[Plik:lor2.png]]&lt;br /&gt;
&lt;br /&gt;
[[Plik:lor3.png]]&lt;br /&gt;
&lt;br /&gt;
Możemy zauważyć, że układ początkowo zachowuje się chaotycznie, a potem dąży do pewnego stanu ustalonego (tzw. atraktora). Cała trajektoria składa się z 8000 punktów, przyjmijmy że powyżej punktu o numerze 2500 mamy już do czynienia tylko z periodyczną trajektorią. Wykreślmy zatem portrety fazowe, o których mowa w treści zadania&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
py.plot(x[2500:,0],x[2500:,1])&lt;br /&gt;
py.show()&lt;br /&gt;
py.plot(x[2500:,1],x[2500:,2])&lt;br /&gt;
py.show()&lt;br /&gt;
py.plot(x[2500:,2],x[2500:,0])&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Plik:lor4.png]]&lt;br /&gt;
&lt;br /&gt;
[[Plik:lor5.png]]&lt;br /&gt;
&lt;br /&gt;
[[Plik:lor6.png]]&lt;br /&gt;
&lt;br /&gt;
Wypisanie zakresów jest już tylko formalnością&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
print 'zmienna x przyjmuje wartosci z zakresu: (',min(x[2500:,0]),',',max(x[2500:,0]),')'&lt;br /&gt;
print 'zmienna y przyjmuje wartosci z zakresu: (',min(x[2500:,1]),',',max(x[2500:,1]),')'&lt;br /&gt;
print 'zmienna z przyjmuje wartosci z zakresu: (',min(x[2500:,2]),',',max(x[2500:,2]),')'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Okres trajektorii periodycznej możemy znaleźć na przykład w ten sposób&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
prog=140&lt;br /&gt;
lista=[]&lt;br /&gt;
for i in range(2500,8000):&lt;br /&gt;
    if (x[i-1,2]&amp;lt;prog) and (x[i,2]&amp;gt;prog): lista.append(i)&lt;br /&gt;
print 'okres to:',np.mean(np.diff(lista)*0.005)&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; okres to: 1.0975&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; zmienna x przyjmuje wartosci z zakresu: ( -33.4431203059 , 25.8037953495 )&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; zmienna y przyjmuje wartosci z zakresu: ( -56.7169238157 , 37.3166709986 )&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; zmienna z przyjmuje wartosci z zakresu: ( 53.4652816712 , 144.264397579 )&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[&amp;quot;Programowanie dla Fizyków Medycznych&amp;quot;]]&lt;/div&gt;</summary>
		<author><name>SuperAdmin</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=MediaWiki:Common.css&amp;diff=3779</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=MediaWiki:Common.css&amp;diff=3779"/>
		<updated>2015-06-12T12:56:57Z</updated>

		<summary type="html">&lt;p&gt;SuperAdmin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Umieszczony tutaj kod CSS zostanie zastosowany we wszystkich skórkach */&lt;br /&gt;
&lt;br /&gt;
/* &amp;lt;nowiki&amp;gt; Common CSS for all skins - copy to your user CSS to change */&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
* Hide text in the onlyinprint class. Is used for the collection extension&lt;br /&gt;
*/&lt;br /&gt;
.onlyinprint {display: none}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
div.mw-geshi {&lt;br /&gt;
  padding: 1em; &lt;br /&gt;
  margin: 1em 0;&lt;br /&gt;
  margin-left: 5em; &lt;br /&gt;
  margin-right: 5em;&lt;br /&gt;
  border: 1px dashed #2f6fab;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Default styling for HTML elements */&lt;br /&gt;
dfn {&lt;br /&gt;
    font-style: inherit;  /* Reset default styling for &amp;lt;dfn&amp;gt; */&lt;br /&gt;
}&lt;br /&gt;
q {&lt;br /&gt;
    quotes: '&amp;quot;' '&amp;quot;' &amp;quot;'&amp;quot; &amp;quot;'&amp;quot;;  /* Straight quote marks for &amp;lt;q&amp;gt; */&lt;br /&gt;
}&lt;br /&gt;
tt {&lt;br /&gt;
   background-color: #F0F0F0;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
tt.shell {&lt;br /&gt;
   background-color: #F0FFF0;&lt;br /&gt;
}&lt;br /&gt;
blockquote {&lt;br /&gt;
	overflow: hidden;  /* Avoid collision of background with floating elements */&lt;br /&gt;
}&lt;br /&gt;
strong.selflink {&lt;br /&gt;
    font-weight: 700;  /* Prevent the 'double bold' bug in Firefox when using DirectWrite */&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Main page fixes */&lt;br /&gt;
#interwiki-completelist {&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
body.page-Main_Page #ca-delete {&lt;br /&gt;
    display: none !important;&lt;br /&gt;
}&lt;br /&gt;
body.page-Main_Page #mp-topbanner {&lt;br /&gt;
    clear: both;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Edit window toolbar */&lt;br /&gt;
#toolbar {&lt;br /&gt;
    height: 22px;&lt;br /&gt;
    margin-bottom: 6px;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* WikiEditor CSS for #wpTextbox1 is not loaded on .css/.js pages, so load here. [[phab:T97299]] */&lt;br /&gt;
.wikiEditor-ui-text #wpTextbox1 {&lt;br /&gt;
    line-height: 1.5em;&lt;br /&gt;
    resize: vertical;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Hide charinsert base for those not using the gadget */&lt;br /&gt;
#editpage-specialchars {&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Highlight data points in the info action if specified in the URL */&lt;br /&gt;
body.action-info :target {&lt;br /&gt;
    background: #DEF;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Make the list of references smaller */&lt;br /&gt;
ol.references,&lt;br /&gt;
div.reflist,&lt;br /&gt;
div.refbegin {&lt;br /&gt;
    font-size: 90%;            /* Default font-size */&lt;br /&gt;
    margin-bottom: 0.5em;&lt;br /&gt;
}&lt;br /&gt;
div.refbegin-100 {&lt;br /&gt;
    font-size: 100%;           /* Option for normal fontsize in {{refbegin}} */&lt;br /&gt;
}&lt;br /&gt;
div.reflist ol.references {&lt;br /&gt;
    font-size: 100%;           /* Reset font-size when nested in div.reflist */&lt;br /&gt;
    list-style-type: inherit;  /* Enable custom list style types */&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Highlight clicked reference in blue to help navigation */&lt;br /&gt;
span.citation:target {&lt;br /&gt;
    background-color: #DEF;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Ensure refs in table headers and the like aren't bold or italic */&lt;br /&gt;
sup.reference {&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
    font-style: normal;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Allow hidden ref errors to be shown by user CSS */&lt;br /&gt;
span.brokenref {&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Styling for citations (CSS3). Breaks long urls, etc., rather than overflowing box */&lt;br /&gt;
.citation {&lt;br /&gt;
    word-wrap: break-word;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* For linked citation numbers and document IDs, where&lt;br /&gt;
   the number need not be shown on a screen or a handheld,&lt;br /&gt;
   but should be included in the printed version */&lt;br /&gt;
@media screen, handheld {&lt;br /&gt;
    .citation .printonly {&lt;br /&gt;
        display: none;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Reset top margin for lists embedded in columns */&lt;br /&gt;
div.columns {&lt;br /&gt;
    margin-top: 0.3em;&lt;br /&gt;
}&lt;br /&gt;
div.columns dl,&lt;br /&gt;
div.columns ol,&lt;br /&gt;
div.columns ul {&lt;br /&gt;
    margin-top: 0;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Avoid elements from breaking between columns */&lt;br /&gt;
.nocolbreak,&lt;br /&gt;
div.columns li,&lt;br /&gt;
div.columns dd dd {&lt;br /&gt;
    -webkit-column-break-inside: avoid;&lt;br /&gt;
    page-break-inside: avoid;&lt;br /&gt;
    break-inside: avoid-column;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Style for [[Template:Flowlist]] that Lets lists flow around floating objecs */&lt;br /&gt;
.flowlist ul {&lt;br /&gt;
    overflow-x: hidden;&lt;br /&gt;
    margin-left: 0;&lt;br /&gt;
    padding-left: 1.6em;&lt;br /&gt;
}&lt;br /&gt;
.flowlist ol {&lt;br /&gt;
    overflow-x: hidden;&lt;br /&gt;
    margin-left: 0;&lt;br /&gt;
    padding-left: 3.2em;&lt;br /&gt;
}&lt;br /&gt;
.flowlist dl {&lt;br /&gt;
    overflow-x: hidden;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Style for horizontal lists (separator following item).&lt;br /&gt;
   IE8-specific classes are assigned in [[MediaWiki:Common.js/IEFixes.js]].&lt;br /&gt;
   @source mediawiki.org/wiki/Snippets/Horizontal_lists&lt;br /&gt;
   @revision 6 (2014-05-09)&lt;br /&gt;
   @author [[User:Edokter]]&lt;br /&gt;
 */&lt;br /&gt;
.hlist dl,&lt;br /&gt;
.hlist ol,&lt;br /&gt;
.hlist ul {&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
}&lt;br /&gt;
/* Display list items inline */&lt;br /&gt;
.hlist dd,&lt;br /&gt;
.hlist dt,&lt;br /&gt;
.hlist li {&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    display: inline;&lt;br /&gt;
}&lt;br /&gt;
/* Display nested lists inline */&lt;br /&gt;
.hlist.inline,&lt;br /&gt;
.hlist.inline dl,&lt;br /&gt;
.hlist.inline ol,&lt;br /&gt;
.hlist.inline ul,&lt;br /&gt;
.hlist dl dl, .hlist dl ol, .hlist dl ul,&lt;br /&gt;
.hlist ol dl, .hlist ol ol, .hlist ol ul,&lt;br /&gt;
.hlist ul dl, .hlist ul ol, .hlist ul ul {&lt;br /&gt;
    display: inline;&lt;br /&gt;
}&lt;br /&gt;
/* Generate interpuncts */&lt;br /&gt;
.hlist dt:after {&lt;br /&gt;
    content: &amp;quot;: &amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
.hlist dd:after,&lt;br /&gt;
.hlist li:after {&lt;br /&gt;
    content: &amp;quot; · &amp;quot;;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
.hlist dd:last-child:after,&lt;br /&gt;
.hlist dt:last-child:after,&lt;br /&gt;
.hlist li:last-child:after {&lt;br /&gt;
    content: none;&lt;br /&gt;
}&lt;br /&gt;
/* For IE8 */&lt;br /&gt;
.hlist dd.hlist-last-child:after,&lt;br /&gt;
.hlist dt.hlist-last-child:after,&lt;br /&gt;
.hlist li.hlist-last-child:after {&lt;br /&gt;
    content: none;&lt;br /&gt;
}&lt;br /&gt;
/* Add parentheses around nested lists */&lt;br /&gt;
.hlist dd dd:first-child:before, .hlist dd dt:first-child:before, .hlist dd li:first-child:before,&lt;br /&gt;
.hlist dt dd:first-child:before, .hlist dt dt:first-child:before, .hlist dt li:first-child:before,&lt;br /&gt;
.hlist li dd:first-child:before, .hlist li dt:first-child:before, .hlist li li:first-child:before {&lt;br /&gt;
    content: &amp;quot; (&amp;quot;;&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
}&lt;br /&gt;
.hlist dd dd:last-child:after, .hlist dd dt:last-child:after, .hlist dd li:last-child:after,&lt;br /&gt;
.hlist dt dd:last-child:after, .hlist dt dt:last-child:after, .hlist dt li:last-child:after,&lt;br /&gt;
.hlist li dd:last-child:after, .hlist li dt:last-child:after, .hlist li li:last-child:after {&lt;br /&gt;
    content: &amp;quot;) &amp;quot;;&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
}&lt;br /&gt;
/* For IE8 */&lt;br /&gt;
.hlist dd dd.hlist-last-child:after, .hlist dd dt.hlist-last-child:after, .hlist dd li.hlist-last-child:after,&lt;br /&gt;
.hlist dt dd.hlist-last-child:after, .hlist dt dt.hlist-last-child:after, .hlist dt li.hlist-last-child:after,&lt;br /&gt;
.hlist li dd.hlist-last-child:after, .hlist li dt.hlist-last-child:after, .hlist li li.hlist-last-child:after {&lt;br /&gt;
    content: &amp;quot;) &amp;quot;;&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
}&lt;br /&gt;
/* Put ordinals in front of ordered list items */&lt;br /&gt;
.hlist ol {&lt;br /&gt;
    counter-reset: listitem;&lt;br /&gt;
}&lt;br /&gt;
.hlist ol &amp;gt; li {&lt;br /&gt;
    counter-increment: listitem;&lt;br /&gt;
}&lt;br /&gt;
.hlist ol &amp;gt; li:before {&lt;br /&gt;
    content: &amp;quot; &amp;quot; counter(listitem) &amp;quot; &amp;quot;;&lt;br /&gt;
    white-space: nowrap;&lt;br /&gt;
}&lt;br /&gt;
.hlist dd ol &amp;gt; li:first-child:before,&lt;br /&gt;
.hlist dt ol &amp;gt; li:first-child:before,&lt;br /&gt;
.hlist li ol &amp;gt; li:first-child:before {&lt;br /&gt;
    content: &amp;quot; (&amp;quot; counter(listitem) &amp;quot; &amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Unbulleted lists */&lt;br /&gt;
.plainlist ol,&lt;br /&gt;
.plainlist ul {&lt;br /&gt;
    line-height: inherit;&lt;br /&gt;
    list-style: none none;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
}&lt;br /&gt;
.plainlist ol li,&lt;br /&gt;
.plainlist ul li {&lt;br /&gt;
    margin-bottom: 0;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Default style for navigation boxes */&lt;br /&gt;
.navbox {                     /* Navbox container style */&lt;br /&gt;
    border: 1px solid #aaa;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    margin: auto;&lt;br /&gt;
    clear: both;&lt;br /&gt;
    font-size: 88%;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    padding: 1px;&lt;br /&gt;
}&lt;br /&gt;
.navbox-inner,&lt;br /&gt;
.navbox-subgroup {&lt;br /&gt;
    width: 100%;&lt;br /&gt;
}&lt;br /&gt;
.navbox-group,&lt;br /&gt;
.navbox-title,&lt;br /&gt;
.navbox-abovebelow {&lt;br /&gt;
    padding: 0.25em 1em;      /* Title, group and above/below styles */&lt;br /&gt;
    line-height: 1.5em;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
}&lt;br /&gt;
th.navbox-group {             /* Group style */&lt;br /&gt;
    white-space: nowrap;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    text-align: right;&lt;br /&gt;
}&lt;br /&gt;
.navbox,&lt;br /&gt;
.navbox-subgroup {&lt;br /&gt;
    background: #fdfdfd;      /* Background color */&lt;br /&gt;
}&lt;br /&gt;
.navbox-list {&lt;br /&gt;
    line-height: 1.8em;&lt;br /&gt;
    border-color: #fdfdfd;    /* Must match background color */&lt;br /&gt;
}&lt;br /&gt;
.navbox th,&lt;br /&gt;
.navbox-title {&lt;br /&gt;
    background: #ccccff;      /* Level 1 color */&lt;br /&gt;
}&lt;br /&gt;
.navbox-abovebelow,&lt;br /&gt;
th.navbox-group,&lt;br /&gt;
.navbox-subgroup .navbox-title {&lt;br /&gt;
    background: #ddddff;      /* Level 2 color */&lt;br /&gt;
}&lt;br /&gt;
.navbox-subgroup .navbox-group,&lt;br /&gt;
.navbox-subgroup .navbox-abovebelow {&lt;br /&gt;
    background: #e6e6ff;      /* Level 3 color */&lt;br /&gt;
}&lt;br /&gt;
.navbox-even {&lt;br /&gt;
    background: #f7f7f7;      /* Even row striping */&lt;br /&gt;
}&lt;br /&gt;
.navbox-odd {&lt;br /&gt;
    background: transparent;  /* Odd row striping */&lt;br /&gt;
}&lt;br /&gt;
table.navbox + table.navbox {  /* Single pixel border between adjacent navboxes */&lt;br /&gt;
    margin-top: -1px;          /* (doesn't work for IE6, but that's okay)       */&lt;br /&gt;
}&lt;br /&gt;
.navbox .hlist td dl,&lt;br /&gt;
.navbox .hlist td ol,&lt;br /&gt;
.navbox .hlist td ul,&lt;br /&gt;
.navbox td.hlist dl,&lt;br /&gt;
.navbox td.hlist ol,&lt;br /&gt;
.navbox td.hlist ul {&lt;br /&gt;
    padding: 0.125em 0;       /* Adjust hlist padding in navboxes */&lt;br /&gt;
}&lt;br /&gt;
ol + table.navbox,&lt;br /&gt;
ul + table.navbox {&lt;br /&gt;
    margin-top: 1em;        /* Prevent lists from clinging to navboxes */&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Default styling for Navbar template */&lt;br /&gt;
.navbar {&lt;br /&gt;
    display: inline;&lt;br /&gt;
    font-size: 88%;&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
}&lt;br /&gt;
.navbar ul {&lt;br /&gt;
    display: inline;&lt;br /&gt;
    white-space: nowrap;&lt;br /&gt;
}&lt;br /&gt;
.mw-body-content .navbar ul {&lt;br /&gt;
    line-height: inherit;&lt;br /&gt;
}&lt;br /&gt;
.navbar li {&lt;br /&gt;
    word-spacing: -0.125em;&lt;br /&gt;
}&lt;br /&gt;
.navbar.mini li span {&lt;br /&gt;
  font-variant: small-caps;&lt;br /&gt;
}&lt;br /&gt;
/* Navbar styling when nested in infobox and navbox */&lt;br /&gt;
.infobox .navbar {&lt;br /&gt;
    font-size: 100%;&lt;br /&gt;
}&lt;br /&gt;
.navbox .navbar {&lt;br /&gt;
    display: block;&lt;br /&gt;
    font-size: 100%;&lt;br /&gt;
}&lt;br /&gt;
.navbox-title .navbar {&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    float: left;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    text-align: left;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    margin-right: 0.5em;&lt;br /&gt;
    width: 6em;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* 'show'/'hide' buttons created dynamically by the CollapsibleTables javascript&lt;br /&gt;
   in [[MediaWiki:Common.js]] are styled here so they can be customised. */&lt;br /&gt;
.collapseButton {&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    float: right;&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    margin-left: 0.5em;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    text-align: right;&lt;br /&gt;
    width: auto;&lt;br /&gt;
}&lt;br /&gt;
/* In navboxes, the show/hide button balances the v·d·e links&lt;br /&gt;
   from [[Template:Navbar]], so they need to be the same width. */&lt;br /&gt;
.navbox .collapseButton {&lt;br /&gt;
    width: 6em;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Styling for JQuery makeCollapsible, matching that of collapseButton */&lt;br /&gt;
.mw-collapsible-toggle {&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    text-align: right;&lt;br /&gt;
}&lt;br /&gt;
.navbox .mw-collapsible-toggle {&lt;br /&gt;
    width: 6em;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Infobox template style */&lt;br /&gt;
.infobox {&lt;br /&gt;
    border: 1px solid #aaa;&lt;br /&gt;
    border-spacing: 3px;&lt;br /&gt;
    background-color: #f9f9f9;&lt;br /&gt;
    color: black;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    margin: 0.5em 0 0.5em 1em;&lt;br /&gt;
    padding: 0.2em;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    float: right;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    clear: right;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    text-align: left;&lt;br /&gt;
    font-size: 88%;&lt;br /&gt;
    line-height: 1.5em;&lt;br /&gt;
}&lt;br /&gt;
.infobox caption {&lt;br /&gt;
    font-size: 125%;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    padding: 0.2em;&lt;br /&gt;
}&lt;br /&gt;
.infobox td,&lt;br /&gt;
.infobox th {&lt;br /&gt;
    vertical-align: top;&lt;br /&gt;
}&lt;br /&gt;
.infobox.bordered {&lt;br /&gt;
    border-collapse: collapse;&lt;br /&gt;
}&lt;br /&gt;
.infobox.bordered td,&lt;br /&gt;
.infobox.bordered th {&lt;br /&gt;
    border: 1px solid #aaa;&lt;br /&gt;
}&lt;br /&gt;
.infobox.bordered .borderless td,&lt;br /&gt;
.infobox.bordered .borderless th {&lt;br /&gt;
    border: 0;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
.infobox.sisterproject {&lt;br /&gt;
    width: 20em;&lt;br /&gt;
    font-size: 90%;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
.infobox.standard-talk {&lt;br /&gt;
    border: 1px solid #c0c090;&lt;br /&gt;
    background-color: #f8eaba;&lt;br /&gt;
}&lt;br /&gt;
.infobox.standard-talk.bordered td,&lt;br /&gt;
.infobox.standard-talk.bordered th {&lt;br /&gt;
    border: 1px solid #c0c090;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* styles for bordered infobox with merged rows */&lt;br /&gt;
.infobox.bordered .mergedtoprow td,&lt;br /&gt;
.infobox.bordered .mergedtoprow th {&lt;br /&gt;
    border: 0;&lt;br /&gt;
    border-top: 1px solid #aaa;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    border-right: 1px solid #aaa;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
.infobox.bordered .mergedrow td,&lt;br /&gt;
.infobox.bordered .mergedrow th {&lt;br /&gt;
    border: 0;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    border-right: 1px solid #aaa;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Styles for geography infoboxes, eg countries,&lt;br /&gt;
   country subdivisions, cities, etc.            */&lt;br /&gt;
.infobox.geography {&lt;br /&gt;
    border-collapse: collapse;&lt;br /&gt;
    line-height: 1.2em;&lt;br /&gt;
    font-size: 90%;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
.infobox.geography  td,&lt;br /&gt;
.infobox.geography  th {&lt;br /&gt;
    border-top: 1px solid #aaa;&lt;br /&gt;
    padding: 0.4em 0.6em 0.4em 0.6em;&lt;br /&gt;
}&lt;br /&gt;
.infobox.geography .mergedtoprow td,&lt;br /&gt;
.infobox.geography .mergedtoprow th {&lt;br /&gt;
    border-top: 1px solid #aaa;&lt;br /&gt;
    padding: 0.4em 0.6em 0.2em 0.6em;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
.infobox.geography .mergedrow td,&lt;br /&gt;
.infobox.geography .mergedrow th {&lt;br /&gt;
    border: 0;&lt;br /&gt;
    padding: 0 0.6em 0.2em 0.6em;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
.infobox.geography .mergedbottomrow td,&lt;br /&gt;
.infobox.geography .mergedbottomrow th {&lt;br /&gt;
    border-top: 0;&lt;br /&gt;
    border-bottom: 1px solid #aaa;&lt;br /&gt;
    padding: 0 0.6em 0.4em 0.6em;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
.infobox.geography .maptable td,&lt;br /&gt;
.infobox.geography .maptable th {&lt;br /&gt;
    border: 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*******************************/&lt;br /&gt;
/* wikitable/prettytable class */&lt;br /&gt;
/*******************************/&lt;br /&gt;
 &lt;br /&gt;
/* wikitable/prettytable class for skinning normal tables,&lt;br /&gt;
   but don't skin tables within tables by accident */&lt;br /&gt;
&lt;br /&gt;
table.wikitable, table.prettytable { margin:1em 0em; background:#f9f9f9; border:1px #aaaaaa solid; border-collapse:collapse; }&lt;br /&gt;
table.wikitable&amp;gt;*&amp;gt;tr&amp;gt;th,&lt;br /&gt;
table.wikitable&amp;gt;*&amp;gt;tr&amp;gt;td,&lt;br /&gt;
table.wikitable&amp;gt;tr&amp;gt;th,&lt;br /&gt;
table.wikitable&amp;gt;tr&amp;gt;td,&lt;br /&gt;
table.prettytable&amp;gt;*&amp;gt;tr&amp;gt;th,&lt;br /&gt;
table.prettytable&amp;gt;*&amp;gt;tr&amp;gt;td,&lt;br /&gt;
table.prettytable&amp;gt;tr&amp;gt;th,&lt;br /&gt;
table.prettytable&amp;gt;tr&amp;gt;td&lt;br /&gt;
{&lt;br /&gt;
  border: 1px #aaaaaa solid;&lt;br /&gt;
  padding: 0.2em;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 table.wikitable&amp;gt;*&amp;gt;tr&amp;gt;th,&lt;br /&gt;
 table.wikitable&amp;gt;tr&amp;gt;th,&lt;br /&gt;
 table.prettytable&amp;gt;*&amp;gt;tr&amp;gt;th,&lt;br /&gt;
 table.prettytable&amp;gt;tr&amp;gt;th&lt;br /&gt;
 {&lt;br /&gt;
   background: #ccccff;&lt;br /&gt;
   text-align: center;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 table.wikitable caption, table.prettytable caption { margin-left:inherit; margin-right:inherit; }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
/* Normal font styling for table row headers with scope=&amp;quot;row&amp;quot; tag */&lt;br /&gt;
.wikitable.plainrowheaders th[scope=row] {&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    text-align: left;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Lists in data cells are always left-aligned */&lt;br /&gt;
.wikitable td ul,&lt;br /&gt;
.wikitable td ol,&lt;br /&gt;
.wikitable td dl {&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    text-align: left;&lt;br /&gt;
}&lt;br /&gt;
/* ...unless they also use the hlist class */&lt;br /&gt;
.toc.hlist ul,&lt;br /&gt;
#toc.hlist ul,&lt;br /&gt;
.wikitable.hlist td ul,&lt;br /&gt;
.wikitable.hlist td ol,&lt;br /&gt;
.wikitable.hlist td dl {&lt;br /&gt;
    text-align: inherit;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Icons for medialist templates [[Template:Listen]],&lt;br /&gt;
   [[Template:Multi-listen_start]], [[Template:Video]],&lt;br /&gt;
   [[Template:Multi-video_start]] */&lt;br /&gt;
div.listenlist {&lt;br /&gt;
    background: url(&amp;quot;//upload.wikimedia.org/wikipedia/commons/4/47/Sound-icon.svg&amp;quot;) no-repeat scroll 0 0 transparent;&lt;br /&gt;
    background-size: 30px;&lt;br /&gt;
    padding-left: 40px;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Fix for hieroglyphs specificality issue in infoboxes ([[Phabricator:43869]]) */&lt;br /&gt;
table.mw-hiero-table td {&lt;br /&gt;
    vertical-align: middle;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Style rules for media list templates */&lt;br /&gt;
div.medialist {&lt;br /&gt;
    min-height: 50px;&lt;br /&gt;
    margin: 1em;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    background-position: top left;&lt;br /&gt;
    background-repeat: no-repeat;&lt;br /&gt;
}&lt;br /&gt;
div.medialist ul {&lt;br /&gt;
    list-style-type: none;&lt;br /&gt;
    list-style-image: none;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
}&lt;br /&gt;
div.medialist ul li {&lt;br /&gt;
    padding-bottom: 0.5em;&lt;br /&gt;
}&lt;br /&gt;
div.medialist ul li li {&lt;br /&gt;
    font-size: 91%;&lt;br /&gt;
    padding-bottom: 0;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Change the external link icon to an Adobe icon for all PDF files&lt;br /&gt;
   in browsers that support these CSS selectors, like Mozilla and Opera */&lt;br /&gt;
div#content a[href$=&amp;quot;.pdf&amp;quot;].external,&lt;br /&gt;
div#content a[href*=&amp;quot;.pdf?&amp;quot;].external,&lt;br /&gt;
div#content a[href*=&amp;quot;.pdf#&amp;quot;].external,&lt;br /&gt;
div#content a[href$=&amp;quot;.PDF&amp;quot;].external,&lt;br /&gt;
div#content a[href*=&amp;quot;.PDF?&amp;quot;].external,&lt;br /&gt;
div#content a[href*=&amp;quot;.PDF#&amp;quot;].external,&lt;br /&gt;
div#mw_content a[href$=&amp;quot;.pdf&amp;quot;].external,&lt;br /&gt;
div#mw_content a[href*=&amp;quot;.pdf?&amp;quot;].external,&lt;br /&gt;
div#mw_content a[href*=&amp;quot;.pdf#&amp;quot;].external,&lt;br /&gt;
div#mw_content a[href$=&amp;quot;.PDF&amp;quot;].external,&lt;br /&gt;
div#mw_content a[href*=&amp;quot;.PDF?&amp;quot;].external,&lt;br /&gt;
div#mw_content a[href*=&amp;quot;.PDF#&amp;quot;].external {&lt;br /&gt;
    background: url(&amp;quot;//upload.wikimedia.org/wikipedia/commons/2/23/Icons-mini-file_acrobat.gif&amp;quot;) no-repeat right;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    padding-right: 18px;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Change the external link icon to an Adobe icon anywhere the PDFlink class&lt;br /&gt;
   is used (notably Template:PDFlink). This works in IE, unlike the above. */&lt;br /&gt;
div#content span.PDFlink a,&lt;br /&gt;
div#mw_content span.PDFlink a {&lt;br /&gt;
    background: url(&amp;quot;//upload.wikimedia.org/wikipedia/commons/2/23/Icons-mini-file_acrobat.gif&amp;quot;) no-repeat right;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    padding-right: 18px;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Content in columns with CSS instead of tables ([[Template:Columns]]) */&lt;br /&gt;
div.columns-2 div.column {&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    float: left;&lt;br /&gt;
    width: 50%;&lt;br /&gt;
    min-width: 300px;&lt;br /&gt;
}&lt;br /&gt;
div.columns-3 div.column {&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    float: left;&lt;br /&gt;
    width: 33.3%;&lt;br /&gt;
    min-width: 200px;&lt;br /&gt;
}&lt;br /&gt;
div.columns-4 div.column {&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    float: left;&lt;br /&gt;
    width: 25%;&lt;br /&gt;
    min-width: 150px;&lt;br /&gt;
}&lt;br /&gt;
div.columns-5 div.column {&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    float: left;&lt;br /&gt;
    width: 20%;&lt;br /&gt;
    min-width: 120px;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Messagebox templates */&lt;br /&gt;
.messagebox {&lt;br /&gt;
    border: 1px solid #aaa;&lt;br /&gt;
    background-color: #f9f9f9;&lt;br /&gt;
    width: 80%;&lt;br /&gt;
    margin: 0 auto 1em auto;&lt;br /&gt;
    padding: .2em;&lt;br /&gt;
}&lt;br /&gt;
.messagebox.merge {&lt;br /&gt;
    border: 1px solid #c0b8cc;&lt;br /&gt;
    background-color: #f0e5ff;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
}&lt;br /&gt;
.messagebox.cleanup {&lt;br /&gt;
    border: 1px solid #9f9fff;&lt;br /&gt;
    background-color: #efefff;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
}&lt;br /&gt;
.messagebox.standard-talk {&lt;br /&gt;
    border: 1px solid #c0c090;&lt;br /&gt;
    background-color: #f8eaba;&lt;br /&gt;
    margin: 4px auto;&lt;br /&gt;
}&lt;br /&gt;
/* For old WikiProject banners inside banner shells. */&lt;br /&gt;
.mbox-inside .standard-talk,&lt;br /&gt;
.messagebox.nested-talk {&lt;br /&gt;
    border: 1px solid #c0c090;&lt;br /&gt;
    background-color: #f8eaba;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    margin: 2px 0;&lt;br /&gt;
    padding: 2px;&lt;br /&gt;
}&lt;br /&gt;
.messagebox.small {&lt;br /&gt;
    width: 238px;&lt;br /&gt;
    font-size: 85%;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    float: right;&lt;br /&gt;
    clear: both;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    margin: 0 0 1em 1em;&lt;br /&gt;
    line-height: 1.25em;&lt;br /&gt;
}&lt;br /&gt;
.messagebox.small-talk {&lt;br /&gt;
    width: 238px;&lt;br /&gt;
    font-size: 85%;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    float: right;&lt;br /&gt;
    clear: both;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    margin: 0 0 1em 1em;&lt;br /&gt;
    line-height: 1.25em;&lt;br /&gt;
    background: #F8EABA;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Cell sizes for ambox/tmbox/imbox/cmbox/ombox/fmbox/dmbox message boxes */&lt;br /&gt;
th.mbox-text, td.mbox-text {   /* The message body cell(s) */&lt;br /&gt;
    border: none;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    padding: 0.25em 0.9em;     /* 0.9em left/right */&lt;br /&gt;
    width: 100%;               /* Make all mboxes the same width regardless of text length */&lt;br /&gt;
}&lt;br /&gt;
td.mbox-image {                /* The left image cell */&lt;br /&gt;
    border: none;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    padding: 2px 0 2px 0.9em;  /* 0.9em left, 0px right */&lt;br /&gt;
    text-align: center;&lt;br /&gt;
}&lt;br /&gt;
td.mbox-imageright {           /* The right image cell */&lt;br /&gt;
    border: none;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    padding: 2px 0.9em 2px 0;  /* 0px left, 0.9em right */&lt;br /&gt;
    text-align: center;&lt;br /&gt;
}&lt;br /&gt;
td.mbox-empty-cell {           /* An empty narrow cell */&lt;br /&gt;
    border: none;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
    width: 1px;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Article message box styles */&lt;br /&gt;
table.ambox {&lt;br /&gt;
    margin: 0 10%;                  /* 10% = Will not overlap with other elements */&lt;br /&gt;
    border: 1px solid #aaa;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    border-left: 10px solid #1e90ff;  /* Default &amp;quot;notice&amp;quot; blue */&lt;br /&gt;
    background: #fbfbfb;&lt;br /&gt;
}&lt;br /&gt;
table.ambox + table.ambox {      /* Single border between stacked boxes. */&lt;br /&gt;
    margin-top: -1px;&lt;br /&gt;
}&lt;br /&gt;
.ambox th.mbox-text,&lt;br /&gt;
.ambox td.mbox-text {            /* The message body cell(s) */&lt;br /&gt;
    padding: 0.25em 0.5em;       /* 0.5em left/right */&lt;br /&gt;
}&lt;br /&gt;
.ambox td.mbox-image {           /* The left image cell */&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    padding: 2px 0 2px 0.5em;    /* 0.5em left, 0px right */&lt;br /&gt;
}&lt;br /&gt;
.ambox td.mbox-imageright {      /* The right image cell */&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    padding: 2px 0.5em 2px 0;    /* 0px left, 0.5em right */&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
table.ambox-notice {&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    border-left: 10px solid #1e90ff;    /* Blue */&lt;br /&gt;
}&lt;br /&gt;
table.ambox-speedy {&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    border-left: 10px solid #b22222;    /* Red */&lt;br /&gt;
    background: #fee;                   /* Pink */&lt;br /&gt;
}&lt;br /&gt;
table.ambox-delete {&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    border-left: 10px solid #b22222;    /* Red */&lt;br /&gt;
}&lt;br /&gt;
table.ambox-content {&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    border-left: 10px solid #f28500;    /* Orange */&lt;br /&gt;
}&lt;br /&gt;
table.ambox-style {&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    border-left: 10px solid #f4c430;    /* Yellow */&lt;br /&gt;
}&lt;br /&gt;
table.ambox-move {&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    border-left: 10px solid #9932cc;    /* Purple */&lt;br /&gt;
}&lt;br /&gt;
table.ambox-protection {&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    border-left: 10px solid #bba;       /* Gray-gold */&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Image message box styles */&lt;br /&gt;
table.imbox {&lt;br /&gt;
    margin: 4px 10%;&lt;br /&gt;
    border-collapse: collapse;&lt;br /&gt;
    border: 3px solid #1e90ff;    /* Default &amp;quot;notice&amp;quot; blue */&lt;br /&gt;
    background: #fbfbfb;&lt;br /&gt;
}&lt;br /&gt;
.imbox .mbox-text .imbox {  /* For imboxes inside imbox-text cells. */&lt;br /&gt;
    margin: 0 -0.5em;       /* 0.9 - 0.5 = 0.4em left/right.        */&lt;br /&gt;
    display: block;         /* Fix for webkit to force 100% width.  */&lt;br /&gt;
}&lt;br /&gt;
.mbox-inside .imbox {       /* For imboxes inside other templates.  */&lt;br /&gt;
    margin: 4px;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
table.imbox-notice {&lt;br /&gt;
    border: 3px solid #1e90ff;    /* Blue */&lt;br /&gt;
}&lt;br /&gt;
table.imbox-speedy {&lt;br /&gt;
    border: 3px solid #b22222;    /* Red */&lt;br /&gt;
    background: #fee;             /* Pink */&lt;br /&gt;
}&lt;br /&gt;
table.imbox-delete {&lt;br /&gt;
    border: 3px solid #b22222;    /* Red */&lt;br /&gt;
}&lt;br /&gt;
table.imbox-content {&lt;br /&gt;
    border: 3px solid #f28500;    /* Orange */&lt;br /&gt;
}&lt;br /&gt;
table.imbox-style {&lt;br /&gt;
    border: 3px solid #f4c430;    /* Yellow */&lt;br /&gt;
}&lt;br /&gt;
table.imbox-move {&lt;br /&gt;
    border: 3px solid #9932cc;    /* Purple */&lt;br /&gt;
}&lt;br /&gt;
table.imbox-protection {&lt;br /&gt;
    border: 3px solid #bba;       /* Gray-gold */&lt;br /&gt;
}&lt;br /&gt;
table.imbox-license {&lt;br /&gt;
    border: 3px solid #88a;       /* Dark gray */&lt;br /&gt;
    background: #f7f8ff;          /* Light gray */&lt;br /&gt;
}&lt;br /&gt;
table.imbox-featured {&lt;br /&gt;
    border: 3px solid #cba135;    /* Brown-gold */&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Category message box styles */&lt;br /&gt;
table.cmbox {&lt;br /&gt;
    margin: 3px 10%;&lt;br /&gt;
    border-collapse: collapse;&lt;br /&gt;
    border: 1px solid #aaa;&lt;br /&gt;
    background: #DFE8FF;    /* Default &amp;quot;notice&amp;quot; blue */&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
table.cmbox-notice {&lt;br /&gt;
    background: #D8E8FF;    /* Blue */&lt;br /&gt;
}&lt;br /&gt;
table.cmbox-speedy {&lt;br /&gt;
    margin-top: 4px;&lt;br /&gt;
    margin-bottom: 4px;&lt;br /&gt;
    border: 4px solid #b22222;    /* Red */&lt;br /&gt;
    background: #FFDBDB;          /* Pink */&lt;br /&gt;
}&lt;br /&gt;
table.cmbox-delete {&lt;br /&gt;
    background: #FFDBDB;    /* Red */&lt;br /&gt;
}&lt;br /&gt;
table.cmbox-content {&lt;br /&gt;
    background: #FFE7CE;    /* Orange */&lt;br /&gt;
}&lt;br /&gt;
table.cmbox-style {&lt;br /&gt;
    background: #FFF9DB;    /* Yellow */&lt;br /&gt;
}&lt;br /&gt;
table.cmbox-move {&lt;br /&gt;
    background: #E4D8FF;    /* Purple */&lt;br /&gt;
}&lt;br /&gt;
table.cmbox-protection {&lt;br /&gt;
    background: #EFEFE1;    /* Gray-gold */&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Other pages message box styles */&lt;br /&gt;
table.ombox {&lt;br /&gt;
    margin: 4px 10%;&lt;br /&gt;
    border-collapse: collapse;&lt;br /&gt;
    border: 1px solid #aaa;       /* Default &amp;quot;notice&amp;quot; gray */&lt;br /&gt;
    background: #f9f9f9;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
table.ombox-notice {&lt;br /&gt;
    border: 1px solid #aaa;       /* Gray */&lt;br /&gt;
}&lt;br /&gt;
table.ombox-speedy {&lt;br /&gt;
    border: 2px solid #b22222;    /* Red */&lt;br /&gt;
    background: #fee;             /* Pink */&lt;br /&gt;
}&lt;br /&gt;
table.ombox-delete {&lt;br /&gt;
    border: 2px solid #b22222;    /* Red */&lt;br /&gt;
}&lt;br /&gt;
table.ombox-content {&lt;br /&gt;
    border: 1px solid #f28500;    /* Orange */&lt;br /&gt;
}&lt;br /&gt;
table.ombox-style {&lt;br /&gt;
    border: 1px solid #f4c430;    /* Yellow */&lt;br /&gt;
}&lt;br /&gt;
table.ombox-move {&lt;br /&gt;
    border: 1px solid #9932cc;    /* Purple */&lt;br /&gt;
}&lt;br /&gt;
table.ombox-protection {&lt;br /&gt;
    border: 2px solid #bba;       /* Gray-gold */&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Talk page message box styles */&lt;br /&gt;
table.tmbox {&lt;br /&gt;
    margin: 4px 10%;&lt;br /&gt;
    border-collapse: collapse;&lt;br /&gt;
    border: 1px solid #c0c090;    /* Default &amp;quot;notice&amp;quot; gray-brown */&lt;br /&gt;
    background: #f8eaba;&lt;br /&gt;
}&lt;br /&gt;
.mediawiki .mbox-inside .tmbox { /* For tmboxes inside other templates. The &amp;quot;mediawiki&amp;quot; class ensures that */&lt;br /&gt;
    margin: 2px 0;               /* this declaration overrides other styles (including mbox-small above)   */&lt;br /&gt;
    width: 100%;                 /* For Safari and Opera */&lt;br /&gt;
}&lt;br /&gt;
.mbox-inside .tmbox.mbox-small { /* &amp;quot;small&amp;quot; tmboxes should not be small when  */&lt;br /&gt;
    line-height: 1.5em;          /* also &amp;quot;nested&amp;quot;, so reset styles that are   */&lt;br /&gt;
    font-size: 100%;             /* set in &amp;quot;mbox-small&amp;quot; above.                */&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
table.tmbox-speedy {&lt;br /&gt;
    border: 2px solid #b22222;    /* Red */&lt;br /&gt;
    background: #fee;             /* Pink */&lt;br /&gt;
}&lt;br /&gt;
table.tmbox-delete {&lt;br /&gt;
    border: 2px solid #b22222;    /* Red */&lt;br /&gt;
}&lt;br /&gt;
table.tmbox-content {&lt;br /&gt;
    border: 2px solid #f28500;    /* Orange */&lt;br /&gt;
}&lt;br /&gt;
table.tmbox-style {&lt;br /&gt;
    border: 2px solid #f4c430;    /* Yellow */&lt;br /&gt;
}&lt;br /&gt;
table.tmbox-move {&lt;br /&gt;
    border: 2px solid #9932cc;    /* Purple */&lt;br /&gt;
}&lt;br /&gt;
table.tmbox-protection,&lt;br /&gt;
table.tmbox-notice {&lt;br /&gt;
    border: 1px solid #c0c090;    /* Gray-brown */&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Disambig and set index box styles */&lt;br /&gt;
table.dmbox {&lt;br /&gt;
    clear: both;&lt;br /&gt;
    margin: 0.9em 1em;&lt;br /&gt;
    border-top: 1px solid #ccc;&lt;br /&gt;
    border-bottom: 1px solid #ccc;&lt;br /&gt;
    background: transparent;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Footer and header message box styles */&lt;br /&gt;
table.fmbox {&lt;br /&gt;
    clear: both;&lt;br /&gt;
    margin: 0.2em 0;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    border: 1px solid #aaa;&lt;br /&gt;
    background: #f9f9f9;     /* Default &amp;quot;system&amp;quot; gray */&lt;br /&gt;
}&lt;br /&gt;
table.fmbox-system {&lt;br /&gt;
    background: #f9f9f9;&lt;br /&gt;
}&lt;br /&gt;
table.fmbox-warning {&lt;br /&gt;
    border: 1px solid #bb7070;  /* Dark pink */&lt;br /&gt;
    background: #ffdbdb;        /* Pink */&lt;br /&gt;
}&lt;br /&gt;
table.fmbox-editnotice {&lt;br /&gt;
    background: transparent;&lt;br /&gt;
}&lt;br /&gt;
/* Div based &amp;quot;warning&amp;quot; style fmbox messages. */&lt;br /&gt;
div.mw-warning-with-logexcerpt,&lt;br /&gt;
div.mw-lag-warn-high,&lt;br /&gt;
div.mw-cascadeprotectedwarning,&lt;br /&gt;
div#mw-protect-cascadeon,&lt;br /&gt;
div.titleblacklist-warning,&lt;br /&gt;
div.locked-warning {&lt;br /&gt;
    clear: both;&lt;br /&gt;
    margin: 0.2em 0;&lt;br /&gt;
    border: 1px solid #bb7070;&lt;br /&gt;
    background: #ffdbdb;&lt;br /&gt;
    padding: 0.25em 0.9em;&lt;br /&gt;
}&lt;br /&gt;
/* Div based &amp;quot;system&amp;quot; style fmbox messages.&lt;br /&gt;
   Used in [[MediaWiki:Readonly lag]]. */&lt;br /&gt;
div.mw-lag-warn-normal,&lt;br /&gt;
div.fmbox-system {&lt;br /&gt;
    clear: both;&lt;br /&gt;
    margin: 0.2em 0;&lt;br /&gt;
    border: 1px solid #aaa;&lt;br /&gt;
    background: #f9f9f9;&lt;br /&gt;
    padding: 0.25em 0.9em;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* These mbox-small classes must be placed after all other&lt;br /&gt;
   ambox/tmbox/ombox etc classes. &amp;quot;body.mediawiki&amp;quot; is so&lt;br /&gt;
   they override &amp;quot;table.ambox + table.ambox&amp;quot; above. */&lt;br /&gt;
body.mediawiki table.mbox-small {   /* For the &amp;quot;small=yes&amp;quot; option. */&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    clear: right;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    float: right;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    margin: 4px 0 4px 1em;&lt;br /&gt;
    width: 238px;&lt;br /&gt;
    font-size: 88%;&lt;br /&gt;
    line-height: 1.25em;&lt;br /&gt;
}&lt;br /&gt;
body.mediawiki table.mbox-small-left {   /* For the &amp;quot;small=left&amp;quot; option. */&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    margin: 4px 1em 4px 0;&lt;br /&gt;
    width: 238px;&lt;br /&gt;
    border-collapse: collapse;&lt;br /&gt;
    font-size: 88%;&lt;br /&gt;
    line-height: 1.25em;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Style for compact ambox */&lt;br /&gt;
/* Hide the images */&lt;br /&gt;
.compact-ambox table .mbox-image,&lt;br /&gt;
.compact-ambox table .mbox-imageright,&lt;br /&gt;
.compact-ambox table .mbox-empty-cell {&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
/* Remove borders, backgrounds, padding, etc. */&lt;br /&gt;
.compact-ambox table.ambox {&lt;br /&gt;
    border: none;&lt;br /&gt;
    border-collapse: collapse;&lt;br /&gt;
    background: transparent;&lt;br /&gt;
    margin: 0 0 0 1.6em !important;&lt;br /&gt;
    padding: 0 !important;&lt;br /&gt;
    width: auto;&lt;br /&gt;
    display: block;&lt;br /&gt;
}&lt;br /&gt;
body.mediawiki .compact-ambox table.mbox-small-left {&lt;br /&gt;
    font-size: 100%;&lt;br /&gt;
    width: auto;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
}&lt;br /&gt;
/* Style the text cell as a list item and remove its padding */&lt;br /&gt;
.compact-ambox table .mbox-text {&lt;br /&gt;
    padding: 0 !important;&lt;br /&gt;
    margin: 0 !important;&lt;br /&gt;
}&lt;br /&gt;
.compact-ambox table .mbox-text-span {&lt;br /&gt;
    display: list-item;&lt;br /&gt;
    line-height: 1.5em;&lt;br /&gt;
    list-style-type: square;&lt;br /&gt;
    list-style-image: url(//bits.wikimedia.org/static-current/skins/MonoBook/bullet.gif);&lt;br /&gt;
}&lt;br /&gt;
.skin-vector .compact-ambox table .mbox-text-span {&lt;br /&gt;
    list-style-type: disc;&lt;br /&gt;
    list-style-image: url(//bits.wikimedia.org/static-current/skins/Vector/images/bullet-icon.png)&lt;br /&gt;
}&lt;br /&gt;
/* Allow for hiding text in compact form */&lt;br /&gt;
.compact-ambox .hide-when-compact {&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Remove default styles for [[MediaWiki:Noarticletext]]. */&lt;br /&gt;
div.noarticletext {&lt;br /&gt;
    border: none;&lt;br /&gt;
    background: transparent;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Hide (formatting) elements from screen, but not from screenreaders */&lt;br /&gt;
.visualhide {&lt;br /&gt;
    position: absolute;&lt;br /&gt;
    left: -10000px;&lt;br /&gt;
    top: auto;&lt;br /&gt;
    width: 1px;&lt;br /&gt;
    height: 1px;&lt;br /&gt;
    overflow: hidden;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Bold save button */&lt;br /&gt;
#wpSave {&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* class hiddenStructure is defunct. See [[Wikipedia:hiddenStructure]] */&lt;br /&gt;
.hiddenStructure {&lt;br /&gt;
    display: inline !important;&lt;br /&gt;
    color: #f00;&lt;br /&gt;
    background-color: #0f0;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* suppress missing interwiki image links where #ifexist cannot&lt;br /&gt;
   be used due to high number of requests see .hidden-redlink on&lt;br /&gt;
   [[m:MediaWiki:Common.css]] */&lt;br /&gt;
.check-icon a.new {&lt;br /&gt;
    display: none;&lt;br /&gt;
    speak: none;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Removes underlines from certain links */&lt;br /&gt;
.nounderlines a,&lt;br /&gt;
.IPA a:link, .IPA a:visited {&lt;br /&gt;
    text-decoration: none !important;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Standard Navigationsleisten, aka box hiding thingy&lt;br /&gt;
   from .de.  Documentation at [[Wikipedia:NavFrame]]. */&lt;br /&gt;
div.NavFrame {&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    padding: 4px;&lt;br /&gt;
    border: 1px solid #aaa;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    border-collapse: collapse;&lt;br /&gt;
    font-size: 95%;&lt;br /&gt;
}&lt;br /&gt;
div.NavFrame + div.NavFrame {&lt;br /&gt;
    border-top-style: none;&lt;br /&gt;
    border-top-style: hidden;&lt;br /&gt;
}&lt;br /&gt;
div.NavPic {&lt;br /&gt;
    background-color: #fff;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    padding: 2px;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    float: left;&lt;br /&gt;
}&lt;br /&gt;
div.NavFrame div.NavHead {&lt;br /&gt;
    line-height: 1.6em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    background-color: #ccf;&lt;br /&gt;
    position: relative;&lt;br /&gt;
}&lt;br /&gt;
div.NavFrame p,&lt;br /&gt;
div.NavFrame div.NavContent,&lt;br /&gt;
div.NavFrame div.NavContent p {&lt;br /&gt;
    font-size: 100%;&lt;br /&gt;
}&lt;br /&gt;
div.NavEnd {&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
    line-height: 1px;&lt;br /&gt;
    clear: both;&lt;br /&gt;
}&lt;br /&gt;
a.NavToggle {&lt;br /&gt;
    position: absolute;&lt;br /&gt;
    top: 0;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    right: 3px;&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
    font-size: 90%;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Hatnotes and disambiguation notices */&lt;br /&gt;
.hatnote {&lt;br /&gt;
    font-style: italic;&lt;br /&gt;
}&lt;br /&gt;
.hatnote i {&lt;br /&gt;
    font-style: normal;&lt;br /&gt;
}&lt;br /&gt;
div.hatnote {&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    padding-left: 1.6em;&lt;br /&gt;
    margin-bottom: 0.5em;&lt;br /&gt;
}&lt;br /&gt;
div.hatnote + div.hatnote {&lt;br /&gt;
    margin-top: -0.5em;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Allow transcluded pages to display in lists rather than a table.&lt;br /&gt;
   Compatible in Firefox; incompatible in IE6. */&lt;br /&gt;
.listify td    { display: list-item; }&lt;br /&gt;
.listify tr    { display: block; }&lt;br /&gt;
.listify table { display: block; }&lt;br /&gt;
 &lt;br /&gt;
/* Geographical coordinates defaults. See [[Template:Coord/link]]&lt;br /&gt;
   for how these are used. The classes &amp;quot;geo&amp;quot;, &amp;quot;longitude&amp;quot;, and&lt;br /&gt;
   &amp;quot;latitude&amp;quot; are used by the [[Geo microformat]]. */&lt;br /&gt;
.geo-default, .geo-dms, .geo-dec  { display: inline; }&lt;br /&gt;
.geo-nondefault, .geo-multi-punct { display: none; }&lt;br /&gt;
.longitude, .latitude             { white-space: nowrap; }&lt;br /&gt;
 &lt;br /&gt;
/* When &amp;lt;div class=&amp;quot;nonumtoc&amp;quot;&amp;gt; is used on the table of contents,&lt;br /&gt;
   the ToC will display without numbers */&lt;br /&gt;
.nonumtoc .tocnumber {&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
.nonumtoc #toc ul,&lt;br /&gt;
.nonumtoc .toc ul {&lt;br /&gt;
    line-height: 1.5em;&lt;br /&gt;
    list-style: none none;&lt;br /&gt;
    margin: .3em 0 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
}&lt;br /&gt;
.hlist.nonumtoc #toc ul ul,&lt;br /&gt;
.hlist.nonumtoc .toc ul ul {&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    margin: 0;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Allow limiting of which header levels are shown in a TOC;&lt;br /&gt;
   &amp;lt;div class=&amp;quot;toclimit-3&amp;quot;&amp;gt;, for instance, will limit to&lt;br /&gt;
   showing ==headings== and ===headings=== but no further&lt;br /&gt;
   (as long as there are no =headings= on the page, which&lt;br /&gt;
   there shouldn't be according to the MoS). */&lt;br /&gt;
.toclimit-2 .toclevel-1 ul,&lt;br /&gt;
.toclimit-3 .toclevel-2 ul,&lt;br /&gt;
.toclimit-4 .toclevel-3 ul,&lt;br /&gt;
.toclimit-5 .toclevel-4 ul,&lt;br /&gt;
.toclimit-6 .toclevel-5 ul,&lt;br /&gt;
.toclimit-7 .toclevel-6 ul {&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Styling for Template:Quote */&lt;br /&gt;
blockquote.templatequote {&lt;br /&gt;
     margin-top: 0;&lt;br /&gt;
}&lt;br /&gt;
blockquote.templatequote div.templatequotecite {&lt;br /&gt;
    line-height: 1.5em;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    text-align: left;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    padding-left: 1.6em;&lt;br /&gt;
    margin-top: 0;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* User block messages */&lt;br /&gt;
div.user-block {&lt;br /&gt;
    padding: 5px;&lt;br /&gt;
    margin-bottom: 0.5em;&lt;br /&gt;
    border: 1px solid #A9A9A9;&lt;br /&gt;
    background-color: #FFEFD5;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Prevent line breaks in silly places:&lt;br /&gt;
   1) Where desired&lt;br /&gt;
   2) Links when we don't want them to&lt;br /&gt;
   3) Bold &amp;quot;links&amp;quot; to the page itself&lt;br /&gt;
   4) Ref tags with group names &amp;lt;ref group=&amp;quot;Note&amp;quot;&amp;gt; --&amp;gt; &amp;quot;[Note 1]&amp;quot; */&lt;br /&gt;
.nowrap,&lt;br /&gt;
.nowraplinks a,&lt;br /&gt;
.nowraplinks .selflink,&lt;br /&gt;
sup.reference a {&lt;br /&gt;
    white-space: nowrap;&lt;br /&gt;
}&lt;br /&gt;
/* But allow wrapping where desired: */&lt;br /&gt;
.wrap,&lt;br /&gt;
.wraplinks a {&lt;br /&gt;
    white-space: normal;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* For template documentation */&lt;br /&gt;
.template-documentation {&lt;br /&gt;
    clear: both;&lt;br /&gt;
    margin: 1em 0 0 0;&lt;br /&gt;
    border: 1px solid #aaa;&lt;br /&gt;
    background-color: #ecfcf4;&lt;br /&gt;
    padding: 1em;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Inline divs in ImageMaps (code borrowed from de.wiki) */&lt;br /&gt;
.imagemap-inline div {&lt;br /&gt;
    display: inline;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Increase the height of the image upload box */&lt;br /&gt;
#wpUploadDescription {&lt;br /&gt;
    height: 13em;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Minimum thumb width */&lt;br /&gt;
.thumbinner {&lt;br /&gt;
    min-width: 100px;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Makes the background of a framed image white instead of gray.&lt;br /&gt;
   Only visible with transparent images. */&lt;br /&gt;
div.thumb .thumbimage {&lt;br /&gt;
    background-color: #fff;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* The backgrounds for galleries. */&lt;br /&gt;
div#content .gallerybox div.thumb {&lt;br /&gt;
    /* Light gray padding */&lt;br /&gt;
    background-color: #F9F9F9;&lt;br /&gt;
}&lt;br /&gt;
/* Put a chequered background behind images, only visible if they have transparency.&lt;br /&gt;
   '.filehistory a img' and '#file img:hover' are handled by MediaWiki core (as of 1.19) */&lt;br /&gt;
.gallerybox .thumb img {&lt;br /&gt;
    background: #fff url(//upload.wikimedia.org/wikipedia/commons/5/5d/Checker-16x16.png) repeat;&lt;br /&gt;
}&lt;br /&gt;
/* But not on articles, user pages, portals or with opt-out. */&lt;br /&gt;
.ns-0 .gallerybox .thumb img,&lt;br /&gt;
.ns-2 .gallerybox .thumb img,&lt;br /&gt;
.ns-100 .gallerybox .thumb img,&lt;br /&gt;
.nochecker .gallerybox .thumb img {&lt;br /&gt;
    background: #fff;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Prevent floating boxes from overlapping any category listings,&lt;br /&gt;
   file histories, edit previews, and edit [Show changes] views. */&lt;br /&gt;
#mw-subcategories, #mw-pages, #mw-category-media,&lt;br /&gt;
#filehistory, #wikiPreview, #wikiDiff {&lt;br /&gt;
    clear: both;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
body.rtl #mw-articlefeedbackv5, body.rtl #mw-articlefeedback {&lt;br /&gt;
    display: block;   /* Override inline block mode */&lt;br /&gt;
    margin-bottom: 1em;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    clear: right;     /* Clear any info boxes that stick out */&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    float: right;     /* Prevents margin collapsing */&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Selectively hide headers in WikiProject banners */&lt;br /&gt;
.wpb .wpb-header             { display: none; }&lt;br /&gt;
.wpbs-inner .wpb .wpb-header { display: block; }     /* for IE */&lt;br /&gt;
.wpbs-inner .wpb .wpb-header { display: table-row; } /* for real browsers */&lt;br /&gt;
.wpbs-inner .wpb-outside     { display: none; }      /* hide things that should only display outside shells */&lt;br /&gt;
 &lt;br /&gt;
/* Styling for Abuse Filter tags */&lt;br /&gt;
.mw-tag-markers {&lt;br /&gt;
    font-family:sans-serif;&lt;br /&gt;
    font-style:italic;&lt;br /&gt;
    font-size:90%;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Hide stuff meant for accounts with special permissions. Made visible again in&lt;br /&gt;
   [[MediaWiki:Group-sysop.css]], [[MediaWiki:Group-accountcreator.css]],&lt;br /&gt;
   [[MediaWiki:Group-templateeditor.css]] and [[Mediawiki:Group-autoconfirmed.css]]. */&lt;br /&gt;
.sysop-show,&lt;br /&gt;
.accountcreator-show,&lt;br /&gt;
.templateeditor-show,&lt;br /&gt;
.autoconfirmed-show {&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
 * Hide the redlink generated by {{Editnotice}},&lt;br /&gt;
 * this overrides the &amp;quot;.sysop-show { display: none; }&amp;quot; above that applies&lt;br /&gt;
 * to the same link as well.&lt;br /&gt;
 *&lt;br /&gt;
 * See [[Phabricator:45013]].&lt;br /&gt;
 */&lt;br /&gt;
.ve-ui-mwNoticesPopupTool-item .editnotice-redlink, .mw-ve-editNotice .editnotice-redlink {&lt;br /&gt;
    display: none !important;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Remove bullets when there are multiple edit page warnings */&lt;br /&gt;
ul.permissions-errors &amp;gt; li {&lt;br /&gt;
    list-style: none none;&lt;br /&gt;
}&lt;br /&gt;
ul.permissions-errors {&lt;br /&gt;
    margin: 0;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* No linewrap on the labels of the login/signup page */&lt;br /&gt;
body.page-Special_UserLogin .mw-label label,&lt;br /&gt;
body.page-Special_UserLogin_signup .mw-label label {&lt;br /&gt;
    white-space: nowrap;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Pie chart test: Transparent borders */&lt;br /&gt;
.transborder {&lt;br /&gt;
    border: solid transparent;&lt;br /&gt;
}&lt;br /&gt;
* html .transborder {  /* IE6 */&lt;br /&gt;
    border: solid #000001;&lt;br /&gt;
    filter: chroma(color=#000001);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Styling for updated markers on watchlist, history and recent/related changes.&lt;br /&gt;
   Bullets are handled in skin-specific stylesheets. */&lt;br /&gt;
.updatedmarker {&lt;br /&gt;
    background-color: transparent;&lt;br /&gt;
    color: #006400;&lt;br /&gt;
}&lt;br /&gt;
li.mw-changeslist-line-watched .mw-title,&lt;br /&gt;
table.mw-changeslist-line-watched .mw-title,&lt;br /&gt;
table.mw-enhanced-watch .mw-enhanced-rctime {&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Generic class for Times-based serif, texhtml class for inline math */&lt;br /&gt;
.times-serif,&lt;br /&gt;
span.texhtml {&lt;br /&gt;
    font-family: &amp;quot;Nimbus Roman No9 L&amp;quot;, &amp;quot;Times New Roman&amp;quot;, Times, serif;&lt;br /&gt;
    font-size: 118%;&lt;br /&gt;
    line-height: 1;&lt;br /&gt;
}&lt;br /&gt;
span.texhtml {&lt;br /&gt;
    white-space: nowrap;&lt;br /&gt;
}&lt;br /&gt;
span.texhtml span.texhtml {&lt;br /&gt;
    font-size: 100%;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Force tabular and lining display for digits and texhtml */&lt;br /&gt;
.digits,&lt;br /&gt;
.texhtml {&lt;br /&gt;
    -moz-font-feature-settings: &amp;quot;lnum&amp;quot;, &amp;quot;tnum&amp;quot;;&lt;br /&gt;
    -webkit-font-feature-settings: &amp;quot;lnum&amp;quot;, &amp;quot;tnum&amp;quot;;&lt;br /&gt;
    font-feature-settings: &amp;quot;lnum&amp;quot;, &amp;quot;tnum&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Display tabs with 4 spaces, see [[Phabricator:59824]] and [[Phabricator:59825]] */&lt;br /&gt;
div.mw-geshi div,&lt;br /&gt;
div.mw-geshi div pre,&lt;br /&gt;
span.mw-geshi,&lt;br /&gt;
pre.source-css,&lt;br /&gt;
pre.source-javascript,&lt;br /&gt;
pre.source-lua {&lt;br /&gt;
    -moz-tab-size: 4;&lt;br /&gt;
    -o-tab-size: 4;&lt;br /&gt;
    tab-size: 4;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Fix styling of transcluded prefindex tables */&lt;br /&gt;
table#mw-prefixindex-list-table,&lt;br /&gt;
table#mw-prefixindex-nav-table {&lt;br /&gt;
    width: 98%;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* For portals, added 2011-12-07 -bv&lt;br /&gt;
   On wide screens, show these as two columns&lt;br /&gt;
   On narrow and mobile screens, let them collapse into a single column */&lt;br /&gt;
.portal-column-left {&lt;br /&gt;
    float: left;&lt;br /&gt;
    width: 50%;&lt;br /&gt;
}&lt;br /&gt;
.portal-column-right {&lt;br /&gt;
    float: right;&lt;br /&gt;
    width: 49%;&lt;br /&gt;
}&lt;br /&gt;
.portal-column-left-wide {&lt;br /&gt;
    float: left;&lt;br /&gt;
    width: 60%;&lt;br /&gt;
}&lt;br /&gt;
.portal-column-right-narrow {&lt;br /&gt;
    float: right;&lt;br /&gt;
    width: 39%;&lt;br /&gt;
}&lt;br /&gt;
.portal-column-left-extra-wide {&lt;br /&gt;
    float: left;&lt;br /&gt;
    width: 70%;&lt;br /&gt;
}&lt;br /&gt;
.portal-column-right-extra-narrow {&lt;br /&gt;
    float: right;&lt;br /&gt;
    width: 29%;&lt;br /&gt;
}&lt;br /&gt;
@media only screen and (max-width: 800px) {&lt;br /&gt;
    /* Decouple the columns on narrow screens */&lt;br /&gt;
    .portal-column-left,&lt;br /&gt;
    .portal-column-right,&lt;br /&gt;
    .portal-column-left-wide,&lt;br /&gt;
    .portal-column-right-narrow,&lt;br /&gt;
    .portal-column-left-extra-wide,&lt;br /&gt;
    .portal-column-right-extra-narrow {&lt;br /&gt;
        float: inherit;&lt;br /&gt;
        width: inherit;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* For announcements */&lt;br /&gt;
#bodyContent .letterhead {&lt;br /&gt;
    background-image:url('//upload.wikimedia.org/wikipedia/commons/e/e0/Tan-page-corner.png');&lt;br /&gt;
    background-repeat:no-repeat;&lt;br /&gt;
    padding: 2em;&lt;br /&gt;
    background-color: #faf9f2;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Tree style lists */&lt;br /&gt;
.treeview ul {&lt;br /&gt;
    padding: 0;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
}&lt;br /&gt;
.treeview li {&lt;br /&gt;
    padding: 0;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    list-style-type: none;&lt;br /&gt;
    list-style-image: none;&lt;br /&gt;
    zoom: 1; /* BE KIND TO IE6 */;&lt;br /&gt;
}&lt;br /&gt;
.treeview li li {&lt;br /&gt;
    background: url(&amp;quot;//upload.wikimedia.org/wikipedia/commons/f/f2/Treeview-grey-line.png&amp;quot;) no-repeat 0 -2981px;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    padding-left: 20px;&lt;br /&gt;
    text-indent: 0.3em;&lt;br /&gt;
}&lt;br /&gt;
.treeview li li.lastline {&lt;br /&gt;
    background-position: 0 -5971px&lt;br /&gt;
}&lt;br /&gt;
.treeview li.emptyline &amp;gt; ul {&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    margin-left: -1px;&lt;br /&gt;
}&lt;br /&gt;
.treeview li.emptyline &amp;gt; ul &amp;gt; li:first-child {&lt;br /&gt;
    background-position: 0 9px&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* hidden sortkey for tablesorter */&lt;br /&gt;
td .sortkey,&lt;br /&gt;
th .sortkey {&lt;br /&gt;
    display: none;&lt;br /&gt;
    speak: none;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Make it possible to hide checkboxes in &amp;lt;inputbox&amp;gt; */&lt;br /&gt;
.inputbox-hidecheckboxes form .inputbox-element {&lt;br /&gt;
    display: none !important;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Work-around for [[Phabricator:25965]] (Kaltura advertisement) */&lt;br /&gt;
.k-player .k-attribution {&lt;br /&gt;
    visibility: hidden;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Move 'play' button of video player to bottom left corner */&lt;br /&gt;
.PopUpMediaTransform a .play-btn-large {&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    top: auto;&lt;br /&gt;
    right: auto;&lt;br /&gt;
    bottom: 0;&lt;br /&gt;
    left: 0;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Workaround to keep editnotices readable in VE view.&lt;br /&gt;
   Long term, editnotices should become a core feature so that they can be designed responsive. */&lt;br /&gt;
.mw-ve-editNotice .mbox-image {&lt;br /&gt;
	display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* smart counters - allow up to #.#.# levels of counting. */&lt;br /&gt;
body { counter-reset: autocount-1 autocount-2 autocount-3; }&lt;br /&gt;
 &lt;br /&gt;
.autocount:before, .autocount-list ol li:before { counter-increment:autocount-1; content: counter(autocount-1) &amp;quot; &amp;quot;; color:green; }&lt;br /&gt;
.autocount-reset:before { counter-reset: autocount-1; }&lt;br /&gt;
.autocount .autocount:before, .autocount-list li ol li:before {&lt;br /&gt;
  counter-increment: autocount-2;&lt;br /&gt;
  content: counter(autocount-1)  &amp;quot;.&amp;quot; counter(autocount-2) &amp;quot; &amp;quot;;&lt;br /&gt;
  color:red;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
.autocount .autocount .autocount:before, .autocount-list li li ol li:before {&lt;br /&gt;
  counter-increment: autocount-3;&lt;br /&gt;
  content: counter(autocount-1) &amp;quot;.&amp;quot; counter(autocount-2) &amp;quot;.&amp;quot; counter(autocount-3) &amp;quot; &amp;quot;;&lt;br /&gt;
  color:green;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
.autocount-list ol { margin-left:1.5em; }&lt;br /&gt;
.autocount-list ol li { list-style:none; }&lt;br /&gt;
.autocount-list ol li:first-child { counter-reset: autocount-1; }&lt;br /&gt;
.autocount-list li ol li:first-child { counter-reset: autocount-2; }&lt;br /&gt;
.autocount-list li li ol li:first-child { counter-reset: autocount-3; }&lt;/div&gt;</summary>
		<author><name>SuperAdmin</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=MediaWiki:Common.css&amp;diff=3778</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=MediaWiki:Common.css&amp;diff=3778"/>
		<updated>2015-06-12T09:55:38Z</updated>

		<summary type="html">&lt;p&gt;SuperAdmin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Umieszczony tutaj kod CSS zostanie zastosowany we wszystkich skórkach */&lt;br /&gt;
&lt;br /&gt;
/* &amp;lt;nowiki&amp;gt; Common CSS for all skins - copy to your user CSS to change */&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
* Hide text in the onlyinprint class. Is used for the collection extension&lt;br /&gt;
*/&lt;br /&gt;
.onlyinprint {display: none}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
div.qwerty {&lt;br /&gt;
background-color: #b0c4de;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Default styling for HTML elements */&lt;br /&gt;
dfn {&lt;br /&gt;
    font-style: inherit;  /* Reset default styling for &amp;lt;dfn&amp;gt; */&lt;br /&gt;
}&lt;br /&gt;
q {&lt;br /&gt;
    quotes: '&amp;quot;' '&amp;quot;' &amp;quot;'&amp;quot; &amp;quot;'&amp;quot;;  /* Straight quote marks for &amp;lt;q&amp;gt; */&lt;br /&gt;
}&lt;br /&gt;
tt {&lt;br /&gt;
   background-color: #F0F0F0;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
tt.shell {&lt;br /&gt;
   background-color: #F0FFF0;&lt;br /&gt;
}&lt;br /&gt;
blockquote {&lt;br /&gt;
	overflow: hidden;  /* Avoid collision of background with floating elements */&lt;br /&gt;
}&lt;br /&gt;
strong.selflink {&lt;br /&gt;
    font-weight: 700;  /* Prevent the 'double bold' bug in Firefox when using DirectWrite */&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Main page fixes */&lt;br /&gt;
#interwiki-completelist {&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
body.page-Main_Page #ca-delete {&lt;br /&gt;
    display: none !important;&lt;br /&gt;
}&lt;br /&gt;
body.page-Main_Page #mp-topbanner {&lt;br /&gt;
    clear: both;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Edit window toolbar */&lt;br /&gt;
#toolbar {&lt;br /&gt;
    height: 22px;&lt;br /&gt;
    margin-bottom: 6px;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* WikiEditor CSS for #wpTextbox1 is not loaded on .css/.js pages, so load here. [[phab:T97299]] */&lt;br /&gt;
.wikiEditor-ui-text #wpTextbox1 {&lt;br /&gt;
    line-height: 1.5em;&lt;br /&gt;
    resize: vertical;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Hide charinsert base for those not using the gadget */&lt;br /&gt;
#editpage-specialchars {&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Highlight data points in the info action if specified in the URL */&lt;br /&gt;
body.action-info :target {&lt;br /&gt;
    background: #DEF;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Make the list of references smaller */&lt;br /&gt;
ol.references,&lt;br /&gt;
div.reflist,&lt;br /&gt;
div.refbegin {&lt;br /&gt;
    font-size: 90%;            /* Default font-size */&lt;br /&gt;
    margin-bottom: 0.5em;&lt;br /&gt;
}&lt;br /&gt;
div.refbegin-100 {&lt;br /&gt;
    font-size: 100%;           /* Option for normal fontsize in {{refbegin}} */&lt;br /&gt;
}&lt;br /&gt;
div.reflist ol.references {&lt;br /&gt;
    font-size: 100%;           /* Reset font-size when nested in div.reflist */&lt;br /&gt;
    list-style-type: inherit;  /* Enable custom list style types */&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Highlight clicked reference in blue to help navigation */&lt;br /&gt;
span.citation:target {&lt;br /&gt;
    background-color: #DEF;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Ensure refs in table headers and the like aren't bold or italic */&lt;br /&gt;
sup.reference {&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
    font-style: normal;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Allow hidden ref errors to be shown by user CSS */&lt;br /&gt;
span.brokenref {&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Styling for citations (CSS3). Breaks long urls, etc., rather than overflowing box */&lt;br /&gt;
.citation {&lt;br /&gt;
    word-wrap: break-word;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* For linked citation numbers and document IDs, where&lt;br /&gt;
   the number need not be shown on a screen or a handheld,&lt;br /&gt;
   but should be included in the printed version */&lt;br /&gt;
@media screen, handheld {&lt;br /&gt;
    .citation .printonly {&lt;br /&gt;
        display: none;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Reset top margin for lists embedded in columns */&lt;br /&gt;
div.columns {&lt;br /&gt;
    margin-top: 0.3em;&lt;br /&gt;
}&lt;br /&gt;
div.columns dl,&lt;br /&gt;
div.columns ol,&lt;br /&gt;
div.columns ul {&lt;br /&gt;
    margin-top: 0;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Avoid elements from breaking between columns */&lt;br /&gt;
.nocolbreak,&lt;br /&gt;
div.columns li,&lt;br /&gt;
div.columns dd dd {&lt;br /&gt;
    -webkit-column-break-inside: avoid;&lt;br /&gt;
    page-break-inside: avoid;&lt;br /&gt;
    break-inside: avoid-column;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Style for [[Template:Flowlist]] that Lets lists flow around floating objecs */&lt;br /&gt;
.flowlist ul {&lt;br /&gt;
    overflow-x: hidden;&lt;br /&gt;
    margin-left: 0;&lt;br /&gt;
    padding-left: 1.6em;&lt;br /&gt;
}&lt;br /&gt;
.flowlist ol {&lt;br /&gt;
    overflow-x: hidden;&lt;br /&gt;
    margin-left: 0;&lt;br /&gt;
    padding-left: 3.2em;&lt;br /&gt;
}&lt;br /&gt;
.flowlist dl {&lt;br /&gt;
    overflow-x: hidden;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Style for horizontal lists (separator following item).&lt;br /&gt;
   IE8-specific classes are assigned in [[MediaWiki:Common.js/IEFixes.js]].&lt;br /&gt;
   @source mediawiki.org/wiki/Snippets/Horizontal_lists&lt;br /&gt;
   @revision 6 (2014-05-09)&lt;br /&gt;
   @author [[User:Edokter]]&lt;br /&gt;
 */&lt;br /&gt;
.hlist dl,&lt;br /&gt;
.hlist ol,&lt;br /&gt;
.hlist ul {&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
}&lt;br /&gt;
/* Display list items inline */&lt;br /&gt;
.hlist dd,&lt;br /&gt;
.hlist dt,&lt;br /&gt;
.hlist li {&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    display: inline;&lt;br /&gt;
}&lt;br /&gt;
/* Display nested lists inline */&lt;br /&gt;
.hlist.inline,&lt;br /&gt;
.hlist.inline dl,&lt;br /&gt;
.hlist.inline ol,&lt;br /&gt;
.hlist.inline ul,&lt;br /&gt;
.hlist dl dl, .hlist dl ol, .hlist dl ul,&lt;br /&gt;
.hlist ol dl, .hlist ol ol, .hlist ol ul,&lt;br /&gt;
.hlist ul dl, .hlist ul ol, .hlist ul ul {&lt;br /&gt;
    display: inline;&lt;br /&gt;
}&lt;br /&gt;
/* Generate interpuncts */&lt;br /&gt;
.hlist dt:after {&lt;br /&gt;
    content: &amp;quot;: &amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
.hlist dd:after,&lt;br /&gt;
.hlist li:after {&lt;br /&gt;
    content: &amp;quot; · &amp;quot;;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
.hlist dd:last-child:after,&lt;br /&gt;
.hlist dt:last-child:after,&lt;br /&gt;
.hlist li:last-child:after {&lt;br /&gt;
    content: none;&lt;br /&gt;
}&lt;br /&gt;
/* For IE8 */&lt;br /&gt;
.hlist dd.hlist-last-child:after,&lt;br /&gt;
.hlist dt.hlist-last-child:after,&lt;br /&gt;
.hlist li.hlist-last-child:after {&lt;br /&gt;
    content: none;&lt;br /&gt;
}&lt;br /&gt;
/* Add parentheses around nested lists */&lt;br /&gt;
.hlist dd dd:first-child:before, .hlist dd dt:first-child:before, .hlist dd li:first-child:before,&lt;br /&gt;
.hlist dt dd:first-child:before, .hlist dt dt:first-child:before, .hlist dt li:first-child:before,&lt;br /&gt;
.hlist li dd:first-child:before, .hlist li dt:first-child:before, .hlist li li:first-child:before {&lt;br /&gt;
    content: &amp;quot; (&amp;quot;;&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
}&lt;br /&gt;
.hlist dd dd:last-child:after, .hlist dd dt:last-child:after, .hlist dd li:last-child:after,&lt;br /&gt;
.hlist dt dd:last-child:after, .hlist dt dt:last-child:after, .hlist dt li:last-child:after,&lt;br /&gt;
.hlist li dd:last-child:after, .hlist li dt:last-child:after, .hlist li li:last-child:after {&lt;br /&gt;
    content: &amp;quot;) &amp;quot;;&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
}&lt;br /&gt;
/* For IE8 */&lt;br /&gt;
.hlist dd dd.hlist-last-child:after, .hlist dd dt.hlist-last-child:after, .hlist dd li.hlist-last-child:after,&lt;br /&gt;
.hlist dt dd.hlist-last-child:after, .hlist dt dt.hlist-last-child:after, .hlist dt li.hlist-last-child:after,&lt;br /&gt;
.hlist li dd.hlist-last-child:after, .hlist li dt.hlist-last-child:after, .hlist li li.hlist-last-child:after {&lt;br /&gt;
    content: &amp;quot;) &amp;quot;;&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
}&lt;br /&gt;
/* Put ordinals in front of ordered list items */&lt;br /&gt;
.hlist ol {&lt;br /&gt;
    counter-reset: listitem;&lt;br /&gt;
}&lt;br /&gt;
.hlist ol &amp;gt; li {&lt;br /&gt;
    counter-increment: listitem;&lt;br /&gt;
}&lt;br /&gt;
.hlist ol &amp;gt; li:before {&lt;br /&gt;
    content: &amp;quot; &amp;quot; counter(listitem) &amp;quot; &amp;quot;;&lt;br /&gt;
    white-space: nowrap;&lt;br /&gt;
}&lt;br /&gt;
.hlist dd ol &amp;gt; li:first-child:before,&lt;br /&gt;
.hlist dt ol &amp;gt; li:first-child:before,&lt;br /&gt;
.hlist li ol &amp;gt; li:first-child:before {&lt;br /&gt;
    content: &amp;quot; (&amp;quot; counter(listitem) &amp;quot; &amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Unbulleted lists */&lt;br /&gt;
.plainlist ol,&lt;br /&gt;
.plainlist ul {&lt;br /&gt;
    line-height: inherit;&lt;br /&gt;
    list-style: none none;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
}&lt;br /&gt;
.plainlist ol li,&lt;br /&gt;
.plainlist ul li {&lt;br /&gt;
    margin-bottom: 0;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Default style for navigation boxes */&lt;br /&gt;
.navbox {                     /* Navbox container style */&lt;br /&gt;
    border: 1px solid #aaa;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    margin: auto;&lt;br /&gt;
    clear: both;&lt;br /&gt;
    font-size: 88%;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    padding: 1px;&lt;br /&gt;
}&lt;br /&gt;
.navbox-inner,&lt;br /&gt;
.navbox-subgroup {&lt;br /&gt;
    width: 100%;&lt;br /&gt;
}&lt;br /&gt;
.navbox-group,&lt;br /&gt;
.navbox-title,&lt;br /&gt;
.navbox-abovebelow {&lt;br /&gt;
    padding: 0.25em 1em;      /* Title, group and above/below styles */&lt;br /&gt;
    line-height: 1.5em;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
}&lt;br /&gt;
th.navbox-group {             /* Group style */&lt;br /&gt;
    white-space: nowrap;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    text-align: right;&lt;br /&gt;
}&lt;br /&gt;
.navbox,&lt;br /&gt;
.navbox-subgroup {&lt;br /&gt;
    background: #fdfdfd;      /* Background color */&lt;br /&gt;
}&lt;br /&gt;
.navbox-list {&lt;br /&gt;
    line-height: 1.8em;&lt;br /&gt;
    border-color: #fdfdfd;    /* Must match background color */&lt;br /&gt;
}&lt;br /&gt;
.navbox th,&lt;br /&gt;
.navbox-title {&lt;br /&gt;
    background: #ccccff;      /* Level 1 color */&lt;br /&gt;
}&lt;br /&gt;
.navbox-abovebelow,&lt;br /&gt;
th.navbox-group,&lt;br /&gt;
.navbox-subgroup .navbox-title {&lt;br /&gt;
    background: #ddddff;      /* Level 2 color */&lt;br /&gt;
}&lt;br /&gt;
.navbox-subgroup .navbox-group,&lt;br /&gt;
.navbox-subgroup .navbox-abovebelow {&lt;br /&gt;
    background: #e6e6ff;      /* Level 3 color */&lt;br /&gt;
}&lt;br /&gt;
.navbox-even {&lt;br /&gt;
    background: #f7f7f7;      /* Even row striping */&lt;br /&gt;
}&lt;br /&gt;
.navbox-odd {&lt;br /&gt;
    background: transparent;  /* Odd row striping */&lt;br /&gt;
}&lt;br /&gt;
table.navbox + table.navbox {  /* Single pixel border between adjacent navboxes */&lt;br /&gt;
    margin-top: -1px;          /* (doesn't work for IE6, but that's okay)       */&lt;br /&gt;
}&lt;br /&gt;
.navbox .hlist td dl,&lt;br /&gt;
.navbox .hlist td ol,&lt;br /&gt;
.navbox .hlist td ul,&lt;br /&gt;
.navbox td.hlist dl,&lt;br /&gt;
.navbox td.hlist ol,&lt;br /&gt;
.navbox td.hlist ul {&lt;br /&gt;
    padding: 0.125em 0;       /* Adjust hlist padding in navboxes */&lt;br /&gt;
}&lt;br /&gt;
ol + table.navbox,&lt;br /&gt;
ul + table.navbox {&lt;br /&gt;
    margin-top: 1em;        /* Prevent lists from clinging to navboxes */&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Default styling for Navbar template */&lt;br /&gt;
.navbar {&lt;br /&gt;
    display: inline;&lt;br /&gt;
    font-size: 88%;&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
}&lt;br /&gt;
.navbar ul {&lt;br /&gt;
    display: inline;&lt;br /&gt;
    white-space: nowrap;&lt;br /&gt;
}&lt;br /&gt;
.mw-body-content .navbar ul {&lt;br /&gt;
    line-height: inherit;&lt;br /&gt;
}&lt;br /&gt;
.navbar li {&lt;br /&gt;
    word-spacing: -0.125em;&lt;br /&gt;
}&lt;br /&gt;
.navbar.mini li span {&lt;br /&gt;
  font-variant: small-caps;&lt;br /&gt;
}&lt;br /&gt;
/* Navbar styling when nested in infobox and navbox */&lt;br /&gt;
.infobox .navbar {&lt;br /&gt;
    font-size: 100%;&lt;br /&gt;
}&lt;br /&gt;
.navbox .navbar {&lt;br /&gt;
    display: block;&lt;br /&gt;
    font-size: 100%;&lt;br /&gt;
}&lt;br /&gt;
.navbox-title .navbar {&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    float: left;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    text-align: left;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    margin-right: 0.5em;&lt;br /&gt;
    width: 6em;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* 'show'/'hide' buttons created dynamically by the CollapsibleTables javascript&lt;br /&gt;
   in [[MediaWiki:Common.js]] are styled here so they can be customised. */&lt;br /&gt;
.collapseButton {&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    float: right;&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    margin-left: 0.5em;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    text-align: right;&lt;br /&gt;
    width: auto;&lt;br /&gt;
}&lt;br /&gt;
/* In navboxes, the show/hide button balances the v·d·e links&lt;br /&gt;
   from [[Template:Navbar]], so they need to be the same width. */&lt;br /&gt;
.navbox .collapseButton {&lt;br /&gt;
    width: 6em;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Styling for JQuery makeCollapsible, matching that of collapseButton */&lt;br /&gt;
.mw-collapsible-toggle {&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    text-align: right;&lt;br /&gt;
}&lt;br /&gt;
.navbox .mw-collapsible-toggle {&lt;br /&gt;
    width: 6em;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Infobox template style */&lt;br /&gt;
.infobox {&lt;br /&gt;
    border: 1px solid #aaa;&lt;br /&gt;
    border-spacing: 3px;&lt;br /&gt;
    background-color: #f9f9f9;&lt;br /&gt;
    color: black;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    margin: 0.5em 0 0.5em 1em;&lt;br /&gt;
    padding: 0.2em;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    float: right;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    clear: right;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    text-align: left;&lt;br /&gt;
    font-size: 88%;&lt;br /&gt;
    line-height: 1.5em;&lt;br /&gt;
}&lt;br /&gt;
.infobox caption {&lt;br /&gt;
    font-size: 125%;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    padding: 0.2em;&lt;br /&gt;
}&lt;br /&gt;
.infobox td,&lt;br /&gt;
.infobox th {&lt;br /&gt;
    vertical-align: top;&lt;br /&gt;
}&lt;br /&gt;
.infobox.bordered {&lt;br /&gt;
    border-collapse: collapse;&lt;br /&gt;
}&lt;br /&gt;
.infobox.bordered td,&lt;br /&gt;
.infobox.bordered th {&lt;br /&gt;
    border: 1px solid #aaa;&lt;br /&gt;
}&lt;br /&gt;
.infobox.bordered .borderless td,&lt;br /&gt;
.infobox.bordered .borderless th {&lt;br /&gt;
    border: 0;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
.infobox.sisterproject {&lt;br /&gt;
    width: 20em;&lt;br /&gt;
    font-size: 90%;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
.infobox.standard-talk {&lt;br /&gt;
    border: 1px solid #c0c090;&lt;br /&gt;
    background-color: #f8eaba;&lt;br /&gt;
}&lt;br /&gt;
.infobox.standard-talk.bordered td,&lt;br /&gt;
.infobox.standard-talk.bordered th {&lt;br /&gt;
    border: 1px solid #c0c090;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* styles for bordered infobox with merged rows */&lt;br /&gt;
.infobox.bordered .mergedtoprow td,&lt;br /&gt;
.infobox.bordered .mergedtoprow th {&lt;br /&gt;
    border: 0;&lt;br /&gt;
    border-top: 1px solid #aaa;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    border-right: 1px solid #aaa;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
.infobox.bordered .mergedrow td,&lt;br /&gt;
.infobox.bordered .mergedrow th {&lt;br /&gt;
    border: 0;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    border-right: 1px solid #aaa;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Styles for geography infoboxes, eg countries,&lt;br /&gt;
   country subdivisions, cities, etc.            */&lt;br /&gt;
.infobox.geography {&lt;br /&gt;
    border-collapse: collapse;&lt;br /&gt;
    line-height: 1.2em;&lt;br /&gt;
    font-size: 90%;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
.infobox.geography  td,&lt;br /&gt;
.infobox.geography  th {&lt;br /&gt;
    border-top: 1px solid #aaa;&lt;br /&gt;
    padding: 0.4em 0.6em 0.4em 0.6em;&lt;br /&gt;
}&lt;br /&gt;
.infobox.geography .mergedtoprow td,&lt;br /&gt;
.infobox.geography .mergedtoprow th {&lt;br /&gt;
    border-top: 1px solid #aaa;&lt;br /&gt;
    padding: 0.4em 0.6em 0.2em 0.6em;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
.infobox.geography .mergedrow td,&lt;br /&gt;
.infobox.geography .mergedrow th {&lt;br /&gt;
    border: 0;&lt;br /&gt;
    padding: 0 0.6em 0.2em 0.6em;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
.infobox.geography .mergedbottomrow td,&lt;br /&gt;
.infobox.geography .mergedbottomrow th {&lt;br /&gt;
    border-top: 0;&lt;br /&gt;
    border-bottom: 1px solid #aaa;&lt;br /&gt;
    padding: 0 0.6em 0.4em 0.6em;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
.infobox.geography .maptable td,&lt;br /&gt;
.infobox.geography .maptable th {&lt;br /&gt;
    border: 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*******************************/&lt;br /&gt;
/* wikitable/prettytable class */&lt;br /&gt;
/*******************************/&lt;br /&gt;
 &lt;br /&gt;
/* wikitable/prettytable class for skinning normal tables,&lt;br /&gt;
   but don't skin tables within tables by accident */&lt;br /&gt;
&lt;br /&gt;
table.wikitable, table.prettytable { margin:1em 0em; background:#f9f9f9; border:1px #aaaaaa solid; border-collapse:collapse; }&lt;br /&gt;
table.wikitable&amp;gt;*&amp;gt;tr&amp;gt;th,&lt;br /&gt;
table.wikitable&amp;gt;*&amp;gt;tr&amp;gt;td,&lt;br /&gt;
table.wikitable&amp;gt;tr&amp;gt;th,&lt;br /&gt;
table.wikitable&amp;gt;tr&amp;gt;td,&lt;br /&gt;
table.prettytable&amp;gt;*&amp;gt;tr&amp;gt;th,&lt;br /&gt;
table.prettytable&amp;gt;*&amp;gt;tr&amp;gt;td,&lt;br /&gt;
table.prettytable&amp;gt;tr&amp;gt;th,&lt;br /&gt;
table.prettytable&amp;gt;tr&amp;gt;td&lt;br /&gt;
{&lt;br /&gt;
  border: 1px #aaaaaa solid;&lt;br /&gt;
  padding: 0.2em;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 table.wikitable&amp;gt;*&amp;gt;tr&amp;gt;th,&lt;br /&gt;
 table.wikitable&amp;gt;tr&amp;gt;th,&lt;br /&gt;
 table.prettytable&amp;gt;*&amp;gt;tr&amp;gt;th,&lt;br /&gt;
 table.prettytable&amp;gt;tr&amp;gt;th&lt;br /&gt;
 {&lt;br /&gt;
   background: #ccccff;&lt;br /&gt;
   text-align: center;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 table.wikitable caption, table.prettytable caption { margin-left:inherit; margin-right:inherit; }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
/* Normal font styling for table row headers with scope=&amp;quot;row&amp;quot; tag */&lt;br /&gt;
.wikitable.plainrowheaders th[scope=row] {&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    text-align: left;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Lists in data cells are always left-aligned */&lt;br /&gt;
.wikitable td ul,&lt;br /&gt;
.wikitable td ol,&lt;br /&gt;
.wikitable td dl {&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    text-align: left;&lt;br /&gt;
}&lt;br /&gt;
/* ...unless they also use the hlist class */&lt;br /&gt;
.toc.hlist ul,&lt;br /&gt;
#toc.hlist ul,&lt;br /&gt;
.wikitable.hlist td ul,&lt;br /&gt;
.wikitable.hlist td ol,&lt;br /&gt;
.wikitable.hlist td dl {&lt;br /&gt;
    text-align: inherit;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Icons for medialist templates [[Template:Listen]],&lt;br /&gt;
   [[Template:Multi-listen_start]], [[Template:Video]],&lt;br /&gt;
   [[Template:Multi-video_start]] */&lt;br /&gt;
div.listenlist {&lt;br /&gt;
    background: url(&amp;quot;//upload.wikimedia.org/wikipedia/commons/4/47/Sound-icon.svg&amp;quot;) no-repeat scroll 0 0 transparent;&lt;br /&gt;
    background-size: 30px;&lt;br /&gt;
    padding-left: 40px;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Fix for hieroglyphs specificality issue in infoboxes ([[Phabricator:43869]]) */&lt;br /&gt;
table.mw-hiero-table td {&lt;br /&gt;
    vertical-align: middle;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Style rules for media list templates */&lt;br /&gt;
div.medialist {&lt;br /&gt;
    min-height: 50px;&lt;br /&gt;
    margin: 1em;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    background-position: top left;&lt;br /&gt;
    background-repeat: no-repeat;&lt;br /&gt;
}&lt;br /&gt;
div.medialist ul {&lt;br /&gt;
    list-style-type: none;&lt;br /&gt;
    list-style-image: none;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
}&lt;br /&gt;
div.medialist ul li {&lt;br /&gt;
    padding-bottom: 0.5em;&lt;br /&gt;
}&lt;br /&gt;
div.medialist ul li li {&lt;br /&gt;
    font-size: 91%;&lt;br /&gt;
    padding-bottom: 0;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Change the external link icon to an Adobe icon for all PDF files&lt;br /&gt;
   in browsers that support these CSS selectors, like Mozilla and Opera */&lt;br /&gt;
div#content a[href$=&amp;quot;.pdf&amp;quot;].external,&lt;br /&gt;
div#content a[href*=&amp;quot;.pdf?&amp;quot;].external,&lt;br /&gt;
div#content a[href*=&amp;quot;.pdf#&amp;quot;].external,&lt;br /&gt;
div#content a[href$=&amp;quot;.PDF&amp;quot;].external,&lt;br /&gt;
div#content a[href*=&amp;quot;.PDF?&amp;quot;].external,&lt;br /&gt;
div#content a[href*=&amp;quot;.PDF#&amp;quot;].external,&lt;br /&gt;
div#mw_content a[href$=&amp;quot;.pdf&amp;quot;].external,&lt;br /&gt;
div#mw_content a[href*=&amp;quot;.pdf?&amp;quot;].external,&lt;br /&gt;
div#mw_content a[href*=&amp;quot;.pdf#&amp;quot;].external,&lt;br /&gt;
div#mw_content a[href$=&amp;quot;.PDF&amp;quot;].external,&lt;br /&gt;
div#mw_content a[href*=&amp;quot;.PDF?&amp;quot;].external,&lt;br /&gt;
div#mw_content a[href*=&amp;quot;.PDF#&amp;quot;].external {&lt;br /&gt;
    background: url(&amp;quot;//upload.wikimedia.org/wikipedia/commons/2/23/Icons-mini-file_acrobat.gif&amp;quot;) no-repeat right;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    padding-right: 18px;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Change the external link icon to an Adobe icon anywhere the PDFlink class&lt;br /&gt;
   is used (notably Template:PDFlink). This works in IE, unlike the above. */&lt;br /&gt;
div#content span.PDFlink a,&lt;br /&gt;
div#mw_content span.PDFlink a {&lt;br /&gt;
    background: url(&amp;quot;//upload.wikimedia.org/wikipedia/commons/2/23/Icons-mini-file_acrobat.gif&amp;quot;) no-repeat right;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    padding-right: 18px;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Content in columns with CSS instead of tables ([[Template:Columns]]) */&lt;br /&gt;
div.columns-2 div.column {&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    float: left;&lt;br /&gt;
    width: 50%;&lt;br /&gt;
    min-width: 300px;&lt;br /&gt;
}&lt;br /&gt;
div.columns-3 div.column {&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    float: left;&lt;br /&gt;
    width: 33.3%;&lt;br /&gt;
    min-width: 200px;&lt;br /&gt;
}&lt;br /&gt;
div.columns-4 div.column {&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    float: left;&lt;br /&gt;
    width: 25%;&lt;br /&gt;
    min-width: 150px;&lt;br /&gt;
}&lt;br /&gt;
div.columns-5 div.column {&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    float: left;&lt;br /&gt;
    width: 20%;&lt;br /&gt;
    min-width: 120px;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Messagebox templates */&lt;br /&gt;
.messagebox {&lt;br /&gt;
    border: 1px solid #aaa;&lt;br /&gt;
    background-color: #f9f9f9;&lt;br /&gt;
    width: 80%;&lt;br /&gt;
    margin: 0 auto 1em auto;&lt;br /&gt;
    padding: .2em;&lt;br /&gt;
}&lt;br /&gt;
.messagebox.merge {&lt;br /&gt;
    border: 1px solid #c0b8cc;&lt;br /&gt;
    background-color: #f0e5ff;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
}&lt;br /&gt;
.messagebox.cleanup {&lt;br /&gt;
    border: 1px solid #9f9fff;&lt;br /&gt;
    background-color: #efefff;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
}&lt;br /&gt;
.messagebox.standard-talk {&lt;br /&gt;
    border: 1px solid #c0c090;&lt;br /&gt;
    background-color: #f8eaba;&lt;br /&gt;
    margin: 4px auto;&lt;br /&gt;
}&lt;br /&gt;
/* For old WikiProject banners inside banner shells. */&lt;br /&gt;
.mbox-inside .standard-talk,&lt;br /&gt;
.messagebox.nested-talk {&lt;br /&gt;
    border: 1px solid #c0c090;&lt;br /&gt;
    background-color: #f8eaba;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    margin: 2px 0;&lt;br /&gt;
    padding: 2px;&lt;br /&gt;
}&lt;br /&gt;
.messagebox.small {&lt;br /&gt;
    width: 238px;&lt;br /&gt;
    font-size: 85%;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    float: right;&lt;br /&gt;
    clear: both;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    margin: 0 0 1em 1em;&lt;br /&gt;
    line-height: 1.25em;&lt;br /&gt;
}&lt;br /&gt;
.messagebox.small-talk {&lt;br /&gt;
    width: 238px;&lt;br /&gt;
    font-size: 85%;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    float: right;&lt;br /&gt;
    clear: both;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    margin: 0 0 1em 1em;&lt;br /&gt;
    line-height: 1.25em;&lt;br /&gt;
    background: #F8EABA;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Cell sizes for ambox/tmbox/imbox/cmbox/ombox/fmbox/dmbox message boxes */&lt;br /&gt;
th.mbox-text, td.mbox-text {   /* The message body cell(s) */&lt;br /&gt;
    border: none;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    padding: 0.25em 0.9em;     /* 0.9em left/right */&lt;br /&gt;
    width: 100%;               /* Make all mboxes the same width regardless of text length */&lt;br /&gt;
}&lt;br /&gt;
td.mbox-image {                /* The left image cell */&lt;br /&gt;
    border: none;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    padding: 2px 0 2px 0.9em;  /* 0.9em left, 0px right */&lt;br /&gt;
    text-align: center;&lt;br /&gt;
}&lt;br /&gt;
td.mbox-imageright {           /* The right image cell */&lt;br /&gt;
    border: none;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    padding: 2px 0.9em 2px 0;  /* 0px left, 0.9em right */&lt;br /&gt;
    text-align: center;&lt;br /&gt;
}&lt;br /&gt;
td.mbox-empty-cell {           /* An empty narrow cell */&lt;br /&gt;
    border: none;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
    width: 1px;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Article message box styles */&lt;br /&gt;
table.ambox {&lt;br /&gt;
    margin: 0 10%;                  /* 10% = Will not overlap with other elements */&lt;br /&gt;
    border: 1px solid #aaa;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    border-left: 10px solid #1e90ff;  /* Default &amp;quot;notice&amp;quot; blue */&lt;br /&gt;
    background: #fbfbfb;&lt;br /&gt;
}&lt;br /&gt;
table.ambox + table.ambox {      /* Single border between stacked boxes. */&lt;br /&gt;
    margin-top: -1px;&lt;br /&gt;
}&lt;br /&gt;
.ambox th.mbox-text,&lt;br /&gt;
.ambox td.mbox-text {            /* The message body cell(s) */&lt;br /&gt;
    padding: 0.25em 0.5em;       /* 0.5em left/right */&lt;br /&gt;
}&lt;br /&gt;
.ambox td.mbox-image {           /* The left image cell */&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    padding: 2px 0 2px 0.5em;    /* 0.5em left, 0px right */&lt;br /&gt;
}&lt;br /&gt;
.ambox td.mbox-imageright {      /* The right image cell */&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    padding: 2px 0.5em 2px 0;    /* 0px left, 0.5em right */&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
table.ambox-notice {&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    border-left: 10px solid #1e90ff;    /* Blue */&lt;br /&gt;
}&lt;br /&gt;
table.ambox-speedy {&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    border-left: 10px solid #b22222;    /* Red */&lt;br /&gt;
    background: #fee;                   /* Pink */&lt;br /&gt;
}&lt;br /&gt;
table.ambox-delete {&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    border-left: 10px solid #b22222;    /* Red */&lt;br /&gt;
}&lt;br /&gt;
table.ambox-content {&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    border-left: 10px solid #f28500;    /* Orange */&lt;br /&gt;
}&lt;br /&gt;
table.ambox-style {&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    border-left: 10px solid #f4c430;    /* Yellow */&lt;br /&gt;
}&lt;br /&gt;
table.ambox-move {&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    border-left: 10px solid #9932cc;    /* Purple */&lt;br /&gt;
}&lt;br /&gt;
table.ambox-protection {&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    border-left: 10px solid #bba;       /* Gray-gold */&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Image message box styles */&lt;br /&gt;
table.imbox {&lt;br /&gt;
    margin: 4px 10%;&lt;br /&gt;
    border-collapse: collapse;&lt;br /&gt;
    border: 3px solid #1e90ff;    /* Default &amp;quot;notice&amp;quot; blue */&lt;br /&gt;
    background: #fbfbfb;&lt;br /&gt;
}&lt;br /&gt;
.imbox .mbox-text .imbox {  /* For imboxes inside imbox-text cells. */&lt;br /&gt;
    margin: 0 -0.5em;       /* 0.9 - 0.5 = 0.4em left/right.        */&lt;br /&gt;
    display: block;         /* Fix for webkit to force 100% width.  */&lt;br /&gt;
}&lt;br /&gt;
.mbox-inside .imbox {       /* For imboxes inside other templates.  */&lt;br /&gt;
    margin: 4px;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
table.imbox-notice {&lt;br /&gt;
    border: 3px solid #1e90ff;    /* Blue */&lt;br /&gt;
}&lt;br /&gt;
table.imbox-speedy {&lt;br /&gt;
    border: 3px solid #b22222;    /* Red */&lt;br /&gt;
    background: #fee;             /* Pink */&lt;br /&gt;
}&lt;br /&gt;
table.imbox-delete {&lt;br /&gt;
    border: 3px solid #b22222;    /* Red */&lt;br /&gt;
}&lt;br /&gt;
table.imbox-content {&lt;br /&gt;
    border: 3px solid #f28500;    /* Orange */&lt;br /&gt;
}&lt;br /&gt;
table.imbox-style {&lt;br /&gt;
    border: 3px solid #f4c430;    /* Yellow */&lt;br /&gt;
}&lt;br /&gt;
table.imbox-move {&lt;br /&gt;
    border: 3px solid #9932cc;    /* Purple */&lt;br /&gt;
}&lt;br /&gt;
table.imbox-protection {&lt;br /&gt;
    border: 3px solid #bba;       /* Gray-gold */&lt;br /&gt;
}&lt;br /&gt;
table.imbox-license {&lt;br /&gt;
    border: 3px solid #88a;       /* Dark gray */&lt;br /&gt;
    background: #f7f8ff;          /* Light gray */&lt;br /&gt;
}&lt;br /&gt;
table.imbox-featured {&lt;br /&gt;
    border: 3px solid #cba135;    /* Brown-gold */&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Category message box styles */&lt;br /&gt;
table.cmbox {&lt;br /&gt;
    margin: 3px 10%;&lt;br /&gt;
    border-collapse: collapse;&lt;br /&gt;
    border: 1px solid #aaa;&lt;br /&gt;
    background: #DFE8FF;    /* Default &amp;quot;notice&amp;quot; blue */&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
table.cmbox-notice {&lt;br /&gt;
    background: #D8E8FF;    /* Blue */&lt;br /&gt;
}&lt;br /&gt;
table.cmbox-speedy {&lt;br /&gt;
    margin-top: 4px;&lt;br /&gt;
    margin-bottom: 4px;&lt;br /&gt;
    border: 4px solid #b22222;    /* Red */&lt;br /&gt;
    background: #FFDBDB;          /* Pink */&lt;br /&gt;
}&lt;br /&gt;
table.cmbox-delete {&lt;br /&gt;
    background: #FFDBDB;    /* Red */&lt;br /&gt;
}&lt;br /&gt;
table.cmbox-content {&lt;br /&gt;
    background: #FFE7CE;    /* Orange */&lt;br /&gt;
}&lt;br /&gt;
table.cmbox-style {&lt;br /&gt;
    background: #FFF9DB;    /* Yellow */&lt;br /&gt;
}&lt;br /&gt;
table.cmbox-move {&lt;br /&gt;
    background: #E4D8FF;    /* Purple */&lt;br /&gt;
}&lt;br /&gt;
table.cmbox-protection {&lt;br /&gt;
    background: #EFEFE1;    /* Gray-gold */&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Other pages message box styles */&lt;br /&gt;
table.ombox {&lt;br /&gt;
    margin: 4px 10%;&lt;br /&gt;
    border-collapse: collapse;&lt;br /&gt;
    border: 1px solid #aaa;       /* Default &amp;quot;notice&amp;quot; gray */&lt;br /&gt;
    background: #f9f9f9;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
table.ombox-notice {&lt;br /&gt;
    border: 1px solid #aaa;       /* Gray */&lt;br /&gt;
}&lt;br /&gt;
table.ombox-speedy {&lt;br /&gt;
    border: 2px solid #b22222;    /* Red */&lt;br /&gt;
    background: #fee;             /* Pink */&lt;br /&gt;
}&lt;br /&gt;
table.ombox-delete {&lt;br /&gt;
    border: 2px solid #b22222;    /* Red */&lt;br /&gt;
}&lt;br /&gt;
table.ombox-content {&lt;br /&gt;
    border: 1px solid #f28500;    /* Orange */&lt;br /&gt;
}&lt;br /&gt;
table.ombox-style {&lt;br /&gt;
    border: 1px solid #f4c430;    /* Yellow */&lt;br /&gt;
}&lt;br /&gt;
table.ombox-move {&lt;br /&gt;
    border: 1px solid #9932cc;    /* Purple */&lt;br /&gt;
}&lt;br /&gt;
table.ombox-protection {&lt;br /&gt;
    border: 2px solid #bba;       /* Gray-gold */&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Talk page message box styles */&lt;br /&gt;
table.tmbox {&lt;br /&gt;
    margin: 4px 10%;&lt;br /&gt;
    border-collapse: collapse;&lt;br /&gt;
    border: 1px solid #c0c090;    /* Default &amp;quot;notice&amp;quot; gray-brown */&lt;br /&gt;
    background: #f8eaba;&lt;br /&gt;
}&lt;br /&gt;
.mediawiki .mbox-inside .tmbox { /* For tmboxes inside other templates. The &amp;quot;mediawiki&amp;quot; class ensures that */&lt;br /&gt;
    margin: 2px 0;               /* this declaration overrides other styles (including mbox-small above)   */&lt;br /&gt;
    width: 100%;                 /* For Safari and Opera */&lt;br /&gt;
}&lt;br /&gt;
.mbox-inside .tmbox.mbox-small { /* &amp;quot;small&amp;quot; tmboxes should not be small when  */&lt;br /&gt;
    line-height: 1.5em;          /* also &amp;quot;nested&amp;quot;, so reset styles that are   */&lt;br /&gt;
    font-size: 100%;             /* set in &amp;quot;mbox-small&amp;quot; above.                */&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
table.tmbox-speedy {&lt;br /&gt;
    border: 2px solid #b22222;    /* Red */&lt;br /&gt;
    background: #fee;             /* Pink */&lt;br /&gt;
}&lt;br /&gt;
table.tmbox-delete {&lt;br /&gt;
    border: 2px solid #b22222;    /* Red */&lt;br /&gt;
}&lt;br /&gt;
table.tmbox-content {&lt;br /&gt;
    border: 2px solid #f28500;    /* Orange */&lt;br /&gt;
}&lt;br /&gt;
table.tmbox-style {&lt;br /&gt;
    border: 2px solid #f4c430;    /* Yellow */&lt;br /&gt;
}&lt;br /&gt;
table.tmbox-move {&lt;br /&gt;
    border: 2px solid #9932cc;    /* Purple */&lt;br /&gt;
}&lt;br /&gt;
table.tmbox-protection,&lt;br /&gt;
table.tmbox-notice {&lt;br /&gt;
    border: 1px solid #c0c090;    /* Gray-brown */&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Disambig and set index box styles */&lt;br /&gt;
table.dmbox {&lt;br /&gt;
    clear: both;&lt;br /&gt;
    margin: 0.9em 1em;&lt;br /&gt;
    border-top: 1px solid #ccc;&lt;br /&gt;
    border-bottom: 1px solid #ccc;&lt;br /&gt;
    background: transparent;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Footer and header message box styles */&lt;br /&gt;
table.fmbox {&lt;br /&gt;
    clear: both;&lt;br /&gt;
    margin: 0.2em 0;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    border: 1px solid #aaa;&lt;br /&gt;
    background: #f9f9f9;     /* Default &amp;quot;system&amp;quot; gray */&lt;br /&gt;
}&lt;br /&gt;
table.fmbox-system {&lt;br /&gt;
    background: #f9f9f9;&lt;br /&gt;
}&lt;br /&gt;
table.fmbox-warning {&lt;br /&gt;
    border: 1px solid #bb7070;  /* Dark pink */&lt;br /&gt;
    background: #ffdbdb;        /* Pink */&lt;br /&gt;
}&lt;br /&gt;
table.fmbox-editnotice {&lt;br /&gt;
    background: transparent;&lt;br /&gt;
}&lt;br /&gt;
/* Div based &amp;quot;warning&amp;quot; style fmbox messages. */&lt;br /&gt;
div.mw-warning-with-logexcerpt,&lt;br /&gt;
div.mw-lag-warn-high,&lt;br /&gt;
div.mw-cascadeprotectedwarning,&lt;br /&gt;
div#mw-protect-cascadeon,&lt;br /&gt;
div.titleblacklist-warning,&lt;br /&gt;
div.locked-warning {&lt;br /&gt;
    clear: both;&lt;br /&gt;
    margin: 0.2em 0;&lt;br /&gt;
    border: 1px solid #bb7070;&lt;br /&gt;
    background: #ffdbdb;&lt;br /&gt;
    padding: 0.25em 0.9em;&lt;br /&gt;
}&lt;br /&gt;
/* Div based &amp;quot;system&amp;quot; style fmbox messages.&lt;br /&gt;
   Used in [[MediaWiki:Readonly lag]]. */&lt;br /&gt;
div.mw-lag-warn-normal,&lt;br /&gt;
div.fmbox-system {&lt;br /&gt;
    clear: both;&lt;br /&gt;
    margin: 0.2em 0;&lt;br /&gt;
    border: 1px solid #aaa;&lt;br /&gt;
    background: #f9f9f9;&lt;br /&gt;
    padding: 0.25em 0.9em;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* These mbox-small classes must be placed after all other&lt;br /&gt;
   ambox/tmbox/ombox etc classes. &amp;quot;body.mediawiki&amp;quot; is so&lt;br /&gt;
   they override &amp;quot;table.ambox + table.ambox&amp;quot; above. */&lt;br /&gt;
body.mediawiki table.mbox-small {   /* For the &amp;quot;small=yes&amp;quot; option. */&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    clear: right;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    float: right;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    margin: 4px 0 4px 1em;&lt;br /&gt;
    width: 238px;&lt;br /&gt;
    font-size: 88%;&lt;br /&gt;
    line-height: 1.25em;&lt;br /&gt;
}&lt;br /&gt;
body.mediawiki table.mbox-small-left {   /* For the &amp;quot;small=left&amp;quot; option. */&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    margin: 4px 1em 4px 0;&lt;br /&gt;
    width: 238px;&lt;br /&gt;
    border-collapse: collapse;&lt;br /&gt;
    font-size: 88%;&lt;br /&gt;
    line-height: 1.25em;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Style for compact ambox */&lt;br /&gt;
/* Hide the images */&lt;br /&gt;
.compact-ambox table .mbox-image,&lt;br /&gt;
.compact-ambox table .mbox-imageright,&lt;br /&gt;
.compact-ambox table .mbox-empty-cell {&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
/* Remove borders, backgrounds, padding, etc. */&lt;br /&gt;
.compact-ambox table.ambox {&lt;br /&gt;
    border: none;&lt;br /&gt;
    border-collapse: collapse;&lt;br /&gt;
    background: transparent;&lt;br /&gt;
    margin: 0 0 0 1.6em !important;&lt;br /&gt;
    padding: 0 !important;&lt;br /&gt;
    width: auto;&lt;br /&gt;
    display: block;&lt;br /&gt;
}&lt;br /&gt;
body.mediawiki .compact-ambox table.mbox-small-left {&lt;br /&gt;
    font-size: 100%;&lt;br /&gt;
    width: auto;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
}&lt;br /&gt;
/* Style the text cell as a list item and remove its padding */&lt;br /&gt;
.compact-ambox table .mbox-text {&lt;br /&gt;
    padding: 0 !important;&lt;br /&gt;
    margin: 0 !important;&lt;br /&gt;
}&lt;br /&gt;
.compact-ambox table .mbox-text-span {&lt;br /&gt;
    display: list-item;&lt;br /&gt;
    line-height: 1.5em;&lt;br /&gt;
    list-style-type: square;&lt;br /&gt;
    list-style-image: url(//bits.wikimedia.org/static-current/skins/MonoBook/bullet.gif);&lt;br /&gt;
}&lt;br /&gt;
.skin-vector .compact-ambox table .mbox-text-span {&lt;br /&gt;
    list-style-type: disc;&lt;br /&gt;
    list-style-image: url(//bits.wikimedia.org/static-current/skins/Vector/images/bullet-icon.png)&lt;br /&gt;
}&lt;br /&gt;
/* Allow for hiding text in compact form */&lt;br /&gt;
.compact-ambox .hide-when-compact {&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Remove default styles for [[MediaWiki:Noarticletext]]. */&lt;br /&gt;
div.noarticletext {&lt;br /&gt;
    border: none;&lt;br /&gt;
    background: transparent;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Hide (formatting) elements from screen, but not from screenreaders */&lt;br /&gt;
.visualhide {&lt;br /&gt;
    position: absolute;&lt;br /&gt;
    left: -10000px;&lt;br /&gt;
    top: auto;&lt;br /&gt;
    width: 1px;&lt;br /&gt;
    height: 1px;&lt;br /&gt;
    overflow: hidden;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Bold save button */&lt;br /&gt;
#wpSave {&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* class hiddenStructure is defunct. See [[Wikipedia:hiddenStructure]] */&lt;br /&gt;
.hiddenStructure {&lt;br /&gt;
    display: inline !important;&lt;br /&gt;
    color: #f00;&lt;br /&gt;
    background-color: #0f0;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* suppress missing interwiki image links where #ifexist cannot&lt;br /&gt;
   be used due to high number of requests see .hidden-redlink on&lt;br /&gt;
   [[m:MediaWiki:Common.css]] */&lt;br /&gt;
.check-icon a.new {&lt;br /&gt;
    display: none;&lt;br /&gt;
    speak: none;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Removes underlines from certain links */&lt;br /&gt;
.nounderlines a,&lt;br /&gt;
.IPA a:link, .IPA a:visited {&lt;br /&gt;
    text-decoration: none !important;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Standard Navigationsleisten, aka box hiding thingy&lt;br /&gt;
   from .de.  Documentation at [[Wikipedia:NavFrame]]. */&lt;br /&gt;
div.NavFrame {&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    padding: 4px;&lt;br /&gt;
    border: 1px solid #aaa;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    border-collapse: collapse;&lt;br /&gt;
    font-size: 95%;&lt;br /&gt;
}&lt;br /&gt;
div.NavFrame + div.NavFrame {&lt;br /&gt;
    border-top-style: none;&lt;br /&gt;
    border-top-style: hidden;&lt;br /&gt;
}&lt;br /&gt;
div.NavPic {&lt;br /&gt;
    background-color: #fff;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    padding: 2px;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    float: left;&lt;br /&gt;
}&lt;br /&gt;
div.NavFrame div.NavHead {&lt;br /&gt;
    line-height: 1.6em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    background-color: #ccf;&lt;br /&gt;
    position: relative;&lt;br /&gt;
}&lt;br /&gt;
div.NavFrame p,&lt;br /&gt;
div.NavFrame div.NavContent,&lt;br /&gt;
div.NavFrame div.NavContent p {&lt;br /&gt;
    font-size: 100%;&lt;br /&gt;
}&lt;br /&gt;
div.NavEnd {&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
    line-height: 1px;&lt;br /&gt;
    clear: both;&lt;br /&gt;
}&lt;br /&gt;
a.NavToggle {&lt;br /&gt;
    position: absolute;&lt;br /&gt;
    top: 0;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    right: 3px;&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
    font-size: 90%;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Hatnotes and disambiguation notices */&lt;br /&gt;
.hatnote {&lt;br /&gt;
    font-style: italic;&lt;br /&gt;
}&lt;br /&gt;
.hatnote i {&lt;br /&gt;
    font-style: normal;&lt;br /&gt;
}&lt;br /&gt;
div.hatnote {&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    padding-left: 1.6em;&lt;br /&gt;
    margin-bottom: 0.5em;&lt;br /&gt;
}&lt;br /&gt;
div.hatnote + div.hatnote {&lt;br /&gt;
    margin-top: -0.5em;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Allow transcluded pages to display in lists rather than a table.&lt;br /&gt;
   Compatible in Firefox; incompatible in IE6. */&lt;br /&gt;
.listify td    { display: list-item; }&lt;br /&gt;
.listify tr    { display: block; }&lt;br /&gt;
.listify table { display: block; }&lt;br /&gt;
 &lt;br /&gt;
/* Geographical coordinates defaults. See [[Template:Coord/link]]&lt;br /&gt;
   for how these are used. The classes &amp;quot;geo&amp;quot;, &amp;quot;longitude&amp;quot;, and&lt;br /&gt;
   &amp;quot;latitude&amp;quot; are used by the [[Geo microformat]]. */&lt;br /&gt;
.geo-default, .geo-dms, .geo-dec  { display: inline; }&lt;br /&gt;
.geo-nondefault, .geo-multi-punct { display: none; }&lt;br /&gt;
.longitude, .latitude             { white-space: nowrap; }&lt;br /&gt;
 &lt;br /&gt;
/* When &amp;lt;div class=&amp;quot;nonumtoc&amp;quot;&amp;gt; is used on the table of contents,&lt;br /&gt;
   the ToC will display without numbers */&lt;br /&gt;
.nonumtoc .tocnumber {&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
.nonumtoc #toc ul,&lt;br /&gt;
.nonumtoc .toc ul {&lt;br /&gt;
    line-height: 1.5em;&lt;br /&gt;
    list-style: none none;&lt;br /&gt;
    margin: .3em 0 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
}&lt;br /&gt;
.hlist.nonumtoc #toc ul ul,&lt;br /&gt;
.hlist.nonumtoc .toc ul ul {&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    margin: 0;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Allow limiting of which header levels are shown in a TOC;&lt;br /&gt;
   &amp;lt;div class=&amp;quot;toclimit-3&amp;quot;&amp;gt;, for instance, will limit to&lt;br /&gt;
   showing ==headings== and ===headings=== but no further&lt;br /&gt;
   (as long as there are no =headings= on the page, which&lt;br /&gt;
   there shouldn't be according to the MoS). */&lt;br /&gt;
.toclimit-2 .toclevel-1 ul,&lt;br /&gt;
.toclimit-3 .toclevel-2 ul,&lt;br /&gt;
.toclimit-4 .toclevel-3 ul,&lt;br /&gt;
.toclimit-5 .toclevel-4 ul,&lt;br /&gt;
.toclimit-6 .toclevel-5 ul,&lt;br /&gt;
.toclimit-7 .toclevel-6 ul {&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Styling for Template:Quote */&lt;br /&gt;
blockquote.templatequote {&lt;br /&gt;
     margin-top: 0;&lt;br /&gt;
}&lt;br /&gt;
blockquote.templatequote div.templatequotecite {&lt;br /&gt;
    line-height: 1.5em;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    text-align: left;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    padding-left: 1.6em;&lt;br /&gt;
    margin-top: 0;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* User block messages */&lt;br /&gt;
div.user-block {&lt;br /&gt;
    padding: 5px;&lt;br /&gt;
    margin-bottom: 0.5em;&lt;br /&gt;
    border: 1px solid #A9A9A9;&lt;br /&gt;
    background-color: #FFEFD5;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Prevent line breaks in silly places:&lt;br /&gt;
   1) Where desired&lt;br /&gt;
   2) Links when we don't want them to&lt;br /&gt;
   3) Bold &amp;quot;links&amp;quot; to the page itself&lt;br /&gt;
   4) Ref tags with group names &amp;lt;ref group=&amp;quot;Note&amp;quot;&amp;gt; --&amp;gt; &amp;quot;[Note 1]&amp;quot; */&lt;br /&gt;
.nowrap,&lt;br /&gt;
.nowraplinks a,&lt;br /&gt;
.nowraplinks .selflink,&lt;br /&gt;
sup.reference a {&lt;br /&gt;
    white-space: nowrap;&lt;br /&gt;
}&lt;br /&gt;
/* But allow wrapping where desired: */&lt;br /&gt;
.wrap,&lt;br /&gt;
.wraplinks a {&lt;br /&gt;
    white-space: normal;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* For template documentation */&lt;br /&gt;
.template-documentation {&lt;br /&gt;
    clear: both;&lt;br /&gt;
    margin: 1em 0 0 0;&lt;br /&gt;
    border: 1px solid #aaa;&lt;br /&gt;
    background-color: #ecfcf4;&lt;br /&gt;
    padding: 1em;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Inline divs in ImageMaps (code borrowed from de.wiki) */&lt;br /&gt;
.imagemap-inline div {&lt;br /&gt;
    display: inline;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Increase the height of the image upload box */&lt;br /&gt;
#wpUploadDescription {&lt;br /&gt;
    height: 13em;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Minimum thumb width */&lt;br /&gt;
.thumbinner {&lt;br /&gt;
    min-width: 100px;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Makes the background of a framed image white instead of gray.&lt;br /&gt;
   Only visible with transparent images. */&lt;br /&gt;
div.thumb .thumbimage {&lt;br /&gt;
    background-color: #fff;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* The backgrounds for galleries. */&lt;br /&gt;
div#content .gallerybox div.thumb {&lt;br /&gt;
    /* Light gray padding */&lt;br /&gt;
    background-color: #F9F9F9;&lt;br /&gt;
}&lt;br /&gt;
/* Put a chequered background behind images, only visible if they have transparency.&lt;br /&gt;
   '.filehistory a img' and '#file img:hover' are handled by MediaWiki core (as of 1.19) */&lt;br /&gt;
.gallerybox .thumb img {&lt;br /&gt;
    background: #fff url(//upload.wikimedia.org/wikipedia/commons/5/5d/Checker-16x16.png) repeat;&lt;br /&gt;
}&lt;br /&gt;
/* But not on articles, user pages, portals or with opt-out. */&lt;br /&gt;
.ns-0 .gallerybox .thumb img,&lt;br /&gt;
.ns-2 .gallerybox .thumb img,&lt;br /&gt;
.ns-100 .gallerybox .thumb img,&lt;br /&gt;
.nochecker .gallerybox .thumb img {&lt;br /&gt;
    background: #fff;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Prevent floating boxes from overlapping any category listings,&lt;br /&gt;
   file histories, edit previews, and edit [Show changes] views. */&lt;br /&gt;
#mw-subcategories, #mw-pages, #mw-category-media,&lt;br /&gt;
#filehistory, #wikiPreview, #wikiDiff {&lt;br /&gt;
    clear: both;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
body.rtl #mw-articlefeedbackv5, body.rtl #mw-articlefeedback {&lt;br /&gt;
    display: block;   /* Override inline block mode */&lt;br /&gt;
    margin-bottom: 1em;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    clear: right;     /* Clear any info boxes that stick out */&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    float: right;     /* Prevents margin collapsing */&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Selectively hide headers in WikiProject banners */&lt;br /&gt;
.wpb .wpb-header             { display: none; }&lt;br /&gt;
.wpbs-inner .wpb .wpb-header { display: block; }     /* for IE */&lt;br /&gt;
.wpbs-inner .wpb .wpb-header { display: table-row; } /* for real browsers */&lt;br /&gt;
.wpbs-inner .wpb-outside     { display: none; }      /* hide things that should only display outside shells */&lt;br /&gt;
 &lt;br /&gt;
/* Styling for Abuse Filter tags */&lt;br /&gt;
.mw-tag-markers {&lt;br /&gt;
    font-family:sans-serif;&lt;br /&gt;
    font-style:italic;&lt;br /&gt;
    font-size:90%;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Hide stuff meant for accounts with special permissions. Made visible again in&lt;br /&gt;
   [[MediaWiki:Group-sysop.css]], [[MediaWiki:Group-accountcreator.css]],&lt;br /&gt;
   [[MediaWiki:Group-templateeditor.css]] and [[Mediawiki:Group-autoconfirmed.css]]. */&lt;br /&gt;
.sysop-show,&lt;br /&gt;
.accountcreator-show,&lt;br /&gt;
.templateeditor-show,&lt;br /&gt;
.autoconfirmed-show {&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
 * Hide the redlink generated by {{Editnotice}},&lt;br /&gt;
 * this overrides the &amp;quot;.sysop-show { display: none; }&amp;quot; above that applies&lt;br /&gt;
 * to the same link as well.&lt;br /&gt;
 *&lt;br /&gt;
 * See [[Phabricator:45013]].&lt;br /&gt;
 */&lt;br /&gt;
.ve-ui-mwNoticesPopupTool-item .editnotice-redlink, .mw-ve-editNotice .editnotice-redlink {&lt;br /&gt;
    display: none !important;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Remove bullets when there are multiple edit page warnings */&lt;br /&gt;
ul.permissions-errors &amp;gt; li {&lt;br /&gt;
    list-style: none none;&lt;br /&gt;
}&lt;br /&gt;
ul.permissions-errors {&lt;br /&gt;
    margin: 0;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* No linewrap on the labels of the login/signup page */&lt;br /&gt;
body.page-Special_UserLogin .mw-label label,&lt;br /&gt;
body.page-Special_UserLogin_signup .mw-label label {&lt;br /&gt;
    white-space: nowrap;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Pie chart test: Transparent borders */&lt;br /&gt;
.transborder {&lt;br /&gt;
    border: solid transparent;&lt;br /&gt;
}&lt;br /&gt;
* html .transborder {  /* IE6 */&lt;br /&gt;
    border: solid #000001;&lt;br /&gt;
    filter: chroma(color=#000001);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Styling for updated markers on watchlist, history and recent/related changes.&lt;br /&gt;
   Bullets are handled in skin-specific stylesheets. */&lt;br /&gt;
.updatedmarker {&lt;br /&gt;
    background-color: transparent;&lt;br /&gt;
    color: #006400;&lt;br /&gt;
}&lt;br /&gt;
li.mw-changeslist-line-watched .mw-title,&lt;br /&gt;
table.mw-changeslist-line-watched .mw-title,&lt;br /&gt;
table.mw-enhanced-watch .mw-enhanced-rctime {&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Generic class for Times-based serif, texhtml class for inline math */&lt;br /&gt;
.times-serif,&lt;br /&gt;
span.texhtml {&lt;br /&gt;
    font-family: &amp;quot;Nimbus Roman No9 L&amp;quot;, &amp;quot;Times New Roman&amp;quot;, Times, serif;&lt;br /&gt;
    font-size: 118%;&lt;br /&gt;
    line-height: 1;&lt;br /&gt;
}&lt;br /&gt;
span.texhtml {&lt;br /&gt;
    white-space: nowrap;&lt;br /&gt;
}&lt;br /&gt;
span.texhtml span.texhtml {&lt;br /&gt;
    font-size: 100%;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Force tabular and lining display for digits and texhtml */&lt;br /&gt;
.digits,&lt;br /&gt;
.texhtml {&lt;br /&gt;
    -moz-font-feature-settings: &amp;quot;lnum&amp;quot;, &amp;quot;tnum&amp;quot;;&lt;br /&gt;
    -webkit-font-feature-settings: &amp;quot;lnum&amp;quot;, &amp;quot;tnum&amp;quot;;&lt;br /&gt;
    font-feature-settings: &amp;quot;lnum&amp;quot;, &amp;quot;tnum&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Display tabs with 4 spaces, see [[Phabricator:59824]] and [[Phabricator:59825]] */&lt;br /&gt;
div.mw-geshi div,&lt;br /&gt;
div.mw-geshi div pre,&lt;br /&gt;
span.mw-geshi,&lt;br /&gt;
pre.source-css,&lt;br /&gt;
pre.source-javascript,&lt;br /&gt;
pre.source-lua {&lt;br /&gt;
    -moz-tab-size: 4;&lt;br /&gt;
    -o-tab-size: 4;&lt;br /&gt;
    tab-size: 4;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Fix styling of transcluded prefindex tables */&lt;br /&gt;
table#mw-prefixindex-list-table,&lt;br /&gt;
table#mw-prefixindex-nav-table {&lt;br /&gt;
    width: 98%;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* For portals, added 2011-12-07 -bv&lt;br /&gt;
   On wide screens, show these as two columns&lt;br /&gt;
   On narrow and mobile screens, let them collapse into a single column */&lt;br /&gt;
.portal-column-left {&lt;br /&gt;
    float: left;&lt;br /&gt;
    width: 50%;&lt;br /&gt;
}&lt;br /&gt;
.portal-column-right {&lt;br /&gt;
    float: right;&lt;br /&gt;
    width: 49%;&lt;br /&gt;
}&lt;br /&gt;
.portal-column-left-wide {&lt;br /&gt;
    float: left;&lt;br /&gt;
    width: 60%;&lt;br /&gt;
}&lt;br /&gt;
.portal-column-right-narrow {&lt;br /&gt;
    float: right;&lt;br /&gt;
    width: 39%;&lt;br /&gt;
}&lt;br /&gt;
.portal-column-left-extra-wide {&lt;br /&gt;
    float: left;&lt;br /&gt;
    width: 70%;&lt;br /&gt;
}&lt;br /&gt;
.portal-column-right-extra-narrow {&lt;br /&gt;
    float: right;&lt;br /&gt;
    width: 29%;&lt;br /&gt;
}&lt;br /&gt;
@media only screen and (max-width: 800px) {&lt;br /&gt;
    /* Decouple the columns on narrow screens */&lt;br /&gt;
    .portal-column-left,&lt;br /&gt;
    .portal-column-right,&lt;br /&gt;
    .portal-column-left-wide,&lt;br /&gt;
    .portal-column-right-narrow,&lt;br /&gt;
    .portal-column-left-extra-wide,&lt;br /&gt;
    .portal-column-right-extra-narrow {&lt;br /&gt;
        float: inherit;&lt;br /&gt;
        width: inherit;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* For announcements */&lt;br /&gt;
#bodyContent .letterhead {&lt;br /&gt;
    background-image:url('//upload.wikimedia.org/wikipedia/commons/e/e0/Tan-page-corner.png');&lt;br /&gt;
    background-repeat:no-repeat;&lt;br /&gt;
    padding: 2em;&lt;br /&gt;
    background-color: #faf9f2;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Tree style lists */&lt;br /&gt;
.treeview ul {&lt;br /&gt;
    padding: 0;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
}&lt;br /&gt;
.treeview li {&lt;br /&gt;
    padding: 0;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    list-style-type: none;&lt;br /&gt;
    list-style-image: none;&lt;br /&gt;
    zoom: 1; /* BE KIND TO IE6 */;&lt;br /&gt;
}&lt;br /&gt;
.treeview li li {&lt;br /&gt;
    background: url(&amp;quot;//upload.wikimedia.org/wikipedia/commons/f/f2/Treeview-grey-line.png&amp;quot;) no-repeat 0 -2981px;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    padding-left: 20px;&lt;br /&gt;
    text-indent: 0.3em;&lt;br /&gt;
}&lt;br /&gt;
.treeview li li.lastline {&lt;br /&gt;
    background-position: 0 -5971px&lt;br /&gt;
}&lt;br /&gt;
.treeview li.emptyline &amp;gt; ul {&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    margin-left: -1px;&lt;br /&gt;
}&lt;br /&gt;
.treeview li.emptyline &amp;gt; ul &amp;gt; li:first-child {&lt;br /&gt;
    background-position: 0 9px&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* hidden sortkey for tablesorter */&lt;br /&gt;
td .sortkey,&lt;br /&gt;
th .sortkey {&lt;br /&gt;
    display: none;&lt;br /&gt;
    speak: none;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Make it possible to hide checkboxes in &amp;lt;inputbox&amp;gt; */&lt;br /&gt;
.inputbox-hidecheckboxes form .inputbox-element {&lt;br /&gt;
    display: none !important;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Work-around for [[Phabricator:25965]] (Kaltura advertisement) */&lt;br /&gt;
.k-player .k-attribution {&lt;br /&gt;
    visibility: hidden;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Move 'play' button of video player to bottom left corner */&lt;br /&gt;
.PopUpMediaTransform a .play-btn-large {&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    top: auto;&lt;br /&gt;
    right: auto;&lt;br /&gt;
    bottom: 0;&lt;br /&gt;
    left: 0;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Workaround to keep editnotices readable in VE view.&lt;br /&gt;
   Long term, editnotices should become a core feature so that they can be designed responsive. */&lt;br /&gt;
.mw-ve-editNotice .mbox-image {&lt;br /&gt;
	display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* smart counters - allow up to #.#.# levels of counting. */&lt;br /&gt;
body { counter-reset: autocount-1 autocount-2 autocount-3; }&lt;br /&gt;
 &lt;br /&gt;
.autocount:before, .autocount-list ol li:before { counter-increment:autocount-1; content: counter(autocount-1) &amp;quot; &amp;quot;; color:green; }&lt;br /&gt;
.autocount-reset:before { counter-reset: autocount-1; }&lt;br /&gt;
.autocount .autocount:before, .autocount-list li ol li:before {&lt;br /&gt;
  counter-increment: autocount-2;&lt;br /&gt;
  content: counter(autocount-1)  &amp;quot;.&amp;quot; counter(autocount-2) &amp;quot; &amp;quot;;&lt;br /&gt;
  color:red;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
.autocount .autocount .autocount:before, .autocount-list li li ol li:before {&lt;br /&gt;
  counter-increment: autocount-3;&lt;br /&gt;
  content: counter(autocount-1) &amp;quot;.&amp;quot; counter(autocount-2) &amp;quot;.&amp;quot; counter(autocount-3) &amp;quot; &amp;quot;;&lt;br /&gt;
  color:green;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
.autocount-list ol { margin-left:1.5em; }&lt;br /&gt;
.autocount-list ol li { list-style:none; }&lt;br /&gt;
.autocount-list ol li:first-child { counter-reset: autocount-1; }&lt;br /&gt;
.autocount-list li ol li:first-child { counter-reset: autocount-2; }&lt;br /&gt;
.autocount-list li li ol li:first-child { counter-reset: autocount-3; }&lt;/div&gt;</summary>
		<author><name>SuperAdmin</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/Info_2&amp;diff=3595</id>
		<title>Laboratorium EEG/Info 2</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/Info_2&amp;diff=3595"/>
		<updated>2015-06-09T10:20:59Z</updated>

		<summary type="html">&lt;p&gt;SuperAdmin: /* Wyniki prezentacji */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
=Laboratorium EEG - grupa 2 - ćwiczenia=&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ogłoszenia bieżące ==&lt;br /&gt;
&lt;br /&gt;
We wtorek (09.06.15.) studenci będą mieli możliwość poprawienia jednej kartkówki.&lt;br /&gt;
&lt;br /&gt;
Terminy prezentacji wyników pracy:&lt;br /&gt;
* 15.05.2015, sala 4.59, w godzinach 12:00 - 15:00,&lt;br /&gt;
* 12.06.2015, sala 4.59, w godzinach 09:00 - 12:00.&lt;br /&gt;
&lt;br /&gt;
Propozycje ocen:&lt;br /&gt;
* 16.06.2015, sala 4.59, godzina 12:00.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Termin zajęć ==&lt;br /&gt;
Zajęcia odbywają się dwa razy w tygodniu, we wtorki w godzinach 12:15 - 14:45 oraz w piątki, w godzinach 09:30 - 12:00. Sala &amp;lt;b&amp;gt;4.59&amp;lt;/b&amp;gt;, ul. Pasteura 5 - &amp;lt;b&amp;gt;&amp;quot;nowy&amp;quot;&amp;lt;/b&amp;gt; budynek dydaktyczny Wydziału Fizyki UW.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Kontakt z prowadzącym ==&lt;br /&gt;
Zajęcia prowadzi mgr Tomasz Spustek, pokój 4.66, ul. Pasteura 5 - nowy, główny budynek dydaktyczny Wydziału Fizyki UW&lt;br /&gt;
&lt;br /&gt;
Preferowany sposób kontaktu - e-mail: tspus@fuw.edu.pl&lt;br /&gt;
&lt;br /&gt;
Możliwe jest zorganizowanie konsultacji z prowadzącym ćwiczenia, po uprzednim kontakcie e-mailowym.&lt;br /&gt;
&lt;br /&gt;
== Warunki zaliczenia ==&lt;br /&gt;
Ćwiczenia zostaną zaliczone osobom, które spełnią dwa niezwykle proste warunki:&lt;br /&gt;
* Posiadanie maksymalnie dwóch nieusprawiedliwionych nieobecności na ćwiczeniach,&lt;br /&gt;
* Posiadanie sumy punktów z dwóch prezentacji oraz ze wszystkich kartkówek nie mniejszej niż połowa punktów możliwych do zdobycia,&lt;br /&gt;
* Punkty będą przyznawane w sposób uwzględniający nie tylko stan wiedzy, ale także czynione postępy.&lt;br /&gt;
&lt;br /&gt;
* Osobom spełniającym powyższe warunki zaproponowana zostanie pozytywna ocena końcowa z Laboratorium.&lt;br /&gt;
* Osoby nie mające tego szczęścia, otrzymają ocenę negatywną.&lt;br /&gt;
&lt;br /&gt;
* Możliwe będzie poprawienie zaproponowanej oceny na wyższą poprzez zrealizowanie dodatkowego projektu. Jego cel zostanie ustalony indywidualnie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Wyniki kartkówek ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center; clear:both;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;11&amp;quot; style=&amp;quot;text-align: center;&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
!Numer indeksu&lt;br /&gt;
!Zadanie 1&lt;br /&gt;
!Zadanie 2&lt;br /&gt;
!Zadanie 3&lt;br /&gt;
!Zadanie 4&lt;br /&gt;
!Zadanie 5&lt;br /&gt;
!Zadanie 6&lt;br /&gt;
!Zadanie 7&lt;br /&gt;
!Zadanie 8&lt;br /&gt;
!Zadanie 9&lt;br /&gt;
!Zadanie 10&lt;br /&gt;
|-&lt;br /&gt;
| 317905&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
|-&lt;br /&gt;
| 335252&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,33&lt;br /&gt;
|-&lt;br /&gt;
| 322929&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,33&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,33&lt;br /&gt;
|-&lt;br /&gt;
| 306766&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
|-&lt;br /&gt;
| 264493&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
|-&lt;br /&gt;
| 320367&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
|-&lt;br /&gt;
| 334134&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,33&lt;br /&gt;
|-&lt;br /&gt;
| 335240&lt;br /&gt;
| 0,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
|-&lt;br /&gt;
| 290829&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,66&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin:10px 10px 10px 10px; padding:10px;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:left;&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
!#&lt;br /&gt;
!Zagadnienia sprawdzane na kartkówkach&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Manipulacja wierszami i kolumnami macierzy (zmiana kolejności elementów).&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Instrukcje warunkowe oraz rekurencja (silnia).&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| Manipulacja łańcuchami znaków oraz tworzenie prostej struktury (konwersja zapisu czasu).&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| Zaawansowane przekształcenia macierzowe (macierz zawierająca elementy większe od średniej).&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| Proste zagadnienia numeryczne (losowanie liczb spełniających warunek, przeszukiwanie macierzy).&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| Wczytywanie danych z plików tekstowych do struktur.&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| Wczytywanie zapisów EEG (pliki .raw) do struktur.&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| Operacje macierzowe (elementy zawierające się w dwóch macierzach).&lt;br /&gt;
|-&lt;br /&gt;
| 9&lt;br /&gt;
| Wczytywanie danych z plików tekstowych do struktur (ponownie).&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| Operacje macierzowe (iloczyn zewnętrzny).&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wyniki prezentacji==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center; clear:both&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center; float: left;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;11&amp;quot; style=&amp;quot;text-align: center;&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
!Numer indeksu&lt;br /&gt;
!Prezentacja 1&lt;br /&gt;
!Prezentacja 2&lt;br /&gt;
!Projekt&lt;br /&gt;
|-&lt;br /&gt;
| 317905&lt;br /&gt;
| 1,00&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 335252&lt;br /&gt;
| 1,00&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 322929&lt;br /&gt;
| 1,00&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 306766&lt;br /&gt;
| 1,00&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 264493&lt;br /&gt;
| 1,00&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 320367&lt;br /&gt;
| 1,00&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 334134&lt;br /&gt;
| 1,00&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 335240&lt;br /&gt;
| 1,00&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 290829&lt;br /&gt;
| 0,50&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>SuperAdmin</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=TI/Programowanie_dla_Fizyk%C3%B3w_Medycznych:Klasy&amp;diff=3551</id>
		<title>TI/Programowanie dla Fizyków Medycznych:Klasy</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=TI/Programowanie_dla_Fizyk%C3%B3w_Medycznych:Klasy&amp;diff=3551"/>
		<updated>2015-06-08T17:15:00Z</updated>

		<summary type="html">&lt;p&gt;SuperAdmin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Klasy==&lt;br /&gt;
&lt;br /&gt;
Klasy są związane z programowanie zorientowanym obiektowo (Object Oriented Programming). Dotąd pisane przez nas programy składały się z ciągu instrukcji, które były wykonywane jedna za drugą, niektóre wiele razy lub tylko przy spełnieniu pewnych warunków. OOP wprowadza nowe podejście do programowania - o programie staramy się myśleć jak o modelu rzeczywistości. Jak ten model będzie wyglądał zależy od rozważanego problemu, jeśli na przykład będziemy pisać program dotyczący pracy banku pojawią się w nim takie obiekty jak: klient, kasjer, konto, kredyt czy lokata - każdy z tych obiektów reprezentuje inną klasę z którą wiążą się pewne możliwe działania (metody klasy) - na przykład kasjer może obsłużyć danego klienta, lokata może zostać otwarta, a konto zapytane o stan. Istnieje prosta reguła mówiąca jak wyszczególnić klasy występujące w danym problemie: opiszmy słownie rozważane zagadnienie, podkreślmy wszystkie rzeczowniki - to będą klasy i wszystkie czasowniki - to będą metody danych klas. Szybko można zauważyć, że niektóre klasy mają ze sobą coś wspólnego na przykład zarówno kasjer jak i klient są osobami, zatem mają imię i nazwisko - w programowaniu obiektowym o takiej zależności mówi się, że kasjer JEST osobą i klient JEST osobą, a realizuje się ją przez dziedziczenie - klasa kasjer i klasa klient dziedziczą po klasie osoba. Klasa osoba może dostarczać pewnych metod - na przykład podajImię lub podajNazwisko - przy zastosowaniu dziedziczenia klasy pochodne (podklasy) także będą miały te metody. Dodatkowo podklasy mogą przesłaniać metody zdefiniowane w nadklasie definiując metody o tej samej nazwie co metody nadklasy, wtedy te same metody wywołane na rzecz klienta i kasjera będą miały różny skutek - ten mechanizm nazywany jest polimorfizmem. Kolejną zaletą programowania obiektowego jest łatwość wielokrotnego używania kodu. Gdy napiszemy i przetestujemy jakiś fragment naszego projektu to chcielibyśmy aby już nigdy nie trzeba było go zmieniać, aby przypadkiem czegoś nie uszkodzić, ale z drugiej strony zależy nam na łatwej modyfikacji na wypadek pojawienia się nowych wymagań projektu - te dwa dążenia są w oczywisty sposób sprzeczne. Ale mechanizm dziedziczenia pozwala zaspokoić oba wymogi - nowe funkcjonalności realizujemy w klasach dziedziczących po już istniejących, w ten sposób nie modyfikujemy napisanego raz kodu, a z drugiej strony łatwo rozbudowujemy nasz projekt. &lt;br /&gt;
Po tym krótkim wstępie ideowym przejdziemy do opisu tworzenia klas w Pythonie. Klasy definiuje się za pomocą słowa kluczowego class, po nim następuje nazwa klasy, w nawiasie lista klas po których dziedziczy tworzona klasa i dwukropek:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class A(object):&lt;br /&gt;
    pass&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Klasa w przykładzie dziedziczy po object, nie jest to wymagane, ale klasy, które nie dziedziczą po object są klasami Pythona w starym stylu i nie posiadają części funkcjonalności, która będzie tu opisywana.&lt;br /&gt;
W ciele klasy możemy definiować różne metody. Określone metody rozpoczynające się od __ są nazywane metodami magicznymi, gdyż Python będzie je wywoływał niejawnie przy różnych okazjach. Najczęściej stosowaną metodą magiczną jest konstruktor (__init__) - metoda wywoływana przy tworzeniu obiektu - jeśli nie podamy konstruktora to jest generowany domyślny bezargumentowy konstruktor, który wywołuje bezargumentowe konstruktory nadklas. Należy pamiętać, że gdy sami definiujemy konstruktor musi on wywołać konstruktory nadklas. W innych językach programowania występuje mechanizm przeładowywania nazw funkcji - definiuje się wiele funkcji o tych samych nazwach ale różnych parametrach i w czasie wywołania na podstawie listy argumentów wywoływana jest odpowiednia funkcja, takie działanie jest niemożliwe w Pythonie - w szczególności jeśli chcemy mieć &amp;quot;różne konstruktory&amp;quot; klasy (np. przyjmujący liczbę całkowitą, dwie liczby zmiennoprzecinkowe i bezparametrowy to musimy wykorzystać mechanizm domyślnych argumentów lub sprawdzania typów przekazanych argumentów, napisanie dwóch konstruktorów spowoduje, że tylko ostatni będzie widoczny). Pierwszym argumentem wszystkich metod klasy musi być zmienna na którą zostanie przypisana referencja do obiektu na rzecz którego została wywołana dana metoda (zwyczajowo nazywa się ją self):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class A(object):&lt;br /&gt;
    y = 5&lt;br /&gt;
    def __init__(self, x = 0):&lt;br /&gt;
        super(A, self).__init__()&lt;br /&gt;
        self.x = x&lt;br /&gt;
    def f(self, z):&lt;br /&gt;
        print self.x, self.y, z&lt;br /&gt;
        &lt;br /&gt;
print A.y #sięganie do zmiennej klasowej y przez klasę, a nie obiekt klasy&lt;br /&gt;
a = A() #tworzenie obiekty klasy konstruktorem &amp;quot;bezargumentowym&amp;quot;&lt;br /&gt;
b = A(5) #tworzenie obiekty klasy konstruktorem &amp;quot;jednoargumentowym&amp;quot;&lt;br /&gt;
a.f(2) #wywołanie metody f na rzecz obiektu a&lt;br /&gt;
A.f(a, 2) #alternatywna forma powyższego wywołania&lt;br /&gt;
b.f(2) #wywołanie metody f na rzecz obiektu b&lt;br /&gt;
A.f(b, 2) #alternatywna forma powyższego wywołania&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
W powyższym przykładzie tworzymy klasę A, która dziedziczy po object, wewnątrz niej zmienną y, która jest klasowa (wspólna dla wszystkich obiektów danej klasy, można się do niej dostać bezpośrednio przez klasę - nie potrzeba obiektu tej klasy). Z kolei zmienna x jest tworzona na poziomie instancji (obiektu) klasy, oznacza to, że każdy obiekt, będzie miał swoją zmienną x - takie zmienne mogą być tworzone w metodach klasy i ich nazwy muszą być poprzedzone self. W komentarzach opisy konstruktorów są wzięte w cudzysłowy, gdyż tak na prawdę w obu wywołaniach jest to ten sam konstruktor (z przyczyn opisanych wcześniej). Tworzenie obiektów klas odbywa się przez podanie nazwy klasy i w nawiasie argumentów konstruktora - taka konstrukcja zwraca obiekt danej klasy, można go przypisać na zmienną i następnie na nim wywoływać metody klasy przy pomocy konstrukcji z kropką: obiekt.metoda(argumenty) w tym zapisie niejawnie na zmienną self przekazywany jest obiekt na którym została wywołana metoda, alternatywna konstrukcja jawnie przekazuje obiekt do self.&lt;br /&gt;
Zobaczmy teraz prosty przykład dziedziczenia:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class X(object):&lt;br /&gt;
    def d(self):&lt;br /&gt;
        print 'metoda d z klasy X'&lt;br /&gt;
&lt;br /&gt;
class B(object):&lt;br /&gt;
    def c(self):&lt;br /&gt;
        print 'metoda c z klasy B'&lt;br /&gt;
        &lt;br /&gt;
class A(X):&lt;br /&gt;
    def a(self):&lt;br /&gt;
        print 'metoda a z klasy A'&lt;br /&gt;
    def b(self):&lt;br /&gt;
        print 'metoda b z klasy A'&lt;br /&gt;
&lt;br /&gt;
class C(B):&lt;br /&gt;
    def a(self):&lt;br /&gt;
        print 'metoda a z klasy C'&lt;br /&gt;
    def b(self):&lt;br /&gt;
        print 'metoda b z klasy C'&lt;br /&gt;
    def d(self):&lt;br /&gt;
        print 'metoda d z klasy C'&lt;br /&gt;
    def e(self):&lt;br /&gt;
        print 'metoda e z klasy C'&lt;br /&gt;
&lt;br /&gt;
class D(A, C):&lt;br /&gt;
    def a(self):&lt;br /&gt;
        print 'metoda a z klasy D'&lt;br /&gt;
&lt;br /&gt;
d = D()&lt;br /&gt;
d.a()&lt;br /&gt;
d.b()&lt;br /&gt;
d.c()&lt;br /&gt;
d.d()&lt;br /&gt;
d.e()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
wynikiem wykonania tego skryptu jest:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
metoda a z klasy D&lt;br /&gt;
metoda b z klasy A&lt;br /&gt;
metoda c z klasy B&lt;br /&gt;
metoda d z klasy X&lt;br /&gt;
metoda e z klasy C&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Teraz parę słów wyjaśnienia: gdy wywołujemy metodę na obiekcie pewnej klasy to jej definicja jest poszukiwana najpierw w danej klasie jeśli zostanie tu znaleziona to jest wywoływana i poszukiwania się kończą (tak jest w przypadku d.a() - mimo, że w klasach A i C były metody a() to kasa D nadpisała tą metodę i metoda nadpisana jest wywoływana), jeśli poszukiwana metoda nie zostanie znaleziona w danej klasie to przeszukiwane są nadklasy rozpoczynając od tej najbardziej na lewo w definicji naszej klasy, jeśli w niej zostanie znaleziona pożądana metoda to zostanie ona wywołana (tak jest w przypadku d.b()), jeśli nie to przeszukiwane są rekurencyjnie klasy bazowe pierwszej nadklasy naszej klasy (znów od lewej) (w wyniku tych poszukiwań zostanie znaleziona metoda d.d() z klasy X), jeśli w pierwszej nadklasie i jej klasach bazowych nie znaleziono danej metody to przechodzimy do poszukiwania w drugiej nadklasie (w tym przypadku jest to klasa C) i tu zostaną znalezione metody d.c() i d.e(). Warto zwrócić uwagę na fakt, że kolejność podawania klas bazowych jest znacząca, dziedziczenie po wielu klasach często sprawia problemu i dlatego w niektórych jeżykach programowania (np. Java) występuje tylko pojedyncze dziedziczenie i dodatkowo mechanizm interfejsów zapewniający, że definiowana klasa implementuje pewne określone metody. Zmieniając w przykładzie kolejność klas po których dziedziczy klasa D dostajemy wynik:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; &lt;br /&gt;
metoda a z klasy D&lt;br /&gt;
metoda b z klasy C&lt;br /&gt;
metoda c z klasy B&lt;br /&gt;
metoda d z klasy C&lt;br /&gt;
metoda e z klasy C&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Tak na prawdę to przed przeszukiwaniem klasy, której instancją jest dany obiekt przeszukiwana jest jeszcze sama instancja - okazuje się, że w Pythonie nawet po stworzeniu obiektu można dodać do niego metody lub atrybuty:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class D(A, C):&lt;br /&gt;
    def a(self):&lt;br /&gt;
        print 'metoda a z klasy D'&lt;br /&gt;
&lt;br /&gt;
def a():&lt;br /&gt;
    print 'metoda a dodana do instancji'&lt;br /&gt;
&lt;br /&gt;
d = D()&lt;br /&gt;
d.a = a&lt;br /&gt;
d.a()&lt;br /&gt;
d.b()&lt;br /&gt;
d.c()&lt;br /&gt;
d.d()&lt;br /&gt;
d.e()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Teraz metoda d.a() jest znaleziona w instancji, a nie w klasie D i wynik tego skryptu jest następujący:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; &lt;br /&gt;
metoda a dodana do instancji&lt;br /&gt;
metoda b z klasy A&lt;br /&gt;
metoda c z klasy B&lt;br /&gt;
metoda d z klasy X&lt;br /&gt;
metoda e z klasy C&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Atrybuty klas można też definiować w bardzo elegancki sposób za pomocą funkcji wbudowanej property. Pozwala ona definiować atrybuty tylko do odczytu, a także definiować funkcje, które mają być wywołane w celu obliczenia wartości żądanego atrybutu. Dla przykładu jeśli chcemy mieć atrybut x, który będzie tylko do odczytu możemy napisać:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class A(object):&lt;br /&gt;
    def __init__(self, x):&lt;br /&gt;
        super(A, self).__init__()&lt;br /&gt;
        self._x = x&lt;br /&gt;
    def getX(self):&lt;br /&gt;
        return self._x&lt;br /&gt;
    x = property(getX)&lt;br /&gt;
&lt;br /&gt;
a = A(5)&lt;br /&gt;
print a.x&lt;br /&gt;
a.x = 6&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
W Pythonie obowiązuje konwencja, że atrybuty rozpoczynające się od _ są prywatne i nie należy próbować ich odczytywać ani modyfikować poza klasą, jest to jednak tylko konwencja. Funkcja property przyjmuje 4 argumenty: pierwszy - obowiązkowy, podający funkcję, która służy do pobrania wartości danego atrybutu, pozostałe opcjonalne - fset - metoda do ustawiania wartości atrybutu (wykorzystywana w przypisaniach), fdel - metoda do usuwania atrybutu (wykorzystywana w poleceniu del) i doc - przyjmujący napis będący opisem danego atrybutu (będzie widoczny w helpie do klasy).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class A(object):&lt;br /&gt;
    def __init__(self, x):&lt;br /&gt;
        super(A, self).__init__()&lt;br /&gt;
        self._x = x&lt;br /&gt;
    def getX(self):&lt;br /&gt;
        return self._x&lt;br /&gt;
    def setX(self, x):&lt;br /&gt;
        self._x = x&lt;br /&gt;
    def delX(self):&lt;br /&gt;
        del self._x&lt;br /&gt;
    x = property(getX, setX, delX, &amp;quot;Zmienna x&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
a = A(5)&lt;br /&gt;
print a.x&lt;br /&gt;
a.x = 2&lt;br /&gt;
del a.x&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Opiszę teraz szereg metod magicznych powalających naszej klasie na upodobnianie się do obiektów wbudowanych w Pythona.&lt;br /&gt;
&lt;br /&gt;
Aby umożliwić operacje algebraiczne na obiektach naszej klasy należy definiować metody __add__(), __sub__(), __mul__(), __div__(), __floodiv()__ czy __pow__() dla odpowiednio operacji +, -, *, /, // i **, podobnie dla operatorów logicznych and, or i xor możemy zdefiniować metody __and__(), __or__() i __xor__(), wszystkie te metody przyjmują (poza self), jeden parametr będący drugim argumentem operatora, na przykład (na self zostanie przekazany w1, a na w w2):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class Wektor(object):&lt;br /&gt;
    def __init__(self, x, y):&lt;br /&gt;
        super(Wektor, self).__init__()&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
    def __add__(self, w):&lt;br /&gt;
        return Wektor(self.x + w.x, self.y + w.y)&lt;br /&gt;
&lt;br /&gt;
w1 = Wektor(1, 3)&lt;br /&gt;
w2 = Wektor(2, 5)&lt;br /&gt;
w3 = w1 + w2&lt;br /&gt;
print w3.x, w3.y&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Można też przedefiniować operatory typy += - odpowiednie metody mają nazwy rozpoczynające się od __i (te metody powinny zwracać self):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class Wektor(object):&lt;br /&gt;
    def __init__(self, x, y):&lt;br /&gt;
        super(Wektor, self).__init__()&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
    def __iadd__(self, w):&lt;br /&gt;
        self.x += w.x&lt;br /&gt;
        self.y += w.y&lt;br /&gt;
        return self&lt;br /&gt;
&lt;br /&gt;
w1 = Wektor(1, 3)&lt;br /&gt;
w2 = Wektor(2, 5)&lt;br /&gt;
w1 += w2&lt;br /&gt;
print w1.x, w1.y&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Z kolei operatory jednoargumentowe (-, +, ~ i abs()) można przedefiniować za pomocą metod __neg__(), __pos__(), __invert__() i __abs__() - nie przyjmują żadnych argumentów poza self:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class Wektor(object):&lt;br /&gt;
    def __init__(self, x, y):&lt;br /&gt;
        super(Wektro, self).__init__()&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
    def __abs__(self):&lt;br /&gt;
        return (self.x ** 2 + self.y ** 2) ** 0.5&lt;br /&gt;
&lt;br /&gt;
w = Wektor(1, 3)&lt;br /&gt;
print abs(w)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Aby nasza klasa obsługiwała indeksowanie należy zdefiniować metody __getitem__(self, key), __setitem__(self, key, value) i __del__(self, key). W założeniu key jest kluczem pod którym przechowywana jest wartość, którą chcemy pobrać, ustawić czy usunąć. Jeśli key jest niepoprawnego typu to powinien zostać zgłoszony wyjątek TypeError, jeśli kluczowi key nie odpowiada, żadna wartość w naszej klasie, to powinien zostać zgłoszony wyjątek IndexError (jeśli nasza klasa jest sekwencją) lub KeyError (jeśli jest odwzorowaniem). Niech przykładem będzie klasa generująca elementy ciągu arytmetycznego. W przykładzie zaimplementowano klasę reprezentującą ciąg arytmetyczny, jeśli użytkownik ustawi jakąś wartość to dopóki jej nie usunie będzie zwracana ustawiona przez niego wartość zamiast wynikającej z definicji ciągu arytmetycznego:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class CiagArytmetyczny(object):&lt;br /&gt;
    def __init__(self, a0, r):&lt;br /&gt;
        super(CiagArytmetyczny, self).__init__()&lt;br /&gt;
        self.a0 = a0&lt;br /&gt;
        self.r = r&lt;br /&gt;
        self.zmienione = {}&lt;br /&gt;
    def sprawdzKlucz(self, key):&lt;br /&gt;
        if type(key) != type(1):&lt;br /&gt;
            raise TypeError&lt;br /&gt;
        if key &amp;lt; 0:&lt;br /&gt;
            raise IndexError&lt;br /&gt;
    def __getitem__(self, key):&lt;br /&gt;
        self.sprawdzKlucz(key)&lt;br /&gt;
        if key in self.zmienione:&lt;br /&gt;
            return self.zmienione[key]&lt;br /&gt;
        return self.a0 + (key - 1) * self.r&lt;br /&gt;
    def __setitem__(self, key, value):&lt;br /&gt;
        self.sprawdzKlucz(key)&lt;br /&gt;
        self.zmienione[key] = value&lt;br /&gt;
    def __delitem__(self, key):&lt;br /&gt;
        self.sprawdzKlucz(key)&lt;br /&gt;
        if key in self.zmienione:&lt;br /&gt;
            del self.zmienione[key]&lt;br /&gt;
&lt;br /&gt;
c = CiagArytmetyczny(0, 5)&lt;br /&gt;
print c[2]&lt;br /&gt;
c[2] = -11&lt;br /&gt;
print c[2]&lt;br /&gt;
del c[2]&lt;br /&gt;
print c[2]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Metoda __str__(self) jest wywoływana przez funkcję wbudowaną str, a __repr__(self) przez funkcję wbudowaną repr, pozwala to na kontrolowanie sposobu wypisywania obiektów naszej klasy:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class CiagArytmetyczny(object):&lt;br /&gt;
    def __init__(self, a0, r):&lt;br /&gt;
        super(CiagArytmetyczny, self).__init__()&lt;br /&gt;
        self.a0 = a0&lt;br /&gt;
        self.r = r&lt;br /&gt;
    def __str__(self):&lt;br /&gt;
        return &amp;quot;Ciąg arytmetyczny o wyrazie począrkowym &amp;quot; + str(self.a0) + &amp;quot; i różnicy &amp;quot; + str(self.r)&lt;br /&gt;
&lt;br /&gt;
c = CiagArytmetyczny(0, 5)&lt;br /&gt;
print str(c)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Można też zdefiniować operatory porządków: &amp;lt;, &amp;lt;=, ==, !=, &amp;gt; i &amp;gt;= przy pomocy metod __lt__(self, other), __le__(self, other), __eq__(self, other), __ne__(self, other), __gt__(self, other), __ge__(self, other), przykład:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class Ulamek(object):&lt;br /&gt;
    def __init__(self, licznik, mianownik):&lt;br /&gt;
        super(Ulamek, self).__init__()&lt;br /&gt;
        self.licznik = licznik&lt;br /&gt;
        self.mianownik = mianownik&lt;br /&gt;
    def __eq__(self, inny):&lt;br /&gt;
        return inny.mianownik * self.licznik == inny.licznik * self.mianownik&lt;br /&gt;
&lt;br /&gt;
u1 = Ulamek(1, 2)&lt;br /&gt;
u2 = Ulamek(5, 10)&lt;br /&gt;
if u1 == u2:&lt;br /&gt;
    print 'równe'&lt;br /&gt;
else:&lt;br /&gt;
    print 'różne'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Z kolei definiując metodę __call__(self, *args) sprawiamy, że obiekty naszej klasy można wywoływać tak jak funkcje:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class CiagArytmetyczny(object):&lt;br /&gt;
    def __init__(self, a0, r):&lt;br /&gt;
        super(CiagArytmetyczny, self).__init__()&lt;br /&gt;
        self.a0 = a0&lt;br /&gt;
        self.r = r&lt;br /&gt;
    def __call__(self, n):&lt;br /&gt;
        return self.a0 + self.r * (n - 1)&lt;br /&gt;
&lt;br /&gt;
c = CiagArytmetyczny(0, 5)&lt;br /&gt;
print c(5)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Definiując metodę __iter__(self) zwracającą obiekt, który będzie miał metodę next(self) zwracającą kolejne elementy tworzonej przez nas sekwencji i zgłaszającą wyjątek StopIteration gdy dojdziemy do końca sekwencji. W przykładzie obiekt sam jest swoim iteratorem - klasa CiagFibonacciego jest sekwencją po n pierwszych wyrazach ciągu Fibonacciego gdzie n jest zadawane w konstruktorze klasy:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class CiagFibonacciego(object):&lt;br /&gt;
    def __init__(self, n):&lt;br /&gt;
        super(CiagFibonacciego, self).__init__()&lt;br /&gt;
        self.n = n&lt;br /&gt;
    def __iter__(self):&lt;br /&gt;
        self.a = 0&lt;br /&gt;
        self.b = 1&lt;br /&gt;
        self.nn = self.n&lt;br /&gt;
        return self&lt;br /&gt;
    def next(self):&lt;br /&gt;
        if self.nn == 0:&lt;br /&gt;
            raise StopIteration&lt;br /&gt;
        self.nn -= 1&lt;br /&gt;
        tmp = self.a&lt;br /&gt;
        self.a, self.b = self.b, self.a + self.b&lt;br /&gt;
        return tmp&lt;br /&gt;
&lt;br /&gt;
fib = CiagFibonacciego(10)&lt;br /&gt;
for f in fib:&lt;br /&gt;
    print f&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Przydatne może być też zdefiniowanie metody __nonzero__(self), będzie ona wywoływana w przypadku wywołania funkcji bool lub przy testach logiczncyh:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class Wektor(object):&lt;br /&gt;
    def __init__(self, x, y):&lt;br /&gt;
        super(Wektor, self).__init__()&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
    def __nonzero__(self):&lt;br /&gt;
        return self.x != 0 or self.y != 0&lt;br /&gt;
&lt;br /&gt;
w = Wektor(1, 1)&lt;br /&gt;
if w:&lt;br /&gt;
    print 'niezerowy'&lt;br /&gt;
else:&lt;br /&gt;
    print 'zerowy'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Gdy nie ma zdefiniowanej funkcji __nonzero__(self) do badania wartości logicznej może być wykorzystana funkcja __len__(str) zwracająca długość sekwencji, przykład:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class Wektor(object):&lt;br /&gt;
    def __init__(self, x, y):&lt;br /&gt;
        super(Wektor, self).__init__()&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
    def __len__(self):&lt;br /&gt;
        return (self.x ** 2 + self.y ** 2) ** 0.5&lt;br /&gt;
&lt;br /&gt;
w = Wektor(1, 1)&lt;br /&gt;
if w:&lt;br /&gt;
    print 'niezerowy'&lt;br /&gt;
else:&lt;br /&gt;
    print 'zerowy'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Przydatne mogą okazać się też metody pozwalające na implementację rzutowania wywoływane przez funkcje wbudowane float, hex, int, long i oct: __float__(self), __hex__(self), __int__(self) i __oct__(self)&lt;br /&gt;
&lt;br /&gt;
Zdefiniowanie operatorów dla tworzonych przez nas klas pozwala wykorzystywać w pracy z nimi napisane wcześniej programy działające na przykład na liczbach (a także funkcje wbudowane Pythona takie jak sum):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class Wektor(object):&lt;br /&gt;
    def __init__(self, x, y):&lt;br /&gt;
        super(Wektor, self).__init__()&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
    def __add__(self, w):&lt;br /&gt;
        return Wektor(self.x + w.x, self.y + w.y)&lt;br /&gt;
    def __str__(self):&lt;br /&gt;
        return 'Wektor [' + str(self.x) + ', ' + str(self.y) + ']' &lt;br /&gt;
&lt;br /&gt;
A = [Wektor(1., 1.), Wektor(0., 7.), Wektor(-11., 12)]&lt;br /&gt;
print sum(A, Wektor(0., 0.))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadanie 1===&lt;br /&gt;
Napisz klasę reprezentującą drzewa binarne, niech ma następujące metody:&lt;br /&gt;
*konstruktor jednoargumentowy tworzący liść o zadanej wartości&lt;br /&gt;
*konstruktor umożliwiający stworzenie węzła o zadanej wartości i prawym lub lewym potomku&lt;br /&gt;
*wysokosc() - zwracającą wysokość drzewa&lt;br /&gt;
*szerokosc() - zwracającą szerokość drzewa&lt;br /&gt;
*liczbaWezlow() - zwracającą liczbę węzłów&lt;br /&gt;
*liczbaLisci() - zwracająca liczbę liści w drzewie&lt;br /&gt;
*wypisz(porzadek) - wypisuje drzewo w kolejności zadanej przez napis początek, możliwe wartości: 'preLP', 'postLP', 'infLP', 'prePL', 'postPL' i 'infPL', gdy nie podano parametru porzadek niech będzie przyjmowany 'preLP', w przypadku podania innego napisu lub wartości nie będącej napisem niech będzie zgłaszany wyjątek&lt;br /&gt;
*czyIzomorficzne(drzewo) - zwracająca True gdy drzewo jest izomorficzne z self&lt;br /&gt;
*doListy() - zwracająca listę zawierającą wartości poszczególnych węzłów - indeksowanie na drzewie: lewy syn i-tego węzła ma indeks 2 * i, a prawy 2 * i + 1, korzeń ma indeks 1, przy takim indeksowaniu wartości drzewa można wygodnie trzymać na liście (na pozycji indeks - 1), niech pozycje którym nie odpowiadają żadne węzły mają wartość None, a zwracana lista niech nie ma zbędnych None na końcu&lt;br /&gt;
*zListy(lista) - klasowa metoda generująca drzewo na podstawie listy takiej jak opisana w poprzednim punkcie&lt;br /&gt;
*zdefiniować operatory logiczne or i and zwracające drzewo o wszystkich wartościach równych 0 i mające kształt będący odpowiednio sumą i częścią wspólną drzew będących argumentami&lt;br /&gt;
*zdefiniować operator + zwracający drzewo mające kształt będący sumą drzew będących argumentami, a w każdym węźle niech będzie suma wartości z odpowiednich węzłów z danych drzew (jeśli w jednym drzewie nie ma odpowiedniego węzła to kopiujemy wartość z odpowiedniego węzła drugiego drzewa)&lt;br /&gt;
===Zadanie 2===&lt;br /&gt;
Napisać klasę reprezentującą drzewo wyszukiwań binarnych, niech ma następujące metody:&lt;br /&gt;
*czyJestWartosc(wartosc) - zwraca True gdy wartosc jest w drzewie False w przeciwnym wypadku&lt;br /&gt;
*wstaw(wartosc) - wstawia wartosc do drzewa, jeśli wartosc jest już w drzewie to nie robi nic&lt;br /&gt;
*usun(wartosc) - usuwa wartość z drzewa, jeśli jej nie było to zwraca wyjatek&lt;br /&gt;
*czyPuse() - zwraca True gdy drzewo jest puste, False w przeciwnym wypadku&lt;br /&gt;
===Zadanie 3===&lt;br /&gt;
Napisz klasę reprezentującą wielomian, niech ma następujące metody:&lt;br /&gt;
*pochodna() - zwracająca wielomian reprezentujący pochodną danego&lt;br /&gt;
*calka() - zwracającą wielomian reprezentujący całkę z danego&lt;br /&gt;
*wartosc(x) - zwraca wartość wielomianu w punkcie x&lt;br /&gt;
*calka_oznaczona(x1, x2) - zwraca wartość całki oznaczonej od x1 do x2&lt;br /&gt;
*zdefiniować operatory +, -, * i wypisywanie&lt;br /&gt;
&lt;br /&gt;
Napisać klasę reprezentującą wyrażenia wymierne, niech ma następujące metody:&lt;br /&gt;
*wartosc(x) - zwraca wartość w punkcie x&lt;br /&gt;
===Zadanie 4===&lt;br /&gt;
Napisać klasę reprezentującą ciąg arytmetyczny, niech ma następujące metody:&lt;br /&gt;
*konstruktor bezparametrowy przyjmujący a_1 = 1 i r = 1&lt;br /&gt;
*konstruktory jedno i dwuargumentowe&lt;br /&gt;
*pobieranie a_n przez ciag[n], niech zwraca wyjątek gdy n &amp;lt;= 0&lt;br /&gt;
*ustawianie a_n przez ciag[n] = wartosc, jeśli ustawimy ręcznie wartość to przy kolejnym pobraniu a_n ta wartość ma być zwrócona&lt;br /&gt;
*usuwanie ustawionej ręcznie wartości przez del ciag[n]&lt;br /&gt;
*przedefiniować operatory + i - tak aby zwracały ciąg którego elementy są sumą i różnicą elementów danych ciagów&lt;br /&gt;
===Zadanie 5===&lt;br /&gt;
Napisać klasę po której będzie można się iterować i będzie ona sekwencją po ciągu liczb Fibonacciego, niech sekwencja przebiega po tylu liczbach jaką wartość podano w konstruktorze&lt;br /&gt;
===Zadanie 6===&lt;br /&gt;
Napisz program, który wczyta z plików listę miast, połączeń między nimi i odległości tych połączeń a następnie pozwoli wyszukiwać połączeń między zadanymi punktami o długości mniejszej niż zadana.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[&amp;quot;Programowanie dla Fizyków Medycznych&amp;quot;]]&lt;/div&gt;</summary>
		<author><name>SuperAdmin</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=TI/Programowanie_dla_Fizyk%C3%B3w_Medycznych:Klasy&amp;diff=3550</id>
		<title>TI/Programowanie dla Fizyków Medycznych:Klasy</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=TI/Programowanie_dla_Fizyk%C3%B3w_Medycznych:Klasy&amp;diff=3550"/>
		<updated>2015-06-08T17:13:23Z</updated>

		<summary type="html">&lt;p&gt;SuperAdmin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Klasy==&lt;br /&gt;
DDD&lt;br /&gt;
Klasy są związane z programowanie zorientowanym obiektowo (Object Oriented Programming). Dotąd pisane przez nas programy składały się z ciągu instrukcji, które były wykonywane jedna za drugą, niektóre wiele razy lub tylko przy spełnieniu pewnych warunków. OOP wprowadza nowe podejście do programowania - o programie staramy się myśleć jak o modelu rzeczywistości. Jak ten model będzie wyglądał zależy od rozważanego problemu, jeśli na przykład będziemy pisać program dotyczący pracy banku pojawią się w nim takie obiekty jak: klient, kasjer, konto, kredyt czy lokata - każdy z tych obiektów reprezentuje inną klasę z którą wiążą się pewne możliwe działania (metody klasy) - na przykład kasjer może obsłużyć danego klienta, lokata może zostać otwarta, a konto zapytane o stan. Istnieje prosta reguła mówiąca jak wyszczególnić klasy występujące w danym problemie: opiszmy słownie rozważane zagadnienie, podkreślmy wszystkie rzeczowniki - to będą klasy i wszystkie czasowniki - to będą metody danych klas. Szybko można zauważyć, że niektóre klasy mają ze sobą coś wspólnego na przykład zarówno kasjer jak i klient są osobami, zatem mają imię i nazwisko - w programowaniu obiektowym o takiej zależności mówi się, że kasjer JEST osobą i klient JEST osobą, a realizuje się ją przez dziedziczenie - klasa kasjer i klasa klient dziedziczą po klasie osoba. Klasa osoba może dostarczać pewnych metod - na przykład podajImię lub podajNazwisko - przy zastosowaniu dziedziczenia klasy pochodne (podklasy) także będą miały te metody. Dodatkowo podklasy mogą przesłaniać metody zdefiniowane w nadklasie definiując metody o tej samej nazwie co metody nadklasy, wtedy te same metody wywołane na rzecz klienta i kasjera będą miały różny skutek - ten mechanizm nazywany jest polimorfizmem. Kolejną zaletą programowania obiektowego jest łatwość wielokrotnego używania kodu. Gdy napiszemy i przetestujemy jakiś fragment naszego projektu to chcielibyśmy aby już nigdy nie trzeba było go zmieniać, aby przypadkiem czegoś nie uszkodzić, ale z drugiej strony zależy nam na łatwej modyfikacji na wypadek pojawienia się nowych wymagań projektu - te dwa dążenia są w oczywisty sposób sprzeczne. Ale mechanizm dziedziczenia pozwala zaspokoić oba wymogi - nowe funkcjonalności realizujemy w klasach dziedziczących po już istniejących, w ten sposób nie modyfikujemy napisanego raz kodu, a z drugiej strony łatwo rozbudowujemy nasz projekt. &lt;br /&gt;
Po tym krótkim wstępie ideowym przejdziemy do opisu tworzenia klas w Pythonie. Klasy definiuje się za pomocą słowa kluczowego class, po nim następuje nazwa klasy, w nawiasie lista klas po których dziedziczy tworzona klasa i dwukropek:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class A(object):&lt;br /&gt;
    pass&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Klasa w przykładzie dziedziczy po object, nie jest to wymagane, ale klasy, które nie dziedziczą po object są klasami Pythona w starym stylu i nie posiadają części funkcjonalności, która będzie tu opisywana.&lt;br /&gt;
W ciele klasy możemy definiować różne metody. Określone metody rozpoczynające się od __ są nazywane metodami magicznymi, gdyż Python będzie je wywoływał niejawnie przy różnych okazjach. Najczęściej stosowaną metodą magiczną jest konstruktor (__init__) - metoda wywoływana przy tworzeniu obiektu - jeśli nie podamy konstruktora to jest generowany domyślny bezargumentowy konstruktor, który wywołuje bezargumentowe konstruktory nadklas. Należy pamiętać, że gdy sami definiujemy konstruktor musi on wywołać konstruktory nadklas. W innych językach programowania występuje mechanizm przeładowywania nazw funkcji - definiuje się wiele funkcji o tych samych nazwach ale różnych parametrach i w czasie wywołania na podstawie listy argumentów wywoływana jest odpowiednia funkcja, takie działanie jest niemożliwe w Pythonie - w szczególności jeśli chcemy mieć &amp;quot;różne konstruktory&amp;quot; klasy (np. przyjmujący liczbę całkowitą, dwie liczby zmiennoprzecinkowe i bezparametrowy to musimy wykorzystać mechanizm domyślnych argumentów lub sprawdzania typów przekazanych argumentów, napisanie dwóch konstruktorów spowoduje, że tylko ostatni będzie widoczny). Pierwszym argumentem wszystkich metod klasy musi być zmienna na którą zostanie przypisana referencja do obiektu na rzecz którego została wywołana dana metoda (zwyczajowo nazywa się ją self):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class A(object):&lt;br /&gt;
    y = 5&lt;br /&gt;
    def __init__(self, x = 0):&lt;br /&gt;
        super(A, self).__init__()&lt;br /&gt;
        self.x = x&lt;br /&gt;
    def f(self, z):&lt;br /&gt;
        print self.x, self.y, z&lt;br /&gt;
        &lt;br /&gt;
print A.y #sięganie do zmiennej klasowej y przez klasę, a nie obiekt klasy&lt;br /&gt;
a = A() #tworzenie obiekty klasy konstruktorem &amp;quot;bezargumentowym&amp;quot;&lt;br /&gt;
b = A(5) #tworzenie obiekty klasy konstruktorem &amp;quot;jednoargumentowym&amp;quot;&lt;br /&gt;
a.f(2) #wywołanie metody f na rzecz obiektu a&lt;br /&gt;
A.f(a, 2) #alternatywna forma powyższego wywołania&lt;br /&gt;
b.f(2) #wywołanie metody f na rzecz obiektu b&lt;br /&gt;
A.f(b, 2) #alternatywna forma powyższego wywołania&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
W powyższym przykładzie tworzymy klasę A, która dziedziczy po object, wewnątrz niej zmienną y, która jest klasowa (wspólna dla wszystkich obiektów danej klasy, można się do niej dostać bezpośrednio przez klasę - nie potrzeba obiektu tej klasy). Z kolei zmienna x jest tworzona na poziomie instancji (obiektu) klasy, oznacza to, że każdy obiekt, będzie miał swoją zmienną x - takie zmienne mogą być tworzone w metodach klasy i ich nazwy muszą być poprzedzone self. W komentarzach opisy konstruktorów są wzięte w cudzysłowy, gdyż tak na prawdę w obu wywołaniach jest to ten sam konstruktor (z przyczyn opisanych wcześniej). Tworzenie obiektów klas odbywa się przez podanie nazwy klasy i w nawiasie argumentów konstruktora - taka konstrukcja zwraca obiekt danej klasy, można go przypisać na zmienną i następnie na nim wywoływać metody klasy przy pomocy konstrukcji z kropką: obiekt.metoda(argumenty) w tym zapisie niejawnie na zmienną self przekazywany jest obiekt na którym została wywołana metoda, alternatywna konstrukcja jawnie przekazuje obiekt do self.&lt;br /&gt;
Zobaczmy teraz prosty przykład dziedziczenia:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class X(object):&lt;br /&gt;
    def d(self):&lt;br /&gt;
        print 'metoda d z klasy X'&lt;br /&gt;
&lt;br /&gt;
class B(object):&lt;br /&gt;
    def c(self):&lt;br /&gt;
        print 'metoda c z klasy B'&lt;br /&gt;
        &lt;br /&gt;
class A(X):&lt;br /&gt;
    def a(self):&lt;br /&gt;
        print 'metoda a z klasy A'&lt;br /&gt;
    def b(self):&lt;br /&gt;
        print 'metoda b z klasy A'&lt;br /&gt;
&lt;br /&gt;
class C(B):&lt;br /&gt;
    def a(self):&lt;br /&gt;
        print 'metoda a z klasy C'&lt;br /&gt;
    def b(self):&lt;br /&gt;
        print 'metoda b z klasy C'&lt;br /&gt;
    def d(self):&lt;br /&gt;
        print 'metoda d z klasy C'&lt;br /&gt;
    def e(self):&lt;br /&gt;
        print 'metoda e z klasy C'&lt;br /&gt;
&lt;br /&gt;
class D(A, C):&lt;br /&gt;
    def a(self):&lt;br /&gt;
        print 'metoda a z klasy D'&lt;br /&gt;
&lt;br /&gt;
d = D()&lt;br /&gt;
d.a()&lt;br /&gt;
d.b()&lt;br /&gt;
d.c()&lt;br /&gt;
d.d()&lt;br /&gt;
d.e()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
wynikiem wykonania tego skryptu jest:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
metoda a z klasy D&lt;br /&gt;
metoda b z klasy A&lt;br /&gt;
metoda c z klasy B&lt;br /&gt;
metoda d z klasy X&lt;br /&gt;
metoda e z klasy C&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Teraz parę słów wyjaśnienia: gdy wywołujemy metodę na obiekcie pewnej klasy to jej definicja jest poszukiwana najpierw w danej klasie jeśli zostanie tu znaleziona to jest wywoływana i poszukiwania się kończą (tak jest w przypadku d.a() - mimo, że w klasach A i C były metody a() to kasa D nadpisała tą metodę i metoda nadpisana jest wywoływana), jeśli poszukiwana metoda nie zostanie znaleziona w danej klasie to przeszukiwane są nadklasy rozpoczynając od tej najbardziej na lewo w definicji naszej klasy, jeśli w niej zostanie znaleziona pożądana metoda to zostanie ona wywołana (tak jest w przypadku d.b()), jeśli nie to przeszukiwane są rekurencyjnie klasy bazowe pierwszej nadklasy naszej klasy (znów od lewej) (w wyniku tych poszukiwań zostanie znaleziona metoda d.d() z klasy X), jeśli w pierwszej nadklasie i jej klasach bazowych nie znaleziono danej metody to przechodzimy do poszukiwania w drugiej nadklasie (w tym przypadku jest to klasa C) i tu zostaną znalezione metody d.c() i d.e(). Warto zwrócić uwagę na fakt, że kolejność podawania klas bazowych jest znacząca, dziedziczenie po wielu klasach często sprawia problemu i dlatego w niektórych jeżykach programowania (np. Java) występuje tylko pojedyncze dziedziczenie i dodatkowo mechanizm interfejsów zapewniający, że definiowana klasa implementuje pewne określone metody. Zmieniając w przykładzie kolejność klas po których dziedziczy klasa D dostajemy wynik:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; &lt;br /&gt;
metoda a z klasy D&lt;br /&gt;
metoda b z klasy C&lt;br /&gt;
metoda c z klasy B&lt;br /&gt;
metoda d z klasy C&lt;br /&gt;
metoda e z klasy C&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Tak na prawdę to przed przeszukiwaniem klasy, której instancją jest dany obiekt przeszukiwana jest jeszcze sama instancja - okazuje się, że w Pythonie nawet po stworzeniu obiektu można dodać do niego metody lub atrybuty:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class D(A, C):&lt;br /&gt;
    def a(self):&lt;br /&gt;
        print 'metoda a z klasy D'&lt;br /&gt;
&lt;br /&gt;
def a():&lt;br /&gt;
    print 'metoda a dodana do instancji'&lt;br /&gt;
&lt;br /&gt;
d = D()&lt;br /&gt;
d.a = a&lt;br /&gt;
d.a()&lt;br /&gt;
d.b()&lt;br /&gt;
d.c()&lt;br /&gt;
d.d()&lt;br /&gt;
d.e()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Teraz metoda d.a() jest znaleziona w instancji, a nie w klasie D i wynik tego skryptu jest następujący:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; &lt;br /&gt;
metoda a dodana do instancji&lt;br /&gt;
metoda b z klasy A&lt;br /&gt;
metoda c z klasy B&lt;br /&gt;
metoda d z klasy X&lt;br /&gt;
metoda e z klasy C&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Atrybuty klas można też definiować w bardzo elegancki sposób za pomocą funkcji wbudowanej property. Pozwala ona definiować atrybuty tylko do odczytu, a także definiować funkcje, które mają być wywołane w celu obliczenia wartości żądanego atrybutu. Dla przykładu jeśli chcemy mieć atrybut x, który będzie tylko do odczytu możemy napisać:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class A(object):&lt;br /&gt;
    def __init__(self, x):&lt;br /&gt;
        super(A, self).__init__()&lt;br /&gt;
        self._x = x&lt;br /&gt;
    def getX(self):&lt;br /&gt;
        return self._x&lt;br /&gt;
    x = property(getX)&lt;br /&gt;
&lt;br /&gt;
a = A(5)&lt;br /&gt;
print a.x&lt;br /&gt;
a.x = 6&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
W Pythonie obowiązuje konwencja, że atrybuty rozpoczynające się od _ są prywatne i nie należy próbować ich odczytywać ani modyfikować poza klasą, jest to jednak tylko konwencja. Funkcja property przyjmuje 4 argumenty: pierwszy - obowiązkowy, podający funkcję, która służy do pobrania wartości danego atrybutu, pozostałe opcjonalne - fset - metoda do ustawiania wartości atrybutu (wykorzystywana w przypisaniach), fdel - metoda do usuwania atrybutu (wykorzystywana w poleceniu del) i doc - przyjmujący napis będący opisem danego atrybutu (będzie widoczny w helpie do klasy).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class A(object):&lt;br /&gt;
    def __init__(self, x):&lt;br /&gt;
        super(A, self).__init__()&lt;br /&gt;
        self._x = x&lt;br /&gt;
    def getX(self):&lt;br /&gt;
        return self._x&lt;br /&gt;
    def setX(self, x):&lt;br /&gt;
        self._x = x&lt;br /&gt;
    def delX(self):&lt;br /&gt;
        del self._x&lt;br /&gt;
    x = property(getX, setX, delX, &amp;quot;Zmienna x&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
a = A(5)&lt;br /&gt;
print a.x&lt;br /&gt;
a.x = 2&lt;br /&gt;
del a.x&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Opiszę teraz szereg metod magicznych powalających naszej klasie na upodobnianie się do obiektów wbudowanych w Pythona.&lt;br /&gt;
&lt;br /&gt;
Aby umożliwić operacje algebraiczne na obiektach naszej klasy należy definiować metody __add__(), __sub__(), __mul__(), __div__(), __floodiv()__ czy __pow__() dla odpowiednio operacji +, -, *, /, // i **, podobnie dla operatorów logicznych and, or i xor możemy zdefiniować metody __and__(), __or__() i __xor__(), wszystkie te metody przyjmują (poza self), jeden parametr będący drugim argumentem operatora, na przykład (na self zostanie przekazany w1, a na w w2):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class Wektor(object):&lt;br /&gt;
    def __init__(self, x, y):&lt;br /&gt;
        super(Wektor, self).__init__()&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
    def __add__(self, w):&lt;br /&gt;
        return Wektor(self.x + w.x, self.y + w.y)&lt;br /&gt;
&lt;br /&gt;
w1 = Wektor(1, 3)&lt;br /&gt;
w2 = Wektor(2, 5)&lt;br /&gt;
w3 = w1 + w2&lt;br /&gt;
print w3.x, w3.y&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Można też przedefiniować operatory typy += - odpowiednie metody mają nazwy rozpoczynające się od __i (te metody powinny zwracać self):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class Wektor(object):&lt;br /&gt;
    def __init__(self, x, y):&lt;br /&gt;
        super(Wektor, self).__init__()&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
    def __iadd__(self, w):&lt;br /&gt;
        self.x += w.x&lt;br /&gt;
        self.y += w.y&lt;br /&gt;
        return self&lt;br /&gt;
&lt;br /&gt;
w1 = Wektor(1, 3)&lt;br /&gt;
w2 = Wektor(2, 5)&lt;br /&gt;
w1 += w2&lt;br /&gt;
print w1.x, w1.y&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Z kolei operatory jednoargumentowe (-, +, ~ i abs()) można przedefiniować za pomocą metod __neg__(), __pos__(), __invert__() i __abs__() - nie przyjmują żadnych argumentów poza self:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class Wektor(object):&lt;br /&gt;
    def __init__(self, x, y):&lt;br /&gt;
        super(Wektro, self).__init__()&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
    def __abs__(self):&lt;br /&gt;
        return (self.x ** 2 + self.y ** 2) ** 0.5&lt;br /&gt;
&lt;br /&gt;
w = Wektor(1, 3)&lt;br /&gt;
print abs(w)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Aby nasza klasa obsługiwała indeksowanie należy zdefiniować metody __getitem__(self, key), __setitem__(self, key, value) i __del__(self, key). W założeniu key jest kluczem pod którym przechowywana jest wartość, którą chcemy pobrać, ustawić czy usunąć. Jeśli key jest niepoprawnego typu to powinien zostać zgłoszony wyjątek TypeError, jeśli kluczowi key nie odpowiada, żadna wartość w naszej klasie, to powinien zostać zgłoszony wyjątek IndexError (jeśli nasza klasa jest sekwencją) lub KeyError (jeśli jest odwzorowaniem). Niech przykładem będzie klasa generująca elementy ciągu arytmetycznego. W przykładzie zaimplementowano klasę reprezentującą ciąg arytmetyczny, jeśli użytkownik ustawi jakąś wartość to dopóki jej nie usunie będzie zwracana ustawiona przez niego wartość zamiast wynikającej z definicji ciągu arytmetycznego:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class CiagArytmetyczny(object):&lt;br /&gt;
    def __init__(self, a0, r):&lt;br /&gt;
        super(CiagArytmetyczny, self).__init__()&lt;br /&gt;
        self.a0 = a0&lt;br /&gt;
        self.r = r&lt;br /&gt;
        self.zmienione = {}&lt;br /&gt;
    def sprawdzKlucz(self, key):&lt;br /&gt;
        if type(key) != type(1):&lt;br /&gt;
            raise TypeError&lt;br /&gt;
        if key &amp;lt; 0:&lt;br /&gt;
            raise IndexError&lt;br /&gt;
    def __getitem__(self, key):&lt;br /&gt;
        self.sprawdzKlucz(key)&lt;br /&gt;
        if key in self.zmienione:&lt;br /&gt;
            return self.zmienione[key]&lt;br /&gt;
        return self.a0 + (key - 1) * self.r&lt;br /&gt;
    def __setitem__(self, key, value):&lt;br /&gt;
        self.sprawdzKlucz(key)&lt;br /&gt;
        self.zmienione[key] = value&lt;br /&gt;
    def __delitem__(self, key):&lt;br /&gt;
        self.sprawdzKlucz(key)&lt;br /&gt;
        if key in self.zmienione:&lt;br /&gt;
            del self.zmienione[key]&lt;br /&gt;
&lt;br /&gt;
c = CiagArytmetyczny(0, 5)&lt;br /&gt;
print c[2]&lt;br /&gt;
c[2] = -11&lt;br /&gt;
print c[2]&lt;br /&gt;
del c[2]&lt;br /&gt;
print c[2]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Metoda __str__(self) jest wywoływana przez funkcję wbudowaną str, a __repr__(self) przez funkcję wbudowaną repr, pozwala to na kontrolowanie sposobu wypisywania obiektów naszej klasy:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class CiagArytmetyczny(object):&lt;br /&gt;
    def __init__(self, a0, r):&lt;br /&gt;
        super(CiagArytmetyczny, self).__init__()&lt;br /&gt;
        self.a0 = a0&lt;br /&gt;
        self.r = r&lt;br /&gt;
    def __str__(self):&lt;br /&gt;
        return &amp;quot;Ciąg arytmetyczny o wyrazie począrkowym &amp;quot; + str(self.a0) + &amp;quot; i różnicy &amp;quot; + str(self.r)&lt;br /&gt;
&lt;br /&gt;
c = CiagArytmetyczny(0, 5)&lt;br /&gt;
print str(c)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Można też zdefiniować operatory porządków: &amp;lt;, &amp;lt;=, ==, !=, &amp;gt; i &amp;gt;= przy pomocy metod __lt__(self, other), __le__(self, other), __eq__(self, other), __ne__(self, other), __gt__(self, other), __ge__(self, other), przykład:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class Ulamek(object):&lt;br /&gt;
    def __init__(self, licznik, mianownik):&lt;br /&gt;
        super(Ulamek, self).__init__()&lt;br /&gt;
        self.licznik = licznik&lt;br /&gt;
        self.mianownik = mianownik&lt;br /&gt;
    def __eq__(self, inny):&lt;br /&gt;
        return inny.mianownik * self.licznik == inny.licznik * self.mianownik&lt;br /&gt;
&lt;br /&gt;
u1 = Ulamek(1, 2)&lt;br /&gt;
u2 = Ulamek(5, 10)&lt;br /&gt;
if u1 == u2:&lt;br /&gt;
    print 'równe'&lt;br /&gt;
else:&lt;br /&gt;
    print 'różne'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Z kolei definiując metodę __call__(self, *args) sprawiamy, że obiekty naszej klasy można wywoływać tak jak funkcje:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class CiagArytmetyczny(object):&lt;br /&gt;
    def __init__(self, a0, r):&lt;br /&gt;
        super(CiagArytmetyczny, self).__init__()&lt;br /&gt;
        self.a0 = a0&lt;br /&gt;
        self.r = r&lt;br /&gt;
    def __call__(self, n):&lt;br /&gt;
        return self.a0 + self.r * (n - 1)&lt;br /&gt;
&lt;br /&gt;
c = CiagArytmetyczny(0, 5)&lt;br /&gt;
print c(5)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Definiując metodę __iter__(self) zwracającą obiekt, który będzie miał metodę next(self) zwracającą kolejne elementy tworzonej przez nas sekwencji i zgłaszającą wyjątek StopIteration gdy dojdziemy do końca sekwencji. W przykładzie obiekt sam jest swoim iteratorem - klasa CiagFibonacciego jest sekwencją po n pierwszych wyrazach ciągu Fibonacciego gdzie n jest zadawane w konstruktorze klasy:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class CiagFibonacciego(object):&lt;br /&gt;
    def __init__(self, n):&lt;br /&gt;
        super(CiagFibonacciego, self).__init__()&lt;br /&gt;
        self.n = n&lt;br /&gt;
    def __iter__(self):&lt;br /&gt;
        self.a = 0&lt;br /&gt;
        self.b = 1&lt;br /&gt;
        self.nn = self.n&lt;br /&gt;
        return self&lt;br /&gt;
    def next(self):&lt;br /&gt;
        if self.nn == 0:&lt;br /&gt;
            raise StopIteration&lt;br /&gt;
        self.nn -= 1&lt;br /&gt;
        tmp = self.a&lt;br /&gt;
        self.a, self.b = self.b, self.a + self.b&lt;br /&gt;
        return tmp&lt;br /&gt;
&lt;br /&gt;
fib = CiagFibonacciego(10)&lt;br /&gt;
for f in fib:&lt;br /&gt;
    print f&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Przydatne może być też zdefiniowanie metody __nonzero__(self), będzie ona wywoływana w przypadku wywołania funkcji bool lub przy testach logiczncyh:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class Wektor(object):&lt;br /&gt;
    def __init__(self, x, y):&lt;br /&gt;
        super(Wektor, self).__init__()&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
    def __nonzero__(self):&lt;br /&gt;
        return self.x != 0 or self.y != 0&lt;br /&gt;
&lt;br /&gt;
w = Wektor(1, 1)&lt;br /&gt;
if w:&lt;br /&gt;
    print 'niezerowy'&lt;br /&gt;
else:&lt;br /&gt;
    print 'zerowy'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Gdy nie ma zdefiniowanej funkcji __nonzero__(self) do badania wartości logicznej może być wykorzystana funkcja __len__(str) zwracająca długość sekwencji, przykład:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class Wektor(object):&lt;br /&gt;
    def __init__(self, x, y):&lt;br /&gt;
        super(Wektor, self).__init__()&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
    def __len__(self):&lt;br /&gt;
        return (self.x ** 2 + self.y ** 2) ** 0.5&lt;br /&gt;
&lt;br /&gt;
w = Wektor(1, 1)&lt;br /&gt;
if w:&lt;br /&gt;
    print 'niezerowy'&lt;br /&gt;
else:&lt;br /&gt;
    print 'zerowy'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Przydatne mogą okazać się też metody pozwalające na implementację rzutowania wywoływane przez funkcje wbudowane float, hex, int, long i oct: __float__(self), __hex__(self), __int__(self) i __oct__(self)&lt;br /&gt;
&lt;br /&gt;
Zdefiniowanie operatorów dla tworzonych przez nas klas pozwala wykorzystywać w pracy z nimi napisane wcześniej programy działające na przykład na liczbach (a także funkcje wbudowane Pythona takie jak sum):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class Wektor(object):&lt;br /&gt;
    def __init__(self, x, y):&lt;br /&gt;
        super(Wektor, self).__init__()&lt;br /&gt;
        self.x = x&lt;br /&gt;
        self.y = y&lt;br /&gt;
    def __add__(self, w):&lt;br /&gt;
        return Wektor(self.x + w.x, self.y + w.y)&lt;br /&gt;
    def __str__(self):&lt;br /&gt;
        return 'Wektor [' + str(self.x) + ', ' + str(self.y) + ']' &lt;br /&gt;
&lt;br /&gt;
A = [Wektor(1., 1.), Wektor(0., 7.), Wektor(-11., 12)]&lt;br /&gt;
print sum(A, Wektor(0., 0.))&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadanie 1===&lt;br /&gt;
Napisz klasę reprezentującą drzewa binarne, niech ma następujące metody:&lt;br /&gt;
*konstruktor jednoargumentowy tworzący liść o zadanej wartości&lt;br /&gt;
*konstruktor umożliwiający stworzenie węzła o zadanej wartości i prawym lub lewym potomku&lt;br /&gt;
*wysokosc() - zwracającą wysokość drzewa&lt;br /&gt;
*szerokosc() - zwracającą szerokość drzewa&lt;br /&gt;
*liczbaWezlow() - zwracającą liczbę węzłów&lt;br /&gt;
*liczbaLisci() - zwracająca liczbę liści w drzewie&lt;br /&gt;
*wypisz(porzadek) - wypisuje drzewo w kolejności zadanej przez napis początek, możliwe wartości: 'preLP', 'postLP', 'infLP', 'prePL', 'postPL' i 'infPL', gdy nie podano parametru porzadek niech będzie przyjmowany 'preLP', w przypadku podania innego napisu lub wartości nie będącej napisem niech będzie zgłaszany wyjątek&lt;br /&gt;
*czyIzomorficzne(drzewo) - zwracająca True gdy drzewo jest izomorficzne z self&lt;br /&gt;
*doListy() - zwracająca listę zawierającą wartości poszczególnych węzłów - indeksowanie na drzewie: lewy syn i-tego węzła ma indeks 2 * i, a prawy 2 * i + 1, korzeń ma indeks 1, przy takim indeksowaniu wartości drzewa można wygodnie trzymać na liście (na pozycji indeks - 1), niech pozycje którym nie odpowiadają żadne węzły mają wartość None, a zwracana lista niech nie ma zbędnych None na końcu&lt;br /&gt;
*zListy(lista) - klasowa metoda generująca drzewo na podstawie listy takiej jak opisana w poprzednim punkcie&lt;br /&gt;
*zdefiniować operatory logiczne or i and zwracające drzewo o wszystkich wartościach równych 0 i mające kształt będący odpowiednio sumą i częścią wspólną drzew będących argumentami&lt;br /&gt;
*zdefiniować operator + zwracający drzewo mające kształt będący sumą drzew będących argumentami, a w każdym węźle niech będzie suma wartości z odpowiednich węzłów z danych drzew (jeśli w jednym drzewie nie ma odpowiedniego węzła to kopiujemy wartość z odpowiedniego węzła drugiego drzewa)&lt;br /&gt;
===Zadanie 2===&lt;br /&gt;
Napisać klasę reprezentującą drzewo wyszukiwań binarnych, niech ma następujące metody:&lt;br /&gt;
*czyJestWartosc(wartosc) - zwraca True gdy wartosc jest w drzewie False w przeciwnym wypadku&lt;br /&gt;
*wstaw(wartosc) - wstawia wartosc do drzewa, jeśli wartosc jest już w drzewie to nie robi nic&lt;br /&gt;
*usun(wartosc) - usuwa wartość z drzewa, jeśli jej nie było to zwraca wyjatek&lt;br /&gt;
*czyPuse() - zwraca True gdy drzewo jest puste, False w przeciwnym wypadku&lt;br /&gt;
===Zadanie 3===&lt;br /&gt;
Napisz klasę reprezentującą wielomian, niech ma następujące metody:&lt;br /&gt;
*pochodna() - zwracająca wielomian reprezentujący pochodną danego&lt;br /&gt;
*calka() - zwracającą wielomian reprezentujący całkę z danego&lt;br /&gt;
*wartosc(x) - zwraca wartość wielomianu w punkcie x&lt;br /&gt;
*calka_oznaczona(x1, x2) - zwraca wartość całki oznaczonej od x1 do x2&lt;br /&gt;
*zdefiniować operatory +, -, * i wypisywanie&lt;br /&gt;
&lt;br /&gt;
Napisać klasę reprezentującą wyrażenia wymierne, niech ma następujące metody:&lt;br /&gt;
*wartosc(x) - zwraca wartość w punkcie x&lt;br /&gt;
===Zadanie 4===&lt;br /&gt;
Napisać klasę reprezentującą ciąg arytmetyczny, niech ma następujące metody:&lt;br /&gt;
*konstruktor bezparametrowy przyjmujący a_1 = 1 i r = 1&lt;br /&gt;
*konstruktory jedno i dwuargumentowe&lt;br /&gt;
*pobieranie a_n przez ciag[n], niech zwraca wyjątek gdy n &amp;lt;= 0&lt;br /&gt;
*ustawianie a_n przez ciag[n] = wartosc, jeśli ustawimy ręcznie wartość to przy kolejnym pobraniu a_n ta wartość ma być zwrócona&lt;br /&gt;
*usuwanie ustawionej ręcznie wartości przez del ciag[n]&lt;br /&gt;
*przedefiniować operatory + i - tak aby zwracały ciąg którego elementy są sumą i różnicą elementów danych ciagów&lt;br /&gt;
===Zadanie 5===&lt;br /&gt;
Napisać klasę po której będzie można się iterować i będzie ona sekwencją po ciągu liczb Fibonacciego, niech sekwencja przebiega po tylu liczbach jaką wartość podano w konstruktorze&lt;br /&gt;
===Zadanie 6===&lt;br /&gt;
Napisz program, który wczyta z plików listę miast, połączeń między nimi i odległości tych połączeń a następnie pozwoli wyszukiwać połączeń między zadanymi punktami o długości mniejszej niż zadana.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[&amp;quot;Programowanie dla Fizyków Medycznych&amp;quot;]]&lt;/div&gt;</summary>
		<author><name>SuperAdmin</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=TI/Programowanie_dla_Fizyk%C3%B3w_Medycznych/RRZ&amp;diff=3549</id>
		<title>TI/Programowanie dla Fizyków Medycznych/RRZ</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=TI/Programowanie_dla_Fizyk%C3%B3w_Medycznych/RRZ&amp;diff=3549"/>
		<updated>2015-06-08T16:56:09Z</updated>

		<summary type="html">&lt;p&gt;SuperAdmin: /* Równania różniczkowe zwyczajne */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
==Równania różniczkowe zwyczajne==&lt;br /&gt;
Zajmieny się teraz problemem numerycznego rozwiązywania równań różniczkowych zwyczajnych o postaci:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{{Hide in print|This text will not be shown in the print.}}&lt;br /&gt;
{{Only in print|This text will only be shown in the print.}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{dy(t)}{dt}  = f(t,y(t))&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
z warunkeim początkowym&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;y(t_0)=y_0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Zauważmy, że przykładowe równanie różniczkowe drugiego rzędu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{d^2 x(t)}{dt^2}  = \omega(t,x(t))&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
można zapisać jako&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{d}{dt} \binom{x(t)}{x'(t)}  = \binom{x'(t)}{\omega(t,x(t))}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
W analogiczny sposób równanie dowolnego rzędy możemy zapisać jako wektorowe równanie różniczkowe pierwszego rzędu. Wystarczy zatem,  że skupimy się na rozwiązywaniu równań pierwszego  rzędu, Rozwiązaniem postawionego problemu są ciągłe funkcje zmiennej czasowej t. Rozwiązanie numeryczne takiego problemu ogranicza się jednak do znalezienia wartości funkcji y(t) w skończonej liczbie punktów czasowych. W najprostrzym przypadku (do którego się tutaj ograniczymy) zakładamy, że punkty te są od siebie równo oddalone, a odległość między nimi nazywamy krokiem czasowym i tradycyjnie oznaczamy literą h. Zatem rozwiązanie równania na przedziale &amp;lt;math&amp;gt;(t_0,t_k)&amp;lt;/math&amp;gt; sprwadzamy do rozwiązania w sekwencji czasów &amp;lt;math&amp;gt;t_0, t+1=t_0+h,t_2=t_0+2h,...,t_k=Nh&amp;lt;/math&amp;gt;. Poprzez &amp;lt;math&amp;gt;x_n&amp;lt;/math&amp;gt; oznaczać będziemy numeryczne przybliżenie  ścisłego rozwiązania &amp;lt;math&amp;gt;x(t_n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Metoda Eulera==&lt;br /&gt;
Najprostszą metodą numeryczną rozwiązywania równań różniczkowych jest metoda Eulera. Przybliżmy pochodzną czasową występującą po lewej stronie równania przez iloraz różnicowy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{d x(t)}{dt}  \approx \frac{x(t+h)-x(t)}{h}&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
przekształacjąc uzyskujemy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x(t+h)  \approx x(t)+ h \frac{d x(t)}{dt} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
a po podstawieniu rozwiązywanego równania mamy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x(t+h)  \approx x(t)+ h f(t,x(t)) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Możemy to zapisać w postaci dyskretnej&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x_{n+1}  = x_n + h f(t_n,x_n) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Wartość w kolejnej chwili czasu dana jest explicite poprzez wartość w chwili poprzedniej. Metoda ta nazywa się Explicit Euler. Możemy teraz zaimplementować ją w pythonie&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;--&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import pylab as py&lt;br /&gt;
&lt;br /&gt;
#rozwiazujemy rownanie dx(t)/dt=f(t,x)&lt;br /&gt;
&lt;br /&gt;
#metoda Explicit Euler&lt;br /&gt;
#f - funkcja f z rownania&lt;br /&gt;
#x0-wartosc poczatkowa&lt;br /&gt;
#t0-czas poczatkowy&lt;br /&gt;
#tk-czas koncowy&lt;br /&gt;
#h-krok czasowy&lt;br /&gt;
&lt;br /&gt;
def EE(f,x0,t0,tk,h): &lt;br /&gt;
    #generujemy wektor czasow&lt;br /&gt;
    t=np.arange(t0,tk,h)&lt;br /&gt;
&lt;br /&gt;
    #liczba krokow czasowych&lt;br /&gt;
    N=len(t)&lt;br /&gt;
&lt;br /&gt;
    #wektor wynikowy&lt;br /&gt;
    if hasattr(x0, &amp;quot;__len__&amp;quot;): x=np.zeros((N,len(x0))) # gdy mamy doczynienia w równaniem wektorowym&lt;br /&gt;
    else: x=np.zeros(N) #dla przypadku skalarnego&lt;br /&gt;
&lt;br /&gt;
    #wpisujemy wartosc poczatkowa&lt;br /&gt;
    x[0]=np.array(x0)&lt;br /&gt;
    #index&lt;br /&gt;
    i=1&lt;br /&gt;
    #petla glowna&lt;br /&gt;
    while (i&amp;lt;N):&lt;br /&gt;
        x[i]=np.array(x[i-1]+h*f(t[i-1],x[i-1]))&lt;br /&gt;
        i+=1&lt;br /&gt;
    return t,x&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;!--&amp;lt;/source&amp;gt;--&amp;gt;&lt;br /&gt;
Najłatwiej będzie przetestować napisaną metodę na równaniu którego ścisłe rozwiązanie jest znane.Zacznijmy zatem od równania oscylatora harmonicznego&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def oscylator(t,y):&lt;br /&gt;
    x=y[0]&lt;br /&gt;
    xdot=y[1]&lt;br /&gt;
    return np.array([xdot,-x])&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Rozwiążmy to równanie z warunkeim początkowym [1.0,1.0] i od czasu od 0 do 100.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
t,x=EE(oscylator,[1.0,1.0],0.0,100,0.01)&lt;br /&gt;
py.plot(t,x[:,0])&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
rozwiązanie wygląda wówczas nastepująco&lt;br /&gt;
&lt;br /&gt;
[[Plik:img01.png]]&lt;br /&gt;
&lt;br /&gt;
Jeżeli zaś wydłuzymy czas symulacji to 1000 otrzymamy&lt;br /&gt;
&lt;br /&gt;
[[Plik:img2.png]]&lt;br /&gt;
&lt;br /&gt;
Amplituta oscylacji rośnie wykładniczo i rozwiązanie numeryczne bardzo szybko przestaje mieć cokolwiek wspólnego ze ścisłym rozwiązaniem którego amplituda jest przecież stała. Metoda Explicit Euler już po kilku krokach czasowych przestaje przypominać ścisłe rozwiązanie. Niestety trudno jest zupełnie wyeliminować to zjawisko, za to możemy użyć metody, która znacznie wolniej będzie się oddalać od ścisłego rozwiązania. Zauważmy, że w metodzie Explicit Euler w każdym kroku czasowym tylko raz liczyliśmy wartość funkcji f. Liczbę wywołan funkcji f w każdym kroku czasowym nazywamy rzędem metody, stąd Explicit Euler jest metodą pierwszego rzędu. Wprowadźmy teraz przykładowe metody rzędu drugiego&lt;br /&gt;
&lt;br /&gt;
==Metoda Żabiego Skoku==  &lt;br /&gt;
W poprzedniej metodzie liczyliśmy wartość funkcji f w chwili &amp;lt;math&amp;gt;t_n&amp;lt;/math&amp;gt;, która była pochodzną po czasie naszego ścisłego rozwiązania. Kolejny punkt &amp;lt;math&amp;gt;x_{n+1}&amp;lt;/math&amp;gt; był liczony z przybliżenia liniowego funkcji  w chwili poprzedniej. Jeżeli faktyczna trajektoria ma niezerową drugą pochodzną to takie liniowe przybliżenie zawsze będzie nas oddalało od ścisłego rozwiązania. Dosyć prostym pomysłem na poprawienie zbieżności metody jest tak zwany żabi skok. Policzmy najpierw wartość zmiennej x przesuwając się w czasie o h/2 i policzmy wówczas pochodną, którą oznaczmy przez &amp;lt;math&amp;gt;k_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; k_1=f(t_n,x_n) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; k_2=f(t_n+h/2,x_n+h/2*k_1) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Nastepnie używamy pochodznej &amp;lt;math&amp;gt; k_2 &amp;lt;/math&amp;gt; zamiast pochodznej &amp;lt;math&amp;gt; k_1 &amp;lt;/math&amp;gt; do obliczenia wartości funkcji w kolejnym kroku czasowym.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x_{n+1}  = x_n + h k_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Przykładowa implementacja tej metody wygląda nastepująco&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def leapfrog(f,x0,t0,tk,h): &lt;br /&gt;
&lt;br /&gt;
    #generujemy wektor czasow&lt;br /&gt;
    t=np.arange(t0,tk,h)&lt;br /&gt;
&lt;br /&gt;
    #liczba krokow czasowych&lt;br /&gt;
    N=len(t)&lt;br /&gt;
&lt;br /&gt;
    #wektor wynikowy&lt;br /&gt;
    if hasattr(x0, &amp;quot;__len__&amp;quot;): x=np.zeros((N,len(x0)))&lt;br /&gt;
    else: x=np.zeros(N)&lt;br /&gt;
&lt;br /&gt;
    #wpisujemy wartosc poczatkowa&lt;br /&gt;
    x[0]=np.array(x0)&lt;br /&gt;
&lt;br /&gt;
    #index&lt;br /&gt;
    i=1&lt;br /&gt;
&lt;br /&gt;
    #petla glowna&lt;br /&gt;
    while (i&amp;lt;N):&lt;br /&gt;
        k1=f(t[i-1],x[i-1])&lt;br /&gt;
        k2=f(t[i-1]+h*0.5,x[i-1]+0.5*h*k1)&lt;br /&gt;
        x[i]=np.array(x[i-1]+h*k2)&lt;br /&gt;
        i+=1&lt;br /&gt;
    return t,x&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Rozwiązanie równania oscylatora tą metodą dla identycznych jak poprzednio czasów da nastepujące wyniki&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
t,x=leapfrog(oscylator,[1.0,1.0],0.0,100,0.01)&lt;br /&gt;
py.plot(t,x[:,0])&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Plik:img3.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
t,x=leapfrog(oscylator,[1.0,1.0],0.0,1000,0.01)&lt;br /&gt;
py.plot(t,x[:,0])&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Plik:img4.png]]&lt;br /&gt;
&lt;br /&gt;
==Metoda Heuna==&lt;br /&gt;
Kolejną metodą niewiele różniącą się od poprzedniej jest metoda Heuna. Zdefiniowana jest ona przez równania&lt;br /&gt;
&amp;lt;math&amp;gt; k_1=f(t_n,x_n) &amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; k_2=f(t_n+h/2,x_n+h/2*k_1) &amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x_{n+1}  = x_n + h k_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Implementacja wygląda następująco&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
def Heun(f,x0,t0,tk,h): &lt;br /&gt;
    #generujemy wektor czasow&lt;br /&gt;
    t=np.arange(t0,tk,h)&lt;br /&gt;
    #liczba krokow czasowych&lt;br /&gt;
    N=len(t)&lt;br /&gt;
    #wektor wynikowy&lt;br /&gt;
    if hasattr(x0, &amp;quot;__len__&amp;quot;): x=np.zeros((N,len(x0)))&lt;br /&gt;
    else: x=np.zeros(N)&lt;br /&gt;
    #wpisujemy wartosc poczatkowa&lt;br /&gt;
    x[0]=np.array(x0)&lt;br /&gt;
    #index&lt;br /&gt;
    i=1&lt;br /&gt;
    #petla glowna&lt;br /&gt;
    while (i&amp;lt;N):&lt;br /&gt;
        k1=f(t[i-1],x[i-1])&lt;br /&gt;
        k2=f(t[i-1]+h*0.5,x[i-1]+0.5*h*k1)&lt;br /&gt;
        x[i]=np.array(x[i-1]+h*0.5*(k1+k2))&lt;br /&gt;
        i+=1&lt;br /&gt;
    return t,x&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Runge-Kutta czwartego rzędu==&lt;br /&gt;
Ostatnią metodą, którą omówimy jest najbardziej popularna metoda zwana w skrócie RK4. Metoda to uznawana jest za kanoniczną i w większości zastosowań dającą najlepsze wyniki. Metody wyższego rzędu nie wnoszą już do wyniku znaczącej poprawy. Jak sugeruje nazwa metody, jej rząd to 4, czyli w każdym kroku czasowym czterokrotnie wywołujemy funkcję f. Metoda ta zdefiniowana jest wzorami&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;    k_1 = f \left( t_n, x_n \right) &amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;    k_2 = f \left( t_n + {h \over 2}, x_n + {1 \over 2} k_1 \right) &amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;    k_3 = f \left( t_n + {h \over 2}, x_n + {1 \over 2} k_2 \right) &amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;    k_4 = f \left( t_n + h, x_n + k_3 \right) &amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;    x_{n+1} = x_n + {h \over 6} (k_1 + 2k_2 + 2k_3 + k_4) &amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
a implementacja wygląda następująco&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def RK4(f,x0,t0,tk,h): &lt;br /&gt;
    #generujemy wektor czasow&lt;br /&gt;
    t=np.arange(t0,tk,h)&lt;br /&gt;
    #liczba krokow czasowych&lt;br /&gt;
    N=len(t)&lt;br /&gt;
    #wektor wynikowy&lt;br /&gt;
    if hasattr(x0, &amp;quot;__len__&amp;quot;): x=np.zeros((N,len(x0)))&lt;br /&gt;
    else: x=np.zeros(N)&lt;br /&gt;
    #wpisujemy wartosc poczatkowa&lt;br /&gt;
    x[0]=np.array(x0)&lt;br /&gt;
    #index&lt;br /&gt;
    i=1&lt;br /&gt;
    #petla glowna&lt;br /&gt;
    while (i&amp;lt;N):&lt;br /&gt;
        k1=h*f(t[i-1],x[i-1])&lt;br /&gt;
        k2=h*f(t[i-1]+h*0.5,x[i-1]+0.5*k1)&lt;br /&gt;
        k3=h*f(t[i-1]+h*0.5,x[i-1]+0.5*k2)&lt;br /&gt;
        k4=h*f(t[i-1]+h,x[i-1]+k3)&lt;br /&gt;
        x[i]=np.array(x[i-1]+(k1+2.0*k2+2.0*k3+k4)/6)&lt;br /&gt;
        i+=1&lt;br /&gt;
    return t,x&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==Przykłady==&lt;br /&gt;
===Zadanie - Wahadło matematyczne z tłumieniem i siłą wymuszającą===&lt;br /&gt;
&lt;br /&gt;
Rozwiąż numerycznie metodą RK4 równanie różniczkowe oscylatora harmonicznego z tłumieniem i siłą wymuszającą&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{d^2x}{dt^2} + \Gamma \frac{dx}{dt} + w_0^2 x = f_0 \cos(W t) &amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
przyjmując parametry &amp;lt;math&amp;gt; f_0 =1, w_0=1, \Gamma=0.1, h=0.1 &amp;lt;/math&amp;gt;. Wykreśl zależność amplitudy drgań w funkcji częstości siły wymuszającej W, dla W z przedziału [0.1,3].&lt;br /&gt;
===Rozwiązanie===&lt;br /&gt;
Zacznijmy od sprowadzenia równania drugiego stopnia do równania pierszego stopnia i zapisania go w postaci funkcji&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def oscylator(t,y):&lt;br /&gt;
    f0=1.0&lt;br /&gt;
    w0=1.0&lt;br /&gt;
    Gamma=0.1&lt;br /&gt;
&lt;br /&gt;
    x=y[0]&lt;br /&gt;
    xdot=y[1]&lt;br /&gt;
    return np.array([xdot,f0*np.cos(oscylator.W*t)-oscylator.Gamma*xdot-w0*w0*x])&lt;br /&gt;
&lt;br /&gt;
oscylator.W=1.0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Nieprzypadkowo parametr W nie jest definiowany w samej funkcji jako zmienna wewnętrzna, ale jako atrybut obiektu jakim jest funkcja. Dzięki takiej konstrukcji łatwo będzie nam zmieniać parametr W czyli częstość siły wymuszającej. Zobaczmy jak wygląda trajektoria będąca rozwiązaniem tego równania dla warunku początkowego [0,1] i czasu końcowego równego 400.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
py.plot(*RK4(oscylator,[0.0,1.0],0.0,400.0,0.1))&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Plik:oscy1.png]]&lt;br /&gt;
&lt;br /&gt;
Widać że początkowo układ dochodzi do stanu regularnych oscylacji. Do analizy amplitudy interesuje nas jedynie koncowa część więc ograniczymy się do analizy trajektorii od czasu 200 do czasu 400. Napiszmy teraz funkcję, która na podstawie trajektorii wyznaczy nam amplitudę oscylacji&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def amplituda(x):&lt;br /&gt;
    lista=x[2000:,0]&lt;br /&gt;
    return (max(lista)-min(lista))*0.5&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Interesować nas będzie amplituda drgań w funkcji częstość W. Wygenerujmy listę wartości W dla których będziemy liczyć amplitudę.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
Omegas=np.arange(0.1,3.0,0.05)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Możemy teraz dla każdej z wartości W rozwiązać numerycznie równanie różniczkowe i wyznaczyć odpowiadającą amplitudę oscylacji&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
amp=[amplituda(RK4(oscylator,[0.0,1.0],0.0,400.0,0.1)[1]) for oscylator.W in Omegas]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Wynik koncowy wyglada następująco&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
py.plot(Omegas,amp)&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
[[Plik:oscy2.png]]&lt;br /&gt;
&lt;br /&gt;
Jak można było się domyślić amplituda jest największa gdy częstotliwość wymuszania W pokrywa się z wartością częstotliwości drgań własnych &amp;lt;math&amp;gt; w_0=1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadanie - Układ Lorenza===&lt;br /&gt;
Rozwiąż układ równań różniczkowych Lorenza dany wzorami&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \begin{cases}\dot x=\sigma y-\sigma x\\\dot y=-xz+rx-y\\\dot z=xy-bz\end{cases}, &amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
metodą całkowania Rungego–Kutty drugiego rzędu z α = 2/3, czyli&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k_1 &amp;amp;= f(t_n,x_n)&amp;lt;/math&amp;gt; , &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k_2 &amp;amp;= f(t_n + \tfrac{2}{3}h, x_n + \tfrac{2}{3}h k_1)&amp;lt;/math&amp;gt; , &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;x_{n+1} &amp;amp;= x_n + h \left(\tfrac{1}{4}k_1+\tfrac{3}{4} k_2 \right). &amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Przyjmij sigma=10, b=8/3, r=99.96, krok czasowy h=0.005 i warunki początkowe x=1,y=0,z=0. Wykonaj 8000 kroków czasowych. Układ po pewnym czasie zacznie poruszać się po pewnej periodycznej trajektorii. Wykonaj 3 rysunki TEJ PERIODYCZNEJ TRAJEKTORII (bez okresu dochodzenia do niej) w płaszczyznach (x,y), (y,z) i (z,x). Wypisz na ekranie przedziały wartości jakie przyjmują zmienne x,y i z na periodycznej trajektorii oraz okres trajektorii periodycznej.&lt;br /&gt;
===Rozwiązanie===&lt;br /&gt;
Zacznijmu od implementacji podanej w treści zadania metody całkowania RK2&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import pylab as py&lt;br /&gt;
&lt;br /&gt;
#rozwiazujemy rownanie dx(t)/dt=f(t,x)&lt;br /&gt;
&lt;br /&gt;
#metoda Explicit Euler&lt;br /&gt;
#f - funkcja f z rownania&lt;br /&gt;
#x0-wartosc poczatkowa&lt;br /&gt;
#t0-czas poczatkowy&lt;br /&gt;
#tk-czas koncowy&lt;br /&gt;
#h-krok czasowy&lt;br /&gt;
&lt;br /&gt;
def RK2(f,x0,t0,tk,h): &lt;br /&gt;
&lt;br /&gt;
    #generujemy wektor czasow&lt;br /&gt;
    t=np.arange(t0,tk,h)&lt;br /&gt;
&lt;br /&gt;
    #liczba krokow czasowych&lt;br /&gt;
    N=len(t)&lt;br /&gt;
&lt;br /&gt;
    #wektor wynikowy&lt;br /&gt;
    if hasattr(x0, &amp;quot;__len__&amp;quot;): x=np.zeros((N,len(x0)))&lt;br /&gt;
    else: x=np.zeros(N)&lt;br /&gt;
&lt;br /&gt;
    #wpisujemy wartosc poczatkowa&lt;br /&gt;
    x[0]=np.array(x0)&lt;br /&gt;
&lt;br /&gt;
    #index&lt;br /&gt;
    i=1&lt;br /&gt;
&lt;br /&gt;
    #petla glowna&lt;br /&gt;
    while (i&amp;lt;N):&lt;br /&gt;
        k1=h*f(t[i-1],x[i-1])&lt;br /&gt;
        k2=h*f(t[i-1]+h*2.0/3.0,x[i-1]+k1*2.0/3.0)&lt;br /&gt;
        x[i]=np.array(x[i-1]+0.25*k1+0.75*k2)&lt;br /&gt;
        i+=1&lt;br /&gt;
    return t,x&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Następnie napiszmy funkcję opisującą układ Lorenza&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def Lorenza(t,y):&lt;br /&gt;
    sigma=10.0&lt;br /&gt;
    b=8.0/3&lt;br /&gt;
    r=99.96&lt;br /&gt;
    xx=y[0]&lt;br /&gt;
    yy=y[1]&lt;br /&gt;
    zz=y[2]&lt;br /&gt;
    xdot=sigma*(yy-xx)&lt;br /&gt;
    ydot=-xx*zz+r*xx-yy&lt;br /&gt;
    zdot=xx*yy-b*zz&lt;br /&gt;
    return np.array([xdot,ydot,zdot])&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zobaczmy teraz jak wyglądają trajektorie wszystkich trzech współrzędnych  rozwiązania z zadanymi parametrami&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
t,x=RK2(Lorenza,[1.0,0.0,0.0],0.0,40.0,0.005)&lt;br /&gt;
py.plot(t,x[:,1])&lt;br /&gt;
py.show()&lt;br /&gt;
py.plot(t,x[:,2])&lt;br /&gt;
py.show()&lt;br /&gt;
py.plot(t,x[:,0])&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Plik:lor1.png]]&lt;br /&gt;
&lt;br /&gt;
[[Plik:lor2.png]]&lt;br /&gt;
&lt;br /&gt;
[[Plik:lor3.png]]&lt;br /&gt;
&lt;br /&gt;
Możemy zauważyć że układ początkowo zachowuje się chaotycznie a potem dąży do pewnego stanu ustalonego (tzw. atraktora). Cała trajektoria składa się z 8000 punktów, przyjmijmy że powyżej punktu o numerze 2500 mamy już do czynienia tylko z periodyczną trajektorią. Wykreślmy zatem portrety fazowe o których mowa w treści zadania&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
py.plot(x[2500:,0],x[2500:,1])&lt;br /&gt;
py.show()&lt;br /&gt;
py.plot(x[2500:,1],x[2500:,2])&lt;br /&gt;
py.show()&lt;br /&gt;
py.plot(x[2500:,2],x[2500:,0])&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Plik:lor4.png]]&lt;br /&gt;
&lt;br /&gt;
[[Plik:lor5.png]]&lt;br /&gt;
&lt;br /&gt;
[[Plik:lor6.png]]&lt;br /&gt;
&lt;br /&gt;
Wypisanie zakresów jest już tylko formalnością&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
print 'zmienna x przyjmuje wartosci z zakresu: (',min(x[2500:,0]),',',max(x[2500:,0]),')'&lt;br /&gt;
print 'zmienna y przyjmuje wartosci z zakresu: (',min(x[2500:,1]),',',max(x[2500:,1]),')'&lt;br /&gt;
print 'zmienna z przyjmuje wartosci z zakresu: (',min(x[2500:,2]),',',max(x[2500:,2]),')'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Okres trajektorii periodycznej możemy znaleść na przykład w ten sposób&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
prog=140&lt;br /&gt;
lista=[]&lt;br /&gt;
for i in range(2500,8000):&lt;br /&gt;
    if (x[i-1,2]&amp;lt;prog) and (x[i,2]&amp;gt;prog): lista.append(i)&lt;br /&gt;
print 'okres to:',np.mean(np.diff(lista)*0.005)&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; okres to: 1.0975&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; zmienna x przyjmuje wartosci z zakresu: ( -33.4431203059 , 25.8037953495 )&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; zmienna y przyjmuje wartosci z zakresu: ( -56.7169238157 , 37.3166709986 )&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; zmienna z przyjmuje wartosci z zakresu: ( 53.4652816712 , 144.264397579 )&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[&amp;quot;Programowanie dla Fizyków Medycznych&amp;quot;]]&lt;/div&gt;</summary>
		<author><name>SuperAdmin</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=TI/Programowanie_dla_Fizyk%C3%B3w_Medycznych/RRZ&amp;diff=3548</id>
		<title>TI/Programowanie dla Fizyków Medycznych/RRZ</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=TI/Programowanie_dla_Fizyk%C3%B3w_Medycznych/RRZ&amp;diff=3548"/>
		<updated>2015-06-08T16:50:36Z</updated>

		<summary type="html">&lt;p&gt;SuperAdmin: /* Równania różniczkowe zwyczajne */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
==Równania różniczkowe zwyczajne==&lt;br /&gt;
Zajmieny się teraz problemem numerycznego rozwiązywania równań różniczkowych zwyczajnych o postaci:&lt;br /&gt;
&lt;br /&gt;
{{Hide in print|This text will not be shown in the print.}}&lt;br /&gt;
{{Only in print|This text will only be shown in the print.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{dy(t)}{dt}  = f(t,y(t))&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
z warunkeim początkowym&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;y(t_0)=y_0&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Zauważmy, że przykładowe równanie różniczkowe drugiego rzędu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{d^2 x(t)}{dt^2}  = \omega(t,x(t))&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
można zapisać jako&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{d}{dt} \binom{x(t)}{x'(t)}  = \binom{x'(t)}{\omega(t,x(t))}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
W analogiczny sposób równanie dowolnego rzędy możemy zapisać jako wektorowe równanie różniczkowe pierwszego rzędu. Wystarczy zatem,  że skupimy się na rozwiązywaniu równań pierwszego  rzędu, Rozwiązaniem postawionego problemu są ciągłe funkcje zmiennej czasowej t. Rozwiązanie numeryczne takiego problemu ogranicza się jednak do znalezienia wartości funkcji y(t) w skończonej liczbie punktów czasowych. W najprostrzym przypadku (do którego się tutaj ograniczymy) zakładamy, że punkty te są od siebie równo oddalone, a odległość między nimi nazywamy krokiem czasowym i tradycyjnie oznaczamy literą h. Zatem rozwiązanie równania na przedziale &amp;lt;math&amp;gt;(t_0,t_k)&amp;lt;/math&amp;gt; sprwadzamy do rozwiązania w sekwencji czasów &amp;lt;math&amp;gt;t_0, t+1=t_0+h,t_2=t_0+2h,...,t_k=Nh&amp;lt;/math&amp;gt;. Poprzez &amp;lt;math&amp;gt;x_n&amp;lt;/math&amp;gt; oznaczać będziemy numeryczne przybliżenie  ścisłego rozwiązania &amp;lt;math&amp;gt;x(t_n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Metoda Eulera==&lt;br /&gt;
Najprostszą metodą numeryczną rozwiązywania równań różniczkowych jest metoda Eulera. Przybliżmy pochodzną czasową występującą po lewej stronie równania przez iloraz różnicowy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{d x(t)}{dt}  \approx \frac{x(t+h)-x(t)}{h}&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
przekształacjąc uzyskujemy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x(t+h)  \approx x(t)+ h \frac{d x(t)}{dt} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
a po podstawieniu rozwiązywanego równania mamy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x(t+h)  \approx x(t)+ h f(t,x(t)) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Możemy to zapisać w postaci dyskretnej&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x_{n+1}  = x_n + h f(t_n,x_n) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Wartość w kolejnej chwili czasu dana jest explicite poprzez wartość w chwili poprzedniej. Metoda ta nazywa się Explicit Euler. Możemy teraz zaimplementować ją w pythonie&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;--&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import pylab as py&lt;br /&gt;
&lt;br /&gt;
#rozwiazujemy rownanie dx(t)/dt=f(t,x)&lt;br /&gt;
&lt;br /&gt;
#metoda Explicit Euler&lt;br /&gt;
#f - funkcja f z rownania&lt;br /&gt;
#x0-wartosc poczatkowa&lt;br /&gt;
#t0-czas poczatkowy&lt;br /&gt;
#tk-czas koncowy&lt;br /&gt;
#h-krok czasowy&lt;br /&gt;
&lt;br /&gt;
def EE(f,x0,t0,tk,h): &lt;br /&gt;
    #generujemy wektor czasow&lt;br /&gt;
    t=np.arange(t0,tk,h)&lt;br /&gt;
&lt;br /&gt;
    #liczba krokow czasowych&lt;br /&gt;
    N=len(t)&lt;br /&gt;
&lt;br /&gt;
    #wektor wynikowy&lt;br /&gt;
    if hasattr(x0, &amp;quot;__len__&amp;quot;): x=np.zeros((N,len(x0))) # gdy mamy doczynienia w równaniem wektorowym&lt;br /&gt;
    else: x=np.zeros(N) #dla przypadku skalarnego&lt;br /&gt;
&lt;br /&gt;
    #wpisujemy wartosc poczatkowa&lt;br /&gt;
    x[0]=np.array(x0)&lt;br /&gt;
    #index&lt;br /&gt;
    i=1&lt;br /&gt;
    #petla glowna&lt;br /&gt;
    while (i&amp;lt;N):&lt;br /&gt;
        x[i]=np.array(x[i-1]+h*f(t[i-1],x[i-1]))&lt;br /&gt;
        i+=1&lt;br /&gt;
    return t,x&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;!--&amp;lt;/source&amp;gt;--&amp;gt;&lt;br /&gt;
Najłatwiej będzie przetestować napisaną metodę na równaniu którego ścisłe rozwiązanie jest znane.Zacznijmy zatem od równania oscylatora harmonicznego&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def oscylator(t,y):&lt;br /&gt;
    x=y[0]&lt;br /&gt;
    xdot=y[1]&lt;br /&gt;
    return np.array([xdot,-x])&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Rozwiążmy to równanie z warunkeim początkowym [1.0,1.0] i od czasu od 0 do 100.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
t,x=EE(oscylator,[1.0,1.0],0.0,100,0.01)&lt;br /&gt;
py.plot(t,x[:,0])&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
rozwiązanie wygląda wówczas nastepująco&lt;br /&gt;
&lt;br /&gt;
[[Plik:img01.png]]&lt;br /&gt;
&lt;br /&gt;
Jeżeli zaś wydłuzymy czas symulacji to 1000 otrzymamy&lt;br /&gt;
&lt;br /&gt;
[[Plik:img2.png]]&lt;br /&gt;
&lt;br /&gt;
Amplituta oscylacji rośnie wykładniczo i rozwiązanie numeryczne bardzo szybko przestaje mieć cokolwiek wspólnego ze ścisłym rozwiązaniem którego amplituda jest przecież stała. Metoda Explicit Euler już po kilku krokach czasowych przestaje przypominać ścisłe rozwiązanie. Niestety trudno jest zupełnie wyeliminować to zjawisko, za to możemy użyć metody, która znacznie wolniej będzie się oddalać od ścisłego rozwiązania. Zauważmy, że w metodzie Explicit Euler w każdym kroku czasowym tylko raz liczyliśmy wartość funkcji f. Liczbę wywołan funkcji f w każdym kroku czasowym nazywamy rzędem metody, stąd Explicit Euler jest metodą pierwszego rzędu. Wprowadźmy teraz przykładowe metody rzędu drugiego&lt;br /&gt;
&lt;br /&gt;
==Metoda Żabiego Skoku==  &lt;br /&gt;
W poprzedniej metodzie liczyliśmy wartość funkcji f w chwili &amp;lt;math&amp;gt;t_n&amp;lt;/math&amp;gt;, która była pochodzną po czasie naszego ścisłego rozwiązania. Kolejny punkt &amp;lt;math&amp;gt;x_{n+1}&amp;lt;/math&amp;gt; był liczony z przybliżenia liniowego funkcji  w chwili poprzedniej. Jeżeli faktyczna trajektoria ma niezerową drugą pochodzną to takie liniowe przybliżenie zawsze będzie nas oddalało od ścisłego rozwiązania. Dosyć prostym pomysłem na poprawienie zbieżności metody jest tak zwany żabi skok. Policzmy najpierw wartość zmiennej x przesuwając się w czasie o h/2 i policzmy wówczas pochodną, którą oznaczmy przez &amp;lt;math&amp;gt;k_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; k_1=f(t_n,x_n) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; k_2=f(t_n+h/2,x_n+h/2*k_1) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Nastepnie używamy pochodznej &amp;lt;math&amp;gt; k_2 &amp;lt;/math&amp;gt; zamiast pochodznej &amp;lt;math&amp;gt; k_1 &amp;lt;/math&amp;gt; do obliczenia wartości funkcji w kolejnym kroku czasowym.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x_{n+1}  = x_n + h k_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Przykładowa implementacja tej metody wygląda nastepująco&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def leapfrog(f,x0,t0,tk,h): &lt;br /&gt;
&lt;br /&gt;
    #generujemy wektor czasow&lt;br /&gt;
    t=np.arange(t0,tk,h)&lt;br /&gt;
&lt;br /&gt;
    #liczba krokow czasowych&lt;br /&gt;
    N=len(t)&lt;br /&gt;
&lt;br /&gt;
    #wektor wynikowy&lt;br /&gt;
    if hasattr(x0, &amp;quot;__len__&amp;quot;): x=np.zeros((N,len(x0)))&lt;br /&gt;
    else: x=np.zeros(N)&lt;br /&gt;
&lt;br /&gt;
    #wpisujemy wartosc poczatkowa&lt;br /&gt;
    x[0]=np.array(x0)&lt;br /&gt;
&lt;br /&gt;
    #index&lt;br /&gt;
    i=1&lt;br /&gt;
&lt;br /&gt;
    #petla glowna&lt;br /&gt;
    while (i&amp;lt;N):&lt;br /&gt;
        k1=f(t[i-1],x[i-1])&lt;br /&gt;
        k2=f(t[i-1]+h*0.5,x[i-1]+0.5*h*k1)&lt;br /&gt;
        x[i]=np.array(x[i-1]+h*k2)&lt;br /&gt;
        i+=1&lt;br /&gt;
    return t,x&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Rozwiązanie równania oscylatora tą metodą dla identycznych jak poprzednio czasów da nastepujące wyniki&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
t,x=leapfrog(oscylator,[1.0,1.0],0.0,100,0.01)&lt;br /&gt;
py.plot(t,x[:,0])&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Plik:img3.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
t,x=leapfrog(oscylator,[1.0,1.0],0.0,1000,0.01)&lt;br /&gt;
py.plot(t,x[:,0])&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Plik:img4.png]]&lt;br /&gt;
&lt;br /&gt;
==Metoda Heuna==&lt;br /&gt;
Kolejną metodą niewiele różniącą się od poprzedniej jest metoda Heuna. Zdefiniowana jest ona przez równania&lt;br /&gt;
&amp;lt;math&amp;gt; k_1=f(t_n,x_n) &amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; k_2=f(t_n+h/2,x_n+h/2*k_1) &amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; x_{n+1}  = x_n + h k_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Implementacja wygląda następująco&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
def Heun(f,x0,t0,tk,h): &lt;br /&gt;
    #generujemy wektor czasow&lt;br /&gt;
    t=np.arange(t0,tk,h)&lt;br /&gt;
    #liczba krokow czasowych&lt;br /&gt;
    N=len(t)&lt;br /&gt;
    #wektor wynikowy&lt;br /&gt;
    if hasattr(x0, &amp;quot;__len__&amp;quot;): x=np.zeros((N,len(x0)))&lt;br /&gt;
    else: x=np.zeros(N)&lt;br /&gt;
    #wpisujemy wartosc poczatkowa&lt;br /&gt;
    x[0]=np.array(x0)&lt;br /&gt;
    #index&lt;br /&gt;
    i=1&lt;br /&gt;
    #petla glowna&lt;br /&gt;
    while (i&amp;lt;N):&lt;br /&gt;
        k1=f(t[i-1],x[i-1])&lt;br /&gt;
        k2=f(t[i-1]+h*0.5,x[i-1]+0.5*h*k1)&lt;br /&gt;
        x[i]=np.array(x[i-1]+h*0.5*(k1+k2))&lt;br /&gt;
        i+=1&lt;br /&gt;
    return t,x&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Runge-Kutta czwartego rzędu==&lt;br /&gt;
Ostatnią metodą, którą omówimy jest najbardziej popularna metoda zwana w skrócie RK4. Metoda to uznawana jest za kanoniczną i w większości zastosowań dającą najlepsze wyniki. Metody wyższego rzędu nie wnoszą już do wyniku znaczącej poprawy. Jak sugeruje nazwa metody, jej rząd to 4, czyli w każdym kroku czasowym czterokrotnie wywołujemy funkcję f. Metoda ta zdefiniowana jest wzorami&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;    k_1 = f \left( t_n, x_n \right) &amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;    k_2 = f \left( t_n + {h \over 2}, x_n + {1 \over 2} k_1 \right) &amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;    k_3 = f \left( t_n + {h \over 2}, x_n + {1 \over 2} k_2 \right) &amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;    k_4 = f \left( t_n + h, x_n + k_3 \right) &amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;    x_{n+1} = x_n + {h \over 6} (k_1 + 2k_2 + 2k_3 + k_4) &amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
a implementacja wygląda następująco&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def RK4(f,x0,t0,tk,h): &lt;br /&gt;
    #generujemy wektor czasow&lt;br /&gt;
    t=np.arange(t0,tk,h)&lt;br /&gt;
    #liczba krokow czasowych&lt;br /&gt;
    N=len(t)&lt;br /&gt;
    #wektor wynikowy&lt;br /&gt;
    if hasattr(x0, &amp;quot;__len__&amp;quot;): x=np.zeros((N,len(x0)))&lt;br /&gt;
    else: x=np.zeros(N)&lt;br /&gt;
    #wpisujemy wartosc poczatkowa&lt;br /&gt;
    x[0]=np.array(x0)&lt;br /&gt;
    #index&lt;br /&gt;
    i=1&lt;br /&gt;
    #petla glowna&lt;br /&gt;
    while (i&amp;lt;N):&lt;br /&gt;
        k1=h*f(t[i-1],x[i-1])&lt;br /&gt;
        k2=h*f(t[i-1]+h*0.5,x[i-1]+0.5*k1)&lt;br /&gt;
        k3=h*f(t[i-1]+h*0.5,x[i-1]+0.5*k2)&lt;br /&gt;
        k4=h*f(t[i-1]+h,x[i-1]+k3)&lt;br /&gt;
        x[i]=np.array(x[i-1]+(k1+2.0*k2+2.0*k3+k4)/6)&lt;br /&gt;
        i+=1&lt;br /&gt;
    return t,x&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==Przykłady==&lt;br /&gt;
===Zadanie - Wahadło matematyczne z tłumieniem i siłą wymuszającą===&lt;br /&gt;
&lt;br /&gt;
Rozwiąż numerycznie metodą RK4 równanie różniczkowe oscylatora harmonicznego z tłumieniem i siłą wymuszającą&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \frac{d^2x}{dt^2} + \Gamma \frac{dx}{dt} + w_0^2 x = f_0 \cos(W t) &amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
przyjmując parametry &amp;lt;math&amp;gt; f_0 =1, w_0=1, \Gamma=0.1, h=0.1 &amp;lt;/math&amp;gt;. Wykreśl zależność amplitudy drgań w funkcji częstości siły wymuszającej W, dla W z przedziału [0.1,3].&lt;br /&gt;
===Rozwiązanie===&lt;br /&gt;
Zacznijmy od sprowadzenia równania drugiego stopnia do równania pierszego stopnia i zapisania go w postaci funkcji&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def oscylator(t,y):&lt;br /&gt;
    f0=1.0&lt;br /&gt;
    w0=1.0&lt;br /&gt;
    Gamma=0.1&lt;br /&gt;
&lt;br /&gt;
    x=y[0]&lt;br /&gt;
    xdot=y[1]&lt;br /&gt;
    return np.array([xdot,f0*np.cos(oscylator.W*t)-oscylator.Gamma*xdot-w0*w0*x])&lt;br /&gt;
&lt;br /&gt;
oscylator.W=1.0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Nieprzypadkowo parametr W nie jest definiowany w samej funkcji jako zmienna wewnętrzna, ale jako atrybut obiektu jakim jest funkcja. Dzięki takiej konstrukcji łatwo będzie nam zmieniać parametr W czyli częstość siły wymuszającej. Zobaczmy jak wygląda trajektoria będąca rozwiązaniem tego równania dla warunku początkowego [0,1] i czasu końcowego równego 400.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
py.plot(*RK4(oscylator,[0.0,1.0],0.0,400.0,0.1))&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Plik:oscy1.png]]&lt;br /&gt;
&lt;br /&gt;
Widać że początkowo układ dochodzi do stanu regularnych oscylacji. Do analizy amplitudy interesuje nas jedynie koncowa część więc ograniczymy się do analizy trajektorii od czasu 200 do czasu 400. Napiszmy teraz funkcję, która na podstawie trajektorii wyznaczy nam amplitudę oscylacji&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def amplituda(x):&lt;br /&gt;
    lista=x[2000:,0]&lt;br /&gt;
    return (max(lista)-min(lista))*0.5&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Interesować nas będzie amplituda drgań w funkcji częstość W. Wygenerujmy listę wartości W dla których będziemy liczyć amplitudę.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
Omegas=np.arange(0.1,3.0,0.05)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Możemy teraz dla każdej z wartości W rozwiązać numerycznie równanie różniczkowe i wyznaczyć odpowiadającą amplitudę oscylacji&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
amp=[amplituda(RK4(oscylator,[0.0,1.0],0.0,400.0,0.1)[1]) for oscylator.W in Omegas]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Wynik koncowy wyglada następująco&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
py.plot(Omegas,amp)&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
[[Plik:oscy2.png]]&lt;br /&gt;
&lt;br /&gt;
Jak można było się domyślić amplituda jest największa gdy częstotliwość wymuszania W pokrywa się z wartością częstotliwości drgań własnych &amp;lt;math&amp;gt; w_0=1 &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Zadanie - Układ Lorenza===&lt;br /&gt;
Rozwiąż układ równań różniczkowych Lorenza dany wzorami&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; \begin{cases}\dot x=\sigma y-\sigma x\\\dot y=-xz+rx-y\\\dot z=xy-bz\end{cases}, &amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
metodą całkowania Rungego–Kutty drugiego rzędu z α = 2/3, czyli&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k_1 &amp;amp;= f(t_n,x_n)&amp;lt;/math&amp;gt; , &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;k_2 &amp;amp;= f(t_n + \tfrac{2}{3}h, x_n + \tfrac{2}{3}h k_1)&amp;lt;/math&amp;gt; , &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;x_{n+1} &amp;amp;= x_n + h \left(\tfrac{1}{4}k_1+\tfrac{3}{4} k_2 \right). &amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Przyjmij sigma=10, b=8/3, r=99.96, krok czasowy h=0.005 i warunki początkowe x=1,y=0,z=0. Wykonaj 8000 kroków czasowych. Układ po pewnym czasie zacznie poruszać się po pewnej periodycznej trajektorii. Wykonaj 3 rysunki TEJ PERIODYCZNEJ TRAJEKTORII (bez okresu dochodzenia do niej) w płaszczyznach (x,y), (y,z) i (z,x). Wypisz na ekranie przedziały wartości jakie przyjmują zmienne x,y i z na periodycznej trajektorii oraz okres trajektorii periodycznej.&lt;br /&gt;
===Rozwiązanie===&lt;br /&gt;
Zacznijmu od implementacji podanej w treści zadania metody całkowania RK2&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import pylab as py&lt;br /&gt;
&lt;br /&gt;
#rozwiazujemy rownanie dx(t)/dt=f(t,x)&lt;br /&gt;
&lt;br /&gt;
#metoda Explicit Euler&lt;br /&gt;
#f - funkcja f z rownania&lt;br /&gt;
#x0-wartosc poczatkowa&lt;br /&gt;
#t0-czas poczatkowy&lt;br /&gt;
#tk-czas koncowy&lt;br /&gt;
#h-krok czasowy&lt;br /&gt;
&lt;br /&gt;
def RK2(f,x0,t0,tk,h): &lt;br /&gt;
&lt;br /&gt;
    #generujemy wektor czasow&lt;br /&gt;
    t=np.arange(t0,tk,h)&lt;br /&gt;
&lt;br /&gt;
    #liczba krokow czasowych&lt;br /&gt;
    N=len(t)&lt;br /&gt;
&lt;br /&gt;
    #wektor wynikowy&lt;br /&gt;
    if hasattr(x0, &amp;quot;__len__&amp;quot;): x=np.zeros((N,len(x0)))&lt;br /&gt;
    else: x=np.zeros(N)&lt;br /&gt;
&lt;br /&gt;
    #wpisujemy wartosc poczatkowa&lt;br /&gt;
    x[0]=np.array(x0)&lt;br /&gt;
&lt;br /&gt;
    #index&lt;br /&gt;
    i=1&lt;br /&gt;
&lt;br /&gt;
    #petla glowna&lt;br /&gt;
    while (i&amp;lt;N):&lt;br /&gt;
        k1=h*f(t[i-1],x[i-1])&lt;br /&gt;
        k2=h*f(t[i-1]+h*2.0/3.0,x[i-1]+k1*2.0/3.0)&lt;br /&gt;
        x[i]=np.array(x[i-1]+0.25*k1+0.75*k2)&lt;br /&gt;
        i+=1&lt;br /&gt;
    return t,x&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Następnie napiszmy funkcję opisującą układ Lorenza&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def Lorenza(t,y):&lt;br /&gt;
    sigma=10.0&lt;br /&gt;
    b=8.0/3&lt;br /&gt;
    r=99.96&lt;br /&gt;
    xx=y[0]&lt;br /&gt;
    yy=y[1]&lt;br /&gt;
    zz=y[2]&lt;br /&gt;
    xdot=sigma*(yy-xx)&lt;br /&gt;
    ydot=-xx*zz+r*xx-yy&lt;br /&gt;
    zdot=xx*yy-b*zz&lt;br /&gt;
    return np.array([xdot,ydot,zdot])&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zobaczmy teraz jak wyglądają trajektorie wszystkich trzech współrzędnych  rozwiązania z zadanymi parametrami&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
t,x=RK2(Lorenza,[1.0,0.0,0.0],0.0,40.0,0.005)&lt;br /&gt;
py.plot(t,x[:,1])&lt;br /&gt;
py.show()&lt;br /&gt;
py.plot(t,x[:,2])&lt;br /&gt;
py.show()&lt;br /&gt;
py.plot(t,x[:,0])&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Plik:lor1.png]]&lt;br /&gt;
&lt;br /&gt;
[[Plik:lor2.png]]&lt;br /&gt;
&lt;br /&gt;
[[Plik:lor3.png]]&lt;br /&gt;
&lt;br /&gt;
Możemy zauważyć że układ początkowo zachowuje się chaotycznie a potem dąży do pewnego stanu ustalonego (tzw. atraktora). Cała trajektoria składa się z 8000 punktów, przyjmijmy że powyżej punktu o numerze 2500 mamy już do czynienia tylko z periodyczną trajektorią. Wykreślmy zatem portrety fazowe o których mowa w treści zadania&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
py.plot(x[2500:,0],x[2500:,1])&lt;br /&gt;
py.show()&lt;br /&gt;
py.plot(x[2500:,1],x[2500:,2])&lt;br /&gt;
py.show()&lt;br /&gt;
py.plot(x[2500:,2],x[2500:,0])&lt;br /&gt;
py.show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Plik:lor4.png]]&lt;br /&gt;
&lt;br /&gt;
[[Plik:lor5.png]]&lt;br /&gt;
&lt;br /&gt;
[[Plik:lor6.png]]&lt;br /&gt;
&lt;br /&gt;
Wypisanie zakresów jest już tylko formalnością&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
print 'zmienna x przyjmuje wartosci z zakresu: (',min(x[2500:,0]),',',max(x[2500:,0]),')'&lt;br /&gt;
print 'zmienna y przyjmuje wartosci z zakresu: (',min(x[2500:,1]),',',max(x[2500:,1]),')'&lt;br /&gt;
print 'zmienna z przyjmuje wartosci z zakresu: (',min(x[2500:,2]),',',max(x[2500:,2]),')'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Okres trajektorii periodycznej możemy znaleść na przykład w ten sposób&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
prog=140&lt;br /&gt;
lista=[]&lt;br /&gt;
for i in range(2500,8000):&lt;br /&gt;
    if (x[i-1,2]&amp;lt;prog) and (x[i,2]&amp;gt;prog): lista.append(i)&lt;br /&gt;
print 'okres to:',np.mean(np.diff(lista)*0.005)&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; okres to: 1.0975&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; zmienna x przyjmuje wartosci z zakresu: ( -33.4431203059 , 25.8037953495 )&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; zmienna y przyjmuje wartosci z zakresu: ( -56.7169238157 , 37.3166709986 )&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; zmienna z przyjmuje wartosci z zakresu: ( 53.4652816712 , 144.264397579 )&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[&amp;quot;Programowanie dla Fizyków Medycznych&amp;quot;]]&lt;/div&gt;</summary>
		<author><name>SuperAdmin</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=MediaWiki:Common.css&amp;diff=3547</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=MediaWiki:Common.css&amp;diff=3547"/>
		<updated>2015-06-08T16:49:54Z</updated>

		<summary type="html">&lt;p&gt;SuperAdmin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Umieszczony tutaj kod CSS zostanie zastosowany we wszystkich skórkach */&lt;br /&gt;
&lt;br /&gt;
/* &amp;lt;nowiki&amp;gt; Common CSS for all skins - copy to your user CSS to change */&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
* Hide text in the onlyinprint class. Is used for the collection extension&lt;br /&gt;
*/&lt;br /&gt;
.onlyinprint {display: none}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Logo&lt;br /&gt;
#p-logo {&lt;br /&gt;
  z-index: 3;&lt;br /&gt;
  position: absolute;&lt;br /&gt;
  top: 0;&lt;br /&gt;
  left: 0;&lt;br /&gt;
  height: 222px;&lt;br /&gt;
  width: 1339px;&lt;br /&gt;
  overflow: visible;&lt;br /&gt;
}&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
/* Default styling for HTML elements */&lt;br /&gt;
dfn {&lt;br /&gt;
    font-style: inherit;  /* Reset default styling for &amp;lt;dfn&amp;gt; */&lt;br /&gt;
}&lt;br /&gt;
q {&lt;br /&gt;
    quotes: '&amp;quot;' '&amp;quot;' &amp;quot;'&amp;quot; &amp;quot;'&amp;quot;;  /* Straight quote marks for &amp;lt;q&amp;gt; */&lt;br /&gt;
}&lt;br /&gt;
tt {&lt;br /&gt;
   background-color: #F0F0F0;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
tt.shell {&lt;br /&gt;
   background-color: #F0FFF0;&lt;br /&gt;
}&lt;br /&gt;
blockquote {&lt;br /&gt;
	overflow: hidden;  /* Avoid collision of background with floating elements */&lt;br /&gt;
}&lt;br /&gt;
strong.selflink {&lt;br /&gt;
    font-weight: 700;  /* Prevent the 'double bold' bug in Firefox when using DirectWrite */&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Main page fixes */&lt;br /&gt;
#interwiki-completelist {&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
body.page-Main_Page #ca-delete {&lt;br /&gt;
    display: none !important;&lt;br /&gt;
}&lt;br /&gt;
body.page-Main_Page #mp-topbanner {&lt;br /&gt;
    clear: both;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Edit window toolbar */&lt;br /&gt;
#toolbar {&lt;br /&gt;
    height: 22px;&lt;br /&gt;
    margin-bottom: 6px;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* WikiEditor CSS for #wpTextbox1 is not loaded on .css/.js pages, so load here. [[phab:T97299]] */&lt;br /&gt;
.wikiEditor-ui-text #wpTextbox1 {&lt;br /&gt;
    line-height: 1.5em;&lt;br /&gt;
    resize: vertical;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Hide charinsert base for those not using the gadget */&lt;br /&gt;
#editpage-specialchars {&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Highlight data points in the info action if specified in the URL */&lt;br /&gt;
body.action-info :target {&lt;br /&gt;
    background: #DEF;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Make the list of references smaller */&lt;br /&gt;
ol.references,&lt;br /&gt;
div.reflist,&lt;br /&gt;
div.refbegin {&lt;br /&gt;
    font-size: 90%;            /* Default font-size */&lt;br /&gt;
    margin-bottom: 0.5em;&lt;br /&gt;
}&lt;br /&gt;
div.refbegin-100 {&lt;br /&gt;
    font-size: 100%;           /* Option for normal fontsize in {{refbegin}} */&lt;br /&gt;
}&lt;br /&gt;
div.reflist ol.references {&lt;br /&gt;
    font-size: 100%;           /* Reset font-size when nested in div.reflist */&lt;br /&gt;
    list-style-type: inherit;  /* Enable custom list style types */&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Highlight clicked reference in blue to help navigation */&lt;br /&gt;
span.citation:target {&lt;br /&gt;
    background-color: #DEF;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Ensure refs in table headers and the like aren't bold or italic */&lt;br /&gt;
sup.reference {&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
    font-style: normal;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Allow hidden ref errors to be shown by user CSS */&lt;br /&gt;
span.brokenref {&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Styling for citations (CSS3). Breaks long urls, etc., rather than overflowing box */&lt;br /&gt;
.citation {&lt;br /&gt;
    word-wrap: break-word;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* For linked citation numbers and document IDs, where&lt;br /&gt;
   the number need not be shown on a screen or a handheld,&lt;br /&gt;
   but should be included in the printed version */&lt;br /&gt;
@media screen, handheld {&lt;br /&gt;
    .citation .printonly {&lt;br /&gt;
        display: none;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Reset top margin for lists embedded in columns */&lt;br /&gt;
div.columns {&lt;br /&gt;
    margin-top: 0.3em;&lt;br /&gt;
}&lt;br /&gt;
div.columns dl,&lt;br /&gt;
div.columns ol,&lt;br /&gt;
div.columns ul {&lt;br /&gt;
    margin-top: 0;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Avoid elements from breaking between columns */&lt;br /&gt;
.nocolbreak,&lt;br /&gt;
div.columns li,&lt;br /&gt;
div.columns dd dd {&lt;br /&gt;
    -webkit-column-break-inside: avoid;&lt;br /&gt;
    page-break-inside: avoid;&lt;br /&gt;
    break-inside: avoid-column;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Style for [[Template:Flowlist]] that Lets lists flow around floating objecs */&lt;br /&gt;
.flowlist ul {&lt;br /&gt;
    overflow-x: hidden;&lt;br /&gt;
    margin-left: 0;&lt;br /&gt;
    padding-left: 1.6em;&lt;br /&gt;
}&lt;br /&gt;
.flowlist ol {&lt;br /&gt;
    overflow-x: hidden;&lt;br /&gt;
    margin-left: 0;&lt;br /&gt;
    padding-left: 3.2em;&lt;br /&gt;
}&lt;br /&gt;
.flowlist dl {&lt;br /&gt;
    overflow-x: hidden;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Style for horizontal lists (separator following item).&lt;br /&gt;
   IE8-specific classes are assigned in [[MediaWiki:Common.js/IEFixes.js]].&lt;br /&gt;
   @source mediawiki.org/wiki/Snippets/Horizontal_lists&lt;br /&gt;
   @revision 6 (2014-05-09)&lt;br /&gt;
   @author [[User:Edokter]]&lt;br /&gt;
 */&lt;br /&gt;
.hlist dl,&lt;br /&gt;
.hlist ol,&lt;br /&gt;
.hlist ul {&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
}&lt;br /&gt;
/* Display list items inline */&lt;br /&gt;
.hlist dd,&lt;br /&gt;
.hlist dt,&lt;br /&gt;
.hlist li {&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    display: inline;&lt;br /&gt;
}&lt;br /&gt;
/* Display nested lists inline */&lt;br /&gt;
.hlist.inline,&lt;br /&gt;
.hlist.inline dl,&lt;br /&gt;
.hlist.inline ol,&lt;br /&gt;
.hlist.inline ul,&lt;br /&gt;
.hlist dl dl, .hlist dl ol, .hlist dl ul,&lt;br /&gt;
.hlist ol dl, .hlist ol ol, .hlist ol ul,&lt;br /&gt;
.hlist ul dl, .hlist ul ol, .hlist ul ul {&lt;br /&gt;
    display: inline;&lt;br /&gt;
}&lt;br /&gt;
/* Generate interpuncts */&lt;br /&gt;
.hlist dt:after {&lt;br /&gt;
    content: &amp;quot;: &amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
.hlist dd:after,&lt;br /&gt;
.hlist li:after {&lt;br /&gt;
    content: &amp;quot; · &amp;quot;;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
.hlist dd:last-child:after,&lt;br /&gt;
.hlist dt:last-child:after,&lt;br /&gt;
.hlist li:last-child:after {&lt;br /&gt;
    content: none;&lt;br /&gt;
}&lt;br /&gt;
/* For IE8 */&lt;br /&gt;
.hlist dd.hlist-last-child:after,&lt;br /&gt;
.hlist dt.hlist-last-child:after,&lt;br /&gt;
.hlist li.hlist-last-child:after {&lt;br /&gt;
    content: none;&lt;br /&gt;
}&lt;br /&gt;
/* Add parentheses around nested lists */&lt;br /&gt;
.hlist dd dd:first-child:before, .hlist dd dt:first-child:before, .hlist dd li:first-child:before,&lt;br /&gt;
.hlist dt dd:first-child:before, .hlist dt dt:first-child:before, .hlist dt li:first-child:before,&lt;br /&gt;
.hlist li dd:first-child:before, .hlist li dt:first-child:before, .hlist li li:first-child:before {&lt;br /&gt;
    content: &amp;quot; (&amp;quot;;&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
}&lt;br /&gt;
.hlist dd dd:last-child:after, .hlist dd dt:last-child:after, .hlist dd li:last-child:after,&lt;br /&gt;
.hlist dt dd:last-child:after, .hlist dt dt:last-child:after, .hlist dt li:last-child:after,&lt;br /&gt;
.hlist li dd:last-child:after, .hlist li dt:last-child:after, .hlist li li:last-child:after {&lt;br /&gt;
    content: &amp;quot;) &amp;quot;;&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
}&lt;br /&gt;
/* For IE8 */&lt;br /&gt;
.hlist dd dd.hlist-last-child:after, .hlist dd dt.hlist-last-child:after, .hlist dd li.hlist-last-child:after,&lt;br /&gt;
.hlist dt dd.hlist-last-child:after, .hlist dt dt.hlist-last-child:after, .hlist dt li.hlist-last-child:after,&lt;br /&gt;
.hlist li dd.hlist-last-child:after, .hlist li dt.hlist-last-child:after, .hlist li li.hlist-last-child:after {&lt;br /&gt;
    content: &amp;quot;) &amp;quot;;&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
}&lt;br /&gt;
/* Put ordinals in front of ordered list items */&lt;br /&gt;
.hlist ol {&lt;br /&gt;
    counter-reset: listitem;&lt;br /&gt;
}&lt;br /&gt;
.hlist ol &amp;gt; li {&lt;br /&gt;
    counter-increment: listitem;&lt;br /&gt;
}&lt;br /&gt;
.hlist ol &amp;gt; li:before {&lt;br /&gt;
    content: &amp;quot; &amp;quot; counter(listitem) &amp;quot; &amp;quot;;&lt;br /&gt;
    white-space: nowrap;&lt;br /&gt;
}&lt;br /&gt;
.hlist dd ol &amp;gt; li:first-child:before,&lt;br /&gt;
.hlist dt ol &amp;gt; li:first-child:before,&lt;br /&gt;
.hlist li ol &amp;gt; li:first-child:before {&lt;br /&gt;
    content: &amp;quot; (&amp;quot; counter(listitem) &amp;quot; &amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Unbulleted lists */&lt;br /&gt;
.plainlist ol,&lt;br /&gt;
.plainlist ul {&lt;br /&gt;
    line-height: inherit;&lt;br /&gt;
    list-style: none none;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
}&lt;br /&gt;
.plainlist ol li,&lt;br /&gt;
.plainlist ul li {&lt;br /&gt;
    margin-bottom: 0;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Default style for navigation boxes */&lt;br /&gt;
.navbox {                     /* Navbox container style */&lt;br /&gt;
    border: 1px solid #aaa;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    margin: auto;&lt;br /&gt;
    clear: both;&lt;br /&gt;
    font-size: 88%;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    padding: 1px;&lt;br /&gt;
}&lt;br /&gt;
.navbox-inner,&lt;br /&gt;
.navbox-subgroup {&lt;br /&gt;
    width: 100%;&lt;br /&gt;
}&lt;br /&gt;
.navbox-group,&lt;br /&gt;
.navbox-title,&lt;br /&gt;
.navbox-abovebelow {&lt;br /&gt;
    padding: 0.25em 1em;      /* Title, group and above/below styles */&lt;br /&gt;
    line-height: 1.5em;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
}&lt;br /&gt;
th.navbox-group {             /* Group style */&lt;br /&gt;
    white-space: nowrap;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    text-align: right;&lt;br /&gt;
}&lt;br /&gt;
.navbox,&lt;br /&gt;
.navbox-subgroup {&lt;br /&gt;
    background: #fdfdfd;      /* Background color */&lt;br /&gt;
}&lt;br /&gt;
.navbox-list {&lt;br /&gt;
    line-height: 1.8em;&lt;br /&gt;
    border-color: #fdfdfd;    /* Must match background color */&lt;br /&gt;
}&lt;br /&gt;
.navbox th,&lt;br /&gt;
.navbox-title {&lt;br /&gt;
    background: #ccccff;      /* Level 1 color */&lt;br /&gt;
}&lt;br /&gt;
.navbox-abovebelow,&lt;br /&gt;
th.navbox-group,&lt;br /&gt;
.navbox-subgroup .navbox-title {&lt;br /&gt;
    background: #ddddff;      /* Level 2 color */&lt;br /&gt;
}&lt;br /&gt;
.navbox-subgroup .navbox-group,&lt;br /&gt;
.navbox-subgroup .navbox-abovebelow {&lt;br /&gt;
    background: #e6e6ff;      /* Level 3 color */&lt;br /&gt;
}&lt;br /&gt;
.navbox-even {&lt;br /&gt;
    background: #f7f7f7;      /* Even row striping */&lt;br /&gt;
}&lt;br /&gt;
.navbox-odd {&lt;br /&gt;
    background: transparent;  /* Odd row striping */&lt;br /&gt;
}&lt;br /&gt;
table.navbox + table.navbox {  /* Single pixel border between adjacent navboxes */&lt;br /&gt;
    margin-top: -1px;          /* (doesn't work for IE6, but that's okay)       */&lt;br /&gt;
}&lt;br /&gt;
.navbox .hlist td dl,&lt;br /&gt;
.navbox .hlist td ol,&lt;br /&gt;
.navbox .hlist td ul,&lt;br /&gt;
.navbox td.hlist dl,&lt;br /&gt;
.navbox td.hlist ol,&lt;br /&gt;
.navbox td.hlist ul {&lt;br /&gt;
    padding: 0.125em 0;       /* Adjust hlist padding in navboxes */&lt;br /&gt;
}&lt;br /&gt;
ol + table.navbox,&lt;br /&gt;
ul + table.navbox {&lt;br /&gt;
    margin-top: 1em;        /* Prevent lists from clinging to navboxes */&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Default styling for Navbar template */&lt;br /&gt;
.navbar {&lt;br /&gt;
    display: inline;&lt;br /&gt;
    font-size: 88%;&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
}&lt;br /&gt;
.navbar ul {&lt;br /&gt;
    display: inline;&lt;br /&gt;
    white-space: nowrap;&lt;br /&gt;
}&lt;br /&gt;
.mw-body-content .navbar ul {&lt;br /&gt;
    line-height: inherit;&lt;br /&gt;
}&lt;br /&gt;
.navbar li {&lt;br /&gt;
    word-spacing: -0.125em;&lt;br /&gt;
}&lt;br /&gt;
.navbar.mini li span {&lt;br /&gt;
  font-variant: small-caps;&lt;br /&gt;
}&lt;br /&gt;
/* Navbar styling when nested in infobox and navbox */&lt;br /&gt;
.infobox .navbar {&lt;br /&gt;
    font-size: 100%;&lt;br /&gt;
}&lt;br /&gt;
.navbox .navbar {&lt;br /&gt;
    display: block;&lt;br /&gt;
    font-size: 100%;&lt;br /&gt;
}&lt;br /&gt;
.navbox-title .navbar {&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    float: left;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    text-align: left;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    margin-right: 0.5em;&lt;br /&gt;
    width: 6em;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* 'show'/'hide' buttons created dynamically by the CollapsibleTables javascript&lt;br /&gt;
   in [[MediaWiki:Common.js]] are styled here so they can be customised. */&lt;br /&gt;
.collapseButton {&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    float: right;&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    margin-left: 0.5em;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    text-align: right;&lt;br /&gt;
    width: auto;&lt;br /&gt;
}&lt;br /&gt;
/* In navboxes, the show/hide button balances the v·d·e links&lt;br /&gt;
   from [[Template:Navbar]], so they need to be the same width. */&lt;br /&gt;
.navbox .collapseButton {&lt;br /&gt;
    width: 6em;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Styling for JQuery makeCollapsible, matching that of collapseButton */&lt;br /&gt;
.mw-collapsible-toggle {&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    text-align: right;&lt;br /&gt;
}&lt;br /&gt;
.navbox .mw-collapsible-toggle {&lt;br /&gt;
    width: 6em;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Infobox template style */&lt;br /&gt;
.infobox {&lt;br /&gt;
    border: 1px solid #aaa;&lt;br /&gt;
    border-spacing: 3px;&lt;br /&gt;
    background-color: #f9f9f9;&lt;br /&gt;
    color: black;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    margin: 0.5em 0 0.5em 1em;&lt;br /&gt;
    padding: 0.2em;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    float: right;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    clear: right;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    text-align: left;&lt;br /&gt;
    font-size: 88%;&lt;br /&gt;
    line-height: 1.5em;&lt;br /&gt;
}&lt;br /&gt;
.infobox caption {&lt;br /&gt;
    font-size: 125%;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    padding: 0.2em;&lt;br /&gt;
}&lt;br /&gt;
.infobox td,&lt;br /&gt;
.infobox th {&lt;br /&gt;
    vertical-align: top;&lt;br /&gt;
}&lt;br /&gt;
.infobox.bordered {&lt;br /&gt;
    border-collapse: collapse;&lt;br /&gt;
}&lt;br /&gt;
.infobox.bordered td,&lt;br /&gt;
.infobox.bordered th {&lt;br /&gt;
    border: 1px solid #aaa;&lt;br /&gt;
}&lt;br /&gt;
.infobox.bordered .borderless td,&lt;br /&gt;
.infobox.bordered .borderless th {&lt;br /&gt;
    border: 0;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
.infobox.sisterproject {&lt;br /&gt;
    width: 20em;&lt;br /&gt;
    font-size: 90%;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
.infobox.standard-talk {&lt;br /&gt;
    border: 1px solid #c0c090;&lt;br /&gt;
    background-color: #f8eaba;&lt;br /&gt;
}&lt;br /&gt;
.infobox.standard-talk.bordered td,&lt;br /&gt;
.infobox.standard-talk.bordered th {&lt;br /&gt;
    border: 1px solid #c0c090;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* styles for bordered infobox with merged rows */&lt;br /&gt;
.infobox.bordered .mergedtoprow td,&lt;br /&gt;
.infobox.bordered .mergedtoprow th {&lt;br /&gt;
    border: 0;&lt;br /&gt;
    border-top: 1px solid #aaa;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    border-right: 1px solid #aaa;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
.infobox.bordered .mergedrow td,&lt;br /&gt;
.infobox.bordered .mergedrow th {&lt;br /&gt;
    border: 0;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    border-right: 1px solid #aaa;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Styles for geography infoboxes, eg countries,&lt;br /&gt;
   country subdivisions, cities, etc.            */&lt;br /&gt;
.infobox.geography {&lt;br /&gt;
    border-collapse: collapse;&lt;br /&gt;
    line-height: 1.2em;&lt;br /&gt;
    font-size: 90%;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
.infobox.geography  td,&lt;br /&gt;
.infobox.geography  th {&lt;br /&gt;
    border-top: 1px solid #aaa;&lt;br /&gt;
    padding: 0.4em 0.6em 0.4em 0.6em;&lt;br /&gt;
}&lt;br /&gt;
.infobox.geography .mergedtoprow td,&lt;br /&gt;
.infobox.geography .mergedtoprow th {&lt;br /&gt;
    border-top: 1px solid #aaa;&lt;br /&gt;
    padding: 0.4em 0.6em 0.2em 0.6em;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
.infobox.geography .mergedrow td,&lt;br /&gt;
.infobox.geography .mergedrow th {&lt;br /&gt;
    border: 0;&lt;br /&gt;
    padding: 0 0.6em 0.2em 0.6em;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
.infobox.geography .mergedbottomrow td,&lt;br /&gt;
.infobox.geography .mergedbottomrow th {&lt;br /&gt;
    border-top: 0;&lt;br /&gt;
    border-bottom: 1px solid #aaa;&lt;br /&gt;
    padding: 0 0.6em 0.4em 0.6em;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
.infobox.geography .maptable td,&lt;br /&gt;
.infobox.geography .maptable th {&lt;br /&gt;
    border: 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*******************************/&lt;br /&gt;
/* wikitable/prettytable class */&lt;br /&gt;
/*******************************/&lt;br /&gt;
 &lt;br /&gt;
/* wikitable/prettytable class for skinning normal tables,&lt;br /&gt;
   but don't skin tables within tables by accident */&lt;br /&gt;
&lt;br /&gt;
table.wikitable, table.prettytable { margin:1em 0em; background:#f9f9f9; border:1px #aaaaaa solid; border-collapse:collapse; }&lt;br /&gt;
table.wikitable&amp;gt;*&amp;gt;tr&amp;gt;th,&lt;br /&gt;
table.wikitable&amp;gt;*&amp;gt;tr&amp;gt;td,&lt;br /&gt;
table.wikitable&amp;gt;tr&amp;gt;th,&lt;br /&gt;
table.wikitable&amp;gt;tr&amp;gt;td,&lt;br /&gt;
table.prettytable&amp;gt;*&amp;gt;tr&amp;gt;th,&lt;br /&gt;
table.prettytable&amp;gt;*&amp;gt;tr&amp;gt;td,&lt;br /&gt;
table.prettytable&amp;gt;tr&amp;gt;th,&lt;br /&gt;
table.prettytable&amp;gt;tr&amp;gt;td&lt;br /&gt;
{&lt;br /&gt;
  border: 1px #aaaaaa solid;&lt;br /&gt;
  padding: 0.2em;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 table.wikitable&amp;gt;*&amp;gt;tr&amp;gt;th,&lt;br /&gt;
 table.wikitable&amp;gt;tr&amp;gt;th,&lt;br /&gt;
 table.prettytable&amp;gt;*&amp;gt;tr&amp;gt;th,&lt;br /&gt;
 table.prettytable&amp;gt;tr&amp;gt;th&lt;br /&gt;
 {&lt;br /&gt;
   background: #ccccff;&lt;br /&gt;
   text-align: center;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 table.wikitable caption, table.prettytable caption { margin-left:inherit; margin-right:inherit; }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
/* Normal font styling for table row headers with scope=&amp;quot;row&amp;quot; tag */&lt;br /&gt;
.wikitable.plainrowheaders th[scope=row] {&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    text-align: left;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Lists in data cells are always left-aligned */&lt;br /&gt;
.wikitable td ul,&lt;br /&gt;
.wikitable td ol,&lt;br /&gt;
.wikitable td dl {&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    text-align: left;&lt;br /&gt;
}&lt;br /&gt;
/* ...unless they also use the hlist class */&lt;br /&gt;
.toc.hlist ul,&lt;br /&gt;
#toc.hlist ul,&lt;br /&gt;
.wikitable.hlist td ul,&lt;br /&gt;
.wikitable.hlist td ol,&lt;br /&gt;
.wikitable.hlist td dl {&lt;br /&gt;
    text-align: inherit;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Icons for medialist templates [[Template:Listen]],&lt;br /&gt;
   [[Template:Multi-listen_start]], [[Template:Video]],&lt;br /&gt;
   [[Template:Multi-video_start]] */&lt;br /&gt;
div.listenlist {&lt;br /&gt;
    background: url(&amp;quot;//upload.wikimedia.org/wikipedia/commons/4/47/Sound-icon.svg&amp;quot;) no-repeat scroll 0 0 transparent;&lt;br /&gt;
    background-size: 30px;&lt;br /&gt;
    padding-left: 40px;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Fix for hieroglyphs specificality issue in infoboxes ([[Phabricator:43869]]) */&lt;br /&gt;
table.mw-hiero-table td {&lt;br /&gt;
    vertical-align: middle;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Style rules for media list templates */&lt;br /&gt;
div.medialist {&lt;br /&gt;
    min-height: 50px;&lt;br /&gt;
    margin: 1em;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    background-position: top left;&lt;br /&gt;
    background-repeat: no-repeat;&lt;br /&gt;
}&lt;br /&gt;
div.medialist ul {&lt;br /&gt;
    list-style-type: none;&lt;br /&gt;
    list-style-image: none;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
}&lt;br /&gt;
div.medialist ul li {&lt;br /&gt;
    padding-bottom: 0.5em;&lt;br /&gt;
}&lt;br /&gt;
div.medialist ul li li {&lt;br /&gt;
    font-size: 91%;&lt;br /&gt;
    padding-bottom: 0;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Change the external link icon to an Adobe icon for all PDF files&lt;br /&gt;
   in browsers that support these CSS selectors, like Mozilla and Opera */&lt;br /&gt;
div#content a[href$=&amp;quot;.pdf&amp;quot;].external,&lt;br /&gt;
div#content a[href*=&amp;quot;.pdf?&amp;quot;].external,&lt;br /&gt;
div#content a[href*=&amp;quot;.pdf#&amp;quot;].external,&lt;br /&gt;
div#content a[href$=&amp;quot;.PDF&amp;quot;].external,&lt;br /&gt;
div#content a[href*=&amp;quot;.PDF?&amp;quot;].external,&lt;br /&gt;
div#content a[href*=&amp;quot;.PDF#&amp;quot;].external,&lt;br /&gt;
div#mw_content a[href$=&amp;quot;.pdf&amp;quot;].external,&lt;br /&gt;
div#mw_content a[href*=&amp;quot;.pdf?&amp;quot;].external,&lt;br /&gt;
div#mw_content a[href*=&amp;quot;.pdf#&amp;quot;].external,&lt;br /&gt;
div#mw_content a[href$=&amp;quot;.PDF&amp;quot;].external,&lt;br /&gt;
div#mw_content a[href*=&amp;quot;.PDF?&amp;quot;].external,&lt;br /&gt;
div#mw_content a[href*=&amp;quot;.PDF#&amp;quot;].external {&lt;br /&gt;
    background: url(&amp;quot;//upload.wikimedia.org/wikipedia/commons/2/23/Icons-mini-file_acrobat.gif&amp;quot;) no-repeat right;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    padding-right: 18px;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Change the external link icon to an Adobe icon anywhere the PDFlink class&lt;br /&gt;
   is used (notably Template:PDFlink). This works in IE, unlike the above. */&lt;br /&gt;
div#content span.PDFlink a,&lt;br /&gt;
div#mw_content span.PDFlink a {&lt;br /&gt;
    background: url(&amp;quot;//upload.wikimedia.org/wikipedia/commons/2/23/Icons-mini-file_acrobat.gif&amp;quot;) no-repeat right;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    padding-right: 18px;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Content in columns with CSS instead of tables ([[Template:Columns]]) */&lt;br /&gt;
div.columns-2 div.column {&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    float: left;&lt;br /&gt;
    width: 50%;&lt;br /&gt;
    min-width: 300px;&lt;br /&gt;
}&lt;br /&gt;
div.columns-3 div.column {&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    float: left;&lt;br /&gt;
    width: 33.3%;&lt;br /&gt;
    min-width: 200px;&lt;br /&gt;
}&lt;br /&gt;
div.columns-4 div.column {&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    float: left;&lt;br /&gt;
    width: 25%;&lt;br /&gt;
    min-width: 150px;&lt;br /&gt;
}&lt;br /&gt;
div.columns-5 div.column {&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    float: left;&lt;br /&gt;
    width: 20%;&lt;br /&gt;
    min-width: 120px;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Messagebox templates */&lt;br /&gt;
.messagebox {&lt;br /&gt;
    border: 1px solid #aaa;&lt;br /&gt;
    background-color: #f9f9f9;&lt;br /&gt;
    width: 80%;&lt;br /&gt;
    margin: 0 auto 1em auto;&lt;br /&gt;
    padding: .2em;&lt;br /&gt;
}&lt;br /&gt;
.messagebox.merge {&lt;br /&gt;
    border: 1px solid #c0b8cc;&lt;br /&gt;
    background-color: #f0e5ff;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
}&lt;br /&gt;
.messagebox.cleanup {&lt;br /&gt;
    border: 1px solid #9f9fff;&lt;br /&gt;
    background-color: #efefff;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
}&lt;br /&gt;
.messagebox.standard-talk {&lt;br /&gt;
    border: 1px solid #c0c090;&lt;br /&gt;
    background-color: #f8eaba;&lt;br /&gt;
    margin: 4px auto;&lt;br /&gt;
}&lt;br /&gt;
/* For old WikiProject banners inside banner shells. */&lt;br /&gt;
.mbox-inside .standard-talk,&lt;br /&gt;
.messagebox.nested-talk {&lt;br /&gt;
    border: 1px solid #c0c090;&lt;br /&gt;
    background-color: #f8eaba;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    margin: 2px 0;&lt;br /&gt;
    padding: 2px;&lt;br /&gt;
}&lt;br /&gt;
.messagebox.small {&lt;br /&gt;
    width: 238px;&lt;br /&gt;
    font-size: 85%;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    float: right;&lt;br /&gt;
    clear: both;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    margin: 0 0 1em 1em;&lt;br /&gt;
    line-height: 1.25em;&lt;br /&gt;
}&lt;br /&gt;
.messagebox.small-talk {&lt;br /&gt;
    width: 238px;&lt;br /&gt;
    font-size: 85%;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    float: right;&lt;br /&gt;
    clear: both;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    margin: 0 0 1em 1em;&lt;br /&gt;
    line-height: 1.25em;&lt;br /&gt;
    background: #F8EABA;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Cell sizes for ambox/tmbox/imbox/cmbox/ombox/fmbox/dmbox message boxes */&lt;br /&gt;
th.mbox-text, td.mbox-text {   /* The message body cell(s) */&lt;br /&gt;
    border: none;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    padding: 0.25em 0.9em;     /* 0.9em left/right */&lt;br /&gt;
    width: 100%;               /* Make all mboxes the same width regardless of text length */&lt;br /&gt;
}&lt;br /&gt;
td.mbox-image {                /* The left image cell */&lt;br /&gt;
    border: none;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    padding: 2px 0 2px 0.9em;  /* 0.9em left, 0px right */&lt;br /&gt;
    text-align: center;&lt;br /&gt;
}&lt;br /&gt;
td.mbox-imageright {           /* The right image cell */&lt;br /&gt;
    border: none;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    padding: 2px 0.9em 2px 0;  /* 0px left, 0.9em right */&lt;br /&gt;
    text-align: center;&lt;br /&gt;
}&lt;br /&gt;
td.mbox-empty-cell {           /* An empty narrow cell */&lt;br /&gt;
    border: none;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
    width: 1px;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Article message box styles */&lt;br /&gt;
table.ambox {&lt;br /&gt;
    margin: 0 10%;                  /* 10% = Will not overlap with other elements */&lt;br /&gt;
    border: 1px solid #aaa;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    border-left: 10px solid #1e90ff;  /* Default &amp;quot;notice&amp;quot; blue */&lt;br /&gt;
    background: #fbfbfb;&lt;br /&gt;
}&lt;br /&gt;
table.ambox + table.ambox {      /* Single border between stacked boxes. */&lt;br /&gt;
    margin-top: -1px;&lt;br /&gt;
}&lt;br /&gt;
.ambox th.mbox-text,&lt;br /&gt;
.ambox td.mbox-text {            /* The message body cell(s) */&lt;br /&gt;
    padding: 0.25em 0.5em;       /* 0.5em left/right */&lt;br /&gt;
}&lt;br /&gt;
.ambox td.mbox-image {           /* The left image cell */&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    padding: 2px 0 2px 0.5em;    /* 0.5em left, 0px right */&lt;br /&gt;
}&lt;br /&gt;
.ambox td.mbox-imageright {      /* The right image cell */&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    padding: 2px 0.5em 2px 0;    /* 0px left, 0.5em right */&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
table.ambox-notice {&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    border-left: 10px solid #1e90ff;    /* Blue */&lt;br /&gt;
}&lt;br /&gt;
table.ambox-speedy {&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    border-left: 10px solid #b22222;    /* Red */&lt;br /&gt;
    background: #fee;                   /* Pink */&lt;br /&gt;
}&lt;br /&gt;
table.ambox-delete {&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    border-left: 10px solid #b22222;    /* Red */&lt;br /&gt;
}&lt;br /&gt;
table.ambox-content {&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    border-left: 10px solid #f28500;    /* Orange */&lt;br /&gt;
}&lt;br /&gt;
table.ambox-style {&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    border-left: 10px solid #f4c430;    /* Yellow */&lt;br /&gt;
}&lt;br /&gt;
table.ambox-move {&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    border-left: 10px solid #9932cc;    /* Purple */&lt;br /&gt;
}&lt;br /&gt;
table.ambox-protection {&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    border-left: 10px solid #bba;       /* Gray-gold */&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Image message box styles */&lt;br /&gt;
table.imbox {&lt;br /&gt;
    margin: 4px 10%;&lt;br /&gt;
    border-collapse: collapse;&lt;br /&gt;
    border: 3px solid #1e90ff;    /* Default &amp;quot;notice&amp;quot; blue */&lt;br /&gt;
    background: #fbfbfb;&lt;br /&gt;
}&lt;br /&gt;
.imbox .mbox-text .imbox {  /* For imboxes inside imbox-text cells. */&lt;br /&gt;
    margin: 0 -0.5em;       /* 0.9 - 0.5 = 0.4em left/right.        */&lt;br /&gt;
    display: block;         /* Fix for webkit to force 100% width.  */&lt;br /&gt;
}&lt;br /&gt;
.mbox-inside .imbox {       /* For imboxes inside other templates.  */&lt;br /&gt;
    margin: 4px;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
table.imbox-notice {&lt;br /&gt;
    border: 3px solid #1e90ff;    /* Blue */&lt;br /&gt;
}&lt;br /&gt;
table.imbox-speedy {&lt;br /&gt;
    border: 3px solid #b22222;    /* Red */&lt;br /&gt;
    background: #fee;             /* Pink */&lt;br /&gt;
}&lt;br /&gt;
table.imbox-delete {&lt;br /&gt;
    border: 3px solid #b22222;    /* Red */&lt;br /&gt;
}&lt;br /&gt;
table.imbox-content {&lt;br /&gt;
    border: 3px solid #f28500;    /* Orange */&lt;br /&gt;
}&lt;br /&gt;
table.imbox-style {&lt;br /&gt;
    border: 3px solid #f4c430;    /* Yellow */&lt;br /&gt;
}&lt;br /&gt;
table.imbox-move {&lt;br /&gt;
    border: 3px solid #9932cc;    /* Purple */&lt;br /&gt;
}&lt;br /&gt;
table.imbox-protection {&lt;br /&gt;
    border: 3px solid #bba;       /* Gray-gold */&lt;br /&gt;
}&lt;br /&gt;
table.imbox-license {&lt;br /&gt;
    border: 3px solid #88a;       /* Dark gray */&lt;br /&gt;
    background: #f7f8ff;          /* Light gray */&lt;br /&gt;
}&lt;br /&gt;
table.imbox-featured {&lt;br /&gt;
    border: 3px solid #cba135;    /* Brown-gold */&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Category message box styles */&lt;br /&gt;
table.cmbox {&lt;br /&gt;
    margin: 3px 10%;&lt;br /&gt;
    border-collapse: collapse;&lt;br /&gt;
    border: 1px solid #aaa;&lt;br /&gt;
    background: #DFE8FF;    /* Default &amp;quot;notice&amp;quot; blue */&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
table.cmbox-notice {&lt;br /&gt;
    background: #D8E8FF;    /* Blue */&lt;br /&gt;
}&lt;br /&gt;
table.cmbox-speedy {&lt;br /&gt;
    margin-top: 4px;&lt;br /&gt;
    margin-bottom: 4px;&lt;br /&gt;
    border: 4px solid #b22222;    /* Red */&lt;br /&gt;
    background: #FFDBDB;          /* Pink */&lt;br /&gt;
}&lt;br /&gt;
table.cmbox-delete {&lt;br /&gt;
    background: #FFDBDB;    /* Red */&lt;br /&gt;
}&lt;br /&gt;
table.cmbox-content {&lt;br /&gt;
    background: #FFE7CE;    /* Orange */&lt;br /&gt;
}&lt;br /&gt;
table.cmbox-style {&lt;br /&gt;
    background: #FFF9DB;    /* Yellow */&lt;br /&gt;
}&lt;br /&gt;
table.cmbox-move {&lt;br /&gt;
    background: #E4D8FF;    /* Purple */&lt;br /&gt;
}&lt;br /&gt;
table.cmbox-protection {&lt;br /&gt;
    background: #EFEFE1;    /* Gray-gold */&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Other pages message box styles */&lt;br /&gt;
table.ombox {&lt;br /&gt;
    margin: 4px 10%;&lt;br /&gt;
    border-collapse: collapse;&lt;br /&gt;
    border: 1px solid #aaa;       /* Default &amp;quot;notice&amp;quot; gray */&lt;br /&gt;
    background: #f9f9f9;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
table.ombox-notice {&lt;br /&gt;
    border: 1px solid #aaa;       /* Gray */&lt;br /&gt;
}&lt;br /&gt;
table.ombox-speedy {&lt;br /&gt;
    border: 2px solid #b22222;    /* Red */&lt;br /&gt;
    background: #fee;             /* Pink */&lt;br /&gt;
}&lt;br /&gt;
table.ombox-delete {&lt;br /&gt;
    border: 2px solid #b22222;    /* Red */&lt;br /&gt;
}&lt;br /&gt;
table.ombox-content {&lt;br /&gt;
    border: 1px solid #f28500;    /* Orange */&lt;br /&gt;
}&lt;br /&gt;
table.ombox-style {&lt;br /&gt;
    border: 1px solid #f4c430;    /* Yellow */&lt;br /&gt;
}&lt;br /&gt;
table.ombox-move {&lt;br /&gt;
    border: 1px solid #9932cc;    /* Purple */&lt;br /&gt;
}&lt;br /&gt;
table.ombox-protection {&lt;br /&gt;
    border: 2px solid #bba;       /* Gray-gold */&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Talk page message box styles */&lt;br /&gt;
table.tmbox {&lt;br /&gt;
    margin: 4px 10%;&lt;br /&gt;
    border-collapse: collapse;&lt;br /&gt;
    border: 1px solid #c0c090;    /* Default &amp;quot;notice&amp;quot; gray-brown */&lt;br /&gt;
    background: #f8eaba;&lt;br /&gt;
}&lt;br /&gt;
.mediawiki .mbox-inside .tmbox { /* For tmboxes inside other templates. The &amp;quot;mediawiki&amp;quot; class ensures that */&lt;br /&gt;
    margin: 2px 0;               /* this declaration overrides other styles (including mbox-small above)   */&lt;br /&gt;
    width: 100%;                 /* For Safari and Opera */&lt;br /&gt;
}&lt;br /&gt;
.mbox-inside .tmbox.mbox-small { /* &amp;quot;small&amp;quot; tmboxes should not be small when  */&lt;br /&gt;
    line-height: 1.5em;          /* also &amp;quot;nested&amp;quot;, so reset styles that are   */&lt;br /&gt;
    font-size: 100%;             /* set in &amp;quot;mbox-small&amp;quot; above.                */&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
table.tmbox-speedy {&lt;br /&gt;
    border: 2px solid #b22222;    /* Red */&lt;br /&gt;
    background: #fee;             /* Pink */&lt;br /&gt;
}&lt;br /&gt;
table.tmbox-delete {&lt;br /&gt;
    border: 2px solid #b22222;    /* Red */&lt;br /&gt;
}&lt;br /&gt;
table.tmbox-content {&lt;br /&gt;
    border: 2px solid #f28500;    /* Orange */&lt;br /&gt;
}&lt;br /&gt;
table.tmbox-style {&lt;br /&gt;
    border: 2px solid #f4c430;    /* Yellow */&lt;br /&gt;
}&lt;br /&gt;
table.tmbox-move {&lt;br /&gt;
    border: 2px solid #9932cc;    /* Purple */&lt;br /&gt;
}&lt;br /&gt;
table.tmbox-protection,&lt;br /&gt;
table.tmbox-notice {&lt;br /&gt;
    border: 1px solid #c0c090;    /* Gray-brown */&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Disambig and set index box styles */&lt;br /&gt;
table.dmbox {&lt;br /&gt;
    clear: both;&lt;br /&gt;
    margin: 0.9em 1em;&lt;br /&gt;
    border-top: 1px solid #ccc;&lt;br /&gt;
    border-bottom: 1px solid #ccc;&lt;br /&gt;
    background: transparent;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Footer and header message box styles */&lt;br /&gt;
table.fmbox {&lt;br /&gt;
    clear: both;&lt;br /&gt;
    margin: 0.2em 0;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    border: 1px solid #aaa;&lt;br /&gt;
    background: #f9f9f9;     /* Default &amp;quot;system&amp;quot; gray */&lt;br /&gt;
}&lt;br /&gt;
table.fmbox-system {&lt;br /&gt;
    background: #f9f9f9;&lt;br /&gt;
}&lt;br /&gt;
table.fmbox-warning {&lt;br /&gt;
    border: 1px solid #bb7070;  /* Dark pink */&lt;br /&gt;
    background: #ffdbdb;        /* Pink */&lt;br /&gt;
}&lt;br /&gt;
table.fmbox-editnotice {&lt;br /&gt;
    background: transparent;&lt;br /&gt;
}&lt;br /&gt;
/* Div based &amp;quot;warning&amp;quot; style fmbox messages. */&lt;br /&gt;
div.mw-warning-with-logexcerpt,&lt;br /&gt;
div.mw-lag-warn-high,&lt;br /&gt;
div.mw-cascadeprotectedwarning,&lt;br /&gt;
div#mw-protect-cascadeon,&lt;br /&gt;
div.titleblacklist-warning,&lt;br /&gt;
div.locked-warning {&lt;br /&gt;
    clear: both;&lt;br /&gt;
    margin: 0.2em 0;&lt;br /&gt;
    border: 1px solid #bb7070;&lt;br /&gt;
    background: #ffdbdb;&lt;br /&gt;
    padding: 0.25em 0.9em;&lt;br /&gt;
}&lt;br /&gt;
/* Div based &amp;quot;system&amp;quot; style fmbox messages.&lt;br /&gt;
   Used in [[MediaWiki:Readonly lag]]. */&lt;br /&gt;
div.mw-lag-warn-normal,&lt;br /&gt;
div.fmbox-system {&lt;br /&gt;
    clear: both;&lt;br /&gt;
    margin: 0.2em 0;&lt;br /&gt;
    border: 1px solid #aaa;&lt;br /&gt;
    background: #f9f9f9;&lt;br /&gt;
    padding: 0.25em 0.9em;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* These mbox-small classes must be placed after all other&lt;br /&gt;
   ambox/tmbox/ombox etc classes. &amp;quot;body.mediawiki&amp;quot; is so&lt;br /&gt;
   they override &amp;quot;table.ambox + table.ambox&amp;quot; above. */&lt;br /&gt;
body.mediawiki table.mbox-small {   /* For the &amp;quot;small=yes&amp;quot; option. */&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    clear: right;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    float: right;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    margin: 4px 0 4px 1em;&lt;br /&gt;
    width: 238px;&lt;br /&gt;
    font-size: 88%;&lt;br /&gt;
    line-height: 1.25em;&lt;br /&gt;
}&lt;br /&gt;
body.mediawiki table.mbox-small-left {   /* For the &amp;quot;small=left&amp;quot; option. */&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    margin: 4px 1em 4px 0;&lt;br /&gt;
    width: 238px;&lt;br /&gt;
    border-collapse: collapse;&lt;br /&gt;
    font-size: 88%;&lt;br /&gt;
    line-height: 1.25em;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Style for compact ambox */&lt;br /&gt;
/* Hide the images */&lt;br /&gt;
.compact-ambox table .mbox-image,&lt;br /&gt;
.compact-ambox table .mbox-imageright,&lt;br /&gt;
.compact-ambox table .mbox-empty-cell {&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
/* Remove borders, backgrounds, padding, etc. */&lt;br /&gt;
.compact-ambox table.ambox {&lt;br /&gt;
    border: none;&lt;br /&gt;
    border-collapse: collapse;&lt;br /&gt;
    background: transparent;&lt;br /&gt;
    margin: 0 0 0 1.6em !important;&lt;br /&gt;
    padding: 0 !important;&lt;br /&gt;
    width: auto;&lt;br /&gt;
    display: block;&lt;br /&gt;
}&lt;br /&gt;
body.mediawiki .compact-ambox table.mbox-small-left {&lt;br /&gt;
    font-size: 100%;&lt;br /&gt;
    width: auto;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
}&lt;br /&gt;
/* Style the text cell as a list item and remove its padding */&lt;br /&gt;
.compact-ambox table .mbox-text {&lt;br /&gt;
    padding: 0 !important;&lt;br /&gt;
    margin: 0 !important;&lt;br /&gt;
}&lt;br /&gt;
.compact-ambox table .mbox-text-span {&lt;br /&gt;
    display: list-item;&lt;br /&gt;
    line-height: 1.5em;&lt;br /&gt;
    list-style-type: square;&lt;br /&gt;
    list-style-image: url(//bits.wikimedia.org/static-current/skins/MonoBook/bullet.gif);&lt;br /&gt;
}&lt;br /&gt;
.skin-vector .compact-ambox table .mbox-text-span {&lt;br /&gt;
    list-style-type: disc;&lt;br /&gt;
    list-style-image: url(//bits.wikimedia.org/static-current/skins/Vector/images/bullet-icon.png)&lt;br /&gt;
}&lt;br /&gt;
/* Allow for hiding text in compact form */&lt;br /&gt;
.compact-ambox .hide-when-compact {&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Remove default styles for [[MediaWiki:Noarticletext]]. */&lt;br /&gt;
div.noarticletext {&lt;br /&gt;
    border: none;&lt;br /&gt;
    background: transparent;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Hide (formatting) elements from screen, but not from screenreaders */&lt;br /&gt;
.visualhide {&lt;br /&gt;
    position: absolute;&lt;br /&gt;
    left: -10000px;&lt;br /&gt;
    top: auto;&lt;br /&gt;
    width: 1px;&lt;br /&gt;
    height: 1px;&lt;br /&gt;
    overflow: hidden;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Bold save button */&lt;br /&gt;
#wpSave {&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* class hiddenStructure is defunct. See [[Wikipedia:hiddenStructure]] */&lt;br /&gt;
.hiddenStructure {&lt;br /&gt;
    display: inline !important;&lt;br /&gt;
    color: #f00;&lt;br /&gt;
    background-color: #0f0;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* suppress missing interwiki image links where #ifexist cannot&lt;br /&gt;
   be used due to high number of requests see .hidden-redlink on&lt;br /&gt;
   [[m:MediaWiki:Common.css]] */&lt;br /&gt;
.check-icon a.new {&lt;br /&gt;
    display: none;&lt;br /&gt;
    speak: none;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Removes underlines from certain links */&lt;br /&gt;
.nounderlines a,&lt;br /&gt;
.IPA a:link, .IPA a:visited {&lt;br /&gt;
    text-decoration: none !important;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Standard Navigationsleisten, aka box hiding thingy&lt;br /&gt;
   from .de.  Documentation at [[Wikipedia:NavFrame]]. */&lt;br /&gt;
div.NavFrame {&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    padding: 4px;&lt;br /&gt;
    border: 1px solid #aaa;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
    border-collapse: collapse;&lt;br /&gt;
    font-size: 95%;&lt;br /&gt;
}&lt;br /&gt;
div.NavFrame + div.NavFrame {&lt;br /&gt;
    border-top-style: none;&lt;br /&gt;
    border-top-style: hidden;&lt;br /&gt;
}&lt;br /&gt;
div.NavPic {&lt;br /&gt;
    background-color: #fff;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    padding: 2px;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    float: left;&lt;br /&gt;
}&lt;br /&gt;
div.NavFrame div.NavHead {&lt;br /&gt;
    line-height: 1.6em;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
    background-color: #ccf;&lt;br /&gt;
    position: relative;&lt;br /&gt;
}&lt;br /&gt;
div.NavFrame p,&lt;br /&gt;
div.NavFrame div.NavContent,&lt;br /&gt;
div.NavFrame div.NavContent p {&lt;br /&gt;
    font-size: 100%;&lt;br /&gt;
}&lt;br /&gt;
div.NavEnd {&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
    line-height: 1px;&lt;br /&gt;
    clear: both;&lt;br /&gt;
}&lt;br /&gt;
a.NavToggle {&lt;br /&gt;
    position: absolute;&lt;br /&gt;
    top: 0;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    right: 3px;&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
    font-size: 90%;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Hatnotes and disambiguation notices */&lt;br /&gt;
.hatnote {&lt;br /&gt;
    font-style: italic;&lt;br /&gt;
}&lt;br /&gt;
.hatnote i {&lt;br /&gt;
    font-style: normal;&lt;br /&gt;
}&lt;br /&gt;
div.hatnote {&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    padding-left: 1.6em;&lt;br /&gt;
    margin-bottom: 0.5em;&lt;br /&gt;
}&lt;br /&gt;
div.hatnote + div.hatnote {&lt;br /&gt;
    margin-top: -0.5em;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Allow transcluded pages to display in lists rather than a table.&lt;br /&gt;
   Compatible in Firefox; incompatible in IE6. */&lt;br /&gt;
.listify td    { display: list-item; }&lt;br /&gt;
.listify tr    { display: block; }&lt;br /&gt;
.listify table { display: block; }&lt;br /&gt;
 &lt;br /&gt;
/* Geographical coordinates defaults. See [[Template:Coord/link]]&lt;br /&gt;
   for how these are used. The classes &amp;quot;geo&amp;quot;, &amp;quot;longitude&amp;quot;, and&lt;br /&gt;
   &amp;quot;latitude&amp;quot; are used by the [[Geo microformat]]. */&lt;br /&gt;
.geo-default, .geo-dms, .geo-dec  { display: inline; }&lt;br /&gt;
.geo-nondefault, .geo-multi-punct { display: none; }&lt;br /&gt;
.longitude, .latitude             { white-space: nowrap; }&lt;br /&gt;
 &lt;br /&gt;
/* When &amp;lt;div class=&amp;quot;nonumtoc&amp;quot;&amp;gt; is used on the table of contents,&lt;br /&gt;
   the ToC will display without numbers */&lt;br /&gt;
.nonumtoc .tocnumber {&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
.nonumtoc #toc ul,&lt;br /&gt;
.nonumtoc .toc ul {&lt;br /&gt;
    line-height: 1.5em;&lt;br /&gt;
    list-style: none none;&lt;br /&gt;
    margin: .3em 0 0;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
}&lt;br /&gt;
.hlist.nonumtoc #toc ul ul,&lt;br /&gt;
.hlist.nonumtoc .toc ul ul {&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    margin: 0;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Allow limiting of which header levels are shown in a TOC;&lt;br /&gt;
   &amp;lt;div class=&amp;quot;toclimit-3&amp;quot;&amp;gt;, for instance, will limit to&lt;br /&gt;
   showing ==headings== and ===headings=== but no further&lt;br /&gt;
   (as long as there are no =headings= on the page, which&lt;br /&gt;
   there shouldn't be according to the MoS). */&lt;br /&gt;
.toclimit-2 .toclevel-1 ul,&lt;br /&gt;
.toclimit-3 .toclevel-2 ul,&lt;br /&gt;
.toclimit-4 .toclevel-3 ul,&lt;br /&gt;
.toclimit-5 .toclevel-4 ul,&lt;br /&gt;
.toclimit-6 .toclevel-5 ul,&lt;br /&gt;
.toclimit-7 .toclevel-6 ul {&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Styling for Template:Quote */&lt;br /&gt;
blockquote.templatequote {&lt;br /&gt;
     margin-top: 0;&lt;br /&gt;
}&lt;br /&gt;
blockquote.templatequote div.templatequotecite {&lt;br /&gt;
    line-height: 1.5em;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    text-align: left;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    padding-left: 1.6em;&lt;br /&gt;
    margin-top: 0;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* User block messages */&lt;br /&gt;
div.user-block {&lt;br /&gt;
    padding: 5px;&lt;br /&gt;
    margin-bottom: 0.5em;&lt;br /&gt;
    border: 1px solid #A9A9A9;&lt;br /&gt;
    background-color: #FFEFD5;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Prevent line breaks in silly places:&lt;br /&gt;
   1) Where desired&lt;br /&gt;
   2) Links when we don't want them to&lt;br /&gt;
   3) Bold &amp;quot;links&amp;quot; to the page itself&lt;br /&gt;
   4) Ref tags with group names &amp;lt;ref group=&amp;quot;Note&amp;quot;&amp;gt; --&amp;gt; &amp;quot;[Note 1]&amp;quot; */&lt;br /&gt;
.nowrap,&lt;br /&gt;
.nowraplinks a,&lt;br /&gt;
.nowraplinks .selflink,&lt;br /&gt;
sup.reference a {&lt;br /&gt;
    white-space: nowrap;&lt;br /&gt;
}&lt;br /&gt;
/* But allow wrapping where desired: */&lt;br /&gt;
.wrap,&lt;br /&gt;
.wraplinks a {&lt;br /&gt;
    white-space: normal;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* For template documentation */&lt;br /&gt;
.template-documentation {&lt;br /&gt;
    clear: both;&lt;br /&gt;
    margin: 1em 0 0 0;&lt;br /&gt;
    border: 1px solid #aaa;&lt;br /&gt;
    background-color: #ecfcf4;&lt;br /&gt;
    padding: 1em;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Inline divs in ImageMaps (code borrowed from de.wiki) */&lt;br /&gt;
.imagemap-inline div {&lt;br /&gt;
    display: inline;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Increase the height of the image upload box */&lt;br /&gt;
#wpUploadDescription {&lt;br /&gt;
    height: 13em;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Minimum thumb width */&lt;br /&gt;
.thumbinner {&lt;br /&gt;
    min-width: 100px;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Makes the background of a framed image white instead of gray.&lt;br /&gt;
   Only visible with transparent images. */&lt;br /&gt;
div.thumb .thumbimage {&lt;br /&gt;
    background-color: #fff;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* The backgrounds for galleries. */&lt;br /&gt;
div#content .gallerybox div.thumb {&lt;br /&gt;
    /* Light gray padding */&lt;br /&gt;
    background-color: #F9F9F9;&lt;br /&gt;
}&lt;br /&gt;
/* Put a chequered background behind images, only visible if they have transparency.&lt;br /&gt;
   '.filehistory a img' and '#file img:hover' are handled by MediaWiki core (as of 1.19) */&lt;br /&gt;
.gallerybox .thumb img {&lt;br /&gt;
    background: #fff url(//upload.wikimedia.org/wikipedia/commons/5/5d/Checker-16x16.png) repeat;&lt;br /&gt;
}&lt;br /&gt;
/* But not on articles, user pages, portals or with opt-out. */&lt;br /&gt;
.ns-0 .gallerybox .thumb img,&lt;br /&gt;
.ns-2 .gallerybox .thumb img,&lt;br /&gt;
.ns-100 .gallerybox .thumb img,&lt;br /&gt;
.nochecker .gallerybox .thumb img {&lt;br /&gt;
    background: #fff;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Prevent floating boxes from overlapping any category listings,&lt;br /&gt;
   file histories, edit previews, and edit [Show changes] views. */&lt;br /&gt;
#mw-subcategories, #mw-pages, #mw-category-media,&lt;br /&gt;
#filehistory, #wikiPreview, #wikiDiff {&lt;br /&gt;
    clear: both;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
body.rtl #mw-articlefeedbackv5, body.rtl #mw-articlefeedback {&lt;br /&gt;
    display: block;   /* Override inline block mode */&lt;br /&gt;
    margin-bottom: 1em;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    clear: right;     /* Clear any info boxes that stick out */&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    float: right;     /* Prevents margin collapsing */&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Selectively hide headers in WikiProject banners */&lt;br /&gt;
.wpb .wpb-header             { display: none; }&lt;br /&gt;
.wpbs-inner .wpb .wpb-header { display: block; }     /* for IE */&lt;br /&gt;
.wpbs-inner .wpb .wpb-header { display: table-row; } /* for real browsers */&lt;br /&gt;
.wpbs-inner .wpb-outside     { display: none; }      /* hide things that should only display outside shells */&lt;br /&gt;
 &lt;br /&gt;
/* Styling for Abuse Filter tags */&lt;br /&gt;
.mw-tag-markers {&lt;br /&gt;
    font-family:sans-serif;&lt;br /&gt;
    font-style:italic;&lt;br /&gt;
    font-size:90%;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Hide stuff meant for accounts with special permissions. Made visible again in&lt;br /&gt;
   [[MediaWiki:Group-sysop.css]], [[MediaWiki:Group-accountcreator.css]],&lt;br /&gt;
   [[MediaWiki:Group-templateeditor.css]] and [[Mediawiki:Group-autoconfirmed.css]]. */&lt;br /&gt;
.sysop-show,&lt;br /&gt;
.accountcreator-show,&lt;br /&gt;
.templateeditor-show,&lt;br /&gt;
.autoconfirmed-show {&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
 * Hide the redlink generated by {{Editnotice}},&lt;br /&gt;
 * this overrides the &amp;quot;.sysop-show { display: none; }&amp;quot; above that applies&lt;br /&gt;
 * to the same link as well.&lt;br /&gt;
 *&lt;br /&gt;
 * See [[Phabricator:45013]].&lt;br /&gt;
 */&lt;br /&gt;
.ve-ui-mwNoticesPopupTool-item .editnotice-redlink, .mw-ve-editNotice .editnotice-redlink {&lt;br /&gt;
    display: none !important;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Remove bullets when there are multiple edit page warnings */&lt;br /&gt;
ul.permissions-errors &amp;gt; li {&lt;br /&gt;
    list-style: none none;&lt;br /&gt;
}&lt;br /&gt;
ul.permissions-errors {&lt;br /&gt;
    margin: 0;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* No linewrap on the labels of the login/signup page */&lt;br /&gt;
body.page-Special_UserLogin .mw-label label,&lt;br /&gt;
body.page-Special_UserLogin_signup .mw-label label {&lt;br /&gt;
    white-space: nowrap;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Pie chart test: Transparent borders */&lt;br /&gt;
.transborder {&lt;br /&gt;
    border: solid transparent;&lt;br /&gt;
}&lt;br /&gt;
* html .transborder {  /* IE6 */&lt;br /&gt;
    border: solid #000001;&lt;br /&gt;
    filter: chroma(color=#000001);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Styling for updated markers on watchlist, history and recent/related changes.&lt;br /&gt;
   Bullets are handled in skin-specific stylesheets. */&lt;br /&gt;
.updatedmarker {&lt;br /&gt;
    background-color: transparent;&lt;br /&gt;
    color: #006400;&lt;br /&gt;
}&lt;br /&gt;
li.mw-changeslist-line-watched .mw-title,&lt;br /&gt;
table.mw-changeslist-line-watched .mw-title,&lt;br /&gt;
table.mw-enhanced-watch .mw-enhanced-rctime {&lt;br /&gt;
    font-weight: normal;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Generic class for Times-based serif, texhtml class for inline math */&lt;br /&gt;
.times-serif,&lt;br /&gt;
span.texhtml {&lt;br /&gt;
    font-family: &amp;quot;Nimbus Roman No9 L&amp;quot;, &amp;quot;Times New Roman&amp;quot;, Times, serif;&lt;br /&gt;
    font-size: 118%;&lt;br /&gt;
    line-height: 1;&lt;br /&gt;
}&lt;br /&gt;
span.texhtml {&lt;br /&gt;
    white-space: nowrap;&lt;br /&gt;
}&lt;br /&gt;
span.texhtml span.texhtml {&lt;br /&gt;
    font-size: 100%;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Force tabular and lining display for digits and texhtml */&lt;br /&gt;
.digits,&lt;br /&gt;
.texhtml {&lt;br /&gt;
    -moz-font-feature-settings: &amp;quot;lnum&amp;quot;, &amp;quot;tnum&amp;quot;;&lt;br /&gt;
    -webkit-font-feature-settings: &amp;quot;lnum&amp;quot;, &amp;quot;tnum&amp;quot;;&lt;br /&gt;
    font-feature-settings: &amp;quot;lnum&amp;quot;, &amp;quot;tnum&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Display tabs with 4 spaces, see [[Phabricator:59824]] and [[Phabricator:59825]] */&lt;br /&gt;
div.mw-geshi div,&lt;br /&gt;
div.mw-geshi div pre,&lt;br /&gt;
span.mw-geshi,&lt;br /&gt;
pre.source-css,&lt;br /&gt;
pre.source-javascript,&lt;br /&gt;
pre.source-lua {&lt;br /&gt;
    -moz-tab-size: 4;&lt;br /&gt;
    -o-tab-size: 4;&lt;br /&gt;
    tab-size: 4;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Fix styling of transcluded prefindex tables */&lt;br /&gt;
table#mw-prefixindex-list-table,&lt;br /&gt;
table#mw-prefixindex-nav-table {&lt;br /&gt;
    width: 98%;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* For portals, added 2011-12-07 -bv&lt;br /&gt;
   On wide screens, show these as two columns&lt;br /&gt;
   On narrow and mobile screens, let them collapse into a single column */&lt;br /&gt;
.portal-column-left {&lt;br /&gt;
    float: left;&lt;br /&gt;
    width: 50%;&lt;br /&gt;
}&lt;br /&gt;
.portal-column-right {&lt;br /&gt;
    float: right;&lt;br /&gt;
    width: 49%;&lt;br /&gt;
}&lt;br /&gt;
.portal-column-left-wide {&lt;br /&gt;
    float: left;&lt;br /&gt;
    width: 60%;&lt;br /&gt;
}&lt;br /&gt;
.portal-column-right-narrow {&lt;br /&gt;
    float: right;&lt;br /&gt;
    width: 39%;&lt;br /&gt;
}&lt;br /&gt;
.portal-column-left-extra-wide {&lt;br /&gt;
    float: left;&lt;br /&gt;
    width: 70%;&lt;br /&gt;
}&lt;br /&gt;
.portal-column-right-extra-narrow {&lt;br /&gt;
    float: right;&lt;br /&gt;
    width: 29%;&lt;br /&gt;
}&lt;br /&gt;
@media only screen and (max-width: 800px) {&lt;br /&gt;
    /* Decouple the columns on narrow screens */&lt;br /&gt;
    .portal-column-left,&lt;br /&gt;
    .portal-column-right,&lt;br /&gt;
    .portal-column-left-wide,&lt;br /&gt;
    .portal-column-right-narrow,&lt;br /&gt;
    .portal-column-left-extra-wide,&lt;br /&gt;
    .portal-column-right-extra-narrow {&lt;br /&gt;
        float: inherit;&lt;br /&gt;
        width: inherit;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* For announcements */&lt;br /&gt;
#bodyContent .letterhead {&lt;br /&gt;
    background-image:url('//upload.wikimedia.org/wikipedia/commons/e/e0/Tan-page-corner.png');&lt;br /&gt;
    background-repeat:no-repeat;&lt;br /&gt;
    padding: 2em;&lt;br /&gt;
    background-color: #faf9f2;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Tree style lists */&lt;br /&gt;
.treeview ul {&lt;br /&gt;
    padding: 0;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
}&lt;br /&gt;
.treeview li {&lt;br /&gt;
    padding: 0;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    list-style-type: none;&lt;br /&gt;
    list-style-image: none;&lt;br /&gt;
    zoom: 1; /* BE KIND TO IE6 */;&lt;br /&gt;
}&lt;br /&gt;
.treeview li li {&lt;br /&gt;
    background: url(&amp;quot;//upload.wikimedia.org/wikipedia/commons/f/f2/Treeview-grey-line.png&amp;quot;) no-repeat 0 -2981px;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    padding-left: 20px;&lt;br /&gt;
    text-indent: 0.3em;&lt;br /&gt;
}&lt;br /&gt;
.treeview li li.lastline {&lt;br /&gt;
    background-position: 0 -5971px&lt;br /&gt;
}&lt;br /&gt;
.treeview li.emptyline &amp;gt; ul {&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    margin-left: -1px;&lt;br /&gt;
}&lt;br /&gt;
.treeview li.emptyline &amp;gt; ul &amp;gt; li:first-child {&lt;br /&gt;
    background-position: 0 9px&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* hidden sortkey for tablesorter */&lt;br /&gt;
td .sortkey,&lt;br /&gt;
th .sortkey {&lt;br /&gt;
    display: none;&lt;br /&gt;
    speak: none;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Make it possible to hide checkboxes in &amp;lt;inputbox&amp;gt; */&lt;br /&gt;
.inputbox-hidecheckboxes form .inputbox-element {&lt;br /&gt;
    display: none !important;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Work-around for [[Phabricator:25965]] (Kaltura advertisement) */&lt;br /&gt;
.k-player .k-attribution {&lt;br /&gt;
    visibility: hidden;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Move 'play' button of video player to bottom left corner */&lt;br /&gt;
.PopUpMediaTransform a .play-btn-large {&lt;br /&gt;
    margin: 0;&lt;br /&gt;
    top: auto;&lt;br /&gt;
    right: auto;&lt;br /&gt;
    bottom: 0;&lt;br /&gt;
    left: 0;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Workaround to keep editnotices readable in VE view.&lt;br /&gt;
   Long term, editnotices should become a core feature so that they can be designed responsive. */&lt;br /&gt;
.mw-ve-editNotice .mbox-image {&lt;br /&gt;
	display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* smart counters - allow up to #.#.# levels of counting. */&lt;br /&gt;
body { counter-reset: autocount-1 autocount-2 autocount-3; }&lt;br /&gt;
 &lt;br /&gt;
.autocount:before, .autocount-list ol li:before { counter-increment:autocount-1; content: counter(autocount-1) &amp;quot; &amp;quot;; color:green; }&lt;br /&gt;
.autocount-reset:before { counter-reset: autocount-1; }&lt;br /&gt;
.autocount .autocount:before, .autocount-list li ol li:before {&lt;br /&gt;
  counter-increment: autocount-2;&lt;br /&gt;
  content: counter(autocount-1)  &amp;quot;.&amp;quot; counter(autocount-2) &amp;quot; &amp;quot;;&lt;br /&gt;
  color:red;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
.autocount .autocount .autocount:before, .autocount-list li li ol li:before {&lt;br /&gt;
  counter-increment: autocount-3;&lt;br /&gt;
  content: counter(autocount-1) &amp;quot;.&amp;quot; counter(autocount-2) &amp;quot;.&amp;quot; counter(autocount-3) &amp;quot; &amp;quot;;&lt;br /&gt;
  color:green;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
.autocount-list ol { margin-left:1.5em; }&lt;br /&gt;
.autocount-list ol li { list-style:none; }&lt;br /&gt;
.autocount-list ol li:first-child { counter-reset: autocount-1; }&lt;br /&gt;
.autocount-list li ol li:first-child { counter-reset: autocount-2; }&lt;br /&gt;
.autocount-list li li ol li:first-child { counter-reset: autocount-3; }&lt;/div&gt;</summary>
		<author><name>SuperAdmin</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=MediaWiki:Common.js&amp;diff=3544</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=MediaWiki:Common.js&amp;diff=3544"/>
		<updated>2015-06-08T15:09:36Z</updated>

		<summary type="html">&lt;p&gt;SuperAdmin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/**&lt;br /&gt;
 * Keep code in MediaWiki:Common.js to a minimum as it is unconditionally&lt;br /&gt;
 * loaded for all users on every wiki page. If possible create a gadget that is&lt;br /&gt;
 * enabled by default instead of adding it here (since gadgets are fully&lt;br /&gt;
 * optimized ResourceLoader modules with possibility to add dependencies etc.)&lt;br /&gt;
 *&lt;br /&gt;
 * Since Common.js isn't a gadget, there is no place to declare its&lt;br /&gt;
 * dependencies, so we have to lazy load them with mw.loader.using on demand and&lt;br /&gt;
 * then execute the rest in the callback. In most cases these dependencies will&lt;br /&gt;
 * be loaded (or loading) already and the callback will not be delayed. In case a&lt;br /&gt;
 * dependency hasn't arrived yet it'll make sure those are loaded before this.&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
/* global mw, $, importStylesheet, importScript */&lt;br /&gt;
/* jshint strict:false, browser:true */&lt;br /&gt;
 &lt;br /&gt;
mw.loader.using( ['mediawiki.util', 'mediawiki.notify', 'jquery.client'] ).done( function () {&lt;br /&gt;
/* Begin of mw.loader.using callback */&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
 * Main Page layout fixes&lt;br /&gt;
 *&lt;br /&gt;
 * Description: Adds an additional link to the complete list of languages available.&lt;br /&gt;
 * Maintainers: [[User:AzaToth]], [[User:R. Koot]], [[User:Alex Smotrov]]&lt;br /&gt;
 */&lt;br /&gt;
if ( mw.config.get( 'wgPageName' ) === 'Main_Page' || mw.config.get( 'wgPageName' ) === 'Talk:Main_Page' ) {&lt;br /&gt;
    $( function () {&lt;br /&gt;
        mw.util.addPortletLink( 'p-lang', '//meta.wikimedia.org/wiki/List_of_Wikipedias',&lt;br /&gt;
            'Complete list', 'interwiki-completelist', 'Complete list of Wikipedias' );&lt;br /&gt;
    } );&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
 * Redirect User:Name/skin.js and skin.css to the current skin's pages&lt;br /&gt;
 * (unless the 'skin' page really exists)&lt;br /&gt;
 * @source: http://www.mediawiki.org/wiki/Snippets/Redirect_skin.js&lt;br /&gt;
 * @rev: 2&lt;br /&gt;
 */&lt;br /&gt;
if ( mw.config.get( 'wgArticleId' ) === 0 &amp;amp;&amp;amp; mw.config.get( 'wgNamespaceNumber' ) === 2 ) {&lt;br /&gt;
    var titleParts = mw.config.get( 'wgPageName' ).split( '/' );&lt;br /&gt;
    /* Make sure there was a part before and after the slash&lt;br /&gt;
       and that the latter is 'skin.js' or 'skin.css' */&lt;br /&gt;
    if ( titleParts.length == 2 ) {&lt;br /&gt;
        var userSkinPage = titleParts.shift() + '/' + mw.config.get( 'skin' );&lt;br /&gt;
        if ( titleParts.slice( -1 ) == 'skin.js' ) {&lt;br /&gt;
            window.location.href = mw.util.getUrl( userSkinPage + '.js' );&lt;br /&gt;
        } else if ( titleParts.slice( -1 ) == 'skin.css' ) {&lt;br /&gt;
            window.location.href = mw.util.getUrl( userSkinPage + '.css' );&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
 * Map addPortletLink to mw.util&lt;br /&gt;
 * @deprecated: Use mw.util.addPortletLink instead.&lt;br /&gt;
 */&lt;br /&gt;
mw.log.deprecate( window, 'addPortletLink', mw.util.addPortletLink, 'Use mw.util.addPortletLink instead' );&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
 * Extract a URL parameter from the current URL&lt;br /&gt;
 * @deprecated: Use mw.util.getParamValue with proper escaping&lt;br /&gt;
 */&lt;br /&gt;
mw.log.deprecate( window, 'getURLParamValue', mw.util.getParamValue, 'Use mw.util.getParamValue instead' );&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
 * Test if an element has a certain class&lt;br /&gt;
 * @deprecated:  Use $(element).hasClass() instead.&lt;br /&gt;
 */&lt;br /&gt;
mw.log.deprecate( window, 'hasClass', function ( element, className ) {&lt;br /&gt;
    return $( element ).hasClass( className );&lt;br /&gt;
}, 'Use jQuery.hasClass() instead' );&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
 * @source www.mediawiki.org/wiki/Snippets/Load_JS_and_CSS_by_URL&lt;br /&gt;
 * @rev 6&lt;br /&gt;
 */&lt;br /&gt;
var extraCSS = mw.util.getParamValue( 'withCSS' ),&lt;br /&gt;
    extraJS = mw.util.getParamValue( 'withJS' );&lt;br /&gt;
 &lt;br /&gt;
if ( extraCSS ) {&lt;br /&gt;
    if ( extraCSS.match( /^MediaWiki:[^&amp;amp;&amp;lt;&amp;gt;=%#]*\.css$/ ) ) {&lt;br /&gt;
        importStylesheet( extraCSS );&lt;br /&gt;
    } else {&lt;br /&gt;
        mw.notify( 'Only pages from the MediaWiki namespace are allowed.', { title: 'Invalid withCSS value' } );&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
if ( extraJS ) {&lt;br /&gt;
    if ( extraJS.match( /^MediaWiki:[^&amp;amp;&amp;lt;&amp;gt;=%#]*\.js$/ ) ) {&lt;br /&gt;
        importScript( extraJS );&lt;br /&gt;
    } else {&lt;br /&gt;
        mw.notify( 'Only pages from the MediaWiki namespace are allowed.', { title: 'Invalid withJS value' } );&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
 * Import more specific scripts if necessary&lt;br /&gt;
 */&lt;br /&gt;
if ( mw.config.get( 'wgAction' ) === 'edit' || mw.config.get( 'wgAction' ) === 'submit' || mw.config.get( 'wgCanonicalSpecialPageName' ) === 'Upload' ) {&lt;br /&gt;
    /* scripts specific to editing pages */&lt;br /&gt;
    importScript( 'MediaWiki:Common.js/edit.js' );&lt;br /&gt;
} else if ( mw.config.get( 'wgCanonicalSpecialPageName' ) === 'Watchlist' ) {&lt;br /&gt;
    /* watchlist scripts */&lt;br /&gt;
    importScript( 'MediaWiki:Common.js/watchlist.js' );&lt;br /&gt;
}&lt;br /&gt;
if ( mw.config.get( 'wgNamespaceNumber' ) === 6 ) {&lt;br /&gt;
    /* file description page scripts */&lt;br /&gt;
    importScript( 'MediaWiki:Common.js/file.js' );&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
 * Helper script for .hlist class in Common.css&lt;br /&gt;
 * Add pseudo-selector class to last-child list items in IE8&lt;br /&gt;
 * @source mediawiki.org/wiki/Snippets/Horizontal_lists&lt;br /&gt;
 * @revision 6 (2014-08-23)&lt;br /&gt;
 * @author [[User:Edokter]]&lt;br /&gt;
 */&lt;br /&gt;
( function ( mw, $ ) {&lt;br /&gt;
    var profile = $.client.profile();&lt;br /&gt;
    if ( profile.name === 'msie' &amp;amp;&amp;amp; profile.versionNumber === 8 ) {&lt;br /&gt;
        mw.hook( 'wikipage.content' ).add( function ( $content ) {&lt;br /&gt;
            $content.find( '.hlist' ).find( 'dd:last-child, dt:last-child, li:last-child' )&lt;br /&gt;
                .addClass( 'hlist-last-child' );&lt;br /&gt;
        } );&lt;br /&gt;
    }&lt;br /&gt;
}( mediaWiki, jQuery ) );&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
 * Fix for Windows XP Unicode font rendering&lt;br /&gt;
 */&lt;br /&gt;
if ( navigator.appVersion.search(/windows nt 5/i) !== -1 ) {&lt;br /&gt;
    mw.util.addCSS( '.IPA { font-family: &amp;quot;Lucida Sans Unicode&amp;quot;, &amp;quot;Arial Unicode MS&amp;quot;; } ' +&lt;br /&gt;
                '.Unicode { font-family: &amp;quot;Arial Unicode MS&amp;quot;, &amp;quot;Lucida Sans Unicode&amp;quot;; } ' );&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
 * WikiMiniAtlas&lt;br /&gt;
 *&lt;br /&gt;
 * Description: WikiMiniAtlas is a popup click and drag world map.&lt;br /&gt;
 *              This script causes all of our coordinate links to display the WikiMiniAtlas popup button.&lt;br /&gt;
 *              The script itself is located on meta because it is used by many projects.&lt;br /&gt;
 *              See [[Meta:WikiMiniAtlas]] for more information.&lt;br /&gt;
 * Maintainers: [[User:Dschwen]]&lt;br /&gt;
 */&lt;br /&gt;
( function () {&lt;br /&gt;
    var require_wikiminiatlas = false;&lt;br /&gt;
    var coord_filter = /geohack/;&lt;br /&gt;
    $( function () {&lt;br /&gt;
        $( 'a.external.text' ).each( function( key, link ) {&lt;br /&gt;
            if ( link.href &amp;amp;&amp;amp; coord_filter.exec( link.href ) ) {&lt;br /&gt;
                require_wikiminiatlas = true;&lt;br /&gt;
                // break from loop&lt;br /&gt;
                return false;&lt;br /&gt;
            }&lt;br /&gt;
        } );&lt;br /&gt;
        if ( $( 'div.kmldata' ).length ) {&lt;br /&gt;
            require_wikiminiatlas = true;&lt;br /&gt;
        }&lt;br /&gt;
        if ( require_wikiminiatlas ) {&lt;br /&gt;
            mw.loader.load( '//meta.wikimedia.org/w/index.php?title=MediaWiki:Wikiminiatlas.js&amp;amp;action=raw&amp;amp;ctype=text/javascript' );&lt;br /&gt;
        }&lt;br /&gt;
    } );&lt;br /&gt;
} )();&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
 * Collapsible tables&lt;br /&gt;
 *&lt;br /&gt;
 * Allows tables to be collapsed, showing only the header. See [[Wikipedia:NavFrame]].&lt;br /&gt;
 *&lt;br /&gt;
 * @version 2.0.3 (2014-03-14)&lt;br /&gt;
 * @source https://www.mediawiki.org/wiki/MediaWiki:Gadget-collapsibleTables.js&lt;br /&gt;
 * @author [[User:R. Koot]]&lt;br /&gt;
 * @author [[User:Krinkle]]&lt;br /&gt;
 * @deprecated Since MediaWiki 1.20: Use class=&amp;quot;mw-collapsible&amp;quot; instead which&lt;br /&gt;
 * is supported in MediaWiki core.&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
var autoCollapse = 2;&lt;br /&gt;
var collapseCaption = 'Ukryj';&lt;br /&gt;
var expandCaption = 'Pokaż';&lt;br /&gt;
var tableIndex = 0;&lt;br /&gt;
 &lt;br /&gt;
function collapseTable( tableIndex ) {&lt;br /&gt;
    var Button = document.getElementById( 'collapseButton' + tableIndex );&lt;br /&gt;
    var Table = document.getElementById( 'collapsibleTable' + tableIndex );&lt;br /&gt;
 &lt;br /&gt;
    if ( !Table || !Button ) {&lt;br /&gt;
        return false;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    var Rows = Table.rows;&lt;br /&gt;
    var i;&lt;br /&gt;
 &lt;br /&gt;
    if ( Button.firstChild.data === collapseCaption ) {&lt;br /&gt;
        for ( i = 1; i &amp;lt; Rows.length; i++ ) {&lt;br /&gt;
            Rows[i].style.display = 'none';&lt;br /&gt;
        }&lt;br /&gt;
        Button.firstChild.data = expandCaption;&lt;br /&gt;
    } else {&lt;br /&gt;
        for ( i = 1; i &amp;lt; Rows.length; i++ ) {&lt;br /&gt;
            Rows[i].style.display = Rows[0].style.display;&lt;br /&gt;
        }&lt;br /&gt;
        Button.firstChild.data = collapseCaption;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function createClickHandler( tableIndex ) {&lt;br /&gt;
    return function ( e ) {&lt;br /&gt;
        e.preventDefault();&lt;br /&gt;
        collapseTable( tableIndex );&lt;br /&gt;
    };&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function createCollapseButtons( $content ) {&lt;br /&gt;
    var NavigationBoxes = {};&lt;br /&gt;
    var $Tables = $content.find( 'table' );&lt;br /&gt;
    var i;&lt;br /&gt;
 &lt;br /&gt;
    $Tables.each( function( i, table ) {&lt;br /&gt;
        if ( $(table).hasClass( 'collapsible' ) ) {&lt;br /&gt;
 &lt;br /&gt;
            /* only add button and increment count if there is a header row to work with */&lt;br /&gt;
            var HeaderRow = table.getElementsByTagName( 'tr' )[0];&lt;br /&gt;
            if ( !HeaderRow ) {&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            var Header = table.getElementsByTagName( 'th' )[0];&lt;br /&gt;
            if ( !Header ) {&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
 &lt;br /&gt;
            NavigationBoxes[ tableIndex ] = table;&lt;br /&gt;
            table.setAttribute( 'id', 'collapsibleTable' + tableIndex );&lt;br /&gt;
 &lt;br /&gt;
            var Button     = document.createElement( 'span' );&lt;br /&gt;
            var ButtonLink = document.createElement( 'a' );&lt;br /&gt;
            var ButtonText = document.createTextNode( collapseCaption );&lt;br /&gt;
            // Styles are declared in [[MediaWiki:Common.css]]&lt;br /&gt;
            Button.className = 'collapseButton';&lt;br /&gt;
 &lt;br /&gt;
            ButtonLink.style.color = Header.style.color;&lt;br /&gt;
            ButtonLink.setAttribute( 'id', 'collapseButton' + tableIndex );&lt;br /&gt;
            ButtonLink.setAttribute( 'href', '#' );&lt;br /&gt;
            $( ButtonLink ).on( 'click', createClickHandler( tableIndex ) );&lt;br /&gt;
            ButtonLink.appendChild( ButtonText );&lt;br /&gt;
 &lt;br /&gt;
            Button.appendChild( document.createTextNode( '[' ) );&lt;br /&gt;
            Button.appendChild( ButtonLink );&lt;br /&gt;
            Button.appendChild( document.createTextNode( ']' ) );&lt;br /&gt;
 &lt;br /&gt;
            Header.insertBefore( Button, Header.firstChild );&lt;br /&gt;
            tableIndex++;&lt;br /&gt;
        }&lt;br /&gt;
    } );&lt;br /&gt;
 &lt;br /&gt;
    for ( i = 0;  i &amp;lt; tableIndex; i++ ) {&lt;br /&gt;
        if ( $( NavigationBoxes[i] ).hasClass( 'collapsed' ) ||&lt;br /&gt;
            ( tableIndex &amp;gt;= autoCollapse &amp;amp;&amp;amp; $( NavigationBoxes[i] ).hasClass( 'autocollapse' ) )&lt;br /&gt;
        ) {&lt;br /&gt;
            collapseTable( i );&lt;br /&gt;
        }&lt;br /&gt;
        else if ( $( NavigationBoxes[i] ).hasClass ( 'innercollapse' ) ) {&lt;br /&gt;
            var element = NavigationBoxes[i];&lt;br /&gt;
            while ((element = element.parentNode)) {&lt;br /&gt;
                if ( $( element ).hasClass( 'outercollapse' ) ) {&lt;br /&gt;
                    collapseTable ( i );&lt;br /&gt;
                    break;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
mw.hook( 'wikipage.content' ).add( createCollapseButtons );&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
 * Dynamic Navigation Bars (experimental)&lt;br /&gt;
 *&lt;br /&gt;
 * Description: See [[Wikipedia:NavFrame]].&lt;br /&gt;
 * Maintainers: UNMAINTAINED&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
/* set up the words in your language */&lt;br /&gt;
var NavigationBarHide = '[' + collapseCaption + ']';&lt;br /&gt;
var NavigationBarShow = '[' + expandCaption + ']';&lt;br /&gt;
var indexNavigationBar = 0;&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
 * Shows and hides content and picture (if available) of navigation bars&lt;br /&gt;
 * Parameters:&lt;br /&gt;
 *     indexNavigationBar: the index of navigation bar to be toggled&lt;br /&gt;
 **/&lt;br /&gt;
window.toggleNavigationBar = function ( indexNavigationBar, event ) {&lt;br /&gt;
    var NavToggle = document.getElementById( 'NavToggle' + indexNavigationBar );&lt;br /&gt;
    var NavFrame = document.getElementById( 'NavFrame' + indexNavigationBar );&lt;br /&gt;
    var NavChild;&lt;br /&gt;
 &lt;br /&gt;
    if ( !NavFrame || !NavToggle ) {&lt;br /&gt;
        return false;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    /* if shown now */&lt;br /&gt;
    if ( NavToggle.firstChild.data === NavigationBarHide ) {&lt;br /&gt;
        for ( NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling ) {&lt;br /&gt;
            if ( $( NavChild ).hasClass( 'NavContent' ) || $( NavChild ).hasClass( 'NavPic' ) ) {&lt;br /&gt;
                NavChild.style.display = 'none';&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    NavToggle.firstChild.data = NavigationBarShow;&lt;br /&gt;
 &lt;br /&gt;
    /* if hidden now */&lt;br /&gt;
    } else if ( NavToggle.firstChild.data === NavigationBarShow ) {&lt;br /&gt;
        for ( NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling ) {&lt;br /&gt;
            if ( $( NavChild ).hasClass( 'NavContent' ) || $( NavChild ).hasClass( 'NavPic' ) ) {&lt;br /&gt;
                NavChild.style.display = 'block';&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        NavToggle.firstChild.data = NavigationBarHide;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    event.preventDefault();&lt;br /&gt;
};&lt;br /&gt;
 &lt;br /&gt;
/* adds show/hide-button to navigation bars */&lt;br /&gt;
function createNavigationBarToggleButton( $content ) {&lt;br /&gt;
    var NavChild;&lt;br /&gt;
    /* iterate over all &amp;lt; div &amp;gt;-elements */&lt;br /&gt;
    var $divs = $content.find( 'div' );&lt;br /&gt;
    $divs.each( function ( i, NavFrame ) {&lt;br /&gt;
        /* if found a navigation bar */&lt;br /&gt;
        if ( $( NavFrame ).hasClass( 'NavFrame' ) ) {&lt;br /&gt;
 &lt;br /&gt;
            indexNavigationBar++;&lt;br /&gt;
            var NavToggle = document.createElement( 'a' );&lt;br /&gt;
            NavToggle.className = 'NavToggle';&lt;br /&gt;
            NavToggle.setAttribute( 'id', 'NavToggle' + indexNavigationBar );&lt;br /&gt;
            NavToggle.setAttribute( 'href', '#' );&lt;br /&gt;
            $( NavToggle ).on( 'click', $.proxy( window.toggleNavigationBar, window, indexNavigationBar ) );&lt;br /&gt;
 &lt;br /&gt;
            var isCollapsed = $( NavFrame ).hasClass( 'collapsed' );&lt;br /&gt;
            /**&lt;br /&gt;
             * Check if any children are already hidden.  This loop is here for backwards compatibility:&lt;br /&gt;
             * the old way of making NavFrames start out collapsed was to manually add style=&amp;quot;display:none&amp;quot;&lt;br /&gt;
             * to all the NavPic/NavContent elements.  Since this was bad for accessibility (no way to make&lt;br /&gt;
             * the content visible without JavaScript support), the new recommended way is to add the class&lt;br /&gt;
             * &amp;quot;collapsed&amp;quot; to the NavFrame itself, just like with collapsible tables.&lt;br /&gt;
             */&lt;br /&gt;
            for ( NavChild = NavFrame.firstChild; NavChild != null &amp;amp;&amp;amp; !isCollapsed; NavChild = NavChild.nextSibling ) {&lt;br /&gt;
                if ( $( NavChild ).hasClass( 'NavPic' ) || $( NavChild ).hasClass( 'NavContent' ) ) {&lt;br /&gt;
                    if ( NavChild.style.display === 'none' ) {&lt;br /&gt;
                        isCollapsed = true;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            if ( isCollapsed ) {&lt;br /&gt;
                for ( NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling ) {&lt;br /&gt;
                    if ( $( NavChild ).hasClass( 'NavPic' ) || $( NavChild ).hasClass( 'NavContent' ) ) {&lt;br /&gt;
                        NavChild.style.display = 'none';&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            var NavToggleText = document.createTextNode( isCollapsed ? NavigationBarShow : NavigationBarHide );&lt;br /&gt;
            NavToggle.appendChild( NavToggleText );&lt;br /&gt;
 &lt;br /&gt;
            /* Find the NavHead and attach the toggle link (Must be this complicated because Moz's firstChild handling is borked) */&lt;br /&gt;
            for( var j = 0; j &amp;lt; NavFrame.childNodes.length; j++ ) {&lt;br /&gt;
                if ( $( NavFrame.childNodes[j] ).hasClass( 'NavHead' ) ) {&lt;br /&gt;
                    NavToggle.style.color = NavFrame.childNodes[j].style.color;&lt;br /&gt;
                    NavFrame.childNodes[j].appendChild( NavToggle );&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            NavFrame.setAttribute( 'id', 'NavFrame' + indexNavigationBar );&lt;br /&gt;
        }&lt;br /&gt;
    } );&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
mw.hook( 'wikipage.content' ).add( createNavigationBarToggleButton );&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
 * Uploadwizard_newusers&lt;br /&gt;
 * Switches in a message for non-autoconfirmed users at [[Wikipedia:Upload]]&lt;br /&gt;
 *&lt;br /&gt;
 * Maintainers: [[User:Krimpet]]&lt;br /&gt;
 */&lt;br /&gt;
function uploadwizard_newusers() {&lt;br /&gt;
    if ( mw.config.get( 'wgNamespaceNumber' ) === 4 &amp;amp;&amp;amp; mw.config.get( 'wgTitle' ) === 'Upload' &amp;amp;&amp;amp; mw.config.get( 'wgAction' ) === 'view' ) {&lt;br /&gt;
        var oldDiv = document.getElementById( 'autoconfirmedusers' ),&lt;br /&gt;
            newDiv = document.getElementById( 'newusers' );&lt;br /&gt;
        if ( oldDiv &amp;amp;&amp;amp; newDiv ) {&lt;br /&gt;
            var userGroups = mw.config.get( 'wgUserGroups' );&lt;br /&gt;
            if ( userGroups ) {&lt;br /&gt;
                for ( var i = 0; i &amp;lt; userGroups.length; i++ ) {&lt;br /&gt;
                    if ( userGroups[i] === 'autoconfirmed' ) {&lt;br /&gt;
                        oldDiv.style.display = 'block';&lt;br /&gt;
                        newDiv.style.display = 'none';&lt;br /&gt;
                        return;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            oldDiv.style.display = 'none';&lt;br /&gt;
            newDiv.style.display = 'block';&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
$(uploadwizard_newusers);&lt;br /&gt;
 &lt;br /&gt;
/**&lt;br /&gt;
 * Magic editintros ****************************************************&lt;br /&gt;
 *&lt;br /&gt;
 * Description: Adds editintros on disambiguation pages and BLP pages.&lt;br /&gt;
 * Maintainers: [[User:RockMFR]]&lt;br /&gt;
 */&lt;br /&gt;
function addEditIntro( name ) {&lt;br /&gt;
    $( '.mw-editsection, #ca-edit' ).find( 'a' ).each( function ( i, el ) {&lt;br /&gt;
        el.href = $( this ).attr( 'href' ) + '&amp;amp;editintro=' + name;&lt;br /&gt;
    } );&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
if ( mw.config.get( 'wgNamespaceNumber' ) === 0 ) {&lt;br /&gt;
    $( function () {&lt;br /&gt;
        if ( document.getElementById( 'disambigbox' ) ) {&lt;br /&gt;
            addEditIntro( 'Template:Disambig_editintro' );&lt;br /&gt;
        }&lt;br /&gt;
    } );&lt;br /&gt;
 &lt;br /&gt;
    $( function () {&lt;br /&gt;
        var cats = mw.config.get('wgCategories');&lt;br /&gt;
        if ( !cats ) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if ( $.inArray( 'Living people', cats ) !== -1 || $.inArray( 'Possibly living people', cats ) !== -1 ) {&lt;br /&gt;
            addEditIntro( 'Template:BLP_editintro' );&lt;br /&gt;
        }&lt;br /&gt;
    } );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Adding/removing of elements from the sidebar */&lt;br /&gt;
function ModifySidebar( action, section, name, link ) {&lt;br /&gt;
	try {&lt;br /&gt;
		switch ( section ) {&lt;br /&gt;
			case 'languages':&lt;br /&gt;
				var target = 'p-lang';&lt;br /&gt;
				break;&lt;br /&gt;
			case 'toolbox':&lt;br /&gt;
				var target = 'p-tb';&lt;br /&gt;
				break;&lt;br /&gt;
			case 'navigation':&lt;br /&gt;
				var target = 'p-navigation';&lt;br /&gt;
				break;&lt;br /&gt;
                        case 'export':&lt;br /&gt;
                                var target = 'p-coll-print_export';&lt;br /&gt;
                                break;&lt;br /&gt;
			default:&lt;br /&gt;
				var target = 'p-' + section;&lt;br /&gt;
				break;&lt;br /&gt;
		}&lt;br /&gt;
 &lt;br /&gt;
		if ( action == 'add' ) {&lt;br /&gt;
			var node = document.getElementById( target )&lt;br /&gt;
							   .getElementsByTagName( 'div' )[0]&lt;br /&gt;
							   .getElementsByTagName( 'ul' )[0];&lt;br /&gt;
 &lt;br /&gt;
			var aNode = document.createElement( 'a' );&lt;br /&gt;
			var liNode = document.createElement( 'li' );&lt;br /&gt;
 &lt;br /&gt;
			aNode.appendChild( document.createTextNode( name ) );&lt;br /&gt;
			aNode.setAttribute( 'href', link );&lt;br /&gt;
			liNode.appendChild( aNode );&lt;br /&gt;
			liNode.className = 'plainlinks';&lt;br /&gt;
			node.appendChild( liNode );&lt;br /&gt;
		}&lt;br /&gt;
 &lt;br /&gt;
		if ( action == 'remove' ) {&lt;br /&gt;
			var list = document.getElementById( target )&lt;br /&gt;
							   .getElementsByTagName( 'div' )[0]&lt;br /&gt;
							   .getElementsByTagName( 'ul' )[0];&lt;br /&gt;
 &lt;br /&gt;
			var listelements = list.getElementsByTagName( 'li' );&lt;br /&gt;
 &lt;br /&gt;
			for ( var i = 0; i &amp;lt; listelements.length; i++ ) {&lt;br /&gt;
				if (&lt;br /&gt;
					listelements[i].getElementsByTagName( 'a' )[0].innerHTML == name ||&lt;br /&gt;
					listelements[i].getElementsByTagName( 'a' )[0].href == link&lt;br /&gt;
				)&lt;br /&gt;
				{&lt;br /&gt;
					list.removeChild( listelements[i] );&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
 &lt;br /&gt;
	} catch( e ) {&lt;br /&gt;
		// let's just ignore what's happened&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function CustomizeModificationsOfSidebar() {&lt;br /&gt;
&lt;br /&gt;
	// removes pdf creation option, that came with the Collection plugin from the Print/Export tab in the sidebar&lt;br /&gt;
	// ModifySidebar( 'remove', 'export', 'Pobierz jako PDF', '' );&lt;br /&gt;
&lt;br /&gt;
	// adds mPDF export option to the Print/Export tab in the sidebar&lt;br /&gt;
        // var tmpString = String({{fullurl:{{FULLPAGENAMEE}}|action=mpdf}});&lt;br /&gt;
        var url = window.location.href + &amp;quot;?action=mpdf&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        // window.alert(url);&lt;br /&gt;
	ModifySidebar( 'add', 'export', 'Zapisz jako PDF', url );&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
jQuery( CustomizeModificationsOfSidebar );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* End of mw.loader.using callback */&lt;br /&gt;
} );&lt;br /&gt;
/* DO NOT ADD CODE BELOW THIS LINE */&lt;/div&gt;</summary>
		<author><name>SuperAdmin</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/Info_2&amp;diff=3527</id>
		<title>Laboratorium EEG/Info 2</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/Info_2&amp;diff=3527"/>
		<updated>2015-06-07T13:13:11Z</updated>

		<summary type="html">&lt;p&gt;SuperAdmin: /* Wyniki kartkówek */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
=Laboratorium EEG - grupa 2 - ćwiczenia=&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ogłoszenia bieżące ==&lt;br /&gt;
&lt;br /&gt;
We wtorek (09.06.15.) studenci będą mieli możliwość poprawienia jednej kartkówki.&lt;br /&gt;
&lt;br /&gt;
Terminy prezentacji wyników pracy:&lt;br /&gt;
* 15.05.2015, sala 4.59, w godzinach 12:00 - 15:00,&lt;br /&gt;
* 12.06.2015, sala 4.59, w godzinach 09:00 - 12:00.&lt;br /&gt;
&lt;br /&gt;
Propozycje ocen:&lt;br /&gt;
* 16.06.2015, sala 4.59, godzina 12:00.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Termin zajęć ==&lt;br /&gt;
Zajęcia odbywają się dwa razy w tygodniu, we wtorki w godzinach 12:15 - 14:45 oraz w piątki, w godzinach 09:30 - 12:00. Sala &amp;lt;b&amp;gt;4.59&amp;lt;/b&amp;gt;, ul. Pasteura 5 - &amp;lt;b&amp;gt;&amp;quot;nowy&amp;quot;&amp;lt;/b&amp;gt; budynek dydaktyczny Wydziału Fizyki UW.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Kontakt z prowadzącym ==&lt;br /&gt;
Zajęcia prowadzi mgr Tomasz Spustek, pokój 4.66, ul. Pasteura 5 - nowy, główny budynek dydaktyczny Wydziału Fizyki UW&lt;br /&gt;
&lt;br /&gt;
Preferowany sposób kontaktu - e-mail: tspus@fuw.edu.pl&lt;br /&gt;
&lt;br /&gt;
Możliwe jest zorganizowanie konsultacji z prowadzącym ćwiczenia, po uprzednim kontakcie e-mailowym.&lt;br /&gt;
&lt;br /&gt;
== Warunki zaliczenia ==&lt;br /&gt;
Ćwiczenia zostaną zaliczone osobom, które spełnią dwa niezwykle proste warunki:&lt;br /&gt;
* Posiadanie maksymalnie dwóch nieusprawiedliwionych nieobecności na ćwiczeniach,&lt;br /&gt;
* Posiadanie sumy punktów z dwóch prezentacji oraz ze wszystkich kartkówek nie mniejszej niż połowa punktów możliwych do zdobycia,&lt;br /&gt;
* Punkty będą przyznawane w sposób uwzględniający nie tylko stan wiedzy, ale także czynione postępy.&lt;br /&gt;
&lt;br /&gt;
* Osobom spełniającym powyższe warunki zaproponowana zostanie pozytywna ocena końcowa z Laboratorium.&lt;br /&gt;
* Osoby nie mające tego szczęścia, otrzymają ocenę negatywną.&lt;br /&gt;
&lt;br /&gt;
* Możliwe będzie poprawienie zaproponowanej oceny na wyższą poprzez zrealizowanie dodatkowego projektu. Jego cel zostanie ustalony indywidualnie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Wyniki kartkówek ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center; clear:both;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;11&amp;quot; style=&amp;quot;text-align: center;&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
!Numer indeksu&lt;br /&gt;
!Zadanie 1&lt;br /&gt;
!Zadanie 2&lt;br /&gt;
!Zadanie 3&lt;br /&gt;
!Zadanie 4&lt;br /&gt;
!Zadanie 5&lt;br /&gt;
!Zadanie 6&lt;br /&gt;
!Zadanie 7&lt;br /&gt;
!Zadanie 8&lt;br /&gt;
!Zadanie 9&lt;br /&gt;
!Zadanie 10&lt;br /&gt;
|-&lt;br /&gt;
| 317905&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
|-&lt;br /&gt;
| 335252&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,33&lt;br /&gt;
|-&lt;br /&gt;
| 322929&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,33&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,33&lt;br /&gt;
|-&lt;br /&gt;
| 306766&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
|-&lt;br /&gt;
| 264493&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
|-&lt;br /&gt;
| 320367&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
|-&lt;br /&gt;
| 334134&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,33&lt;br /&gt;
|-&lt;br /&gt;
| 335240&lt;br /&gt;
| 0,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
|-&lt;br /&gt;
| 290829&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,66&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin:10px 10px 10px 10px; padding:10px;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:left;&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
!#&lt;br /&gt;
!Zagadnienia sprawdzane na kartkówkach&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Manipulacja wierszami i kolumnami macierzy (zmiana kolejności elementów).&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Instrukcje warunkowe oraz rekurencja (silnia).&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| Manipulacja łańcuchami znaków oraz tworzenie prostej struktury (konwersja zapisu czasu).&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| Zaawansowane przekształcenia macierzowe (macierz zawierająca elementy większe od średniej).&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| Proste zagadnienia numeryczne (losowanie liczb spełniających warunek, przeszukiwanie macierzy).&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| Wczytywanie danych z plików tekstowych do struktur.&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| Wczytywanie zapisów EEG (pliki .raw) do struktur.&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| Operacje macierzowe (elementy zawierające się w dwóch macierzach).&lt;br /&gt;
|-&lt;br /&gt;
| 9&lt;br /&gt;
| Wczytywanie danych z plików tekstowych do struktur (ponownie).&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| Operacje macierzowe (iloczyn zewnętrzny).&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wyniki prezentacji==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center; clear:both&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center; float: left;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;11&amp;quot; style=&amp;quot;text-align: center;&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
!Numer indeksu&lt;br /&gt;
!Prezentacja 1&lt;br /&gt;
!Prezentacja 2&lt;br /&gt;
!Projekt&lt;br /&gt;
|-&lt;br /&gt;
| 317905&lt;br /&gt;
| 1,00&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 335252&lt;br /&gt;
| 1,00&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 322929&lt;br /&gt;
| 1,0&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 306766&lt;br /&gt;
| 1,00&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 264493&lt;br /&gt;
| 1,00&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 320367&lt;br /&gt;
| 1,00&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 334134&lt;br /&gt;
| 1,00&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 335240&lt;br /&gt;
| 1,00&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 290829&lt;br /&gt;
| 0,50&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>SuperAdmin</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/Info_2&amp;diff=3526</id>
		<title>Laboratorium EEG/Info 2</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/Info_2&amp;diff=3526"/>
		<updated>2015-06-07T13:11:44Z</updated>

		<summary type="html">&lt;p&gt;SuperAdmin: /* Wyniki kartkówek */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
=Laboratorium EEG - grupa 2 - ćwiczenia=&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ogłoszenia bieżące ==&lt;br /&gt;
&lt;br /&gt;
We wtorek (09.06.15.) studenci będą mieli możliwość poprawienia jednej kartkówki.&lt;br /&gt;
&lt;br /&gt;
Terminy prezentacji wyników pracy:&lt;br /&gt;
* 15.05.2015, sala 4.59, w godzinach 12:00 - 15:00,&lt;br /&gt;
* 12.06.2015, sala 4.59, w godzinach 09:00 - 12:00.&lt;br /&gt;
&lt;br /&gt;
Propozycje ocen:&lt;br /&gt;
* 16.06.2015, sala 4.59, godzina 12:00.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Termin zajęć ==&lt;br /&gt;
Zajęcia odbywają się dwa razy w tygodniu, we wtorki w godzinach 12:15 - 14:45 oraz w piątki, w godzinach 09:30 - 12:00. Sala &amp;lt;b&amp;gt;4.59&amp;lt;/b&amp;gt;, ul. Pasteura 5 - &amp;lt;b&amp;gt;&amp;quot;nowy&amp;quot;&amp;lt;/b&amp;gt; budynek dydaktyczny Wydziału Fizyki UW.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Kontakt z prowadzącym ==&lt;br /&gt;
Zajęcia prowadzi mgr Tomasz Spustek, pokój 4.66, ul. Pasteura 5 - nowy, główny budynek dydaktyczny Wydziału Fizyki UW&lt;br /&gt;
&lt;br /&gt;
Preferowany sposób kontaktu - e-mail: tspus@fuw.edu.pl&lt;br /&gt;
&lt;br /&gt;
Możliwe jest zorganizowanie konsultacji z prowadzącym ćwiczenia, po uprzednim kontakcie e-mailowym.&lt;br /&gt;
&lt;br /&gt;
== Warunki zaliczenia ==&lt;br /&gt;
Ćwiczenia zostaną zaliczone osobom, które spełnią dwa niezwykle proste warunki:&lt;br /&gt;
* Posiadanie maksymalnie dwóch nieusprawiedliwionych nieobecności na ćwiczeniach,&lt;br /&gt;
* Posiadanie sumy punktów z dwóch prezentacji oraz ze wszystkich kartkówek nie mniejszej niż połowa punktów możliwych do zdobycia,&lt;br /&gt;
* Punkty będą przyznawane w sposób uwzględniający nie tylko stan wiedzy, ale także czynione postępy.&lt;br /&gt;
&lt;br /&gt;
* Osobom spełniającym powyższe warunki zaproponowana zostanie pozytywna ocena końcowa z Laboratorium.&lt;br /&gt;
* Osoby nie mające tego szczęścia, otrzymają ocenę negatywną.&lt;br /&gt;
&lt;br /&gt;
* Możliwe będzie poprawienie zaproponowanej oceny na wyższą poprzez zrealizowanie dodatkowego projektu. Jego cel zostanie ustalony indywidualnie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Wyniki kartkówek ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center; clear:both;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;11&amp;quot; style=&amp;quot;text-align: center;&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
!Numer indeksu&lt;br /&gt;
!Zadanie 1&lt;br /&gt;
!Zadanie 2&lt;br /&gt;
!Zadanie 3&lt;br /&gt;
!Zadanie 4&lt;br /&gt;
!Zadanie 5&lt;br /&gt;
!Zadanie 6&lt;br /&gt;
!Zadanie 7&lt;br /&gt;
!Zadanie 8&lt;br /&gt;
!Zadanie 9&lt;br /&gt;
!Zadanie 10&lt;br /&gt;
|-&lt;br /&gt;
| 317905&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
|-&lt;br /&gt;
| 335252&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,33&lt;br /&gt;
|-&lt;br /&gt;
| 322929&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,33&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,33&lt;br /&gt;
|-&lt;br /&gt;
| 306766&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
|-&lt;br /&gt;
| 264493&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
|-&lt;br /&gt;
| 320367&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
|-&lt;br /&gt;
| 334134&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,33&lt;br /&gt;
|-&lt;br /&gt;
| 335240&lt;br /&gt;
| 0,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
|-&lt;br /&gt;
| 290829&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,66&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin:10px 10px 10px 10px; padding:10px;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:left;&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
!#&lt;br /&gt;
!Zagadnienia sprawdzane na kartkówkach&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Manipulacja wierszami i kolumnami macierzy (zmiana kolejności elementów).&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Instrukcje warunkowe oraz rekurencja (silnia).&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| Manipulacja łańcuchami znaków oraz tworzenie prostej struktury (konwersja zapisu czasu).&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| Zaawansowane przekształcenia macierzowe (macierz zawierająca elementy większe od średniej).&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| Proste zagadnienia numeryczne (losowanie liczb spełniających warunek, przeszukiwanie macierzy).&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| Wczytywanie danych z plików tekstowych do struktur.&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| Operacje macierzowe (elementy zawierające się w dwóch macierzach).&lt;br /&gt;
|-&lt;br /&gt;
| 9&lt;br /&gt;
| Wczytywanie danych z plików tekstowych do struktur (ponownie).&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| Operacje macierzowe (iloczyn zewnętrzny).&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wyniki prezentacji==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center; clear:both&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center; float: left;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;11&amp;quot; style=&amp;quot;text-align: center;&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
!Numer indeksu&lt;br /&gt;
!Prezentacja 1&lt;br /&gt;
!Prezentacja 2&lt;br /&gt;
!Projekt&lt;br /&gt;
|-&lt;br /&gt;
| 317905&lt;br /&gt;
| 1,00&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 335252&lt;br /&gt;
| 1,00&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 322929&lt;br /&gt;
| 1,0&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 306766&lt;br /&gt;
| 1,00&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 264493&lt;br /&gt;
| 1,00&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 320367&lt;br /&gt;
| 1,00&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 334134&lt;br /&gt;
| 1,00&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 335240&lt;br /&gt;
| 1,00&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 290829&lt;br /&gt;
| 0,50&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>SuperAdmin</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/Info_2&amp;diff=3525</id>
		<title>Laboratorium EEG/Info 2</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/Info_2&amp;diff=3525"/>
		<updated>2015-06-07T13:10:47Z</updated>

		<summary type="html">&lt;p&gt;SuperAdmin: /* Wyniki kartkówek */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
=Laboratorium EEG - grupa 2 - ćwiczenia=&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ogłoszenia bieżące ==&lt;br /&gt;
&lt;br /&gt;
We wtorek (09.06.15.) studenci będą mieli możliwość poprawienia jednej kartkówki.&lt;br /&gt;
&lt;br /&gt;
Terminy prezentacji wyników pracy:&lt;br /&gt;
* 15.05.2015, sala 4.59, w godzinach 12:00 - 15:00,&lt;br /&gt;
* 12.06.2015, sala 4.59, w godzinach 09:00 - 12:00.&lt;br /&gt;
&lt;br /&gt;
Propozycje ocen:&lt;br /&gt;
* 16.06.2015, sala 4.59, godzina 12:00.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Termin zajęć ==&lt;br /&gt;
Zajęcia odbywają się dwa razy w tygodniu, we wtorki w godzinach 12:15 - 14:45 oraz w piątki, w godzinach 09:30 - 12:00. Sala &amp;lt;b&amp;gt;4.59&amp;lt;/b&amp;gt;, ul. Pasteura 5 - &amp;lt;b&amp;gt;&amp;quot;nowy&amp;quot;&amp;lt;/b&amp;gt; budynek dydaktyczny Wydziału Fizyki UW.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Kontakt z prowadzącym ==&lt;br /&gt;
Zajęcia prowadzi mgr Tomasz Spustek, pokój 4.66, ul. Pasteura 5 - nowy, główny budynek dydaktyczny Wydziału Fizyki UW&lt;br /&gt;
&lt;br /&gt;
Preferowany sposób kontaktu - e-mail: tspus@fuw.edu.pl&lt;br /&gt;
&lt;br /&gt;
Możliwe jest zorganizowanie konsultacji z prowadzącym ćwiczenia, po uprzednim kontakcie e-mailowym.&lt;br /&gt;
&lt;br /&gt;
== Warunki zaliczenia ==&lt;br /&gt;
Ćwiczenia zostaną zaliczone osobom, które spełnią dwa niezwykle proste warunki:&lt;br /&gt;
* Posiadanie maksymalnie dwóch nieusprawiedliwionych nieobecności na ćwiczeniach,&lt;br /&gt;
* Posiadanie sumy punktów z dwóch prezentacji oraz ze wszystkich kartkówek nie mniejszej niż połowa punktów możliwych do zdobycia,&lt;br /&gt;
* Punkty będą przyznawane w sposób uwzględniający nie tylko stan wiedzy, ale także czynione postępy.&lt;br /&gt;
&lt;br /&gt;
* Osobom spełniającym powyższe warunki zaproponowana zostanie pozytywna ocena końcowa z Laboratorium.&lt;br /&gt;
* Osoby nie mające tego szczęścia, otrzymają ocenę negatywną.&lt;br /&gt;
&lt;br /&gt;
* Możliwe będzie poprawienie zaproponowanej oceny na wyższą poprzez zrealizowanie dodatkowego projektu. Jego cel zostanie ustalony indywidualnie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Wyniki kartkówek ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center; clear:both;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;11&amp;quot; style=&amp;quot;text-align: center;&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
!Numer indeksu&lt;br /&gt;
!Zadanie 1&lt;br /&gt;
!Zadanie 2&lt;br /&gt;
!Zadanie 3&lt;br /&gt;
!Zadanie 4&lt;br /&gt;
!Zadanie 5&lt;br /&gt;
!Zadanie 6&lt;br /&gt;
!Zadanie 7&lt;br /&gt;
!Zadanie 8&lt;br /&gt;
!Zadanie 9&lt;br /&gt;
!Zadanie 10&lt;br /&gt;
|-&lt;br /&gt;
| 317905&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
|-&lt;br /&gt;
| 335252&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,33&lt;br /&gt;
|-&lt;br /&gt;
| 322929&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,33&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,33&lt;br /&gt;
|-&lt;br /&gt;
| 306766&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
|-&lt;br /&gt;
| 264493&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
|-&lt;br /&gt;
| 320367&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
|-&lt;br /&gt;
| 334134&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,33&lt;br /&gt;
|-&lt;br /&gt;
| 335240&lt;br /&gt;
| 0,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
|-&lt;br /&gt;
| 290829&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,66&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin:10px 10px 10px 10px; padding:10px;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:left;&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
!#&lt;br /&gt;
!Zagadnienia sprawdzane na kartkówkach&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Manipulacja wierszami i kolumnami macierzy (zmiana kolejności elementów).&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Instrukcje warunkowe oraz rekurencja (silnia).&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| Manipulacja łańcuchami znaków oraz tworzenie prostej struktury (konwersja zapisu czasu).&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| Zaawansowane przekształcenia macierzowe (macierz zawierająca elementy większe od średniej).&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| Proste zagadnienia numeryczne (losowanie liczb spełniających warunek, przeszukiwanie macierzy).&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| Wczytywanie danych z plików tekstowych do struktur.&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| Operacje macierzowe (elementy zawierające się w dwóch macierzach).&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| Wczytywanie danych z plików tekstowych do struktur (ponownie).&lt;br /&gt;
|-&lt;br /&gt;
| 9&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| Operacje macierzowe (iloczyn zewnętrzny).&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wyniki prezentacji==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center; clear:both&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center; float: left;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;11&amp;quot; style=&amp;quot;text-align: center;&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
!Numer indeksu&lt;br /&gt;
!Prezentacja 1&lt;br /&gt;
!Prezentacja 2&lt;br /&gt;
!Projekt&lt;br /&gt;
|-&lt;br /&gt;
| 317905&lt;br /&gt;
| 1,00&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 335252&lt;br /&gt;
| 1,00&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 322929&lt;br /&gt;
| 1,0&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 306766&lt;br /&gt;
| 1,00&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 264493&lt;br /&gt;
| 1,00&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 320367&lt;br /&gt;
| 1,00&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 334134&lt;br /&gt;
| 1,00&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 335240&lt;br /&gt;
| 1,00&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 290829&lt;br /&gt;
| 0,50&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>SuperAdmin</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/Info_2&amp;diff=3524</id>
		<title>Laboratorium EEG/Info 2</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/Info_2&amp;diff=3524"/>
		<updated>2015-06-07T13:10:09Z</updated>

		<summary type="html">&lt;p&gt;SuperAdmin: /* Wyniki kartkówek */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
=Laboratorium EEG - grupa 2 - ćwiczenia=&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ogłoszenia bieżące ==&lt;br /&gt;
&lt;br /&gt;
We wtorek (09.06.15.) studenci będą mieli możliwość poprawienia jednej kartkówki.&lt;br /&gt;
&lt;br /&gt;
Terminy prezentacji wyników pracy:&lt;br /&gt;
* 15.05.2015, sala 4.59, w godzinach 12:00 - 15:00,&lt;br /&gt;
* 12.06.2015, sala 4.59, w godzinach 09:00 - 12:00.&lt;br /&gt;
&lt;br /&gt;
Propozycje ocen:&lt;br /&gt;
* 16.06.2015, sala 4.59, godzina 12:00.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Termin zajęć ==&lt;br /&gt;
Zajęcia odbywają się dwa razy w tygodniu, we wtorki w godzinach 12:15 - 14:45 oraz w piątki, w godzinach 09:30 - 12:00. Sala &amp;lt;b&amp;gt;4.59&amp;lt;/b&amp;gt;, ul. Pasteura 5 - &amp;lt;b&amp;gt;&amp;quot;nowy&amp;quot;&amp;lt;/b&amp;gt; budynek dydaktyczny Wydziału Fizyki UW.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Kontakt z prowadzącym ==&lt;br /&gt;
Zajęcia prowadzi mgr Tomasz Spustek, pokój 4.66, ul. Pasteura 5 - nowy, główny budynek dydaktyczny Wydziału Fizyki UW&lt;br /&gt;
&lt;br /&gt;
Preferowany sposób kontaktu - e-mail: tspus@fuw.edu.pl&lt;br /&gt;
&lt;br /&gt;
Możliwe jest zorganizowanie konsultacji z prowadzącym ćwiczenia, po uprzednim kontakcie e-mailowym.&lt;br /&gt;
&lt;br /&gt;
== Warunki zaliczenia ==&lt;br /&gt;
Ćwiczenia zostaną zaliczone osobom, które spełnią dwa niezwykle proste warunki:&lt;br /&gt;
* Posiadanie maksymalnie dwóch nieusprawiedliwionych nieobecności na ćwiczeniach,&lt;br /&gt;
* Posiadanie sumy punktów z dwóch prezentacji oraz ze wszystkich kartkówek nie mniejszej niż połowa punktów możliwych do zdobycia,&lt;br /&gt;
* Punkty będą przyznawane w sposób uwzględniający nie tylko stan wiedzy, ale także czynione postępy.&lt;br /&gt;
&lt;br /&gt;
* Osobom spełniającym powyższe warunki zaproponowana zostanie pozytywna ocena końcowa z Laboratorium.&lt;br /&gt;
* Osoby nie mające tego szczęścia, otrzymają ocenę negatywną.&lt;br /&gt;
&lt;br /&gt;
* Możliwe będzie poprawienie zaproponowanej oceny na wyższą poprzez zrealizowanie dodatkowego projektu. Jego cel zostanie ustalony indywidualnie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Wyniki kartkówek ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center; clear:both;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;11&amp;quot; style=&amp;quot;text-align: center;&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
!Numer indeksu&lt;br /&gt;
!Zadanie 1&lt;br /&gt;
!Zadanie 2&lt;br /&gt;
!Zadanie 3&lt;br /&gt;
!Zadanie 4&lt;br /&gt;
!Zadanie 5&lt;br /&gt;
!Zadanie 6&lt;br /&gt;
!Zadanie 7&lt;br /&gt;
!Zadanie 8&lt;br /&gt;
!Zadanie 9&lt;br /&gt;
!Zadanie 10&lt;br /&gt;
|-&lt;br /&gt;
| 317905&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
|-&lt;br /&gt;
| 335252&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,33&lt;br /&gt;
|-&lt;br /&gt;
| 322929&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,33&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,33&lt;br /&gt;
|-&lt;br /&gt;
| 306766&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
|-&lt;br /&gt;
| 264493&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
|-&lt;br /&gt;
| 320367&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
|-&lt;br /&gt;
| 334134&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,33&lt;br /&gt;
|-&lt;br /&gt;
| 335240&lt;br /&gt;
| 0,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
|-&lt;br /&gt;
| 290829&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,66&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin:10px 10px 10px 10px; padding:10px;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align: center;&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
!#&lt;br /&gt;
!Zagadnienia sprawdzane na kartkówkach&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Manipulacja wierszami i kolumnami macierzy (zmiana kolejności elementów).&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Instrukcje warunkowe oraz rekurencja (silnia).&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| Manipulacja łańcuchami znaków oraz tworzenie prostej struktury (konwersja zapisu czasu).&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| Zaawansowane przekształcenia macierzowe (macierz zawierająca elementy większe od średniej).&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| Proste zagadnienia numeryczne (losowanie liczb spełniających warunek, przeszukiwanie macierzy).&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| Wczytywanie danych z plików tekstowych do struktur.&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| Operacje macierzowe (elementy zawierające się w dwóch macierzach).&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| Wczytywanie danych z plików tekstowych do struktur (ponownie).&lt;br /&gt;
|-&lt;br /&gt;
| 9&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| Operacje macierzowe (iloczyn zewnętrzny).&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wyniki prezentacji==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center; clear:both&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center; float: left;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;11&amp;quot; style=&amp;quot;text-align: center;&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
!Numer indeksu&lt;br /&gt;
!Prezentacja 1&lt;br /&gt;
!Prezentacja 2&lt;br /&gt;
!Projekt&lt;br /&gt;
|-&lt;br /&gt;
| 317905&lt;br /&gt;
| 1,00&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 335252&lt;br /&gt;
| 1,00&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 322929&lt;br /&gt;
| 1,0&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 306766&lt;br /&gt;
| 1,00&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 264493&lt;br /&gt;
| 1,00&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 320367&lt;br /&gt;
| 1,00&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 334134&lt;br /&gt;
| 1,00&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 335240&lt;br /&gt;
| 1,00&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 290829&lt;br /&gt;
| 0,50&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>SuperAdmin</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/Info_2&amp;diff=3523</id>
		<title>Laboratorium EEG/Info 2</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Laboratorium_EEG/Info_2&amp;diff=3523"/>
		<updated>2015-06-07T13:09:52Z</updated>

		<summary type="html">&lt;p&gt;SuperAdmin: /* Wyniki kartkówek */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
=Laboratorium EEG - grupa 2 - ćwiczenia=&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ogłoszenia bieżące ==&lt;br /&gt;
&lt;br /&gt;
We wtorek (09.06.15.) studenci będą mieli możliwość poprawienia jednej kartkówki.&lt;br /&gt;
&lt;br /&gt;
Terminy prezentacji wyników pracy:&lt;br /&gt;
* 15.05.2015, sala 4.59, w godzinach 12:00 - 15:00,&lt;br /&gt;
* 12.06.2015, sala 4.59, w godzinach 09:00 - 12:00.&lt;br /&gt;
&lt;br /&gt;
Propozycje ocen:&lt;br /&gt;
* 16.06.2015, sala 4.59, godzina 12:00.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Termin zajęć ==&lt;br /&gt;
Zajęcia odbywają się dwa razy w tygodniu, we wtorki w godzinach 12:15 - 14:45 oraz w piątki, w godzinach 09:30 - 12:00. Sala &amp;lt;b&amp;gt;4.59&amp;lt;/b&amp;gt;, ul. Pasteura 5 - &amp;lt;b&amp;gt;&amp;quot;nowy&amp;quot;&amp;lt;/b&amp;gt; budynek dydaktyczny Wydziału Fizyki UW.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Kontakt z prowadzącym ==&lt;br /&gt;
Zajęcia prowadzi mgr Tomasz Spustek, pokój 4.66, ul. Pasteura 5 - nowy, główny budynek dydaktyczny Wydziału Fizyki UW&lt;br /&gt;
&lt;br /&gt;
Preferowany sposób kontaktu - e-mail: tspus@fuw.edu.pl&lt;br /&gt;
&lt;br /&gt;
Możliwe jest zorganizowanie konsultacji z prowadzącym ćwiczenia, po uprzednim kontakcie e-mailowym.&lt;br /&gt;
&lt;br /&gt;
== Warunki zaliczenia ==&lt;br /&gt;
Ćwiczenia zostaną zaliczone osobom, które spełnią dwa niezwykle proste warunki:&lt;br /&gt;
* Posiadanie maksymalnie dwóch nieusprawiedliwionych nieobecności na ćwiczeniach,&lt;br /&gt;
* Posiadanie sumy punktów z dwóch prezentacji oraz ze wszystkich kartkówek nie mniejszej niż połowa punktów możliwych do zdobycia,&lt;br /&gt;
* Punkty będą przyznawane w sposób uwzględniający nie tylko stan wiedzy, ale także czynione postępy.&lt;br /&gt;
&lt;br /&gt;
* Osobom spełniającym powyższe warunki zaproponowana zostanie pozytywna ocena końcowa z Laboratorium.&lt;br /&gt;
* Osoby nie mające tego szczęścia, otrzymają ocenę negatywną.&lt;br /&gt;
&lt;br /&gt;
* Możliwe będzie poprawienie zaproponowanej oceny na wyższą poprzez zrealizowanie dodatkowego projektu. Jego cel zostanie ustalony indywidualnie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Wyniki kartkówek ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center; clear:right; float:left&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;11&amp;quot; style=&amp;quot;text-align: center;&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
!Numer indeksu&lt;br /&gt;
!Zadanie 1&lt;br /&gt;
!Zadanie 2&lt;br /&gt;
!Zadanie 3&lt;br /&gt;
!Zadanie 4&lt;br /&gt;
!Zadanie 5&lt;br /&gt;
!Zadanie 6&lt;br /&gt;
!Zadanie 7&lt;br /&gt;
!Zadanie 8&lt;br /&gt;
!Zadanie 9&lt;br /&gt;
!Zadanie 10&lt;br /&gt;
|-&lt;br /&gt;
| 317905&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
|-&lt;br /&gt;
| 335252&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,33&lt;br /&gt;
|-&lt;br /&gt;
| 322929&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,33&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,33&lt;br /&gt;
|-&lt;br /&gt;
| 306766&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
|-&lt;br /&gt;
| 264493&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
|-&lt;br /&gt;
| 320367&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
|-&lt;br /&gt;
| 334134&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,33&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,33&lt;br /&gt;
|-&lt;br /&gt;
| 335240&lt;br /&gt;
| 0,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 1,00&lt;br /&gt;
|-&lt;br /&gt;
| 290829&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,00&lt;br /&gt;
| 1,00&lt;br /&gt;
| 0,66&lt;br /&gt;
| 0,33&lt;br /&gt;
| 0,66&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin:10px 10px 10px 10px; padding:10px;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align: center;&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
!#&lt;br /&gt;
!Zagadnienia sprawdzane na kartkówkach&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Manipulacja wierszami i kolumnami macierzy (zmiana kolejności elementów).&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Instrukcje warunkowe oraz rekurencja (silnia).&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| Manipulacja łańcuchami znaków oraz tworzenie prostej struktury (konwersja zapisu czasu).&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| Zaawansowane przekształcenia macierzowe (macierz zawierająca elementy większe od średniej).&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| Proste zagadnienia numeryczne (losowanie liczb spełniających warunek, przeszukiwanie macierzy).&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| Wczytywanie danych z plików tekstowych do struktur.&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| Operacje macierzowe (elementy zawierające się w dwóch macierzach).&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| Wczytywanie danych z plików tekstowych do struktur (ponownie).&lt;br /&gt;
|-&lt;br /&gt;
| 9&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| Operacje macierzowe (iloczyn zewnętrzny).&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Wyniki prezentacji==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center; clear:both&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center; float: left;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;11&amp;quot; style=&amp;quot;text-align: center;&amp;quot; | &lt;br /&gt;
|-&lt;br /&gt;
!Numer indeksu&lt;br /&gt;
!Prezentacja 1&lt;br /&gt;
!Prezentacja 2&lt;br /&gt;
!Projekt&lt;br /&gt;
|-&lt;br /&gt;
| 317905&lt;br /&gt;
| 1,00&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 335252&lt;br /&gt;
| 1,00&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 322929&lt;br /&gt;
| 1,0&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 306766&lt;br /&gt;
| 1,00&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 264493&lt;br /&gt;
| 1,00&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 320367&lt;br /&gt;
| 1,00&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 334134&lt;br /&gt;
| 1,00&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 335240&lt;br /&gt;
| 1,00&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 290829&lt;br /&gt;
| 0,50&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>SuperAdmin</name></author>
		
	</entry>
</feed>