Problem Herona. lim(x i+1 x i ) 0. lim x i0 +1 x i0 < ǫ.

Podobne dokumenty
Elementy programowania komputerów

wykres funkcji pierwiastki

Wykład II PASCAL - podstawy składni i zmienne, - instrukcje wyboru, - iteracja, - liczby losowe

Język programowania PASCAL

PoniŜej znajdują się pytania z egzaminów zawodowych teoretycznych. Jest to materiał poglądowy.

Wykład II PASCAL - podstawy składni i zmienne, - instrukcje wyboru, - iteracja cz. 1

Programowanie w Turbo Pascal

Instrukcje podsumowanie. Proste: - przypisania - wejścia-wyjścia (read, readln, write, writeln) - pusta - po prostu ; (średnik) Strukturalne:

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

INSTRUKCJA PUSTA. Nie składa się z żadnych znaków i symboli, niczego nie robi. for i := 1 to 10 do {tu nic nie ma};

Programowanie strukturalne i obiektowe. Funkcje

WHILE (wyrażenie) instrukcja;

Podstawy programowania

Wykład IV Algorytmy metody prezentacji i zapisu Rzut oka na język PASCAL

Elżbieta Kula - wprowadzenie do Turbo Pascala i algorytmiki

WHILE (wyrażenie) instrukcja;

Pascal - wprowadzenie

TEMAT: Podejmowanie decyzji w programie instrukcja warunkowa (IF).

ALGORYTMY. 1. Podstawowe definicje Schemat blokowy

2.Sprawdzanie czy podana liczba naturalna jest pierwsza Liczba pierwsza to liczba podzielna tylko przez 1 i przez siebie.

ALGORYTMY. 1. Podstawowe definicje Schemat blokowy

Rzut oka na współczesną matematykę spotkanie 3: jak liczy kalkulator i o źródłach chaosu

Schematy blokowe I. 1. Dostępne bloki: 2. Prosty program drukujący tekst.

W wielu obliczeniach w matematyce bądź fizyce wykonanie niektórych kroków zależy od spełnienia warunku.

Algorytmy i struktury danych. Wykład 4

CIĄGI wiadomości podstawowe

1 Całki funkcji wymiernych

if (wyrażenie ) instrukcja

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

Algorytm - pojęcie algorytmu, sposób zapisu, poziom szczegółowości, czynności proste i strukturalne. Pojęcie procedury i funkcji.

Aproksymacja diofantyczna

Procedury i funkcje. Przykład programu z procedurą. Definicja. Cechy procedury

Otrzymaliśmy w ten sposób ograniczenie na wartości parametru m.

Podstawą w systemie dwójkowym jest liczba 2 a w systemie dziesiętnym liczba 10.

Specyfikacja zadania informatycznego nr 1

Metody numeryczne w przykładach

Wykład z Podstaw Informatyki dla I roku BO. Piotr Mika

Wstęp do Informatyki zadania ze złożoności obliczeniowej z rozwiązaniami

Iteracje. Algorytm z iteracją to taki, w którym trzeba wielokrotnie powtarzać instrukcję, aby warunek został spełniony.

Informacja w perspektywie obliczeniowej. Informacje, liczby i obliczenia

O LICZBACH NIEOBLICZALNYCH I ICH ZWIĄZKACH Z INFORMATYKĄ

Podstawy programowania. Wykład 3 Konstrukcje sterujące. Krzysztof Banaś Podstawy programowania 1

Indukcja matematyczna. Zasada minimum. Zastosowania.

#include <stdio.h> void main(void) { int x = 10; long y = 20; double s; s = x + y; printf ( %s obliczen %d + %ld = %f, Wynik, x, y, s ); }

Podstawy Programowania C++

Arytmetyka. Działania na liczbach, potęga, pierwiastek, logarytm

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

Luty 2001 Algorytmy (7) 2000/2001

PASCAL. Etapy pisania programu. Analiza potrzeb i wymagań (treści zadania) Opracowanie algorytmu Kodowanie Kompilacja Testowanie Stosowanie

