【问题标题】:Matlab : What am I doing wrong? (Indexing)Matlab:我做错了什么? (索引)
【发布时间】:2015-10-14 22:30:42
【问题描述】:

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

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

其中 i = 2: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

矩阵 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

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

【问题讨论】:

    标签: matlab matrix matrix-indexing


    【解决方案1】:

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

    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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-01
      • 1970-01-01
      • 2010-12-14
      • 2011-06-01
      • 1970-01-01
      • 2020-10-19
      相关资源
      最近更新 更多