Trigonometrik fonksiyonlar nasıl çalışır?


102

Lise matematiğinde ve muhtemelen üniversitede, trigonometri fonksiyonlarını nasıl kullanacağımız, ne yaptıkları ve ne tür problemleri çözdükleri öğretiliyor. Ama bana her zaman kara kutu olarak sunuldular. Bir şeyin Sinüsüne veya Kosinüsüne ihtiyacınız varsa, hesap makinenizdeki sin veya cos düğmesine basarsınız ve hazırsınız. Hangisi iyi.

Merak ettiğim şey, trigonometrik fonksiyonların tipik olarak nasıl uygulandığı.


Trigonometri fonksiyonlarının ne olduğu veya nasıl uygulandıkları konusunda kafanız mı karıştı?
Kyle Cronin

15
Ne olduklarını biliyorum. Ne yaptıklarını biliyorum. Hangi amaçla hangisine ihtiyacım olduğunu nasıl belirleyeceğimi biliyorum. Size açılar ve mesafeler arasındaki ilişkiyi anlatabilirim. Aradığım şey daha çok John D. Cook'un cevabıydı. Ve gerçek algoritmalardan bahseden diğer herkes
Jurassic_C

Bu güzel bir soru. Örneğin, sinüs, kosinüs ve tanjant, transandantal fonksiyonlardır ve bunların çözülmesi zordur ... Öte yandan, herhangi bir sonlu doğruluk derecesine kadar size doğru cevabı verecek basit bir Taylor serisi genişletmesi kullanılarak tanımlanabilirler. gereklidir.
Alex

Yanıtlar:


144

İlk olarak, bir çeşit menzil azaltma yapmanız gerekir. Tetikleme işlevleri periyodiktir, bu nedenle bağımsız değişkenleri standart bir aralığa indirmeniz gerekir. Başlangıç ​​olarak, açıları 0 ila 360 derece arasında azaltabilirsiniz. Ancak birkaç kimlik kullanarak, daha azıyla idare edebileceğinizi fark edersiniz. 0 ile 45 derece arasındaki açılar için sinüsleri ve kosinüsleri hesaplarsanız, tüm açılar için tüm trigonometrik fonksiyonları hesaplamak için önyükleme yapabilirsiniz.

Argümanınızı azalttıktan sonra, çoğu çip sinüsleri ve kosinüsleri hesaplamak için bir CORDIC algoritması kullanır. İnsanların bilgisayarların Taylor serisini kullandığını söylediğini duyabilirsiniz. Bu mantıklı geliyor ama doğru değil. CORDIC algoritmaları, verimli donanım uygulamasına çok daha uygundur . ( Yazılım kitaplıkları, trigonometri işlevlerini desteklemeyen donanımlar için Taylor serilerini kullanabilir.) Oldukça iyi yanıtlar almak için CORDIC algoritmasını kullanan, ancak daha sonra doğruluğu artırmak için başka bir şey yapan bazı ek işlemler olabilir.

Yukarıdakilerle ilgili bazı iyileştirmeler var. Örneğin, çok küçük açılar için teta (radyan cinsinden), sin (teta) = teta sahip olduğunuz tüm hassasiyete eşittir, bu nedenle basitçe teta'yı döndürmek başka bir algoritma kullanmaktan daha etkilidir. Bu yüzden pratikte, mümkün olan tüm performansı ve doğruluğu ortadan kaldıracak çok sayıda özel durum mantığı vardır. Daha küçük pazarlara sahip çipler, çok fazla optimizasyon çabasına gitmeyebilir.


4
Harika cevap - CORDIC'in kendi başına menzil azaltmaya gerçekten ihtiyacı olmasa da (aslında kendi başına bir menzil azaltma algoritmasıdır); -pi / 2 ve + pi / 2 arasındaki açılar için iyi çalışır, bu nedenle bu aralığın dışındaki açılar için 180 derecelik bir vektör dönüşü yapmanız yeterlidir.
Jason S

3
Bir polinom yaklaşımı kullanmak Uygulamalar olabilir sık Taylor serilerini kullanmak, ancak genellikle gerektiğini Remez algoritması ile tespit edilmiştir katsayılarını kullanın. lolengine.net/blog/2011/12/21/better-function-approximations
Pascal Cuoq

