Fortran Coder

查看: 7485|回复: 6
打印 上一主题 下一主题

[其他行业算法] sor迭代什么方式结束循环较好

[复制链接]

9

帖子

2

主题

0

精华

入门

F 币
53 元
贡献
29 点
跳转到指定楼层
楼主
发表于 2014-4-18 13:19:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
[Fortran] 纯文本查看 复制代码
do
            do k=2,n-1
                Ek0=E(k)
                P0=(P(k)*Dz(k)+P(k-1)*Dz(k-1))/(Dz(k)+Dz(k-1))
                Dz0=(Dz(k)+Dz(k-1))/2D0
                E(k)=E(k)*(1D0-W0)+W0*(E(k+1)/(Dz0*Dz(k))+E(k-1)/(Dz0*Dz(k-1)))/(1.0D0/(Dz(k)*Dz0)+1.0D0/(Dz(k-1)*Dz0)+i*W*U*P0)
                T=(abs(dble(Ek0)-dble(E(k)))+abs(aimag(Ek0)-aimag(E(k))))/2D0
                if(T<1e-45)goto 100
            enddo
        enddo
100     H2=(E(3)-E(2))/(Dz(2)*i*W*U)
        Hs=P(2)*Dz(2)*(E(2)+(E(3)-E(2))/4)/2+H2
        Pa=(E(2)/Hs)**2/(W*U)

如题 作业中
用到sor迭代求解一个较大的矩阵
不知道怎样结束循环
我上面用的总感觉不是很好
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

136

帖子

3

主题

0

精华

版主

F 币
1964 元
贡献
1677 点

帅哥勋章管理勋章爱心勋章新人勋章热心勋章元老勋章

沙发
发表于 2014-4-18 14:12:52 | 只看该作者
迭代法的收敛方式很多,一般计算的有: 残差、两次迭代结果的RMS,判断有两种,1、小于某个阈值,2、变化很小

9

帖子

2

主题

0

精华

入门

F 币
53 元
贡献
29 点
板凳
 楼主| 发表于 2014-4-18 18:15:49 | 只看该作者
aliouying 发表于 2014-4-18 14:12
迭代法的收敛方式很多,一般计算的有: 残差、两次迭代结果的RMS,判断有两种,1、小于某个阈值,2、变化很 ...

能不能具体点呢
我上面的就是比较了迭代之前与之后其中一个值的大小
但是矩阵中有许多值 可能恰好比较了的那个满足 就跳出了
这样结果就不精确了

135

帖子

15

主题

0

精华

版主

F 币
1159 元
贡献
637 点

爱心勋章管理勋章

地板
发表于 2014-4-18 18:20:40 | 只看该作者
可以用初始荷载的某种范数与求解得结果与失衡力同样的范数比值 作为收敛判断标准

136

帖子

3

主题

0

精华

版主

F 币
1964 元
贡献
1677 点

帅哥勋章管理勋章爱心勋章新人勋章热心勋章元老勋章

5#
发表于 2014-4-19 10:29:29 | 只看该作者
H_S 发表于 2014-4-18 18:15
能不能具体点呢
我上面的就是比较了迭代之前与之后其中一个值的大小
但是矩阵中有许多值 可能恰好比较了 ...

你这代码有问题,为什么是判断某一个值?

我说的残差或者解的RMS都是指所有的解,即对应所有的Ek
所以判断迭代收敛与否,是在所有的k循环后计算得到Ek,然后与Ek0(即上一次的结果)做对比

PS:为什么内层循环是k=2,n-1?Ek(1)和Ek(n)不变么?

9

帖子

2

主题

0

精华

入门

F 币
53 元
贡献
29 点
6#
 楼主| 发表于 2014-4-19 12:17:00 | 只看该作者
珊瑚虫 发表于 2014-4-18 18:20
可以用初始荷载的某种范数与求解得结果与失衡力同样的范数比值 作为收敛判断标准 ...

说的太专业了 看不懂

9

帖子

2

主题

0

精华

入门

F 币
53 元
贡献
29 点
7#
 楼主| 发表于 2014-4-19 12:29:32 | 只看该作者
本帖最后由 H_S 于 2014-4-19 19:19 编辑
aliouying 发表于 2014-4-19 10:29
你这代码有问题,为什么是判断某一个值?

我说的残差或者解的RMS都是指所有的解,即对应所有的Ek

是就判断了一个值 觉得不是很好 就来问了

看我同学的是
DO
   E0=E
   SUM=0
   DO k=2,n-1
        E(k)=E(k)+....
   ENDDO
   DO i=1,n
        SUM=SUM+abs(E(i)-E0(k))
   ENDDO
   IF(SUM<1E-15)EXIT
ENDDO

大概就是这样的 凭记忆打的

我就觉得又多了一个数组 好麻烦

E(1)和E(n)是边界条件


您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-11-1 07:49

Powered by Tencent X3.4

© 2013-2024 Tencent

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