[已解决] 关于实现Jocabi迭代的疑问

[复制链接]
liptzn 发表于 2022-1-10 11:12:44
A=rand(10)+6*eye(10);
b=randn(10,1);
x=zeros(10,1);
T=1;
while T>0.00000001&T<100
    for i=1:10        
        for j=1:10
            if j~=i
                y(i)=b(i)-A(i,j)*x(j);
            end   
        end
        y(i)=y(i)/A(i,i);
    end
    T=max(abs(x-y));
    x=y;
end
x

初学matlab,按照上述代码运行结果不对,而将上述b(i)先赋值给y(i)再进行运算结果正确,即
A=rand(10)+6*eye(10);
b=randn(10,1);
x=zeros(10,1);
T=1;
while T>0.00000001&T<100
    for i=1:10
       y(i)=b(i);
        for j=1:10
            if j~=i
                y(i)=y(i)-A(i,j)*x(j);
            end   
        end
        y(i)=y(i)/A(i,i);
    end
    T=max(abs(x-y));
    x=y;
end
x

红色部分为差异部分,想请问下这两者的差异在哪儿,多谢指教。

最佳答案


WarnerChang 发表于 2022-1-10 18:32:54
本帖最后由 WarnerChang 于 2022-1-10 18:35 编辑
liptzn 发表于 2022-1-10 17:18
非常感谢您的回答,我刚刚开始学习,所以这个问题想把它搞懂。首先每次迭代带入的都是上一次的解x,最后 ...

那么我问你if语句中j==i时,y(i)的值又是多少呢?这就要求了必须在j循环外先赋值

要不然jacobi迭代式中等号右边的第一项就是变化的,求出来大概率不对

8 条回复


WarnerChang 发表于 2022-1-10 11:21:16
因为y(i)在内层循环中会一直改变值啊,而b(i)是始终不变的啊,在内层循环执行之前给y(i)重新赋值,才能得到正确结果

liptzn 发表于 2022-1-10 11:25:39
WarnerChang 发表于 2022-1-10 11:21
因为y(i)在内层循环中会一直改变值啊,而b(i)是始终不变的啊,在内层循环执行之前给y(i)重新赋值,才能得到 ...

但是重新每次赋值也都是赋值b(i)固定值,问什么不可以直接用b(i)直接运算呢

WarnerChang 发表于 2022-1-10 12:58:45
liptzn 发表于 2022-1-10 11:25
但是重新每次赋值也都是赋值b(i)固定值,问什么不可以直接用b(i)直接运算呢 ...

因为内层循环需要在每一步内结果收敛啊,你一直给的是b(i),每一次内层循环都停留在第一个迭代步,没有变化了

liptzn 发表于 2022-1-10 17:18:13
WarnerChang 发表于 2022-1-10 12:58
因为内层循环需要在每一步内结果收敛啊,你一直给的是b(i),每一次内层循环都停留在第一个迭代步,没有变 ...

非常感谢您的回答,我刚刚开始学习,所以这个问题想把它搞懂。首先每次迭代带入的都是上一次的解x,最后是把得到的结果y赋值给x了,每次迭代用的都是向量b去减其他分量;其次我的系数矩阵加了6倍的单位矩阵,已经保证其严格对角占优,所以可以保证迭代结果的收敛性。我仍然想不通为什么不可以直接用b减,而是要每次都把b赋值给y。我想了好久没有搞懂,您有时间可以再帮忙看下吗,非常感谢!

WarnerChang 发表于 2022-1-10 18:32:54
本帖最后由 WarnerChang 于 2022-1-10 18:35 编辑
liptzn 发表于 2022-1-10 17:18
非常感谢您的回答,我刚刚开始学习,所以这个问题想把它搞懂。首先每次迭代带入的都是上一次的解x,最后 ...

那么我问你if语句中j==i时,y(i)的值又是多少呢?这就要求了必须在j循环外先赋值

要不然jacobi迭代式中等号右边的第一项就是变化的,求出来大概率不对

回复此楼

liptzn 发表于 2022-1-10 19:21:19
WarnerChang 发表于 2022-1-10 18:32
那么我问你if语句中j==i时,y(i)的值又是多少呢?这就要求了必须在j循环外先赋值

要不然jacobi迭代式中等 ...

OK,懂了,非常感谢

SuiJiRand 发表于 2022-1-11 20:20:50
应该不是另一位兄弟说的原因,
我的理解是:只要看公式就行,j循环应该是一个求和,要把所有i~=j时候的-aij*xj加起来,然后再加个b,如果你不用y的话实际上最后加起来的只有b和最后一个不等于i的j那一项,比如i等于1的时候,你原先那个程序算的y(1)=b(1)-A(1,10)*x(10),而不是y(1)=b(1)-A(1,2)*x(2)-...-A(1,10)*x(10)。

liptzn 发表于 2022-1-11 22:12:52
SuiJiRand 发表于 2022-1-11 20:20
应该不是另一位兄弟说的原因,
我的理解是:只要看公式就行,j循环应该是一个求和,要把所有i~=j时候的-aij ...

嗯嗯,你说的对,兄弟,我昨天发现每次只是减去一项,如果不用y迭代的话,只是减去最后一个j~=i的项。刚开始学编程,这点问题困扰了我好久。谢谢你了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

相关帖子
相关文章
热门教程
站长推荐
快速回复 返回顶部 返回列表