1
CORDIC tarafından kullanılan değerler tablosunun önceden hesaplanması gerektiğini unutmayın. Dolayısıyla, Taylor hala "derleme zamanında" kullanılabilir.
Rhubbarb

2
Görünüşe göre bu yanıt, bu benzer soruya verilen yüksek puanlı kabul edilen cevapla çelişiyor: stackoverflow.com/questions/2284860/… . Bu cevap, sin () işlevinin çoğunlukla donanım düzeyinde uygulandığını söylerken, diğeri C'de diyor.
Perry

48

Düzenleme: Jack Ganssle'ın gömülü sistemler hakkındaki kitabı "The Firmware Handbook" da makul bir tartışması var .

Bilginize: Eğer doğruluk ve performans kısıtlamaları varsa, Taylor serisi gerektiğini değil sayısal amaçlı yaklaşık fonksiyonlar için kullanılabilir. (Bunları Matematik dersleriniz için saklayın.) Bir fonksiyonun analitikliğini tek bir noktada kullanırlar , örneğin tüm türevlerinin o noktada var olması gerçeği. İlgi aralığında mutlaka bir araya gelmeleri gerekmez. Genellikle değerlendirme noktasının hemen yakınında "mükemmel" olmak için fonksiyon yaklaşımının doğruluğunu dağıtmak gibi kötü bir iş yaparlar; siz uzaklaştıkça hata genellikle yukarı doğru yakınlaştırır. Sürekli olmayan türevi olan bir fonksiyonunuz varsa (örneğin kare dalgalar, üçgen dalgalar ve bunların integralleri), bir Taylor serisi size yanlış cevabı verecektir.

X0 <x <x1 aralığında belirli bir f (x) fonksiyonuna yaklaşmak için maksimum N dereceli bir polinom kullanıldığında en iyi "kolay" çözüm, Chebyshev yaklaşımındandır ; iyi bir tartışma için bkz. Sayısal Tarifler. Cos ve ters kosinüs ile bağlantılı Wolfram makalesi I'deki Tj (x) ve Tk (x), bunların polinomlar olduğunu ve pratikte katsayıları elde etmek için bir tekrarlama formülü kullandığınızı unutmayın. Tekrar, Sayısal Tariflere bakınız.

düzenleme: Wikipedia'nın yaklaşım teorisi üzerine yarı iyi bir makalesi var . Alıntı yaptıkları kaynaklardan biri (Hart, "Bilgisayar Yaklaşımları") baskısı tükendi (ve kullanılmış kopyalar pahalı olma eğilimindedir) ancak bunun gibi şeyler hakkında birçok ayrıntıya giriyor. (Jack Ganssle, The Embedded Muse adlı bülteninin 39. sayısında bundan bahsetmektedir .)

düzenleme 2: İşte günah (x) için Taylor ve Chebyshev için bazı somut hata ölçütleri (aşağıya bakın). Dikkat edilmesi gereken bazı önemli noktalar:

  1. Taylor serisi yaklaşımının belirli bir aralıktaki maksimum hatasının, aynı derecedeki bir Chebyshev yaklaşımının maksimum hatasından çok daha büyük olduğu. (Yaklaşık aynı hata için, Chebyshev ile bir terimle daha az kurtulabilirsiniz, bu da daha hızlı performans anlamına gelir)
  2. Menzil azaltma büyük bir kazançtır. Bunun nedeni, yaklaşımın aralığı daha küçük olduğunda yüksek dereceden polinomların katkısının küçülmesidir.
  3. Menzil azaltmadan kurtulamıyorsanız, katsayılarınızın daha hassas bir şekilde saklanması gerekir.

Beni yanlış anlamayın: Taylor serisi sinüs / kosinüs için düzgün çalışacaktır (-pi / 2 ila + pi / 2 aralığı için makul hassasiyetle; teknik olarak, yeterli terimle, tüm gerçek girdiler için istediğiniz hassasiyete ulaşabilirsiniz, ancak Taylor serisini kullanarak cos (100) hesaplamaya çalışın ve rasgele duyarlıklı aritmetik kullanmadığınız sürece bunu yapamazsınız). Bilimsel olmayan bir hesap makinesiyle ıssız bir adada mahsur kalırsam ve sinüs ve kosinüsü hesaplamam gerekirse, katsayıları hatırlamak kolay olduğu için muhtemelen Taylor serisini kullanırdım. Ancak kendi sin () veya cos () işlevlerinizi yazmak zorunda kalmanın gerçek dünya uygulamaları yeterince nadirdir, istenen bir doğruluğa ulaşmak için verimli bir uygulama kullanmanın en iyisi - Taylor serisinde böyle değildir .

