0
votes

I'm not sure if this typical behaviour or not but I am solving a finite-difference problem using the backward differencing method.

I populated a sparse matrix with the appropriate diagonal terms (along the central diagonal and one above and below it) and I attempted to solve the problem using MATLAB's built-in method (B=A\x) and it seems MATLAB just gets it wrong.

Furthermore, if use inv() and use the inverse of the tridiagonal matrix I get the correct solution.

Why does this behave like this?

Additional info:

http://pastebin.com/AbuEW6CR (Values are tabbed so its easier read) Stiffness matrix K:

1   0   0   0
-0.009  1.018   -0.009  0
0   -0.009  1.018   -0.009
0   0   0   1

Values for d:

0
15.55
15.55
86.73

Built-in output:

-1.78595556155136e-05
0.00196073713853244
0.00196073713853244
0.0108149483252210

Output using inv(K):

0
15.42
16.19
86.73

Manual output:

0
15.28
16.18
85.16

Code

nx = 21; %number of spatial steps
nt = 501; %number of time steps (varies between 501 and 4001)
p = alpha * dt / dx^2; %arbitrary constant
a = [0 -p*ones(1,nx-2) 0]'; %diagonal below central diagonal
b = (1+2*p)*ones(nx,1); %central diagonal
c = [1 -p*ones(1,nx-2) 1]'; %diagonal above central diagonal
d = zeros(nx, 1); %rhs values
% Variables a,b,c,d are used for the manual tridiagonal method for
% comparison with MATLAB's built-in functions. The variables represent
% diagonals and the rhs of the matrix    
% The equation is K*U(n+1)=U(N)

U = zeros(nx,nt);
% Setting initial conditions
U(:,[1 2]) = (60-32)*5/9;
K = sparse(nx,nx);
% Indices of the sparse matrix which correspond to the diagonal
diagonal = 1:nx+1:nx*nx; 

% Populating diagonals
K(diagonal) =1+2*p;
K(diagonal(2:end)-1) =-p;
K(diagonal(1:end-1)+1) =-p;

% Applying dirichlet condition at final spatial step, the temperature is
% derived from a table for predefined values during the calculation
K(end,end-1:end)=[0 1];

% Applying boundary conditions at first spatial step
K(1,1:2) = [1 0];


% Populating rhs values and applying boundary conditions, d=U(n)
d(ivec) = U(ivec,n);
d(nx) = R; %From table
d(1) = 0;

U(:,n+1) = tdm(a,b,c,d); % Manual solver, gives correct answer

U(:,n+1) = d\K; % Built-in solver, gives wrong answer
1
Please give a concrete example (with code and the results).Bitwise
I have added one, it took a while to get everything I needed together. From the results I have posted it looks like using the slash just produces completely the wrong results.user2272296
Nevermind... biggest facepalm ever... I had the operation the wrong way round... sorry for wasting your time.user2272296
Haha I was about to answer informing you that your built-in solution was roughly equal to the inv() solution divided by about 8000MattG

1 Answers

1
votes

The following line:

U(:,n+1) = d\K;

should have been

U(:,n+1) = K\d;

By mistake I had them the wrong way round and didn't notice it, it obviously changes the mathematical expression and hence the wrong answers.