19. Funkcje trygonometryczne
Treści kształcenia. Funkcje. Pojęcie funkcji (intuicyjnie, nie jako relacji), argumenty, wartości, dziedzina, przeciwdziedzina, zbiór wartości. Funkcje monotoniczne, wypukłe, parzyste, nieparzyste, okresowe. Iniekcje, suriekcje, bijekcje. Przegląd podstawowych funkcji elementarnych (afiniczna, kwadratowa, wykładnicza, logarytmiczna (teoria obliczeń), trygonometryczne), ich wykresów i własności.
Efekty kształcenia. Potrafi badać i określać własności podstawowych funkcji, które napotyka w informatyce.
Wstęp¶
Celem niniejszych zajęć jest zrozumienie własności funkcji trygonometrycznych, czyli funkcji stowarzyszonych z parametryzacją okręgu. Ich użyteczność w informatyce ujawnia się najbardziej w projektowaniu grafiki komputerowej. Funkcje trygonometryczne są używane również przy generowaniu tzw. transformat, np. transformaty Fouriera (zarówno dyskretnej i ciągłej). Znaczenie tych transformat ujawnia się przy analizowaniu funkcji różnego rodzaju.
Jednym z kluczowych zastosowań dyskretnej transformaty Fouriera (DFT) jest analiza spektralna próbek oraz kompresja. DFT używa się też przy bardzo wydajnych algorytmach mnożenia dużych liczb całkowitych takich jak algorytm Schönhage–Strassena.
Definicja¶
Okrąg jednostkowy to figura geometryczna zadana równaniem uwikłanym . Zbiór par liczb rzeczywistych spełniających to równanie wygląda następująco.
x,y=var('x,y')
implicit_plot(x^2+y^2==1,(x,-1,1),(y,-1,1),axes=True)
Definicja funkcji trygonometrycznych¶
Definicja (funkcje sinus i kosinus dla okręgu)
Punkt na okręgu jednostkowym możemy opisać jednoznacznie za pomocą promienia wychodzącego z punktu i półprostej, która przecina ten okrąg. Kąt zadany przez taką półprostą obliczamy względem półdodatniej osi . Oznaczmy ten kąt przez . Definiujemy dwie funkcje
oraz
zadane relacją
gdzie kąt (mierzony w radianach) jest nachyleniem półprostej wychodzącej z punktu , która przecina okrąg jednostkowy w punkcie .
Gdy mamy do czynienia z kątem spoza zakresu standardowego, wartości funkcji trygonometrycznych definiujemy następująco
gdzie i oraz jest jednoznacznie ustaloną liczbą całkowitą. Podobnie definiujemy
Przykład
Punkt odpowiada kątowi . Zatem
oraz
Zadanie
Wyznacz wartość funkcji sinus i kosinus dla kątów
(30 stopni)
(45 stopni)
(60 stopni)
Sprawdzenie w SageMath¶
sin(pi/6)1/2cos(pi/6)1/2*sqrt(3)sin(pi/4)1/2*sqrt(2)cos(pi/4)1/2*sqrt(2)sin(pi/3)1/2*sqrt(3)cos(pi/3)1/2Uzasadnienie matematyczne ¶
Prosta wyznacza wraz z okręgiem jednostkowym trójkąt równoramienny o wierzchołkach , i . Obliczmy wartość .
gra=plot(x,(x,0,1))+implicit_plot(x^2+y^2==1,(x,0,1),(y,0,1))+line([[sqrt(2)/2,0],[sqrt(2)/2,sqrt(2)/2]],linestyle='dashed')
x1=sqrt(2)/2
gra=point([[0,0],[x1,0],[x1,x1]],color='red',pointsize=20)+gra
gra+=text('(0,0)',[0.1,0.01])
gra+=text('(x,0)',[x1+0.1,0.01])
gra+=text('(x,x)',[x1+0.1,x1])
gra
wielomian=(x^2+y^2-1).subs({y:x})solve(wielomian,x)[x == -1/2*sqrt(2), x == 1/2*sqrt(2)]Wartość funkcji kosinus oraz sinus dla jest dodatnia, zatem
Uzasadnienie matematyczne ¶
UWAGA! Rozwiązanie podane poniżej wykorzystuje pojęcie prostej, wektora oraz normy wektora.
Określamy trójkąt równoboczny (kąt wewnętrzny ) o wierzchołkach , i wierzchołku , który jest określony poprzez przecięcie trzech prostych , i . Proste , przecinają się w punkcie . Proste , przecinają się w punkcie , a proste , przecinają się w punkcie .
Cele:
Wyznaczenie współrzędnych jako funkcji zmiennych .
Wyznaczenie kwadratów odległości między punktami , oraz .
Porównanie (kwadratów) odległości: , oraz 1 (trójkąt równoboczny!).
x,y,a,b=var('x,y,a,b')
solve([y-a*x,y-(b*x-b)],(x,y))[[x == -b/(a - b), y == -a*b/(a - b)]](x^2+y^2-((x-1)^2+y^2)).subs({x:-b/(a - b),y:-a*b/(a - b)}).simplify_full().numerator().factor()-a - bUzyskaliśmy relację . Podstawmy to do finalnej relacji .
(x^2+y^2-1).subs({x:-b/(a - b),y:-a*b/(a - b)}).subs({a:-b}).simplify_full().numerator().factor()b^2 - 3Współczynnik ze względu na wybór właściwego nachylenia prostej . Uzyskaliśmy dane o punkcie .
#x
(-b/(a - b)).subs({a:-b}).subs({b:-sqrt(3)})1/2#y
(-a*b/(a - b)).subs({a:-b}).subs({b:-sqrt(3)})1/2*sqrt(3)Zgodnie z definicją uzyskujemy formuły
oraz
#ilustracja graficzna sytuacji
x1=1/2
y1=sqrt(3)/2
gra=plot(sqrt(3)*x,(x,0,1.2),ymax=1.1)+implicit_plot(x^2+y^2==1,(x,0,1),(y,0,1))+line([[1,0],[x1,y1]],linestyle='dashed')
gra=point([[0,0],[1,0],[x1,y1]],color='red',pointsize=20)+gra
gra+=text('(0,0)',[0.1,0.01])
gra+=text('(1,0)',[1+0.1,0.01])
gra+=text('(x,y)',[x1+0.1,y1])
gra
Prawo dodawania na okręgu¶
Oznaczmy przez wektor z punktu do punktu na okręgu jednostkowym. Wektor obrócony o 90 stopni przeciwnie do ruchu wskazówek zegara względem wektora ma współrzędne (uzasadnij!). Z tej zależności otrzymujemy relacje
oraz
Obrócony układ współrzędnych¶
Punkt na okręgu jednostkowym (a więc ) zadaje kąt i wyznacza wektor oraz wektor do niego prostopadły . Względem tych dwóch wektorów otrzymujemy ,,obrócony’’ układ współrzędnych. Przyjmując, że nowa oś pokrywa się z półprostą wyznaczoną przez wektor , a oś pokrywa się z półprostą wyznaczoną przez wektor . Oznaczmy drugi punkt na okręgu jednostkowym o kącie . Względem nowego układu współrzędnych obrót o kąt zadaje w układzie współrzędnych , punkt o łącznym kącie . W efekcie jest to punkt odpowiadający przejściu o jednostek względem wektora i jednostek względem wektora . Łącznie
Ustaliliśmy w ten sposób ,,prawo dodawania’’ na okręgu jednostkowym. Punkt zadany przez sumę kątów ma współrzędne . W terminach funkcji trygonometrycznych oznacza to
i
Wraz ze wzorem (jedynkowym)
otrzymaliśmy komplet wzorów, które jednoznacznie identyfikują nam funkcje trygonometryczne.
Parzystość¶
Zgodnie z przyjętymi definicjami funkcja kosinus jest parzysta, tzn.
dla dowolnego .
Funkcja sinus jest z kolei nieparzysta
dla dowolnego .
Różnowartościowość, surjektywność i monotoniczność¶
Ponownie analizując definicję i relację z okręgiem otrzymujemy dwie własności:
funkcja jest różnowartościowa, surjektywna i ściśle rosnąca.
funkcja jest różnowartościowa, surjektywna i ściśle malejąca.
UWAGA! Do ścisłego dowodu tych własności wystarczy zauważyć, że dla zadanego kąta z wyłączeniem kątów oraz otrzymujemy prostą dla pewnego współczynnika nachylenia . Podstawiając równanie tej prostej do równania okręgu otrzymujemy następujące relacje
oraz
gdzie wyznaczenie znaku otrzymujemy bazując na znaku funkcji oraz .
Powyższe wzory pozwalają w stosunkowo prosty i wydajny sposób podać formuły dokładne oraz przybliżenia numeryczne dla kosinusa i sinusa dowolnego kąta postaci dla .
Załóżmy, że dana jest para liczb dla ustalonego kąta . Otrzymujemy zgodnie z powyższymi wzorami formułę
Poprzez podstawienie do ,,wzoru jedynkowego’’ otrzymujemy
alpha=var('alpha')
pretty_print(solve(cos(alpha)-((cos(alpha/2))^2-(1-cos(alpha/2)^2)),cos(alpha/2)))eq2=(sin(alpha/2)^2+cos(alpha/2)^2-1).substitution_delayed(cos(1/2*alpha),sqrt(1/2*cos(alpha) + 1/2))
pretty_print(solve(eq2,sin(1/2*alpha)))def cit(tup):
c,s=tup
return [sqrt((1+c)/2),sqrt((1-c)/2)]def polowienie(n):
x=[0,1]
li=[x]
for _ in range(n):
li.append(cit(x))
x=cit(x)
return li#wykres ilustruje zbliżanie się par punktów od punktu (0,1) do punktu (1,0) poprzez ciąg punktów (cos(pi/2^i),sin(pi/2^i))
gra=Graphics()
gra+=sum([point(x) for x in polowienie(7)])
gra+=plot(x,(x,-1,1))
gra.show(aspect_ratio=1)
Uzasadnienie matematyczne ¶
Do wyznaczenia wartości oraz wykorzystamy formułę na podwojenie kąta i własność oraz .
c,s=var('c,s')
#cos(pi/3)==cos(pi/6)^2-(1-cos(pi/6)^2)
solve(1/2-(c^2-(1-c^2)),c)[c == -1/2*sqrt(3), c == 1/2*sqrt(3)]#sin(pi/6)==sqrt((1-cos(pi/3))/2)
sqrt((1-c)/2).subs({c:1/2*sqrt(3)})sqrt(-1/4*sqrt(3) + 1/2)Zadanie (wartość funkcji kosinus dla kąta )¶
Korzystając z formuły powyżej wyznacz postać dokładną i postać numeryczną liczby .
pretty_print(polowienie(7)[6][0].simplify_full())polowienie(7)[6][0].n()0.999698818696204cos(pi/128).n()0.999698818696204Zadanie (wartość funkcji sinus dla kąta )¶
Wyznacz formułę dokładną na wartość funkcji dla .
Wystarczy zauważyć, że . Korzystając z formuły na sinusa kątów oraz oraz z formuły na sinus różnicy kątów, otrzymujemy .
# wartości cos(pi/2^k) dla k=0,..9 bardzo szybko zbiegają do 1
list_plot(polowienie(10))
Sumy trygonometryczne¶
Korzystając ze wzorów na kosinus i sinus sumy kątów możemy wyprowadzić następujące wzory
Zadanie (wzory na sumy)¶
Wyprowadź powyższe wzory.
Zadanie (suma sinusa i kosinusa)¶
Uzasadnij, że
x=var('x')
pp=plot(sin(x)+cos(x),(x,-2*pi,2*pi))+plot([sqrt(2),-sqrt(2)],(x,-2*pi,2*pi),linestyle='dashed',color='red')
pp+=line([(pi/4,0),(pi/4,sqrt(2))],color='green',linestyle='dashed')
pp+=text(r'$\sqrt{2}$', (-0.3, 1.3), color='black')
pp+=text(r'$\sqrt{2}$', (-0.3, 1.3), color='black')
pp+=text(r'$\pi/4$', (pi/4, -0.1), color='black')
pp+=text(r'$y=sin(x)+cos(x)$', (3.2, 1), color='black')
pp.show()
Tangens i kotangens¶
Współczynnik nachylenia prostej dla zadanego kąta z wyłączeniem wartości nazywamy tangensem kąta i oznaczamy . Zgodnie z równaniem okręgu i definicją funkcji sinus i kosinus zachodzi relacja
Kotangensem kąta (różnego od 0 i ) nazywamy liczbę oznaczaną i zdefiniowaną wzorem
Dla liczby stosujemy definicję, w której funkcje kosinus i sinus są obliczane zgodnie z formułą redukcyjną podaną wcześniej. W szczególności wartości kotangensa i tangensa powtarzają się po przesunięciu argumentu o dowolną wielokrotność liczby .
Wykres funkcji trygonometrycznych¶
Możemy teraz naszkicować wykresy funkcji trygonometrycznych zdefiniowanych w tym rozdziale
x=var('x')
plot(cos(x),(x,-2*pi,2*pi))
x=var('x')
plot(sin(x),(x,-2*pi,2*pi))
x=var('x')
plot(tan(x),(x,-pi,pi), detect_poles='show',color='green',ymin=-10,ymax=10)
x=var('x')
plot(cot(x),(x,-2*pi,2*pi), detect_poles='show',color='green',ymin=-10,ymax=10)
Okresowość¶
Funkcje kosinus i sinus są -okresowe i jest to ich okres minimalny. Oznacza to, że
oraz
dla dowolnego i podobna własność nie jest prawdą dla żadnej liczby dodatniej, mniejszej od .
Funkcje kotangens i tangens są -okresowe i jest to ich okres minimalny.
Podstawienie uniwersalne¶
Funkcje kosinus, sinus oraz tangens można powiązać za pomocą tzw. podstawienia uniwersalnego. Jego znaczenie omówimy poniżej.
We wszystkich wyprowadzeniach poniżej przyjmujemy, że kąty nie są postaci dla żadnej liczby całkowitej .
Zgodnie z jedynką trygonometryczną, otrzymujemy
Z formuły na podwojenie funkcji kosinus otrzymujemy
i po podstawieniu
Z formuły na podwojenie funkcji sinus otrzymujemy
Powyższe wzory nazywamy podstawieniem uniwersalnym, ponieważ pozwalają nam wyrazić wartości funkcji trygonometrycznych kosinus () i sinus () za pomocą formuły (wymiernej) jednej zmiennej (). W syntetycznej formie
gdzie .
Ponadto .
UWAGA!
Formuła daje również poprawne wartości, o ile przyjmiemy poprawne konwencje dotyczące granic funkcji przy zbliżaniu się do wartości nieoznaczonych. Sprawdź!
Parametryzacja wymierna okręgu¶
Charakteryzację punktów na okręgu jednostkowym za pomocą parametru oraz dwóch zmiennych nazywamy parametryzacją wymierną (ze względu na ) okręgu.
t=var('t')
parametric_plot(((t^2-1)/(t^2+1),2*t/(t^2+1)),(t,-10,10))
Znaczenie podstawienia uniwersalnego¶
Podstawienie uniwersalne pozwala przekształcić dowolną formułę trygonometryczną wykorzystującą pojedynczą zmienną oraz całkowite wielokrotności tej zmiennej i operacje dodawania, odejmowania, mnożenia i dzielenia do postaci pewnej funkcji wymiernej (zmiennej ). Uproszczenie takiej formuły do postaci najkrótszej jest wówczas rutynowym zadaniem na wyrażenia podobne dla wielomianów oraz algorytm dzielenia wielomianów z resztą.
Jednym z podstawowych zastosowań jest redukcja całek trygonometrycznych do całek wymiernych. O tym będziemy się uczyć na analizie matematycznej.
Drugim ważnym zastosowaniem jest możliwość szybkiego wyznaczania funkcji trygonometrycznych. Klasycznym algorytmem, który wykorzystuje te idee, jest CORDIC (COordinate Rotation DIgital Computer). Jest to algorytm w klasie shift-and-add wynaleziony w latach 50. XX wieku przez Jacka Voldera. Pozwala on w wydajny sposób obliczać wartości funkcji trygonometrycznych mając do dyspozycji tylko podstawowe operacje arytmetyczne oraz tablicę wartości referencyjnych.
Zadanie (upraszczanie tożsamości)¶
Uzasadnij za pomocą podstawienia uniwersalnego, że wyrażenie upraszcza się do zera.
Wskazówka: Wykorzystaj dwie zmienne oraz i ich związek .
#sprawdzenie automatyczne
#w krokach wykorzystujemy trig_expand() do usunięcia wielokrotnego kosinusa
#następnie podstawiamy formuły uniwersalne
#a w kolejnym kroku porządkujemy wyrażenie wymierne
x,t=var('x,t')
wyr=((sin(x))^4 + (cos(x))^4 - 1/2*(cos(2*x)^2) - 1/2).trig_expand().substitution_delayed(sin(x),2*t/(1+t^2)).substitution_delayed(cos(x),(1-t^2)/(1+t^2))
wyr.simplify_full()0Algorytm CORDIC¶
W poniższych kilku zadaniach opiszemy sposób na wyznaczanie (jednoczesne) pary dwóch funkcji trygonometrycznych dla kątów . Jest to jedyny przedział, w którym musimy wyznaczać wartości funkcji trygonometrycznych bezpośrednim rachunkiem. W pozostałych przedziałach liczb rzeczywistych stosujemy parzystość funkcji oraz jej okresowość.
CORDIC - tożsamości¶
Uzasadnij korzystając z tożsamości podanych wcześniej, że zachodzą dla dowolnego kąta oraz kąta następujące tożsamości
CORDIC - wartości specjalne¶
Teraz zaprojektujemy algorytm, który wyznacza (ustalone) przybliżenia numeryczne dla kątów w przedziale spełniających relacje
Dla wartość kąta wynosi .
Wartość kąta , dla którego , wyznaczymy numerycznie z zadaną dokładnością. Zauważmy, że znamy metodę wyznaczania wartości funkcji tangens dla kątów . Korzystając z formuły na sinusa i kosinusa sumy kątów, otrzymamy
Mając więc dany w kroku -tym tangens kąta otrzymujemy formułę na tangens kąta następująco
i korzystając z dodatniości obu wyrażeń wyprowadzamy wzór rekurencyjny
def tanstep(t):
return -1/t+sqrt(1+t^2)/t
def tan2(n):
t=(pi/4,1)
tli=[t]
for _ in range(n):
t=(t[0]/2,tanstep(t[1]))
tli.append(t)
return tli[[x[0],x[1].n()] for x in tan2(7)][[1/4*pi, 1.00000000000000],
[1/8*pi, 0.414213562373095],
[1/16*pi, 0.198912367379658],
[1/32*pi, 0.0984914033571647],
[1/64*pi, 0.0491268497694666],
[1/128*pi, 0.0245486221089237],
[1/256*pi, 0.0122724623795705],
[1/512*pi, 0.00613600015762472]]W kolejnym kroku wykorzystamy tablicę wyznaczonych wartości do obliczenia wartości , dla których . Startując od wartości tangensa dla , która wynosi 1, będziemy korygować tę wartość korzystając z tożsamości
Mając dane przybliżenie w -tym kroku spełniające własność poszukujemy na liście elementów takiej pozycji , aby indeks był najmniejszym możliwym, dla którego zachodzi
W ten sposób otrzymujemy wartość i w kolejnym kroku będziemy przeszukiwać listę od indeksu wzwyż. Algorytm zatrzymujemy w momencie, gdy osiągnęliśmy pożądaną wartość błędu dla zadanego z góry .
def tanGen(prec):
t=(pi/4,RealField(prec)(1))
yield t
while True:
t=(t[0]/2,tanstep(t[1]))
yield t def t(A,B):
return (A+B)/(1-A*B)
def Beta(i,prec,epsilon):
if i==0:
return (pi/4,RealField(prec)(1))
a=tanGen(prec)
kres=1/2^i
beta=0
tbeta=RealField(prec)(0)
astep=(0,RealField(prec)(0))
while True:
beta+=astep[0]
astep=next(a)
tstep=t(tbeta,astep[1])
while tstep > kres:
astep=next(a)
tstep=t(tbeta,astep[1])
tbeta=tstep
if kres-tbeta <= epsilon:
return (beta+astep[0],tbeta)[Beta(i,100,10^(-10)) for i in [0..10]][(1/4*pi, 1.0000000000000000000000000000),
(5070934489/34359738368*pi, 0.49999999990035765720922114811),
(2679342517/34359738368*pi, 0.24999999990959789595212387809),
(1360076097/34359738368*pi, 0.12499999991952645792755488633),
(42667331/2147483648*pi, 0.062499999917698551970573841998),
(341671445/34359738368*pi, 0.031249999948421089681982516737),
(170877413/34359738368*pi, 0.015624999930512532503403664797),
(85443921/34359738368*pi, 0.0078124999895466838245222201309),
(10680653/8589934592*pi, 0.0039062499610521905952177749260),
(21361387/34359738368*pi, 0.0019531249360535920183539559400),
(83443/268435456*pi, 0.00097656249674699430942650687966)]W ostatnim kroku obliczymy przybliżenie wartości dla kąta w przedziale stosując korekty wartości referencyjnych dla kątów oraz ich tangensów (z dokładnością do błędu)
Za wartość początkową przyjmujemy . W -tym kroku, jeśli aktualna wartość jest dodatnia, odejmujemy kąt , w przeciwnym przypadku dodajemy. Odwzorowujemy też ten efekt na obliczanych funkcjach trygonometrycznych.
def Cordic(alpha,n,prec,epsilon):
beta=[Beta(i,prec,epsilon) for i in range(n+1)]
c=RealField(prec)(1)
s=RealField(prec)(0)
alphatmp=RealField(prec)(alpha)
pow2=RealField(prec)(1)
for i in range(0,n+1):
if alphatmp>=0:
sigma=1
else:
sigma=-1
c,s=RealField(prec)(1/sqrt(1+pow2^2)*(c-sigma*pow2*s)),RealField(prec)(1/sqrt(1+pow2^2)*(s+sigma*pow2*c))
pow2/=2
alphatmp-=sigma*RealField(prec)(beta[i][0])
return (c,s,alphatmp)#przykładowe obliczenie numeryczne cos(1) i sin(1) w 40 krokach iteracji na liczbach ze 100 bitową precyzją i tolerancją błędu 10^(-12)
#zwrócone wartości to (cos(1),sin(1), bład kątą)
Cordic(1,40,100,10^(-12))(0.54030230586931977050317848782,
0.84147098480713880326914124188,
3.7994145047196532351921549346e-13)Porównując wartość obliczoną geometrycznie z przybliżeniem wyznaczonym w 40 iteracjach algorytmu CORDIC otrzymujemy prawidłową wartość z 16-cyfrową precyzją.
Warto zaznaczyć, że podstawowe kroki iteracji algorytmu CORDIC to dodawanie liczb zmiennoprzecinkowych oraz mnożenie przez potęgi 2, które realizuje się operacją shift, która jest znacząco szybsza niż ogólne mnożenie zmiennoprzecinkowe.
a=pi/4
vector(Cordic(a,50,200,10^(-20))[0:2])-vector([(1/sqrt(2)).n(200),(1/sqrt(2)).n(200)])(-5.7700458367192628175046408339313819966904942745512160692812e-16, 5.7700458367192581091027638255049221908773500864782978560239e-16)#wzrost precyzji wraz ze wzrostem liczby iteracji algorytmu CORDIC
list_plot([log(abs(Cordic(pi/4,k,100,10^(-20))[0]-(1/sqrt(2))),10) for k in range(3,50)])+plot(-1/3*x,(x,0,50))
Funkcje cyklometryczne¶
Funkcje kosinus, sinus, kotangens i tangens są bijekcjami, gdy ograniczymy je do odpowiednich przedziałów. W przypadku funkcji bijektywnej możemy skonstruować funkcję spełniającą relacje dla dowolnego oraz dla dowolnego .
Funkcja odwrotna do sinusa¶
Definiujemy funkcję . Jest to funkcja odwrotna do funkcji .
Funkcję nazywamy arkus sinusem.
x=var('x')
plot(arcsin(x),(x,-1,1))
Funkcja odwrotna do kosinusa¶
Definiujemy funkcję . Jest to funkcja odwrotna do funkcji .
Funkcję nazywamy arkus kosinusem.
x=var('x')
plot(arccos(x),(x,-1,1))
Funkcja odwrotna do tangensa¶
Definiujemy funkcję . Jest to funkcja odwrotna do funkcji .
Funkcję nazywamy arkus tangensem.
x=var('x')
plot(arctan(x),(x,-20,20))
Funkcja odwrotna do kotangensa¶
Definiujemy funkcję . Jest to funkcja odwrotna do funkcji .
Funkcję nazywamy arkus kotangensem.
x=var('x') #uwaga: wbudowana w SageMath funkcja arccot ma inną normalizację!
plot(pi-arccot(-x),(x,-20,0))+plot(arccot(x),(x,0,20))
Zadanie (ciekawostka z arkusem tangensem)¶
Udowodnij równość
Wskazówka: wykorzystaj wzór
oraz zauważ, że suma daje kąt w przedziale .