Fortran Coder

查看: 778|回复: 2
打印 上一主题 下一主题

[线性代数] 求助Gauss消元法求解线性方程组的数值不稳定问题

[复制链接]

13

帖子

4

主题

0

精华

入门

F 币
64 元
贡献
30 点
跳转到指定楼层
楼主
发表于 2024-3-28 12:30:53 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
各位老师好,我在学习数值算法的时候写了一个用Gauss消元法求解线性方程组的Fortran代码,并重复了徐士良老师《Fortran常用算法程序集》中的例子(见下图);这段代码编译过程正常,但求解出的X1和X2与书中给出的答案相差很大。其中一个原因我认为是选主元方式的差异,我的程序中采用“列选主元”,而书中采用“全选主元”。很多教材中提到列主元也能在很大程度上保证数值稳定性,所以我想原因可能出在代码的其他部分,希望各位老师帮忙看看这段代码在算法上有没有可以改进的地方,感谢各位老师不吝指教!
(经过测试,发现是回代这一部分循环的代码出现问题,因为我用直接列式算出的结果是正确的,但我实在没有发现回代这个循环的问题)

2.f90 (1.33 KB, 下载次数: 4)

分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

167

帖子

2

主题

1

精华

大师

Vim

F 币
1010 元
贡献
484 点

规矩勋章

沙发
发表于 2024-3-28 13:55:29 | 只看该作者
[Fortran] 纯文本查看 复制代码
   !ans=0 这个ans的位置错误 
    X(4) = B(4)/A(4,4)
    X(3) = (B(3)-A(3,4)*X(4))/A(3,3)
    X(2) = (B(2)-A(2,4)*X(4)-A(2,3)*X(3))/a(2,2)

    do j=3,1,-1
        ans = 0 !应该在这里
        do i=j+1,4,1
            ans = ans + A(j,i)*X(i)
        end do
        X(j) = (B(j)-ans)/A(j,j)
    end do

13

帖子

4

主题

0

精华

入门

F 币
64 元
贡献
30 点
板凳
 楼主| 发表于 2024-3-28 21:36:09 | 只看该作者
Transpose 发表于 2024-3-28 13:55
[mw_shl_code=fortran,true]   !ans=0 这个ans的位置错误
    X(4) = B(4)/A(4,4)
    X(3) = (B(3)-A(3,4 ...

感谢老师指正,我搞错了ans赋值语句的位置,现在程序运行正常了。
还想麻烦老师帮忙看看这个程序在数值算法和语法规范等方面有没有可以优化的地方,非常感谢!
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-11-22 05:44

Powered by Tencent X3.4

© 2013-2024 Tencent

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