Zajęcia: VBA TEMAT: VBA PROCEDURY NUMERYCZNE Metoda bisekcji i metoda trapezów

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

do instrukcja while (wyrażenie);

Systemy liczbowe. 1. Przedstawić w postaci sumy wag poszczególnych cyfr liczbę rzeczywistą R = (10).

Instrukcja warunkowa i złoŝona.

Złożoność informacyjna Kołmogorowa. Paweł Parys

Technologie informacyjne - wykład 12 -

KURS PASCAL A. 1.Wprowadzenie

Podstawy Informatyki. Inżynieria Ciepła, I rok. Iteracja warunkowadopóki(while) Blok instrukcji. Pascal: begin instrukcja1; C: { end;

Wstęp do programowania. Procedury i funkcje. Piotr Chrząstowski-Wachtel

1 Wprowadzenie do algorytmiki

Języki programowania zasady ich tworzenia

INFORMATYKA W SZKOLE. Podyplomowe Studia Pedagogiczne. Dr inż. Grażyna KRUPIŃSKA. D-10 pokój 227

Ilość cyfr liczby naturalnej

Laboratorium 5 Przybliżone metody rozwiązywania równań nieliniowych

Algorytmika i pseudoprogramowanie

Opis problemu i przedstawienie sposobu jego rozwiązania w postaci graficznej. Gimnazjum nr 3 im. Jana Pawła II w Hrubieszowie 1

WYRAŻENIA ALGEBRAICZNE

Zapis liczb binarnych ze znakiem

INSTRUKCJE PĘTLI, INSTRUKCJA WYBORU. Instrukcja pętli For to do

FUNKCJA POTĘGOWA, WYKŁADNICZA I LOGARYTMICZNA

1. LICZBY DZIAŁ Z PODRĘCZNIKA L.P. NaCoBeZu kryteria sukcesu w języku ucznia

1. Nagłówek funkcji: int funkcja(void); wskazuje na to, że ta funkcja. 2. Schemat blokowy przedstawia algorytm obliczania

Podprogramy. Procedury

17. Naprzemienne odejmowanie

Algorytm. a programowanie -

Podstawy programowania

Lekcja 6: Pascal. Procedura i funkcja

4. Funkcje. Przykłady

ECDL Podstawy programowania Sylabus - wersja 1.0

OPERACJE WEJŚCIA / WYJŚCIA. wysyła sformatowane dane do standardowego strumienia wyjściowego (stdout)

Programowanie i techniki algorytmiczne

INSTRUKCJA ITERACYJNA REPEAT. repeat Instrukcja_1; Instrukcja_2; {... } Instrukcja_N; until wyr ; INSTRUKCJA ITERACYJNA WHILE

for (inicjacja_warunkow_poczatkowych; wyrazenie_warunkowe; wyrazenie_zwiekszajace) { blok instrukcji; }

APROKSYMACJA. Rys. 1. Funkcja aproksymująca zbiór punktów pomiarowych (1) (2) (3) (4) (5) (6) (7) ... Zmienna y

Ile waży arbuz? Copyright Łukasz Sławiński

ALGORYTMY I STRUKTURY DANYCH

Wykład 1. Na początku zajmować się będziemy zbiorem liczb całkowitych

#include <stdio.h> int main( ) { int x = 10; long y = 20; double s; s = x + y; printf ( %s obliczen %d + %ld = %f, Wynik, x, y, s ); }

Lekcja : Tablice + pętle

ALGORYTMY Algorytm poprawny jednoznaczny szczegółowy uniwersalny skończoność efektywność (sprawność) zmiennych liniowy warunkowy iteracyjny

PROGRAMOWANIE W C++ ZADANIA

Indukcja. Materiały pomocnicze do wykładu. wykładowca: dr Magdalena Kacprzak

Wprowadzenie komentarzy do programu

2.8. Algorytmy, schematy, programy

Podstawy Programowania Podstawowa składnia języka C++

Prognozowanie rozgrywki grą planszową

Wykład III PASCAL - iteracja cz, 2, - liczby losowe, - tablice

7. CIĄGI. WYKŁAD 5. Przykłady :

5. Rozwiązywanie układów równań liniowych

Iteracyjne rozwiązywanie równań

Transkrypt:

Problem Herona 1. Prosty problem Na wstępie zdefiniujemy to czego będzie dotyczyć wykład Elementy programowania komputerów, który mam prowadzić dla Państwa. Zastanówmy sie na początku jak obliczamy pierwiastki kwadratowe z liczb dodatnich. Ten prosty problem i jego rozwiązanie, które wszyscy znamy, pozwoli nam poczynić pewne uogólnienia i pozwoli dostrzec wszystkie problemy występujące w tzw. programowaniu, o którym będziemy mówić. Kiedy już je dostrzeżemy i zauważymy ich ważność poświęcimy kilka chwil każdemu z nich by potem łatwiej i lepiej mócpisaćprogramydlasiebiei,comożeważniejsze,dlainnych,którzybędąjeu Was zamawiać. Zadanie jakie sobie stawiamy brzmi następująco. Dla zadanej liczby dodatniej obliczyć na komputerze(oczywiście bez używania kalkulatora) pierwiastek kwadratowy. Comusimyzrobić?Wczytaćdane,tęjednąliczbę aiwydrukowaćwartość a. Jeśli jest to liczba kwadratowa, tzn. taka, że jej pierwiastek jest liczbą wymierną to sprawa jest w miarę prosta. Co zrobić jednak jeśli liczbą tą jest 2? Pierwiastkiem jest liczba niewymierna. Jak ją przedstawić? Ile miejsc znaczących wydrukować? Jeszcze inaczej, z jaką dokładnością należy ją policzyć? Sześć? Czy dokładność innych obliczeńzależnychodtakwyliczonego a(jeślitakieobliczeniaprowadzimy)będzie wtedy wystarczająca? Itd, itp. Pytań tego typu będzie jeszcze więcej. Musimy na nie odpowiadać gdyż tego wymaga klient, który zamówił u nas program do obliczeń? Jeśli jest to np. bank lub szpital to konsekwencje złych przybliżeń mogą być fatalne wskutkach. Załóżmyjednak,żewiemyjuż,żedokładnośćmawynosić ±10 6,czylijedna milionowa. Oznacza to, że wynik jaki dostaniemy może sią różnić od dokładnego o wielkość ǫ = 0.000001. Pojawia się wtedy następny problem jak policzyć ten pierwiastek z taką dokładnością. Żeby nie tracić za wiele czasu spójrzmy na poniższy rysunek. Algorytm obliczania pierwiastka jest natychmiastowy! wystarczy liczyć średnią wartość z dwóch liczb: jednej x dowolnej(mniejszej od zadanej liczby a) i drugiej równej drugiemu bokowi a/x. Na początku, przy zadanym x, liczba a/x jest inna niż x, ale jeśli będziemy dostatecznie długo powtarzać proces obliczania średniej to obie liczby będą do siebie dążyć i w nieskończoności iteracji(tak nazywamy ten sposób powtarzania obliczeń) otrzymamy lim(x i+1 x i ) 0. Proszętosprawdzić.Przypewnym i = i 0 będziespełnionarelacja lim x i0 +1 x i0 < ǫ.. W tym momencie możemy przerwać proces rachunkowy. Bez tego warunku nasz algorytm byłby nieskończony. Proces obliczeń nigdy by się nie zatrzymał. 1

x i+1 =1/2(x +a/x) i i a a a/x 2 x =a Rysunek 1: Wzór Herona. x Mamywięcalgorytmobliczeń.Jesttotzw.wzórHerona 1,znanyPaństwu.Był używany w szkole. Co najważniejsze, mamy tu algorytm skończony, a więc proces obliczeń możemy w odpowiednim miejscu przerwać. Poobliczeniu adrukujemywynikzdokładnościązadanąprzezklienta. Dokładnie jednak nie wiadomo co drukować. Tak jest. Czy drukować sam pierwiastek, czy liczbę i pierwiastek, czy może również wydrukować dokładność, a może też należałoby w jakiś sposób pozwolić ustalać dokładność w trakcie rachowania? Okazuje się, że na te pytania też musimy odpowiedzieć. Musimy te problemy przedyskutować z klientem. To wszystko należy do tzw. definicji problemu. To nie jest już tylko obliczenie pierwiastka, ale obliczenie pierwiastka z zadaną dokładnością i sposób jego przedstawienia. Komputer pracuje stosując tzw. arytmetykę dyskretną, tzn. używa on tylko skończonego zbioru liczb co wynika z jego budowy. Każda komórka pamięci komputera, obojętnie jak duża, może zmieścić próćz tego jakąś liczbę maksymalną i żadnej większej. Jeśli użyjemy większej liczby takich komórek pamięci to możemy używać większych liczb. Wynika stąd, że klient, który zamówił u nas program liczenia pierwiastka powinien dodatkowo określić jak wielkie liczby kwadratowe będą go interesowały. To pozwoli nam zdefiniować wielkość komórek pamięci, w których będziemy zapisywać wyniki obliczeń. Komórki pamięci są podobne pod tym względem do szuflady: większa szuflada(typ) więcej gratów(danych) można tam upchać. Można oczywiście używać maksymalnych dostępnych komórek, ale czasami prowadzi to do zagracenia pamięci. Niektóre problemy nie wymagają by zmuszać naszego klienta do zakupu dodatkowych modułów pamięci do jego komputera. Byłby to nonsens. Czy już rozwiązaliśmy wszystkie problemy? Jeszcze nie. Musimy naszkicować projekt programu. Schemat ten nie będzie jeszcze programem dla komputera, ale pomoże nam wtedy gdy zechcemy taki program napisać. Jak on wygląda? Np. tak 1: ustal dokładność obliczeń epsilon; 2: wczytaj liczbę a; 3: oblicz pierwiastek z liczby a wg wzoru Herona; 4: drukuj pierwiastek; 1 HeronzAleksandrii(stgr.HeronhoAleksandreus,ok.10-70) starożytnygreckimatematyk, fizyk, mechanik, wynalazca i konstruktor. 2

To jest prawdziwy schemat. Spróbujmy go udokładnić. Jak potraktować przypadek ujemnych a? Musimy wczytać nową liczbę a, informując jednocześnie użytkownika o tym, że wprowadził złą daną. Programowanie to przewidywanie różnych sytuacji, które mogą się zdarzyć podczas pracy programu. 1: ustal dokładność obliczeń: epsilon <- 0.000001; 2: wczytaj liczbę a; jeśli a<0 wykonaj [ wypisz "a jest mniejsze od 0"; idź do kroku 2 ]; 3: oblicz pierwiastek z liczby a wg wzoru Herona; 4: drukuj pierwiastek; Schemat rozrasta się. Zajmijmy się teraz krokiem 6. Powinniśmy ustalić x, obliczyć aź,obliczyćśrednią x i 1/2(x+aź)ipowtarzaćtenproces,podstawiającpod x nowąwartość x i ażdomomentugdyosiągniemypasdokładności. 1: ustal dokładność obliczeń: epsilon <- 0.000001; 2: wczytaj liczbę a; jeśli a<0 wykonaj [ wypisz "a jest mniejsze od 0"; idź do kroku 2; ]; 3: ustal x: x <- a/4 przyjmujemy startowe x=a/4 I: [ xi <- 1/2(x+aź); jeśli abs(xi-x) > epsilon idź do kroku I; ] 4: drukuj pierwiastek wg wzorca zgodnego z zadaną dokładnością; Używamy zdań rozkazujących: rozkazów. Pojawiły się również rozkazy złożone z kilku linii tekstu instrukcje złożone, które zawarłem w nawiasy kwadratowe [...], etykiety, które są nazwami kroków, pewne funkcje znane w systemie, funkcje biblioteczne, np. abs, itd. W zasadzie można przystąpić do kodowania. Należy więc wybrać język wyższego poziomu, w którym to kodowanie przeprowadzimy i przełożyć nasz schematyczny program na ten język. Czy to koniec? Rozstrzygnięcie jakiego języka programowania należy użyć nie jest proste. Są ich setki. Dla przykładu podaję Państwu kod problemu wraz z krótkim opisem oraz przykładem obliczeń, dokonanych w Pascalu. program heron; uses dos, crt; dolaczanie bibliotek KOMENTARZ: 3

Program uzywa algorytmu Herona dla znajdowania pierwiastka kwadratowego z liczby z dokladnoscia zadana przez uzytkownika. Jest to metoda iteracyjna, ktora sprowadza sie do wzoru: x_i+1 = 1/2 * (xi+a/źi) gdzie xi jest wartoscia poczatkowa, ktora moze byc podana przez uzytkownika lub, najlepiej, obliczona wstepnie w programie. Powyzszy wzor mozna latwo zrozumiec analizujac nastepujacy rysunek. (a - pole, x_i - bok, x_(i+1) - drugi bok) --------------- a x_(i+1)=a/ź --------------- x_i Wartosc pierwiastka lezy gdzies pomiedzy xi i x_(i+1), a wiec jest rowna 1/2(x_+x_(i+1))=1/2(x_i+a/ź_i). Liczba (a) wczytywana jest z terminala. Dokladnosc obliczen (eps) jest ustalona przez programiste. function time:real; funkcja pobierania czasu w sec. var hour, minute, second, Hundreds: word; begin GetTime(hour, minute, second, hundreds); wykorzystanie bibliotek time:=3600*hour+60*minute+(second+hundreds/100); end; const eps=1e-9; dokladnosc obliczen; blad var xi, xi1, a: extended; duze liczby! iter: integer; gospodarka zasobami pamieci time0: real; begin clrscr; wczytywanie danych: writeln( Program: HERON ); 4

writeln( Obliczanie pierwiastka kwadratowego z liczby dodatniej. ); repeat write( Prosze podac liczbe (>0): a= ); until a>=0; read(a); sprawdzanie poprawnosci danych: if a=0 then begin writeln; writeln( Pierwiastek=, 0 ); halt; end; obliczenia time0:=time; iter:=0; xi:=a/4; repeat xi1:=0.5*(xi+a/źi); xi:=a/źi1; iter:=iter+1; until abs(xi-xi1)<eps; wypisywanie wynikow: Dobrej informacji nigdy za wiele! writeln; writeln( Liczba: a =,a:25:9); writeln( Pierwiastek: x =,xi:25:9, +/-,eps); writeln( Liczba iteracji: iter =,iter:25); writeln( Sprawdzenie: x^2 =,xi*xi:25:9); writeln( Czas obliczen =,time-time0:25:9, sec. ); end. Przykladowe wyniki obliczen. ---------------------------- Turbo Pascal Version 7.0 Copyright (c) 1983,92 Borland International Program: HERON Obliczanie pierwiastka kwadratowego z liczby dodatniej. Prosze podac liczbe (>0): a= 12345678987654321 Liczba: a = 12345678987654321.000000000 Pierwiastek: x = 111111111.000000000 +/- 1.00000000000000E-0009 Liczba iteracji: iter = 30 Sprawdzenie: x^2 = 12345678987654321.000000000 Czas obliczen = 0.000000000 sec. 5

------------------------------------------------------------------------------ Co mozna dodac do programu? Np. licznik czasu. Czego nauczyliśmy się z tego przykładu? Jest to tamat na następny wykład. Możemy tylko powiedzieć, że zdefiniowaliśmy wiele problemów, których na pierwszy rzut oka nie widać, a które zawsze występują w procesie programowania. O nich będą te wykłady. 6