y=sin(x) örnek çözüm

Başlatan ilhan_mkp, 03 Temmuz 2012, 23:31:31

ilhan_mkp

y=sin(x)  bu sinüs fonksiyonunu anlamak için örnek bir çözüme ihtiyacım var.
x=30 alıp işlem sırası ile çözümünü anlatan bir örnek

Engineer Jr.

Yani sin(30)=1/2 nereden geliyor bunu mu soruyorsunuz ? Eğer buysa Taylor açılımı na bakın. http://dotancohen.com/eng/taylor-sine.php

z

Sin(x) fonksiyonu, x'in 0 2Pi aralığınaki değişime karşılık  -1...+1 aralığında sonuçlar verir.

Başka bir şey bilmene gerek yok.

X Radyan cinsinden belki derleyicin derece cinsinden değer kullanıyor olabilir. Bunu bir deneme ile anlarsın.

x ve float

x=3.14/2
y=sin(x)

y yaklaşık 1 olur.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

ilhan_mkp

yanıtlar için teşekkür ederim.
hocam ben bu olayı hazır bir fonksiyonda kullanmak için sormadım.
assembly ile kendi sinüs alt programımı yazabilrmiyim diye sormuştum.
cevaplararın devamında birkaç sorum daha vardı 0.5 değğerini binary olarak nasıl yazarız.
assemly ile  noktalı sayılar ile işlem yapmam gerekecek sayıları sıfırdanmı kuratarmalıyım acaba ?


vitruvius

0.5 binary olarak  (0,1)2 diye yazılır.

Tagli

Assembly ile yapacaksan ve fazla uğraşmak istemiyorsan tablo kullan. Floating point'in assembly kodunu yazmak zor olabilir. Buraya bir bak: http://en.wikipedia.org/wiki/IEEE_754-1985

Bu arada, geçenlerde bir arkadaştan duymuştum, bilgisayarlarda trigonometrik fonksiyonlar Taylor serisi ile hesaplanmıyormuş. Daha etkili bir algoritma kullanılıyormuş ama adını hatırlamıyorum.
Gökçe Tağlıoğlu

ilhan_mkp

hocam bende bişiler okudum hatta z hocamında bu konuda kendi sitesinde bir yazıda devamı gelecek şeklinde bekleyen bir konusu vardı.
tablo konusuna gelince ben bunu bir iş için kullanmayacam   daha önce basic ile yaptığım hobi meselererini asm ile tekrarlayaraktan asm öğrenmeye çalışıyorum ama işlemci olarak pic değil avr kullanıyorum.

ilhan_mkp

Alıntı yapılan: Tagli - 04 Temmuz 2012, 16:43:43
Assembly ile yapacaksan ve fazla uğraşmak istemiyorsan tablo kullan. Floating point'in assembly kodunu yazmak zor olabilir. Buraya bir bak: http://en.wikipedia.org/wiki/IEEE_754-1985

Bu arada, geçenlerde bir arkadaştan duymuştum, bilgisayarlarda trigonometrik fonksiyonlar Taylor serisi ile hesaplanmıyormuş. Daha etkili bir algoritma kullanılıyormuş ama adını hatırlamıyorum.

hocam şu etkli yöntemi öğrenme şansınız varmı acaba
assemby ile sin(x) olayı baya zormuş örnek bile yok denilebilir birtane x86 örneği buldum onuda anlayamadım
olayı asm koduna dökünce (0,1)2 yazmak benim için hiçte kolay değil hadi floating pointe ilgili beleşçilik yapalım hazır macro var
dört işlemle sin(x) nasıl yapılır

kantirici

4 işlemle taylor seri açılımından  ilk 4-5 terim alınarak yaklaşık bir sonuç elde edilebilir düşüncesindeyim.

ilhan_mkp

hocam yaklaşık sonuç yeterli oacak.
önce açımızı radyana çevirmek gerekiyor burada sonuç ondalıklı çıkıyor dereceyi 10 ile büyütüp işlem yapsam mantıklı olurmu acaba

z

#10
sin(x) = x - K1 (x^3) + K2(x^5) - K3(x^7)

Burada x ve K lar kesirli sayılar. Float sayılarla çarpma ve toplama işlemlerini yapabilen rutinlerinizi yazmanız gerekiyor. Float sayılarla işlem yapmak istemiyorsan fixpoint hesap yapabilirsin.

K1=1/6
K2=1/120
K3=1/5040

sayılarını bir tabloda tut. Daha sonra en tepedeki bağıntıya göre çarp topla.

http://www.intmath.com/series-expansion/3-how-calculator-works.php

Aşağıdaki linkte alınacak terim sayısının etkisi görülmekte.

http://www.tvalx.com/MathArticles/ExploringTaylorPolynomials/ExploringTaylorPolynomials.htm

1/5040 sayısı varken x sayısını 10 ile çarpmakla kesirli işlem yapmaktan sıyrılamazsın.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

#11
Oncelikle kullanacağın sayı sistemine karar vermelisin.

Bunun için iki seçeneğin var. Birincisi 10'lu sistem. Diğeriyse 2'li sistem.

