Picproje Elektronik Sitesi

SERBEST BÖLGE => Programlama ve Algoritma => Konuyu başlatan: ilhan_mkp - 03 Temmuz 2012, 23:31:31

Başlık: y=sin(x) örnek çözüm
Gönderen: ilhan_mkp - 03 Temmuz 2012, 23:31:31
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
Başlık: Ynt: y=sin(x) örnek çözüm
Gönderen: Engineer Jr. - 04 Temmuz 2012, 00:33:20
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 (http://dotancohen.com/eng/taylor-sine.php)
Başlık: Ynt: y=sin(x) örnek çözüm
Gönderen: z - 04 Temmuz 2012, 06:06:28
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.

Başlık: Ynt: y=sin(x) örnek çözüm
Gönderen: ilhan_mkp - 04 Temmuz 2012, 15:34:53
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 ?

Başlık: Ynt: y=sin(x) örnek çözüm
Gönderen: vitruvius - 04 Temmuz 2012, 15:49:13
0.5 binary olarak  (0,1)2 diye yazılır.
Başlık: Ynt: y=sin(x) örnek çözüm
Gönderen: 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 (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.
Başlık: Ynt: y=sin(x) örnek çözüm
Gönderen: ilhan_mkp - 04 Temmuz 2012, 17:51:33
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.
Başlık: Ynt: y=sin(x) örnek çözüm
Gönderen: ilhan_mkp - 14 Ağustos 2012, 22:31:36
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 (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
Başlık: Ynt: y=sin(x) örnek çözüm
Gönderen: kantirici - 14 Ağustos 2012, 22:42:35
4 işlemle taylor seri açılımından  ilk 4-5 terim alınarak yaklaşık bir sonuç elde edilebilir düşüncesindeyim.
Başlık: Ynt: y=sin(x) örnek çözüm
Gönderen: ilhan_mkp - 14 Ağustos 2012, 23:00:55
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
Başlık: Ynt: y=sin(x) örnek çözüm
Gönderen: z - 15 Ağustos 2012, 00:43:05
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 (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 (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.
Başlık: Ynt: y=sin(x) örnek çözüm
Gönderen: z - 15 Ağustos 2012, 09:44:02
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.

Başlık: Ynt: y=sin(x) örnek çözüm
Gönderen: bocek - 15 Ağustos 2012, 16:15:51
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 (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.
Başlık: Ynt: y=sin(x) örnek çözüm
Gönderen: ilhan_mkp - 24 Ağustos 2012, 19:37:43
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.

Başlık: Ynt: y=sin(x) örnek çözüm
Gönderen: DumrulBey - 28 Ağustos 2012, 15:36:35
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 (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
Başlık: Ynt: y=sin(x) örnek çözüm
Gönderen: ilhan_mkp - 30 Ağustos 2012, 02:25:37
hocam tablo kullanmazsak ben avr uğraşıyorum  çarpma veya bölme için en iyimser senaryo ile 60 clock kadar zaman harcıyorum.
tablo yöntemi mantıklı peki hocam bu assembler olayını geliştirmek adına  tavsiyeliriniz varmı.
bulduğum assembler örnekleri pek öğretici değil meşhur japon chanin dört işlem çin yazdıı kodları çatpat anlıyorum ama iş bir lcd sürmeye gelince işler biraz karışıyor.
Başlık: Ynt: y=sin(x) örnek çözüm
Gönderen: ilhan_mkp - 31 Ağustos 2012, 00:01:50
avr assembleri yalayıp yutmak istemiyorum hocam. bu assembler hevesini c öncesi temel eksikleri gidermek adına yapilan bir eğitim gibi düşünün yanlişmi düşünüyorum bilmiyorum ama assembler ile bir kaç hobisine iş yapayım diyorum.
avr assembler kod yazabilmek için en bol örnekli işlemci gibime geliyor.
nasip olurda temel mantıkları öğrenirsem  maliyet müşteri istekleri terazisinin topuzu bukadar geniş bir alanda gezerken tabiki c ile keyif içinde işlemci seçmek isterim.
unutmadan hocam daha öncede söyledim ben yazılım üzeri çalışmıyorum iş yerimde yazılm işleri var ama ben hala yetersizim şimdilik plc akıllı röle işlerine devam c ile güvenim geldiğinde yapılacak iş çakılı.
direk c ile bu işlere dalsak sorun yaşanmayacağını düşünüyorsanız ben kendi cabarımla c öğrenmeye çalışayım ödevmişçesine bir konusu üzerine kafa yorarım bi devre tasarımı yapar donanım yazılım olarak yanlışları doğruları alternatif çözümleri konuşuruz sonuçta c bilen çok
Başlık: Ynt: y=sin(x) örnek çözüm
Gönderen: ilhan_mkp - 01 Eylül 2012, 02:21:58
hocam vallahi tam üzerine bastınız acıkçası dile takılıp kalmaktansa bol uygulama yapıp algolaritmalar üzerine konuşmak lazım ama açtığımız çoğu konu hangi dil vs mesela modbus gibi standart bir haberleşme protokolü mesale pid kontrol için autotune yöntemleri vb konuları çok az tartışıyoruz.
dilden çok ben ı2c haberleşmeyi bile bilmiyorum adc okuma konusundada bir sürü soru işareti var datasheetleri birazdaha didiklemek lazım
bi yerden başlamak lazım bence mesela adc adc okuken kesme ile okuyabiliyoruz bu kesme ne zaman oluşuyor iki ksme arası süre hep aynımı olur herhangi bir işlemci için cevaplasanız olur önce işlemcinin donanımları neler yapabiliyor bunları irdelemek istiyorum
tabi zaman sorunum var eve bu saatte gelip 7de yine işe gidiyorum onun için bi süredir sadece soru sorup cevap okuyabiliyorum.
Başlık: Ynt: y=sin(x) örnek çözüm
Gönderen: DumrulBey - 01 Eylül 2012, 07:46:29
Alıntı yapılan: gerbay - 31 Ağustos 2012, 00:25:02
Hocam ben bu konuda şöyle düşünüyorum;

Hepimiz Tükçe biliyoruz ama kaçımız şiir, güzel makale ya da edebi eser meydana getirebiliyoruz?

Önemli olan C bilmek de değil, önemli olan programlama tekniğini, veri yapılarını, algoritmaları iyi bilmek..
Hocam, gayet güzel bir noktaya temas etmişsin ki kaçırdığımız nokta belki de hep bu. İşte bu tür tartışmalar (assembly mi, yüksek seviyeli mi?) kimi zaman yapılır. Hatta hatırlıyorum, forumda bu konuda uzun süren başlıklar var. Ama sanırım PC'lerde olmayan bir kavramdan sorumluyuz. Bu da tekniker ile mühendis arasındaki kalın çizgiyi ifade ediyor. Mühendis hesabını yapıp imzasını atıyor. Ancak tekniker gerektiğinde kalemi eline alıp hesap da yapacak, havya ile lehim de. Yani yaptığımız işler kağıt üzerinde sanal şeyler değil. İşin kuramı başlangıçta bizi bir yere götürüyor, pratikte ise neler ile karşılaşacağımızı tecrübe ile bilmekteyiz.

Dip Not: Hoş C derleyicisi (compiler) tüm C olanaklarının %100'nü destekliyor mu ki sizi yarı yolda bırakmasın. Haa keza, kodunuz assembly diline (assembler değil, o derleyicisi demek) çevrildiğinde, aralarda bir sürü çöp kod yer alıyor. Günümüzde ise tıpkı PC'lerde olduğu gibi kapasite/hız artıyor. Dolayısıyla assembly ile kaynakları iyi kullanan kod yazmak gereksizleşiyor. Ancak hassas uygulamalarda assembly bilmeli ve ona güvenmeli...:)

Sevgiler, saygılar...
Başlık: Ynt: y=sin(x) örnek çözüm
Gönderen: Tagli - 02 Eylül 2012, 21:33:08
Derleyicilerde bu tür fonksiyonların ne şekilde makine koduna dönüşeceği ile ilgili seçenekler olsaydı hoş olurdu. Hız isteyen tablo kullanır, az yer kaplamasını isteyen polinom kullanırdı. Assembly ile uğraşmaya da gerek kalmazdı.
Başlık: Ynt: y=sin(x) örnek çözüm
Gönderen: fractal - 03 Eylül 2012, 11:57:00
ben 100hz ile 800hz arasında değişen sinüslerim için tablo kullanmadım.şimdi aslında tek bir tablo kullanılabilir örnekleme için.sadece frekans artıkça cözünürlük değişir.

ben tüm değerlerimi o frekans için hesaplayıp bir diziye atıyorum.sonuç olarak tablodan okumakla arasında bir fark yok.sadece hesaplama işi var.

sinüs tablosu oluşturuldu.pwm çözünürlüğüde  önemli kaç bit kullanılıyor.8 bit ise virgülden sonraki 2,3 basamak ne fark ederki...