Loki93
Loki93

Reputation: 15

Matlab : What am I doing wrong? (Indexing)

I'm trying to solve a system of 10 linear equations out of which the middle 8 equations look alike. They look like this :

t_i-1 - 2.3086*(t_i) + t_i+1 == -7.7160

where i = 2:9

so I decided to construct the coefficient matrix and the constant matrix(array) for the system of equations through looping.This is what I did.

T = sym('t' , [1 10]); %% Creates a vector T = [ t1 t2 .... t10]
A_10 = zeros(10,10);
b_10 = zeros(10,1);

for i = 2:9 %% This loop generates the equations and arranges them in the matrices A_10 and B_10.

T(i-1) - 2.3086*T(i) + T(i+1) == -7.7160; 

[A_10(i,i-1:i+1),b_10(i,1)] = equationsToMatrix(ans) 

end

Everything except for the ninth row(last but one) is correct in the Matrix A_10. This is what A_10 looks like

A_10 =

Columns 1 through 9

     0         0         0         0         0         0         0         0         0
1.0000   -2.3086    1.0000         0         0         0         0         0         0
     0    1.0000   -2.3086    1.0000         0         0         0         0         0
     0         0    1.0000   -2.3086    1.0000         0         0         0         0
     0         0         0    1.0000   -2.3086    1.0000         0         0         0
     0         0         0         0    1.0000   -2.3086    1.0000         0         0
     0         0         0         0         0    1.0000   -2.3086    1.0000         0
     0         0         0         0         0         0    1.0000   -2.3086    1.0000
     0         0         0         0         0         0         0    1.0000    1.0000
     0         0         0         0         0         0         0         0         0

Column 10

         0
         0
         0
         0
         0
         0
         0
         0
   -2.3086
         0

The last three elements of the row nine should be 1 , -2.3086 , 1 like the previous rows but it shows 1, 1, -2.3086. What am I doing wrong here?

This is what the iteration looks like in the loop

ans =  t8 - (11543*t9)/5000 + t10 == -1929/250

The equation is correct too. I can't figure out what the problem is.

Upvotes: 1

Views: 61

Answers (1)

TroyHaskin
TroyHaskin

Reputation: 8401

Without the second input vars, equationsToMatrix uses symvar to determine the variable list. Using symvar directly with the last equation gives

>> i = 9;symvar(T(i-1) - 2.3086*T(i) + T(i+1) == -7.7160)
ans =
[ t10, t8, t9]

So for whatever reason, symvar produced the incorrect ordering for only the last equation (possibly because 1 < 9). To remedy the situation, pass your intended ordering using the second input

eqn = T(i-1) - 2.3086*T(i) + T(i+1) == -7.7160;
[A_10(i,i-1:i+1),b_10(i,1)] = equationsToMatrix(eqn,T(i-1:i+1));

You'll also noticed I assigned the equation to an explicit variable eqn. This is better practice than relying on ans.


Also, since you're producing a numeric array anyway, you can produce A without the Symbolic Toolbox in a number of ways. For example:

n            = 10;
A            = full(spdiags(ones(n,1)*[1,-2.3086,1],[-1,0,1],n,n));
A([1,end],:) = 0;

Upvotes: 3

Related Questions