Her ikisinin de kendine özgü avantaj ve dezavantajları var.

İkili sistemde çalışacaksan

10 sistemindeki x sayısını ikili sisteme çevirmen gerekiyor. Daha sonra çarpma ve toplama rutinlerini 2'li sistemde yapacaksın. Sin değerini hesapladıktan sonra sonucu tekrardan 10'lu sisteme çevireceksin.

Eğer 10 lu sistemde çalışacaksan x girdi değerini toplama ve çarpma işlemlerinde kullanırken sürekli olarak decimal kontrol ve düzeltmeler yapmak zorundasın. En sonunda elde edeceğin sonuç doğrudan 10'lu sistem olacak.

Burada en önemli konu;

sin fonksiyonunu noktadan sonra kaç basamak doğrulukla hesaplamak istediğindir.

Zira bu konu aynı zamanda K1, K2, K3 .... katsayılarının miktarını ve daha da önemlisi K1, K2, K3 .. lerin noktadan sonra kaç basamağının olacağını dolayısı ile toplama ve çarpma rutinlerinde noktadan sonraki basamak sayısını (rutinlerin işlem kapasitesini) bilmeni gerektirir.

-----------------------

Bir önceki mesajımda trigonometrik fonksiyonları hesaplamak için seri açılımdan yararlanmanın yolunu gösterdim. Fakat hesap makinelerinin büyük çoğunluğu seri açılımını kullanmıyor(muş).

CORDIC diye bir algoritma var. Bu algoritma ile çok daha hızlı hesaplama yapılabiliyor. Bu güne kadar bu algoritmayı hiç kullanmadım. Eğer bu konulara meraklıysan bu algoritmayı temelinden anlamalısın.

Ben o sabrı gösteremedim. CORDIC'i anlayan var ve bizlere de anlatırsa memnun olurum.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

bocek

#12
buyrun size 4 işlemle sinüs hesaplama algoritması:
Function Sine(x)
real Term = x; integer 2n = 0; real Error = 0.00001;
real Sine = x; real sqx = x*x;
While Term > Error
2n = 2n + 2;
Term = Term*(-1)*sqx/(2n*2n + 2n);
Sine = Sine + Term;
End

kaynak :
http://www.johnsjacob.com/uploads/Embedded_Function2011.pdf

deneme yapmak için excel vba'ya çevirdim.

' Excel'de sinüs hesaplama programı
' Kaynak : http://www.johnsjacob.com/uploads/Embedded_Function2011.pdf
Function sinus(x)
Dim Term, Error, Sine, sqx As Double
Dim nn As Integer
Term = x
Error = 0.00001
Sine = x
sqx = x * x
nn = 0

While Term > Error
nn = nn + 2
Term = Term * (-1) * sqx / (nn * nn + nn)
Sine = Sine + Term
Wend
sinus = Sine
End Function


örnek
sin(0.23)     => 0.227978 excel'in kendi sinüs fonksiyonu ile hesaplanan,
sinus(0.23) => 0.227972 yukarıdaki fonksiyon ile hesaplanan.
1 ya da 0. işte 'bit'ün mesele..

ilhan_mkp

cevaplar için hepsinize teşekkür ediyorum.
anlatılanları anlamam haftalarımı alabilir tam aklımda olan soruların yanıtları geldi.

gerbay hocam tablo iş için kullanırken çok mantıklı ama ben yazılım üzerine bir iş yapmadığım için amacım bişiler öğrenmek tablo bile kolay olmuyor açıkçası.

z hocam cordic denilen yöntemi adamın biri library olarak yazmış nete koymuş bende ayrıntılarını araştırayım belki sizlere katkım olur.


DumrulBey

#14
Alıntı yapılan: bocek - 15 Ağustos 2012, 16:15:51
buyrun size 4 işlemle sinüs hesaplama algoritması:
http://www.johnsjacob.com/uploads/Embedded_Function2011.pdf

örnek
sin(0.23)     => 0.227978 excel'in kendi sinüs fonksiyonu ile hesaplanan,
sinus(0.23) => 0.227972 yukarıdaki fonksiyon ile hesaplanan.

Evet, bu örnek (sin 0.23) için hata oranı 100 binde 2 gibi görünüyor; eğer yanlış kodlamadıysam:

Alıntı Yapmain.sin(0.230) = 22.797 (100x)
std.sin(0.230)  = 22.798 (100x)
Fark = 0.001 / Oran = % 0.002

Ancak sinüs'ü alınan sayı 1'i geçtiğinde, mevcut hata oranı çok kötü. Örneğin sin pi/2 herkesin bildiği gibi 1'dir. Bu işlev ise daha düşük bir değer hesaplıyor:

Alıntı Yapmain.sin(1.571) = 92.484 (100x)
std.sin(1.571)  = 100.000 (100x)
Fark = 7.516 / Oran = % 4.785

Eğer ilk örnekteki sayının 10 katıyla denerseniz  bir anda devasa (%20) hata oranları ile karşılaşıyoruz:

Alıntı Yapmain.sin(2.300) = 27.217 (100x)
std.sin(2.300)  = 74.571 (100x)
Fark = 47.354 / Oran = % 20.589
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)