我试图解决一个由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
方程式也是正确的。我无法弄清问题是什么。
答案 0 :(得分: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;