Aralık = -pi / 2 ila + pi / 2, derece 5 (3 terim)

  • Taylor: 4.5e-3, f (x) = xx etrafında maksimum hata 3 /6 + x 5 /120
  • Chebyshev: 7e-5, f (x) = 0.9996949x-0.1656700x 3 + 0.0075134x 5 civarında maksimum hata

Aralık = -pi / 2 ila + pi / 2, derece 7 (4 terim)

  • Taylor: 1.5E-4, f (x) = xx etrafında maksimum hata 3 /6 + x 5 /120-x 7 /5040
  • Chebyshev: 6e-7, f (x) = 0.99999660x-0.16664824x 3 + 0.00830629x 5 -0.00018363x 7 civarında maksimum hata

Aralık = -pi / 4 ila + pi / 4, derece 3 (2 terim)

  • Taylor: 2.5e-3, f (x) etrafında maksimum hata = xx 3 /6
  • Chebyshev: 1.5e-4, f (x) = 0.999x-0.1603x 3 civarında maksimum hata

Aralık = -pi / 4 ila + pi / 4, derece 5 (3 terim)

  • Taylor: 3.5E-5, f (x) = xx etrafında maksimum hata 3 /6 + x 5
  • Chebyshev: 6e-7, f (x) = 0.999995x-0.1666016x 3 + 0.0081215x 5 civarında maksimum hata

Aralık = -pi / 4 ila + pi / 4, derece 7 (4 terim)

  • Taylor: 3e-7, f (x) = xx etrafında maksimum hata 3 /6 + x 5 /120-x 7 /5040
  • Chebyshev: 1.2e-9, f (x) = 0.999999986x-0.166666367x 3 + 0.008331584x 5 -0.000194621x 7 civarında maksimum hata

2
Bu yorum yanlış. Her yaklaşım için bir zaman ve yer vardır. HERHANGİ seri yaklaşımı için yakınsama bölgesini belirlemek için yeterli analizi bilmiyorsanız, onu KULLANMAMALISINIZ. Bu Taylor, Chebyshev, Padé vb. Seriler için geçerli. Taylor serileri genellikle Yeterince İyi'dir.
kquinn

4
: omuz silkme: Seni bilmiyorum ama küçük bir mahalledeki bir işlevi sadece bir nokta civarında değerlendirmekle hiç ilgilenmedim. Bir aralığa hızlı en küçük kareler bile sığdırmak oldukça kolaydır. Taylor serisini kullanan herkes asıl noktayı kaçırıyor.
Jason S

1
@kquinn: Chebyshev yaklaşımları için yakınsama bölgesi, hesaplandıkları aralık, sürece açık bir girdi olduğundan kullanışlı bir kavram değildir.
Jason S

2
Yanıt veren, Hart'ın varlığını bildiği için oy kullanıyor. : gülümseme: Hart, 25 yıl önce bir kopyasını (basılı olarak) satın aldığımda bulmak zor olsa da, buradaki klasik referanstır. Her kuruşuna değer. Mümkün olan yerlerde menzil azaltma, uygun bir yaklaşımla birleştirildiğinde, ister Pade, Chebychev, hatta uygun Taylor serisi olsun, iyi bir yaklaşımdır. Pade veya Chebychev yaklaşımları, Taylor serisine göre genellikle daha iyi seçimdir.

3
??? Bu nasıl farklı? Günah (x) 'i -2pi'den + 2pi'ye hesaplamak için 17. dereceye kadar Taylor serileri muhtemelen Chebyshev tarafından 7. veya 9. derece polinom ile yenilebilir. "Ağaçları keserken zaman kısıtınız varsa, el testeresi kullanmamalısınız. Elektrikli testere kullanın." Belki de "olmamalı" dan "Taylor serisini kullanmanızı tavsiye etmem" gibi bir şeye dönüşmeliyim. Elbette, bazı durumlarda Taylor serisini kullanabilirsiniz, ancak doğruluğunuz ve performansınız sorunlu olacaktır. Performans derken CPU yürütme süresini kastediyorum.
Jason S

14

