#!/usr/bin/python3 ''' Program pobiera od użytkownika argument x oraz parametr dokładności dok i wylicza wartość sin(x) korzystając z rozwinięcia w szereg potęgowy wokół 0 (https://pl.wikipedia.org/wiki/Funkcje_trygonometryczne#Przez_szereg_Taylora). Sumowanie zatrzymujemy gdy wartość bezwzględna ostatnio dodanego wyrazu szeregu będzie mniejsza bądź równa dok (to proste, a przy tym bardzo bezpieczne kryterium, często aż nadmiernie zachowawcze, związane jest z własnością szeregów naprzemiennych). Im bardziej x różni się od 0, tym gorzej działa przybliżenie – dla takiej samej dokładności potrzebujemy coraz więcej wyrazów szeregu. Ponadto mogą nam się nawarstwiać błędy numeryczne. Stąd warto skorzystać z jakichkolwiek dostępnych środków (tu: wzorów redukcyjnych dla sinusa), by wyrazić sin(x) dla wszystkich możliwych wartości x przez sin(x) od małych x. ''' import math #Potrzebne nam jedynie do porównania naszej wartości sinusa z dokładną pi=3.1415926535897932 #w zasadzie jeśli mamy już załadowany moduł math, to można też pi = math.pi x=float(input("Podaj x:")) dok=float(input("Podaj dokładność:")) msin=math.sin(x) #sin(x) z modułu math, do porównania #Sinus jest funkcją okresową, więc możemy zawęzić wartości. x%=2*pi #Ograniczamy się do zakresu +/-2pi if x<0: #Sprowadzamy -x do x (sinus jest nieparzysty) x=-x; znak=-1 else: znak=1 #Korzystamy z trygonometrycznych wzorów redukcyjnych, zeby jeszcze bardziej ograniczyć zakres x (od 0 do pi/2) if x>3*pi/2: x=2*pi-x;znak=-znak elif x>pi: x=x-pi; znak=-znak elif x>pi/2: x=pi-x #Główna pętla programu, wykonujemy ją aż spełni się kryterium wynik=x; wyraz=x n=0 while abs(wyraz)>dok: n+=1 wyraz*=-x**2/(2*n*(2*n+1)) wynik+=wyraz wynik*=znak #mnożymy wynik przez wyznaczony wcześniej znak print("sin(x) = ",wynik) print("liczba wyrazów szeregu = ",n) print("różnica z dokładnym = ",wynik-msin) #wartość i jej różnica z sinusem z modułu math