Wstęp do Programowania potok funkcyjny

Podobne dokumenty
Iteracyjne rozwiązywanie równań

Metody numeryczne I Równania nieliniowe

Programowanie Funkcyjne. Marcin Kubica Świder,

Wybrane metody przybliżonego. wyznaczania rozwiązań (pierwiastków) równań nieliniowych

Wstęp do Programowania potok funkcyjny

1 Metody rozwiązywania równań nieliniowych. Postawienie problemu

Metody rozwiązywania równań nieliniowych

Lab 10. Funkcje w argumentach funkcji metoda Newtona. Synonimy nazw typów danych. Struktury. Tablice struktur.

Rozwiązywanie równań nieliniowych i ich układów. Wyznaczanie zer wielomianów.

Rozwiązywanie równań nieliniowych

Wprowadzenie Metoda bisekcji Metoda regula falsi Metoda siecznych Metoda stycznych RÓWNANIA NIELINIOWE

METODY ROZWIĄZYWANIA RÓWNAŃ NIELINIOWYCH

1 Równania nieliniowe

ROZWIĄZYWANIE RÓWNAŃ NIELINIOWYCH

Następnie przypominamy (dla części studentów wprowadzamy) podstawowe pojęcia opisujące funkcje na poziomie rysunków i objaśnień.

METODY NUMERYCZNE. Wykład 4. Numeryczne rozwiązywanie równań nieliniowych z jedną niewiadomą. prof. dr hab.inż. Katarzyna Zakrzewska

Matematyka stosowana i metody numeryczne

Elementy metod numerycznych

Zagadnienia - równania nieliniowe

METODY NUMERYCZNE. Wykład 4. Numeryczne rozwiązywanie równań nieliniowych z jedną niewiadomą. Rozwiązywanie równań nieliniowych z jedną niewiadomą

Wstęp do Programowania potok funkcyjny

Wstęp do metod numerycznych Rozwiazywanie równań algebraicznych. P. F. Góra

1 Pochodne wyższych rzędów

Wprowadzenie do metod numerycznych Wykład 2 Numeryczne rozwiązywanie równań nieliniowych

Metody numeryczne Wykład 7

FUNKCJE. Kurs ZDAJ MATURĘ Z MATEMATYKI MODUŁ 5 Teoria funkcje cz.1. Definicja funkcji i wiadomości podstawowe

Metody numeryczne. Równania nieliniowe. Janusz Szwabiński.

Metody numeryczne w przykładach

Wstęp do Programowania potok funkcyjny

4. Funkcje. Przykłady

Programowanie strukturalne i obiektowe. Funkcje

RÓWNANIA NIELINIOWE Maciej Patan

FUNKCJE I RÓWNANIA KWADRATOWE. Lekcja 78. Pojęcie i wykres funkcji kwadratowej str

Kubatury Gaussa (całka podwójna po trójkącie)

Wymagania edukacyjne na poszczególne oceny branżowa szkoła I stopnia klasa 1 po gimnazjum

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Rekurencja (rekursja)

9. BADANIE PRZEBIEGU ZMIENNOŚCI FUNKCJI

Rozwiązywanie równań nieliniowych i ich układów. Wyznaczanie zer wielomianów.

Równania nieliniowe. LABORKA Piotr Ciskowski

Algorytm. a programowanie -

Obliczenia iteracyjne

Programowanie - wykład 4

Optymalizacja ciągła

Paradygmaty programowania

Wstęp do programowania. Różne różności

Całkowanie numeryczne przy użyciu kwadratur

WHILE (wyrażenie) instrukcja;

FUNKCJA LINIOWA - WYKRES. y = ax + b. a i b to współczynniki funkcji, które mają wartości liczbowe

Wstęp do Programowania potok funkcyjny

Wyznaczanie miejsc zerowych funkcji

Wstęp do Programowania potok funkcyjny

Podstawy programowania. Wykład: 13. Rekurencja. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

FUNKCJA LINIOWA - WYKRES

Metody Numeryczne. Wojciech Szewczuk

Metody Numeryczne Optymalizacja. Wojciech Szewczuk

METODY KOMPUTEROWE W OBLICZENIACH INŻYNIERSKICH

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

Metody Obliczeniowe w Nauce i Technice

ZAGADNIENIA PROGRAMOWE I WYMAGANIA EDUKACYJNE DO TESTU PRZYROSTU KOMPETENCJI Z MATEMATYKI DLA UCZNIA KLASY II

