2015-10-14 3 views
1

Я пытаюсь решить систему из 10 линейных уравнений, из которых средние 8 выглядят одинаково. Они выглядят так:Matlab: Что я делаю неправильно? (Индексирование)

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

где я = 2: 9

поэтому я решил построить матрицу коэффициентов и постоянную матрицу (массив) для системы уравнений через looping.This, что я сделал ,

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 

Все, кроме девятой строки (последней, но одной), является правильным в матрице A_10. Это то, что A_10 выглядит как

A_10 =

Колонны с 1 по 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 

Колонка 10

  0 
     0 
     0 
     0 
     0 
     0 
     0 
     0 
    -2.3086 
     0 

Последние три элемента строки девять должен быть 1, -2,3086 , 1, как и предыдущие строки, но показывает 1, 1, -2.3086. Что я здесь делаю неправильно?

Это то, что итерация выглядит в петле

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

Уравнение правильно тоже. Я не могу понять, в чем проблема.

ответ

3

Без второго ввода vars, equationsToMatrix uses symvar для определения списка переменных. Использование symvar непосредственно с последним уравнением дает

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

Так по какой-либо причине, symvar произвел неправильный порядок только для последнего уравнения (возможно, потому, что 1 < 9). Чтобы исправить ситуацию, пройти от предполагаемой упорядоченности, используя второй вход

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)); 

Вы также заметили, я назначил уравнение к явному переменным eqn. Это лучше, чем полагаться на ans.


Кроме того, поскольку вы производите числовой массив в любом случае, вы можете производить A без Символических инструментов в ряде направлений. Например:

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

Работал. Спасибо! – Loki93

Смежные вопросы