查看: 721|回复: 11|关注: 0

[已答复] SOR迭代

[复制链接]

新手

9 麦片

财富积分


050


5

主题

15

帖子

0

最佳答案
发表于 2018-1-13 01:22:20 | 显示全部楼层 |阅读模式
不知道为什么结果不正确,可是我自己好像发现不出什么问题,请帮我看看哪里出错了谢谢。
  1. A = [-4 1 1 1;1 -4 1 1;1 1 -4 1;1 1 1 -4];
  2. B = [1 1 1 1]';
  3. n = length(B);
  4. x0 = zeros(n,1);
  5. x = zeros(n,1);
  6. MAXN = 20; %最大的迭代次数
  7. tol = 1e-5;
  8. k = 0; %迭代次数
  9. m1 = 0; %已算出向量的新分量的部分
  10. m2 = 0; %未算出的部分
  11. w = 1.3;

  12. while k <= MAXN
  13. for j=1:n
  14. m2=m2+A(1,j)*x0(j);
  15. end
  16. x(1)=(1-w)*x0(1)+w*(B(1)-m2)/A(1,1);
  17. m2=0;
  18. for i=2:n
  19. for j=1:i-1
  20. m1=m1+A(i,j)*x(j);
  21. end
  22. for j=i:n
  23. m2=m2+A(i,j)*x0(j);
  24. end
  25. x(i)=(1-w)*x0(i)+w*(B(i)-m1-m2)/A(i,i);
  26. m1=0;
  27. m2=0;
  28. end
  29. if norm(x-x0,inf)<tol
  30. fprintf('迭代结束');
  31. break;
  32. end
  33. x0=x;
  34. k=k+1;
  35. end
  36. fprintf('%d\n',k);
复制代码


新手

9 麦片

财富积分


050


5

主题

15

帖子

0

最佳答案
 楼主| 发表于 2018-1-13 16:06:45 | 显示全部楼层
与答案不正确是因为迭代格式写错了......

新手

25 麦片

财富积分


050


1

主题

33

帖子

4

最佳答案
发表于 2018-1-13 13:12:30 | 显示全部楼层
会不会是w错了?w=1.0718试一试?

新手

9 麦片

财富积分


050


5

主题

15

帖子

0

最佳答案
 楼主| 发表于 2018-1-13 13:42:53 | 显示全部楼层
经典七道 发表于 2018-1-13 13:12
会不会是w错了?w=1.0718试一试?

可是w=1.3是题目的要求

MATLAB 基础讨论
版块优秀回答者

入门

171 麦片

财富积分


50500


2

主题

200

帖子

21

最佳答案
  • 关注者: 3
发表于 2018-1-13 13:55:16 | 显示全部楼层
PNZQE 发表于 2018-1-13 13:42
可是w=1.3是题目的要求

为什么你认为你的代码运行不正确

新手

9 麦片

财富积分


050


5

主题

15

帖子

0

最佳答案
 楼主| 发表于 2018-1-13 13:57:00 | 显示全部楼层
风之子儿 发表于 2018-1-13 13:55
为什么你认为你的代码运行不正确

因为答案和书上的不一样啊...

MATLAB 基础讨论
版块优秀回答者

入门

171 麦片

财富积分


50500


2

主题

200

帖子

21

最佳答案
  • 关注者: 3
发表于 2018-1-13 13:58:27 | 显示全部楼层
PNZQE 发表于 2018-1-13 13:57
因为答案和书上的不一样啊...

我好像没有书,说实话,你问题是什么

新手

9 麦片

财富积分


050


5

主题

15

帖子

0

最佳答案
 楼主| 发表于 2018-1-13 14:08:56 | 显示全部楼层
风之子儿 发表于 2018-1-13 13:58
我好像没有书,说实话,你问题是什么

答案不一样不是很自然的想到有错误吗......

MATLAB 基础讨论
版块优秀回答者

入门

171 麦片

财富积分


50500


2

主题

200

帖子

21

最佳答案
  • 关注者: 3
发表于 2018-1-13 14:18:15 | 显示全部楼层
PNZQE 发表于 2018-1-13 14:08
答案不一样不是很自然的想到有错误吗......