WHILE (wyrażenie) instrukcja;

Klasa 1 technikum. Poniżej przedstawiony został podział wymagań na poszczególne oceny szkolne:

Wstęp do programowania INP001213Wcl rok akademicki 2018/19 semestr zimowy. Wykład 5. Karol Tarnowski A-1 p.

Matematyka II. Bezpieczeństwo jądrowe i ochrona radiologiczna Semestr letni 2018/2019 wykład 13 (27 maja)

Wiadomości wstępne Środowisko programistyczne Najważniejsze różnice C/C++ vs Java

Wykład 11a. Składnia języka Klasycznego Rachunku Predykatów. Języki pierwszego rzędu.

Rozwiązywanie równań nieliniowych i ich układów. Wyznaczanie zer wielomianów.

FUNKCJA I JEJ WŁASNOŚCI

3. FUNKCJA LINIOWA. gdzie ; ół,.

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

Wstęp do Programowania potok funkcyjny

Funkcje i tablice. Elwira Wachowicz. 23 maja 2013

Politechnika Gdańska Wydział Elektrotechniki i Automatyki Katedra Inżynierii Systemów Sterowania

Kurs wyrównawczy - teoria funkcji holomorficznych

Metody numeryczne. materiały do wykładu dla studentów

Zadanie 3 Oblicz jeżeli wiadomo, że liczby 8 2,, 1, , tworzą ciąg arytmetyczny. Wyznacz różnicę ciągu. Rozwiązanie:

Wstęp do Programowania, laboratorium 02

10 zadań związanych z granicą i pochodną funkcji.

Instrukcje pętli przykłady. Odgadywanie hasła. 1) Program pyta o hasło i podaje adres, gdy hasło poprawne lub komunikat o błędnym haśle.

Języki i metody programowania

Zajęcia nr 1 (1h) Dwumian Newtona. Indukcja. Zajęcia nr 2 i 3 (4h) Trygonometria

a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] a[10]

ZESPÓŁ SZKÓŁ W OBRZYCKU

Oznacza to, że chcemy znaleźć minimum, a właściwie wartość najmniejszą funkcji

2.1. Postać algebraiczna liczb zespolonych Postać trygonometryczna liczb zespolonych... 26

Przedmiotowe zasady oceniania i wymagania edukacyjne z matematyki dla klasy drugiej gimnazjum

1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami

1) 2) 3) 5) 6) 7) 8) 9) 10) 11) 12) 13) 14) 15) 16) 17) 18) 19) 20) 21) 22) 23) 24) 25)

Wymagania na poszczególne oceny w klasie II gimnazjum do programu nauczania MATEMATYKA NA CZASIE

Podstawy Programowania C++

INFORMATYKA ELEMENTY METOD NUMERYCZNYCH.

ROK SZKOLNY 2017/2018 WYMAGANIA EDUKACYJNE NA POSZCZEGÓLNE OCENY:

Wstęp do analizy matematycznej

Naukę zaczynamy od poznania interpretera. Interpreter uruchamiamy z konsoli poleceniem

Wymagania edukacyjne. Hasło z podstawy programowej 1. Liczby naturalne 1 Liczby naturalne, cechy podzielności. Liczba godzin

PORÓWNANIE TREŚCI ZAWARTYCH W OBOWIĄZUJĄCYCH STANDARDACH EGZAMINACYJNYCH Z TREŚCIAMI NOWEJ PODSTAWY PROGRAMOWEJ

Modelowanie rynków finansowych z wykorzystaniem pakietu R

Projekt Era inżyniera pewna lokata na przyszłość jest współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego

1. Znajdowanie miejsca zerowego funkcji metodą bisekcji.

Funkcje wymierne. Jerzy Rutkowski. Działania dodawania i mnożenia funkcji wymiernych określa się wzorami: g h + k l g h k.

Transkrypt:

Wstęp do Programowania potok funkcyjny Marcin Kubica 2010/2011

Outline Procedury wyższych rzędów 1 Procedury wyższych rzędów jako abstrakcje konstrukcji programistycznych

Intuicje Procedury wyższych rzędów Procedury wyższych rzędów to procedury przetwarzające procedury. Równouprawnienie procedur: z procedurami można robić wszystko to, co można robić z wartościami wszystkich pozostałych typów danych (z wyjątkiem porównywania). Procedury mogą być argumentami procedur lub ich wynikami. Jedno z zastosowań procedur wyższych rzędów: abstrakcja powtarzających się schematów postępowania.