Taylor Serisi veya CORDIC kullanılarak hesaplandığına inanıyorum . Trigonometri fonksiyonlarından (oyunlar, grafikler) yoğun şekilde yararlanan bazı uygulamalar, başlatıldıklarında trigonometri tabloları oluştururlar, böylece tekrar tekrar hesaplamak yerine değerleri arayabilirler.


6

Trigonometri işlevleri hakkındaki Wikipedia makalesine göz atın . Bunları kodda uygulamak hakkında bilgi edinmek için iyi bir yer Sayısal Tarifler'dir .

Pek matematikçi değilim, ama günahın, çünkü ve bronzluğun "nereden geldiği" konusundaki anlayışım, bir anlamda, dik açılı üçgenlerle çalışırken gözlemlenmeleridir. Bir grup farklı dik açılı üçgenin kenar uzunluklarının ölçümlerini alır ve noktaları bir grafikte çizerseniz, bundan günah, cos ve bronz elde edebilirsiniz. Harper Shelby'nin işaret ettiği gibi, işlevler basitçe dik açılı üçgenlerin özellikleri olarak tanımlanır.

Daha sofistike bir anlayış, bu oranların çemberin geometrisiyle nasıl ilişkili olduğunu anlamakla elde edilir, bu da radyanlara ve tüm bu iyiliğe yol açar. Hepsi Wikipedia girişinde var.


1

En yaygın olarak bilgisayarlar için, güç serisi gösterimi sinüsleri ve kosinüsleri hesaplamak için kullanılır ve bunlar diğer trigonometrik fonksiyonlar için kullanılır. Bu serilerin yaklaşık 8 terime genişletilmesi, makinenin epsilon'una (tutulabilen en küçük sıfır olmayan kayan nokta sayısı) yakın bir doğruluk için gereken değerleri hesaplar.

CORDIC yöntemi, donanım üzerinde uygulandığından daha hızlıdır, ancak standart bilgisayarlar için değil, öncelikle gömülü sistemler için kullanılır.


0

@ Jason S tarafından sağlanan yanıtı genişletmek istiyorum. @ Jason S tarafından tarif edilene benzer bir etki alanı alt bölümü yöntemi kullanarak ve Maclaurin serisi yaklaşımları kullanarak, tan (), sin () üzerinden ortalama (2-3) X hız artışı , cos (), atan (), asin () ve acos () fonksiyonları -O3 optimizasyonu ile gcc derleyicisine yerleştirildi. Aşağıda açıklanan en iyi Maclaurin serisi yaklaşık fonksiyonlar, iki kat kesinlik elde etti.

Tan (), sin () ve cos () fonksiyonları için ve basitlik için, örtüşen bir 0 ila 2pi + pi / 80 alanı, pi / 80, 3pi / 80'de "çapa noktaları" ile 81 eşit aralığa bölündü, ..., 161pi / 80. Sonra bu 81 bağlantı noktasından tan (), sin () ve cos () değerlendirildi ve saklandı. Trig kimlikleri yardımıyla, her bir trigonometrik fonksiyon için tek bir Maclaurin serisi fonksiyonu geliştirilmiştir. ± sonsuz arasındaki herhangi bir açı, tetik yaklaştırma fonksiyonlarına sunulabilir çünkü fonksiyonlar, ilk olarak giriş açısını 0 ila 2pi alanına çevirir. Bu çeviri ek yükü, tahmin ek yüküne dahil edilmiştir.

Atan (), asin () ve acos () fonksiyonları için benzer yöntemler geliştirildi; burada -1.0 ile 1.1 arasında örtüşen bir alan -19/20, -17/20, .. ., 19/20, 21/20. Daha sonra bu 21 bağlantı noktasından yalnızca bir tanesi () kaydedildi. Yine ters trigonometrik özdeşliklerin yardımıyla atan () işlevi için tek bir Maclaurin serisi işlevi geliştirilmiştir. Atan () fonksiyonunun sonuçları daha sonra asin () ve acos () 'ya yaklaşmak için kullanıldı.

Tüm ters tetikleme yaklaştırma işlevleri atan () yaklaştırma işlevine dayandığından, herhangi bir çift duyarlıklı bağımsız değişken girdi değerine izin verilir. Bununla birlikte, asin () ve acos () yaklaştırma işlevlerine argüman girdisi ± 1 alanına kesilir çünkü bunun dışındaki herhangi bir değer anlamsızdır.

