Matlab:我做错了什么? (索引)

Matlab : What am I doing wrong? (Indexing)

我正在尝试求解一个由 10 个线性方程组成的系统,其中中间的 8 个方程看起来很相似。它们看起来像这样:

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

Matrix 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

第 9 行的最后三个元素应该是 1 , -2.3086 , 1 和前几行一样,但它显示 1, 1, -2.3086。我在这里做错了什么?

这是迭代在循环中的样子

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

方程式也正确。我不知道是什么问题。

不用第二个输入varsequationsToMatrix 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;