Kilka prostych przykładów let p f = function x -> f x + f (2 * x);; val p : (int -> int) -> int -> int = <fun> Argumentem procedury p jest procedura f. Wynikiem jest λ-abstrakcja. Jak rozumieć typ procedury p? (int -> int) -> (int -> int). Argument i wynik są typu int -> int.

Kilka prostych przykładów let twice f = fun x -> f (f x);; val twice : ( a -> a) -> ( a -> a) = <fun> twice (fun x -> x * (x+1)) 2;; - : int = 42 twice (fun s -> "mocium panie, " ˆ s) "me wezwanie";; - : string = "mocium panie, mocium panie, me wezwanie" f jest procedurą i można ją złożyć samą ze sobą. Argument i wynik f muszą być tego samego typu. Może to być dowolny typ a. Procedura f jest typu a -> a. Procedura twice jest typu ( a -> a) -> ( a -> a).

Polimorfizm Procedury wyższych rzędów Polimorfizm ta sama procedura może być wielu typów. Schemat typu zawiera zmienne typowe ( a, b, c,... ). Za zmienne typowe podstawiamy równocześnie dowolne typy (lub schematy). Ta sama zmienna taki sam typ. Różne zmienne brak związku między typami. Ten sam mechanizm co w podstawianiu termów za zmienne, w termach ze zmiennymi. Uzgodnienie schematów typów = unifikacja termów.

Polimorfizm Procedury wyższych rzędów Podstawiając w typie ( a -> a) -> ( a -> a) za a typ int uzyskujemy (int -> int) -> (int -> int). Podstawiając za a typ a -> a, uzyskujemy: (( a -> a) -> ( a -> a)) -> (( a -> a) -> ( a -> a)).

Polimorfizm Procedury wyższych rzędów let czterokrotnie f = twice twice f;; val czterokrotnie : ( a -> a) -> ( a -> a) = <fun> Jakiego typu jest tutaj procedura twice? czterokrotnie f = (twice twice) f = = twice (twice f ) = twice f 2 = f 4 Drugie twice przetwarza f, a więc jest typu: ( a -> a) -> ( a -> a). Pierwsze twice przetwarza drugie twice, a więc jest typu: (( a -> a) -> ( a -> a)) -> (( a -> a) -> ( a -> a)).

Polimorfizm Procedury wyższych rzędów Składanie procedur: let compose f g = function x -> f (g x);; val compose:( a -> b) -> ( c -> a) -> ( c -> b) = <fun> Trzy różne zmienne typowe. Zależności między typami: wynik g i argument f muszą być tego samego typu, argument g i argument złożenia są tego samego typu, wynik f i wynik złożenia są tego samego typu. Typ compose to najbardziej ogólny schemat typu zawierający te zależności.

Polimorfizm Procedury wyższych rzędów Wielokrotne składanie funkcji samej ze sobą: let id x = x;; val id : a -> a = <fun> let rec iterate n f = if n = 0 then id else compose (iterate (n-1) f) f;; val iterate : int -> ( a -> a) -> ( a -> a) = <fun> Alternatywna definicja twice: let twice f = iterate 2 f;; val twice : ( a -> a) -> ( a -> a) = <fun>

Czy istnieją procedury wieloargumentowe? Typy proceduralne są postaci argument -> wynik. Typy procedur wieloargumentowych mają wiele strzałek: τ 1 τ 2 τ n τ n+1 = = τ 1 (τ 2 (τ n τ n+1 )... ). Można je interpretować na dwa sposoby: procedura n-argumentowa, procedura jednoargumentowa, której wynikiem jest procedura typu: τ 2 τ n+1. Przy odpowiedniej kolejności argumentów możemy podać tylko część z nich, otrzymując w wyniku przydatną procedurę.

Czy istnieją procedury wieloargumentowe? Jeden argument, który jest parą liczb: let plus (x, y) = x + y;; val plus : (int * int) -> int = <fun> Dwa argumenty, które są liczbami: let plus x y = x + y;; val plus : int -> (int -> int) = <fun> Można ten typ interpretować jako int -> (int -> int). Procedura jednoargumentowa, której wynikiem jest procedura jednoargumentowa. let plus = function x -> function y -> x + y;; val plus : int -> (int -> int) = <fun>

Czy istnieją procedury wieloargumentowe? Podanie części argumentów może mieć sens: let plus x y = x + y;; val plus : int -> (int -> int) = <fun> let inc = plus 1;; val inc : int -> int = <fun>

