Tridiagonal matris algoritması - Vikipedi
İçeriğe atla
Ana menü
Gezinti
  • Anasayfa
  • Hakkımızda
  • İçindekiler
  • Rastgele madde
  • Seçkin içerik
  • Yakınımdakiler
Katılım
  • Deneme tahtası
  • Köy çeşmesi
  • Son değişiklikler
  • Dosya yükle
  • Topluluk portalı
  • Wikimedia dükkânı
  • Yardım
  • Özel sayfalar
Vikipedi Özgür Ansiklopedi
Ara
  • Bağış yapın
  • Hesap oluştur
  • Oturum aç
  • Bağış yapın
  • Hesap oluştur
  • Oturum aç

İçindekiler

  • Giriş
  • 1 Yöntem
    • 1.1 C içinde uygulaması
    • 1.2 MATLAB içinde uygulaması
    • 1.3 Fortran 90 içinde uygulaması
  • 2 Kaynakça
  • 3 Dış bağlantılar

Tridiagonal matris algoritması

  • Deutsch
  • English
  • Español
  • Français
  • हिन्दी
  • İtaliano
  • Nederlands
  • Português
  • Русский
  • Українська
  • 中文
Bağlantıları değiştir
  • Madde
  • Tartışma
  • Oku
  • Değiştir
  • Kaynağı değiştir
  • Geçmişi gör
Araçlar
Eylemler
  • Oku
  • Değiştir
  • Kaynağı değiştir
  • Geçmişi gör
Genel
  • Sayfaya bağlantılar
  • İlgili değişiklikler
  • Kalıcı bağlantı
  • Sayfa bilgisi
  • Bu sayfayı kaynak göster
  • Kısaltılmış URL'yi al
  • Karekodu indir
Yazdır/dışa aktar
  • Bir kitap oluştur
  • PDF olarak indir
  • Basılmaya uygun görünüm
Diğer projelerde
  • Vikiveri ögesi
Görünüm
Vikipedi, özgür ansiklopedi
Bu madde, öksüz maddedir; zira herhangi bir maddeden bu maddeye verilmiş bir bağlantı yoktur. Lütfen ilgili maddelerden bu sayfaya bağlantı vermeye çalışın. (Eylül 2022)

Tridiagonal matris algoritması (b.b.d. TDMA), Thomas algoritması olarak da bilinmektedir (Llewellyn Thomas ardından isimlendirilmiştir), sayısal lineer cebirde tridiagonal denklem sistemlerini çözmek için kullanılan basitleştirilmiş bir Gauss eleme yöntemidir.

n bilinmeyenli bir tridiagonal sistem şöyle yazılabilir:

a i x i − 1 + b i x i + c i x i + 1 = d i , {\displaystyle a_{i}x_{i-1}+b_{i}x_{i}+c_{i}x_{i+1}=d_{i},\,\!} {\displaystyle a_{i}x_{i-1}+b_{i}x_{i}+c_{i}x_{i+1}=d_{i},\,\!}

a 1 = 0 {\displaystyle a_{1}=0\,} {\displaystyle a_{1}=0\,} ve c n = 0 {\displaystyle c_{n}=0\,} {\displaystyle c_{n}=0\,}'dır.

Bu algoritma köşegen olarak baskın (b.b.d. "diagonally dominant") sistemlere uygulanabilir. Bu sistem matris formunda aşağıdaki gibi belirtilebilir:

[ b 1 c 1 0 a 2 b 2 c 2 a 3 b 3 ⋱ ⋱ ⋱ c n − 1 0 a n b n ] [ x 1 x 2 x 3 ⋮ x n ] = [ d 1 d 2 d 3 ⋮ d n ] . {\displaystyle {\begin{bmatrix}{b_{1}}&{c_{1}}&{}&{}&{0}\\{a_{2}}&{b_{2}}&{c_{2}}&{}&{}\\{}&{a_{3}}&{b_{3}}&\ddots &{}\\{}&{}&\ddots &\ddots &{c_{n-1}}\\{0}&{}&{}&{a_{n}}&{b_{n}}\\\end{bmatrix}}{\begin{bmatrix}{x_{1}}\\{x_{2}}\\{x_{3}}\\\vdots \\{x_{n}}\\\end{bmatrix}}={\begin{bmatrix}{d_{1}}\\{d_{2}}\\{d_{3}}\\\vdots \\{d_{n}}\\\end{bmatrix}}.} {\displaystyle {\begin{bmatrix}{b_{1}}&{c_{1}}&{}&{}&{0}\\{a_{2}}&{b_{2}}&{c_{2}}&{}&{}\\{}&{a_{3}}&{b_{3}}&\ddots &{}\\{}&{}&\ddots &\ddots &{c_{n-1}}\\{0}&{}&{}&{a_{n}}&{b_{n}}\\\end{bmatrix}}{\begin{bmatrix}{x_{1}}\\{x_{2}}\\{x_{3}}\\\vdots \\{x_{n}}\\\end{bmatrix}}={\begin{bmatrix}{d_{1}}\\{d_{2}}\\{d_{3}}\\\vdots \\{d_{n}}\\\end{bmatrix}}.}

