MatematikTutkusu.com Forumları

Karekök alma algoritması

 İlk  1 2 3
svsmumcu26 - ait kullanıcı resmi (Avatar) svsmumcu26 20:10 26 Tem 2014 #21
Mühendislik bana göre değilmiş.Hiçbirisi ilgimi çekmiyorrr )

cengizhanhck 20:20 26 Tem 2014 #22
#include <iostream>
#include <cmath>
using namespace std;

int main()
{
float girdi=0;
float hassaslik=0.01;
float yaklasim=1;
float cikti=0;
cout<<"bir sayi yaziniz:";
cin>>girdi;
float kok=1;
while(kok<girdi/2)
{ kok=kok+hassaslik;
if(fabs(kok*kok-girdi)<fabs(yaklasim))
{ cikti=kok;
yaklasim=kok*kok-girdi;
}

}

cout <<"yaklasik olarak=" <<cikti;
cin>>girdi;


}
asagi yukarı anlatmak bu istediğim .ama belirteyim bu en kaba bulma yöntemi çok büyük sayilarda patlar program .
ilgimi bunlar çekiyodu benim ama şartlar zaten eninde sonunda insani tipa itiyo Savaş.Seneye tercih yaparken hangisine gitsem daha az kötülük çıkar diye düşüneceksin .

svsmumcu26 - ait kullanıcı resmi (Avatar) svsmumcu26 20:21 26 Tem 2014 #23
Tercih edeceğim alanlar belli zaten. Hepsi ilgimi çekiyor benim.Ama bu tür konulara hiç ilgim yok... Nedense.

gereksizyorumcu - ait kullanıcı resmi (Avatar) gereksizyorumcu 23:43 26 Tem 2014 #24
.C yapisal programlamayi kullanir,c++ nesneye yönelik programlama.C kolay ögrenilir veya programlama kolay ögreniliri kim demişşe yalan söylemiş.Assembly ve normal makine dilini saymazsak C insandan en uzak dildir .O yüzden ögrenmesi pekte kolay olmasa gerek .

Üniversilerde derslere bakarsaniz ilk önce C işlenir sonra C++ diğer programlama dilleri genellikle seçmeli olur veya hiç olmaz.
Tüm programlama dillerin bilmenin bir anlami yok amacinin ne oldugu önemli.Assemblye işletim sistemleri bazi kisimlari,C işletim sistemleri ve driver,C++ performans gereken programlar ve oyunlar ,Java küçük çapli programlar ve telefonlar için vb.
Hazir kütüphane fonksiyonlari özenle yazilmiştir o yüzden onlarin yaptiği sqrt fonksiyonun elle yapilandan hizli olmasi normal .
Kabaca aklima gelen sqrt fonsiyon söyle benim.
Şimdi diyelim Float girdi diye bir değişken var ve 4 den büyük olan bir sayi girilmiş olsun.
Birde float kök=1 diye bir değişken olsun.
Ayrica float hassaslik olsun.Mesela hassaslik 0,01 olabilir,001 olabilir ne kadar küçültürsen o kadar yaklaşiriz
ve son olarakta float yaklasim olsun.
While döngüsü ile kök sayisi Girdi/2 den küçükken çalissin ve kök=kök+hassaslik iken kök sayisin karesini al ve yaklasim=girdi-kök*kök
Birde if ifadesi ekle ve döngü işlerken yaklasimin mutlak degeri ne kadar küçük oluyosa o senin seçmen gereken sayidir.Çok berbat bir algoritma ama işine yarayabilir aklima daha iyiis gelmedi suan.
kızma ama dediğin gibi gerçekten berbat bir algoritma
arkadaşlar işi işlem yapmak diye bilgisayara eziyet etmeyin. algoritmalarınız hızlı olmalı
nedir o öyle belli bir adım büyüklüğü belirleyip köke ulaşana kadar uygun adım marş.


C# de şöyle bir şey yapılabilirmiş bir dene bakalım bunu.

HTML-Kodu:
 Console.WriteLine("Bir sayı girin");
            double sayi = Convert.ToDouble(Console.ReadLine());
            long i, n = (long)sayi, t;
            double r = sayi;
            for (i = 0; i < n; i++)
            {
                r = (r + (sayi / r)) * 0.5;
                t = (long)r;
                if ((t * t) < t)
                    break;
            }
            Math.Sqrt();
            Console.WriteLine("Sayının Karekökü =" + r.ToString());
            Console.ReadLine(); 
            }
