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

时间:2015-10-14 22:30:43

标签: matlab matrix matrix-indexing

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

    grid.setEditorEnabled(true);

    // register save listener
    grid.getEditorFieldGroup().addCommitHandler(new CommitHandler() {
        @Override
        public void preCommit(CommitEvent commitEvent) throws CommitException {
        }
        @Override
        public void postCommit(CommitEvent commitEvent) throws CommitException {
            // You can persist your data here
            Notification.show("Item " + grid.getEditedItemId() + " was edited.");
        }
    });

其中i = 2:9

所以我决定通过循环为方程组构造系数矩阵和常数矩阵(数组)。这就是我所做的。

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

除了第九行(最后一个)之外的所有内容在Matrix A_10中都是正确的。这就是A_10的样子

A_10 =

第1至9栏

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

第10栏

     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

第九行的最后三个元素应该是1,-2.3086,与之前的行类似,但它显示1,1,-2.3086。我在这里做错了什么?

这就是循环中迭代的样子

         0
         0
         0
         0
         0
         0
         0
         0
   -2.3086
         0

方程式也是正确的。我无法弄清问题是什么。

1 个答案:

答案 0 :(得分:3)

没有第二个输入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;