tridiagonal matrix with a corner entry from upper diagonal
    7 visualizaciones (últimos 30 días)
  
       Mostrar comentarios más antiguos
    
    ivordes greenleaf
 el 22 de Abr. de 2015
  
    
    
    
    
    Respondida: Jacob Lane
 el 16 de Abr. de 2019
            I am trying a construct a matlab code such that it will solve an almost tridiagonal matrix. The input I want to put in is the main diagonal (a), the upper diagonal (b) and the lower diagonal and the RHS vector (r). The matrix I want to solve looks like this:
             | a(1)  b(1)                                 |
             | c(1)  a(2)  b(2)                           |
             |       c(2)  a(3)  b(3)                     |
             |              .     .     .                 |
             |                    .     .     .           |
             |                          .     .    b(n-1) |
             | b(n)                       c(n)   a(n)  |
I can construct a code that works for the tridiagonal, but that corner entry got me, especially when it is supposed to come from the original input c.
This is what I got so far:
function y = tridiagonal ( c, a, b, r )
n = length ( a );
for i = 1 : n-1 b(i) = b(i) / a(i); a(i+1) = a(i+1) - c(i) * b(i); end
r(1) = r(1) / a(1); for i = 2 : n r(i) = ( r(i) - c(i-1) * r(i-1) ) / a(i); end
for i = n-1 : -1 : 1 r(i) = r(i) - r(i+1) * b(i); end
if ( nargout == 0 ) disp ( r ) else y = r; end
Thanks for any input!
1 comentario
  Guillaume
      
      
 el 22 de Abr. de 2015
				The c entry on the last row should be c(n-1) not c(n). Where does c(n) go? The last column of the first row?
Respuesta aceptada
  Guillaume
      
      
 el 22 de Abr. de 2015
        There is actually a function in matlab to construct tridiagonal matrices. It's well hidden in the gallery function (with the tridiag option). I would construct the matrix this way:
a = 1:10; b = 101:110; c = 201:210; %demo data
m = full(gallery('tridiag', b, [a 0], c));
m(end-1, 1) = m(end-1, end); %move b(n) in first column
m(1, end-1) = m(end, end-1); %move c(n) in first row
m = m(1:end-1, 1:end-1) %get rid of last row and column
I assumed c(n) went in the last column of the first row, since it's c(n-1) that ends up on the last row.
2 comentarios
  Guillaume
      
      
 el 22 de Abr. de 2015
				No, the coefficients can be anything. a, b and c just have to be vectors (of the same length). For example:
a = rand(1, 20); b = ones(1, 20); c = randperm(20);
work just as well.
Más respuestas (2)
  Ahmet Cecen
      
 el 22 de Abr. de 2015
        Check out spdiags and diag functions for a much easier way to do this.
0 comentarios
  Jacob Lane
 el 16 de Abr. de 2019
        I am having trouble with trying to write a function for a tridiagonal matrix. I am just trying to prove that one is in fact tridiagonal. Can anyone help me?
0 comentarios
Ver también
Categorías
				Más información sobre Creating and Concatenating Matrices en Help Center y File Exchange.
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!