burada matematik devreye giriyor. sizleri bu bölümlere alırken matematik bilmenizi/öğrenmenizi bunun için istiyorlar. yukarıdaki algoritmada yapılansa her adımda eldeki mevcut bir kök değerine (kökü alınacak sayı)/(eldeki kök değeri) kadar bir sayı eklenip 2'ye bölünmesi ve yeni bir eldeki kök değeri elde edilmesi. kısaca kodu yazan Newton metoduyla köke yaklaşmayı düşünmüş, muhtemelen 5-6 adımla istediğiniz hassasiyette bir kök bulacaktır. daha iyi algoritmalar vardır muhakkak ama bu işinizi görüyor olmalı. ayrıca da sqrt() gibi fonksiyonların bunlardan çok daha iyi algoritmalarla çalıştığından emin olabilirsiniz .

Tükenir Kalem - ait kullanıcı resmi (Avatar) Tükenir Kalem 02:53 27 Tem 2014 #25
burada matematik devreye giriyor. sizleri bu bölümlere alırken matematik bilmenizi/öğrenmenizi bunun için istiyorlar. yukarıdaki algoritmada yapılansa her adımda eldeki mevcut bir kök değerine (kökü alınacak sayı)/(eldeki kök değeri) kadar bir sayı eklenip 2'ye bölünmesi ve yeni bir eldeki kök değeri elde edilmesi. kısaca kodu yazan Newton metoduyla köke yaklaşmayı düşünmüş, muhtemelen 5-6 adımla istediğiniz hassasiyette bir kök bulacaktır. daha iyi algoritmalar vardır muhakkak ama bu işinizi görüyor olmalı. ayrıca da sqrt() gibi fonksiyonların bunlardan çok daha iyi algoritmalarla çalıştığından emin olabilirsiniz .
Öğretmenim Newton metodunu araştırdım sayenizde..Çok çok teşekkür ederim..Şimdi kodları gerçekten anladım,aslında Cengiz arkadaşımız sayesinde adamın bu kodlarla sürekli daha yakın bir değeri buldurmaya çalıştığını anlamıştım..Ama bu yolu nereden akıl ettiğini anlamamıştım,Newton metodundaki teğet açıklamasıyla bunu da anladım sayenizde.Bu arada aynı programı C++ ile yaptım,arada framework perdesi olmadığından gözle görülür bir şekilde sqrt() fonksiyonu ile aynı hızda buldu..(Yâni saniye olarak fark yok,ama salise ölçümünde fark olabilir)

Bu algoritma hızlı..Newton metodundan daha hızlı bir yol olabilir mi öğretmenim ?
İlginiz için teşekkür ederim..

gereksizyorumcu - ait kullanıcı resmi (Avatar) gereksizyorumcu 04:29 27 Tem 2014 #26
belki denediğiniz sayılarda sqrt() ile yakın sonuçlar vermiş olabilir ama Newton dan çok daha hızlı hesaplama yöntemleri eminim ki mevcuttur. şu an için kök bulmada daha efektif hangi metod var bilmiyorum, Newton-Raphson çok genel bir yöntem yani tüm fonksiyonlarda kullanılabildiği için direkt karekök bulma gibi çok dar bir kullanımda geri kalacağı kesin. C# veya C++ hangi algoritmaları kullanıyor onları da bilmiyorum açıkcası kodlardan anlamıyorum ama demek istediğim kök bulmak çok temel bir işlem bu yüzden kullandığınız dilin hazır fonksiyonu bırakın algoritma olarak değişken seçimlerinde bile optimize edilmiştir.

burada esas mesele böyle temel işlemlerin yapılmasını sağlayan güzel algoritmaların olduğunu bilmekle beraber mümkünse hazır olanı kullanmaktır. bizim gelişim yapmaya çalışacağımız hazır olmayanı yazarken olmalı. hazır olanı geliştirmek programlama dilini yazanların problemi

Tükenir Kalem - ait kullanıcı resmi (Avatar) Tükenir Kalem 04:37 27 Tem 2014 #27
Haklısınız tabii,onların hazır fonksiyonu ile yarışmam mümkün değil..Hem uzman matematikçiler ve mühendisler çalışıyor,hem de bilgileri çok çok daha ileri seviyede..Benim amacım da dediğiniz gibi,hazır olmayanı yazmayı öğrenmek..Bunun için önüme gelen bütün problemleri çözmeye çalışıyorum ki,var olan bilgilerimle neler yapabilirim diye ufkum açılsın..Tekrar teşekkür ederim ilginiz için

Serkan A. - ait kullanıcı resmi (Avatar) Serkan A. 04:55 27 Tem 2014 #28
En meşhur algoritmalar Methods of computing square roots - Wikipedia, the free encyclopedia burda. Anlayabilirsen

Tükenir Kalem - ait kullanıcı resmi (Avatar) Tükenir Kalem 05:12 27 Tem 2014 #29
Türkçe'sini bile birkaç dk inceleyince anlıyorum..Sık kullanılanlara ekledim öğretmenim,İngilizce şart..Sözlük ile anlamaya çalışırım bol bir vakit bulduğumda..

Teşekkür ederim..

 İlk  1 2 3
Üst Forum
Anasayfa
Yukarı Standart Görünüm