Czy istnieją procedury wieloargumentowe? Obie formy przekazywania argumentów są równoważne. Dowodem procedury przekształcające jedną postać w drugą i odwrotnie. let curry f = function x -> function y -> f (x, y);; val curry : (( a * b) -> c) -> ( a -> b -> c) = <fun> let uncurry f = function (x, y) -> f x y;; val uncurry : ( a -> b -> c) -> (( a * b) -> c) = <fun>

Przedstawione wcześniej procedury można zdefiniować i tak: let twice f x = f (f x);; val twice : ( a -> a) -> ( a -> a) = <fun> let compose f g x = f (g x);; val compose : ( a -> b) -> ( c -> a) -> ( c -> b) = <fun> let curry f x y = f (x, y);; val curry : (( a * b) -> c) -> ( a -> b -> c) = <fun> let uncurry f (x, y) = f x y;; val uncurry : ( a -> b -> c) -> (( a * b) -> c) = <fun>

Sumy częściowe szeregów Przybliżanie szeregów przez ich sumy częściowe. Zdefiniujmy procedurę obliczającą sumę częściową dowolnego szeregu. Elementy szeregu są zadane jako procedura. let szereg f n = let rec sum a n = if n = 0 then a else sum (a +. f n) (n - 1) in sum 0.0 n;; val szereg : (int -> float) -> (int -> float) = <fun>

Sumy częściowe szeregów Przybliżamy szereg: i=1 1 (4i 3)(4i 1) = π 8. let szereg_pi_8 n = szereg (function i -> 1. /. ((4. *. float i -. 3.) *. (4. *. float i -. 1.))) n;; val szereg_pi_8 : int -> float = <fun> let pi = 8. *. szereg_pi_8 1000;; val pi : float = 3.14109265362103818

Abstrakcja proceduralna Procedury abstrakcja powtarzających się fragmentów kodu. Procedury wyższych rzędów abstrakcja powtarzających się schematów, które różnią się fragmentami kodu wewnątrz nich.

Szukanie zer funkcji Procedury wyższych rzędów Dwie metody szukania zer funkcji: przez bisekcję i metoda Newtona (stycznych). Metoda przez bisekcję podział przedziału, na końcach którego funkcja przyjmuje przeciwne znaki. Metoda stycznych iteracja następującego procesu: w punkcie będącym aktualnym przybliżeniem zera funkcji rysujemy styczną do wykresu funkcji, kolejnym przybliżeniem jest punkt przecięcia stycznej z osią X. Obie metody polegają na polepszaniu pewnego przybliżenia, aż do uzyskania satysfakcjonującego wyniku.

Schemat iteracyjnego przybliżania Ogólny schemat iteracji przybliżającej wynik: let rec iteruj poczatek popraw czy_dobre wynik = if czy_dobre poczatek then wynik poczatek else iteruj (popraw poczatek) popraw czy_dobre wynik;; val iteruj : a -> ( a -> a) -> ( a -> bool) -> ( a -> b) -> b = <fun>

Metoda przez bisekcję i Newtona jako instancje iteracji: Parametr Metoda Newtona Metoda przez bisekcję poczatek punkt w pobliżu zera końce przedziału zawierającego zero popraw przecięcie stycznej do wy- podział przedziału na pół kresu funkcji z osią X czy_dobre wartość funkcji w punkcie jest bliska zeru wynik dany punkt koniec przedziału wartość funkcji na końcu przedziału jest bliska zeru

Metoda przez bisekcję Dana funkcja f oraz dwa punkty, l i p, w których f przyjmuje wartości przeciwnych znaków. Gdzieś pomiędzy l i p funkcja f ma zero. Uproszczenie: przyjmujemy, że f l 0 < f p, dopuszczamy aby l < p lub l > p.

Metoda przez bisekcję Procedura bisekcja bada wartość f w punktach l i p, i wywołuje szukaj zgodnie z przyjetym uproszczeniem: let bisekcja f l p = let rec szukaj l p =... in let wartosc_l = f l and wartosc_p = f p in if ujemne wartosc_l && dodatnie wartosc_p then szukaj l p else szukaj p l;; val bisekcja : (float -> float) -> float -> float -> float = <fun>

Metoda przez bisekcję Procedura szukaj korzysta z procedury iteruj: let szukaj l p = let czy_dobre x =... and popraw x =... in iteruj (l, p) popraw czy_dobre fst

