Konuyu Oyla:
  • Derecelendirme: 5/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Taylor Serisi ve Kendi Trigonometrik Fonksiyonlarımızın Yazımı
#1
Taylor serisi fonksiyonları polinomsal açıdan ifade etmek için bize olanak sağlar ve biz bu sayede bir takım fonksiyonların değerlerini hesaplayabiliriz. Temel olarak mantığı şöyledir:
   
Yukardaki şekle dikkat edecek olursak,g(x) bir polinom fonksiyonu olmak üzere  g(x) fonksiyonu ve f(x) fonksiyonu x=0 noktasında eşittir,yani bu fonksiyon bir noktada aynı değeri vermektedir.g(0)=f(0)’dır.Sabit bir fonksiyon olduğu için g(x) fonksiyonun f(x) fonksiyonunu temsil ettiğini söyleyemeyiz.Peki bir de 1.türevlerini eşitlesek fonksiyonlar biraz daha yaklaşır.Ama unutmamamız gereken nokta, ilk noktayı da bize sağlamalı ilk nokta neydi, g(0)=f(0) ‘dı.İkinci aşama şu olmalı:
g(x)=f(0)+ f’(0).x;.  eğer eşitliğin her iki tarafının da türevini alırsak f(0) sabit olduğu için türevi 0’dır, çarpımın türevini alırsak f’(0) da sabit olduğu için  türevi 0’dır, ve sonuç olarak g’(0)=f’(0) olduğunu görebiliriz.Şimdi iki fonksiyonu bir noktada daha eşitledik.Bir türev daha alır eşitlersek fonksiyonları daha da yaklaştırmış oluruz.3. Aşamada şöyle yaparsak: g(x)=f(0)+f’(0).x+(1/2)f’’(0).x^2 Türevlerini alırsak g’’(0)=f’’(0) olduğunu görebiliriz.Sonuç olarak şöyle bir formüle ulaşırız.
   
                  
Biz burada a’yı 0 olarak aldık, yani sıfıra ortalayan bir fonksiyon yazdık bu şekildeki seriye mclaurin sersisi denir.Diğer noktalara göre daha kolay hesaplama yapılmasını sağlar.
Cos(x) fonksiyonun Taylor özelde de maclaurin serisiyle ifade edersek:
g(x)=cos(0)+cos’(0).x+cos’’(0).x^2/2+cos’’’(0).x^3/6+cos’’’’(0).x^4/24+…+cos(n. Turev)(0).x^n/n!
g(x)=cos(0) (+) -sin(0).x (+) -cos(0).x^2/2 (+) sin(0).x^3/3!+cos(0).x^4/4!
g(x)=1 (+) 0.x (+) -1.x^2/2! (+) 0.x^3/3! (+) 1.x^4/4!
Nihayetinde sonuç şu şekilde olur:
 
   

Bu kadar matematikten sonra gelelim programlamaya :
Delphi kodları:

unit Unit2;

interface

uses
 Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
 System.Classes, Vcl.Graphics, System.Math,
 Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
 TForm2 = class(TForm)
   Button1: TButton;
   Edit1: TEdit;
   function factorial(n: double): double;
   function cosx(n: double): double;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form2: TForm2;

implementation

{$R *.dfm}

function TForm2.factorial(n: double): double;
begin
 if n = 1 then
   exit(1.0);
 result := n * factorial(n - 1);
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
ShowMessage(cosx(StrToFloat(Edit1.Text)).ToString);
end;

function TForm2.cosx(n: double): double;
var
 toplam, temp: double;
 carpan, i: integer;
begin
 if (n < -360) or (n > 360) then
   n := fmod(n, 360);     // değer 360'tan büyükse esas açıya dönüştürüyoruz.
 if (n < 0) then          //değer eksi bir değerse artı karşılığını buluyoruz
   n := 360 + n;
   if (n=90) or (n=270) then  exit(0);       //bu değerler 0 olduğu içim geri döndürüyoruz.

 n := n * PI / 180.0; //değeri dereceye çeviriyoruz
 toplam := 1;  // taylor serisinin Cos(0) ilk değerini veriyoruz.
 temp := 0;
 carpan:=-1;// serideki toplamların başında eksi mi artı mı olduğunu belirlemek için kullanacağız.
                 // ilk değerimiz eksi olduğu için -1 değerini veriyoruz
 for i := 1 to 85 do  //ortalama 168. dereceye kadar türev alacağız.
 //aslında türev sonuçlarımız -1 yada +1 onuda carpan değişkeni ile belirliyoruz
 begin
   temp := power(n, i * 2) / factorial(i * 2);    //(cos(i. türev)(0)=-1 yada +1).x^i/i!
   // i yi ikiyle çarpıyoruz çünkü tek sayı olan türevler sin(0)=0  olduğu için anlamsız.
   if (carpan = -1) then   //sırayla + yada - değerini alıyor.
   begin
     temp := -temp;
     carpan := 1;
   end

   else
     carpan := -1;

   toplam := toplam + temp;
 end;

 result := toplam;   //sonucu döndürüyoruz.