Yaklaşık fonksiyonları test etmek için, bir milyar rastgele fonksiyon değerlendirmesinin değerlendirilmesi zorlandı (yani, -O3 optimizasyon derleyicisinin bir şeyi değerlendirmeyi atlamasına izin verilmedi çünkü bazı hesaplanmış sonuçlar kullanılmayacaktı.) rastgele sayılar ve sonuçların işlenmesi, herhangi bir trigonometrik veya ters trigonometrik fonksiyonu değerlendirmeden bir çalışmanın maliyeti ilk olarak gerçekleştirildi. Bu sapma daha sonra gerçek fonksiyon değerlendirme süresinin daha temsili bir yaklaşımı elde etmek için her testten çıkarıldı.

Tablo 2. Belirtilen işlevi veya işlevleri bir milyar kez yürütmek için saniye cinsinden harcanan süre. Tahminler, Tablo 1'in ilk satırında gösterilen bir milyar rasgele sayının değerlendirilmesinin zaman maliyeti Tablo 1'de kalan satırlardan çıkarılarak elde edilmiştir.

Bronzlaşmada geçirilen süre (): 18.0515 18.2545

TAN3 () içinde harcanan süre: 5.93853 6.02349

TAN4 () içinde harcanan süre: 6.72216 6.99134

Sin () ve cos () 'de harcanan süre: 19.4052 19.4311

SINCOS3'te () harcanan süre: 7.85564 7.92844

SINCOS4'te () harcanan süre: 9.36672 9.57946

Ata'da geçirilen süre (): 15.7160 15.6599

ATAN1'de () harcanan süre: 6.47800 6.55230

ATAN2'de () harcanan süre: 7.26730 7.24885

ATAN3 () içinde harcanan süre: 8.15299 8.21284

Asin () ve acos () 'da geçirilen süre: 36.8833 36.9496

ASINCOS1 () 'de geçirilen süre: 10.1655 9.78479

ASINCOS2'de () harcanan süre: 10.6236 10.6000

ASINCOS3 () 'de geçirilen süre: 12.8430 12.0707

(Yer tasarrufu sağlamak amacıyla, Tablo 1 gösterilmemiştir.) Tablo 2, her yaklaşık fonksiyonun bir milyar değerlendirmesinin iki ayrı çalışmasının sonuçlarını göstermektedir. İlk sütun, ilk sütun ve ikinci sütun ikinci işlemdir. İşlev adlarındaki '1', '2', '3' veya '4' sayıları, belirli trigonometri veya ters trigonometrik yaklaşımı değerlendirmek için Maclaurin serisi işlevinde kullanılan terimlerin sayısını gösterir. SINCOS # (), hem sin hem de cos'un aynı anda değerlendirildiği anlamına gelir. Aynı şekilde, ASINCOS # (), hem asin hem de acos'un aynı anda değerlendirildiği anlamına gelir. Her iki miktarın aynı anda değerlendirilmesinde çok az ek yük vardır.

Sonuçlar, terimlerin sayısının artırılmasının beklendiği gibi yürütme süresini biraz artırdığını göstermektedir. En küçük terim sayısı bile, değerinin ± sonsuza yaklaştığı yere yakın tan () yaklaşımı dışında her yerde yaklaşık 12-14 basamaklı doğruluk verdi. Tan () işlevinin bile orada sorun yaşaması beklenir.

Benzer sonuçlar, Unix'te üst düzey bir MacBook Pro dizüstü bilgisayarda ve Linux'ta üst düzey bir masaüstü bilgisayarda elde edildi.


-5

Günah, cos ve tan hakkında daha fiziksel bir açıklama istiyorsanız, bunların dik açılı üçgenlerle nasıl bir ilişki içinde olduklarını düşünün. Cos (lambda) 'nın gerçek sayısal değeri, açılardan biri lambda olan bir dik açılı üçgen oluşturarak ve lambda'ya bitişik üçgen kenarının uzunluğunu hipotenüsün uzunluğuna bölerek bulunabilir. Benzer şekilde günah için hipotenüse bölünen karşı tarafı kullanın. Tanjant için, bitişik tarafa bölünmüş karşı tarafı kullanın. Bunu hatırlamak için klasik memonik SOHCAHTOA'dır (socatoa olarak telaffuz edilir).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.