Metoda przez bisekcję x jest dobrym przybliżeniem, gdy f x < ε. Bisekcja badamy znak f po środku między l i p. let czy_dobre x = abs_float (f (fst x)) < epsilon and popraw x = let l = fst x and p = snd x in let srodek = average l p in if dodatnie (f srodek) then (l, srodek) else (srodek, p)

Metoda przez bisekcję Przykład: zastosowanie metody przez bisekcję do pierwiastkowania: let sqrt a = let f x = a -. square x in bisekcja f 0.0 (a +. 1.0);; val sqrt : float -> float = <fun> sqrt 42.0;; - : float = 6.48074069840786

Metoda Newtona Procedury wyższych rzędów Uproszczenia: Zakładamy, że dana funkcja jest różniczkowalna. Pomijamy kwestię własności stopu i dzielenia przez 0. Styczna do wykresu funkcji w x przecina oś X w punkcie x (f x) (f x). x x 5 3 x x x 1 4 2

Metoda Newtona Procedury wyższych rzędów Metoda Newtona jako iteracyjne przybliżenie: let newton f x = let p = pochodna f in let czy_dobre x = abs_float (f x) < epsilon and popraw x = x -. (f x) /. (p x) in iteruj x popraw czy_dobre id;; val newton : (float -> float) -> float -> float = <fun>

Metoda Newtona Procedury wyższych rzędów Metoda Newtona oznacza też metodę liczenia pierwiastków kwadratowych. Jest to szczególny przypadek metody Newtona znajdowania zer, dla funkcji f (x) = x 2 a. Funkcja ta ma zera w punktach ± a. f (x) = 2x, czyli kolejne przybliżenie to: x f (x) f (x) = x x 2 a = 2x 2 x 2 + a = x 2 + a = x + a x 2x 2x 2x 2 Otrzymujemy dokładnie metodę pierwiastkowania Newtona. Przybliżenie zaczynamy w dowolnym dodatnim punkcie, np. 1.

Metoda Newtona Procedury wyższych rzędów let sqrt a = let f x = a -. square x in newton f 1.;; val sqrt : float -> float = <fun> sqrt 17.64;; - : float = 4.20000000000023643

Punkty stałe funkcji Procedury wyższych rzędów Punkt stały funkcji f to taki x, że f (x) = x. Dla niektórych funkcji f i x-ów, ciąg x, f (x), f 2 (x), f 3 (x),... jest zbieżny do pewnego punktu stałego f. Jest tak np. dla przekształceń zwężających. Fakt: Jeżeli f jest funkcją ciągłą, oraz ciąg x, f (x), f 2 (x),... jest zbieżny, to lim i f i (x) jest punktem stałym f.

Punkty stałe funkcji Procedury wyższych rzędów Przybliżanie punktów stałych za pomocą procedury iteruj: let punkt_staly f x = let blisko x = abs_float (x -. f x) < epsilon in iteruj x f blisko f;; val punkt_staly : (float -> float) -> float -> float = <fun> punkt_staly cos 1.0;; 0.73908...

Punkty stałe funkcji Procedury wyższych rzędów Pierwiastkowanie za pomocą obliczania punktów stałych. Punkt stały funkcji y x y to ± x. Obliczenie: punkt_staly (function y -> x /. y) 1.0;; zapętla się: 1 x 1 = x x x = 1...

Punkty stałe funkcji Procedury wyższych rzędów Wytłumienie przez uśrednienie: Uśrednienie funkcji f, to funkcja x f (x)+x 2. Uśrednienie f ma dokładnie takie same punkty stałe co f. Szukamy punktów stałych uśrednienia f, zamiast f. let usrednienie f = function x -> average x (f x);; val usrednienie : (float -> float) -> float -> float = <fun> let sqrt x = punkt_staly (usrednienie (function y -> x/. y)) 1.0;; val sqrt : float -> float = <fun> Otrzymaliśmy... metodę pierwiastkowania Newtona.

Naturalny sposób implementacji pojęć matematycznych (np. składanie funkcji i różniczkowanie funkcji). Jeśli dane są procedurami, to operacje na nich są procedurami wyższych rzędów. Na przykład, predykaty i operacje logiczne. Abstrakcja powtarzających się schematów procedur (np. iteruj). Standardowo zdefiniowane procedury wyższych rzędów przetwarzające listy. (Zobaczymy to w kolejnym wykładzie.)