我是说了我没有书,你代码运行正确,没有错误提示,谁知道你的代码为什么错。考个试都有个标答。真不知道你怎么想的。
你的代码运行结果
  1. ans 21
复制代码

新手

9 麦片

财富积分


050


5

主题

15

帖子

0

最佳答案
 楼主| 发表于 2018-1-13 14:27:20 | 显示全部楼层
风之子儿 发表于 2018-1-13 14:18
我是说了我没有书,你代码运行正确,没有错误提示,谁知道你的代码为什么错。考个试都有个标答。真不知道 ...

噢我误解你刚刚的意思了,我以为你问我有什么问题,不好意思
题目就是用SOR方法解方程组,A是它的系数矩阵,B是常数列向量,给的w是1.3
然后答案是取到第11次迭代就停止,达到精度要求,然后结果为x(11)=(-0.99999646,-1.00000310,-0.99999953,-0.99999912)'
可是我的迭代无法停止,而且结果也差很远

MATLAB 基础讨论
版块优秀回答者

入门

171 麦片

财富积分


50500


2

主题

200

帖子

21

最佳答案
  • 关注者: 3
发表于 2018-1-13 15:31:37 | 显示全部楼层
PNZQE 发表于 2018-1-13 14:27
噢我误解你刚刚的意思了,我以为你问我有什么问题,不好意思
题目就是用SOR方法解方程组,A是它的系数矩 ...

sor迭代不懂,但稍微查找了下相关资料,并运行了个类似代码。下面简略说明下:
首先,你的代码,迭代运行最大11次
      x=[-84.6814927491303,-50.8504127053332,-10.3377429405826,86.4626830030572]

第一个问题:你说你的迭代无法停止,不知是不是指循环不终止,我这没这种情况。

其次,自找的代码(汗颜啊,不是数软专业,也没时间去看原理,有机会下次吧)
  1. function [n,x]=sor22(A,b,X,nm,w,ww)
  2. %用超松弛迭代法求解方程组Ax=b
  3. %输入:A为方程组的系数矩阵,b为方程组右端的列向量,X为迭代初值构成的列向量,nm为最大迭代次数,w为误差精度,ww为松弛因子
  4. %输出:x为求得的方程组的解构成的列向量,n为迭代次数
  5. n=1;
  6. m=length(A);
  7. D=diag(diag(A));        %令A=D-L-U,计算矩阵D
  8. L=tril(-A)+D;           %令A=D-L-U,计算矩阵L
  9. U=triu(-A)+D;          %令A=D-L-U,计算矩阵U
  10. M=inv(D-ww*L)*((1-ww)*D+ww*U);    %计算迭代矩阵
  11. g=ww*inv(D-ww*L)*b;                %计算迭代格式中的常数项
  12. %下面是迭代过程
  13. while n<=nm
  14.     x=M*X+g;         %用迭代格式进行迭代
  15.     if norm(x-X,'inf')<w
  16.       disp('迭代次数为');
  17.       n
  18.       disp('方程组的解为');
  19.       x
  20.       return;
  21.       %上面:达到精度要求就结束程序,输出迭代次数和方程组的解
  22.     end
  23.     X=x;n=n+1;
  24. end
  25. %下面:如果达到最大迭代次数仍不收敛,输出警告语句及迭代的最终结果(并不是方程组的解)
  26. disp('在最大迭代次数内不收敛!');
  27. disp('最大迭代次数后的结果为');
  28. x
复制代码

  1. command window
  2. sor22(A,B,x0,12,tol,w)
  3. 迭代次数为

  4. n =

  5.     12

  6. 方程组的解为

  7. x =

  8.    -1.0000
  9.    -1.0000
  10.    -1.0000
  11.    -1.0000


  12. ans =

  13.     12
复制代码

这个迭代12次收敛,11次是不收敛,你自己可以试试。
所以,你的迭代的那个方程有问题(说似乎也和没说一样,嘻嘻)
就这样了,莽撞了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /3 下一条

快速回复 返回顶部 返回列表