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
方程式也正确。我不知道是什么问题。
不用第二个输入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;
我正在尝试求解一个由 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
方程式也正确。我不知道是什么问题。
不用第二个输入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;