end;

end.

C++ Kodları:

 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit4.h"
#include <math.h>
// ---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm4 *Form4;
// ---------------------------------------------------------------------------
#define PI 3.14159265358979323846264338327950288419716939937510582097494459230
 
__fastcall double TForm4::factorial(long double n) {
 
                   if (n == 1) {
                              return 1.0;
                   }
 
                   return n*factorial(n - 1); //
}
 
__fastcall double TForm4::cosx(long double n) {
 
                   if (n < -360 || n > 360) {
 
                              n = fmod(n, 360);
                   }
 
                   if (n < 0) {
 
                              n = 360 + n;
                   }
 
                   if (n == 90 || n == 270) {
                              return 0;
                   }
 
                   n = n * PI / 180.0;
                   long double toplam = 1;
                   long double temp;
                   int carpan = -1;
                   for (int i = 2; i < 170; i += 2) {
 
                              temp = pow(n, i) / factorial(i);
                              if (carpan == -1) {
                                            temp = -temp;
                                            carpan = 1;
                              }
                              else {
                                            carpan = -1;
                              }
 
                              toplam += temp;
 
                   }
 
                   return toplam;
 
                   //
}
 
__fastcall TForm4::TForm4(TComponent* Owner) : TForm(Owner) {
}
 
// ---------------------------------------------------------------------------
void __fastcall TForm4::Button1Click(TObject *Sender) {
                   ShowMessage(cosx(StrToFloat(Edit1->Text)));
}
// ---------------------------------------------------------------------------
Sonuçların hesap makinesine çok çok yakınsadığını neredeyse aynı değerler olduğunu göreceksiniz.Diğer trigonometrik fonksiyonları bu mantıkla kolayca kendiniz yazabilirsiniz.
Herhangi bir basit problem, hakkında yeterince toplantı yapılarak, çözümsüz hale getirilebilir.

Cevapla
#2
Teşekkürler Savaş bey.
Cevapla
#3
Değerli bilgiler ve katkılarınızdan dolayı teşekkür ederiz.
While true do; Hayat döngüsü, kısır değildir! Yapılan bir yanlış, o döngünün dışına çıkmanızı sağlayacaktır.
WWW
Cevapla
#4
(Rica ederim, sağ olun arkadaşlar.)

//Arcsinüsün maclaurin  sersisi(binomial seri) şeklinde ifadesi
  //k=1/2   (aslında k=-1/2 fakat X^2 de işareti eksi olduğu için
 //çapım sonuçları daima artı olacağı için x^2 katsayılarını da k yı artı olarak aldık.
//  integral(1/sqrt(1-x^2))=1+ kx^2/1! + k*(k+1)x^4/2!+k*(k+1)*(k+2)x^6/3!......
//integral alınca:
// arcsin(x)= x+kx^3/3 + k*(k+1)x^5/(2!*5 )+k*(k+1)*(k+2)x^7/(3!*7)....... şeklinde olur

function TTrigonometri.arcsinx(n: extended): extended;
var
 toplam, temp,k: extended;
i,j: integer;
begin
if (n>1)or (n<-1) then exit(nan);
if (n=1)or (n=-1) then exit(n*90);

 toplam:=n;//serinin başındaki x değerimizi toplama ekleyerek başlıyoruz

 k:=1/2;     //k değerimiz
  temp:=1.0;
 for I := 1 to 1750 do    // n değerimizi yüksek tuttukça sonuç daha sağlıklı olur
   begin
   //aslında burada yaptığımız k'nın i'li kombinasyonudur.
      for j := 0 to i-1 do
        begin
          temp:=temp*(k+j);
        end;
         temp:=temp/factorial(i);


          temp:=temp*(power(n,((i*2)+1))/((i*2)+1));
          //seriinin integralini alıyoruz.
         toplam:=toplam+temp;
         temp:=1.0;
   end;



   result:=toplam*180/pi;  //radyan cinsinden dereceye çeviriyoruz.
end;

end.
Herhangi bir basit problem, hakkında yeterince toplantı yapılarak, çözümsüz hale getirilebilir.

Cevapla




Konuyu Okuyanlar: 1 Ziyaretçi