Bu tür sistemler için çözüm, O ( n ) {\displaystyle O(n)} {\displaystyle O(n)} mertebesinde aşama sayısı ile O ( n 3 ) {\displaystyle O(n^{3})} {\displaystyle O(n^{3})} mertebesinde aşama sayısı gerektiren Gauss eleme yöntemi kullanılmadan elde edilebilir. İlk aşamada bütün a i {\displaystyle a_{i}} {\displaystyle a_{i}}'ler elenir ve ardından geriye doğru yerine koyma yöntemi ile sonuca ulaşılır. Bu tip matrislerle çoğunlukla bir boyutlu Poisson denkleminin ayrıklaştırılmasında (ör. bir boyutlu difüzyon problemi) ve kübik eğri interpolasyonunda karşılaşılır.

Yöntem

[değiştir | kaynağı değiştir]

İlk aşama matris katsayılarının aşağıdaki gibi düzenlenmesinden oluşur. Düzenlenmiş yeni katsayılar ayraç ile işaretlenmiştir:

c i ′ = { c i b i ; i = 1 c i b i − c i − 1 ′ a i ; i = 2 , 3 , … , n − 1 {\displaystyle c'_{i}={\begin{cases}{\begin{array}{lcl}{\cfrac {c_{i}}{b_{i}}}&;&i=1\\{\cfrac {c_{i}}{b_{i}-c'_{i-1}a_{i}}}&;&i=2,3,\dots ,n-1\\\end{array}}\end{cases}}\,} {\displaystyle c'_{i}={\begin{cases}{\begin{array}{lcl}{\cfrac {c_{i}}{b_{i}}}&;&i=1\\{\cfrac {c_{i}}{b_{i}-c'_{i-1}a_{i}}}&;&i=2,3,\dots ,n-1\\\end{array}}\end{cases}}\,}

ve:

d i ′ = { d i b i ; i = 1 d i − d i − 1 ′ a i b i − c i − 1 ′ a i ; i = 2 , 3 , … , n . {\displaystyle d'_{i}={\begin{cases}{\begin{array}{lcl}{\cfrac {d_{i}}{b_{i}}}&;&i=1\\{\cfrac {d_{i}-d'_{i-1}a_{i}}{b_{i}-c'_{i-1}a_{i}}}&;&i=2,3,\dots ,n.\\\end{array}}\end{cases}}\,} {\displaystyle d'_{i}={\begin{cases}{\begin{array}{lcl}{\cfrac {d_{i}}{b_{i}}}&;&i=1\\{\cfrac {d_{i}-d'_{i-1}a_{i}}{b_{i}-c'_{i-1}a_{i}}}&;&i=2,3,\dots ,n.\\\end{array}}\end{cases}}\,}

Bu aşama ileri süpürme (b.b.d. "forward sweep") olarak adlandırılır. Çözüm ise geriye doğru yerine koyma yöntemi ile elde edilir:

x n = d n ′ {\displaystyle x_{n}=d'_{n}\,} {\displaystyle x_{n}=d'_{n}\,}
x i = d i ′ − c i ′ x i + 1 ;   i = n − 1 , n − 2 , … , 1. {\displaystyle x_{i}=d'_{i}-c'_{i}x_{i+1}\qquad ;\ i=n-1,n-2,\ldots ,1.} {\displaystyle x_{i}=d'_{i}-c'_{i}x_{i+1}\qquad ;\ i=n-1,n-2,\ldots ,1.}

C içinde uygulaması

[değiştir | kaynağı değiştir]
void solveMatrix (int n, double *a, double *b, double *c, double *v, double *x)
{
	/**
	 * n - number of equations
	 * a - sub-diagonal (means it is the diagonal below the main diagonal) -- indexed from 1..n-1
	 * b - the main diagonal
	 * c - sup-diagonal (means it is the diagonal above the main diagonal) -- indexed from 0..n-2
	 * v - right part
	 * x - the answer
	 */
	for (int i = 1; i < n; i++)
	{
		double m = a[i]/b[i-1];
                b[i] = b[i] - m * c[i - 1];
		v[i] = v[i] - m*v[i-1];
	}

	x[n-1] = v[n-1]/b[n-1];

	for (int i = n - 2; i >= 0; --i)
		x[i] = (v[i] - c[i] * x[i+1]) / b[i];
}

MATLAB içinde uygulaması

[değiştir | kaynağı değiştir]
function x = TDMAsolver(a,b,c,d)
%a, b, c are the column vectors for the compressed tridiagonal matrix, d is the right vector
n = length(b); % n is the number of rows
 
% Modify the first-row coefficients
c(1) = c(1) / b(1);    % Division by zero risk.
d(1) = d(1) / b(1);    % Division by zero would imply a singular matrix.
 
for i = 2:n-1
    temp = b(i) - a(i) * c(i-1);
    c(i) = c(i) / temp;
    d(i) = (d(i) - a(i) * d(i-1))/temp;
end

d(n) = (d(n) - a(n) * d(n-1))/( b(n) - a(n) * c(n-1));
 
% Now back substitute.
x(n) = d(n);
for i = n-1:-1:1
    x(i) = d(i) - c(i) * x(i + 1);
end
end

Fortran 90 içinde uygulaması

[değiştir | kaynağı değiştir]
      subroutine solve_tridiag(a,b,c,v,x,n)
      implicit none
!	 a - sub-diagonal (means it is the diagonal below the main diagonal)
!	 b - the main diagonal
!	 c - sup-diagonal (means it is the diagonal above the main diagonal)
!	 v - right part
!	 x - the answer
!	 n - number of equations

        integer,intent(in) :: n
        real(8),dimension(n),intent(in) :: a,b,c,v
        real(8),dimension(n),intent(out) :: x
        real(8),dimension(n) :: bp,vp
        real(8) :: m
        integer i

! Make copies of the b and v variables so that they are unaltered by this sub
        bp(1) = b(1)
        vp(1) = v(1)

        !The first pass (setting coefficients):
firstpass: do i = 2,n
         m = a(i)/bp(i-1)
         bp(i) = b(i) - m*c(i-1)
         vp(i) = v(i) - m*vp(i-1)
        end do firstpass

         x(n) = vp(n)/bp(n)
        !The second pass (back-substition)
backsub:do i = n-1, 1, -1
          x(i) = (vp(i) - c(i)*x(i+1))/bp(i)
        end do backsub

    end subroutine solve_tridiag

Kaynakça

[değiştir | kaynağı değiştir]
  • Conte, S.D., and deBoor, C. (1972). Elementary Numerical Analysis. McGraw-Hill, New York. KB1 bakım: Birden fazla ad: yazar listesi (link)
  • Press, WH; Teukolsky, SA; Vetterling, WT; Flannery, BP (2007), "Section 2.4", Numerical Recipes: The Art of Scientific Computing (3.3yayımcı=Cambridge University Press bas.), New York, ISBN 978-0-521-88068-8 

Dış bağlantılar

[değiştir | kaynağı değiştir]
  • Example with VBA code
"https://tr.wikipedia.org/w/index.php?title=Tridiagonal_matris_algoritması&oldid=35608163" sayfasından alınmıştır
Kategoriler:
  • Lineer cebir
  • Sayısal analiz
Gizli kategoriler:
  • Öksüz maddeler Eylül 2022
  • KB1 bakım: Birden fazla ad: yazar listesi
  • Sayfa en son 00.57, 8 Temmuz 2025 tarihinde değiştirildi.
  • Metin Creative Commons Atıf-AynıLisanslaPaylaş Lisansı altındadır ve ek koşullar uygulanabilir. Bu siteyi kullanarak Kullanım Şartlarını ve Gizlilik Politikasını kabul etmiş olursunuz.
    Vikipedi® (ve Wikipedia®) kâr amacı gütmeyen kuruluş olan Wikimedia Foundation, Inc. tescilli markasıdır.
  • Gizlilik politikası
  • Vikipedi hakkında
  • Sorumluluk reddi
  • Davranış Kuralları
  • Geliştiriciler
  • İstatistikler
  • Çerez politikası
  • Mobil görünüm
  • Wikimedia Foundation
  • Powered by MediaWiki
Tridiagonal matris algoritması
Konu ekle