Fortran Coder

查看: 3322|回复: 21
打印 上一主题 下一主题

[数值问题] fortran 程序运行不守恒是什么问题?急

[复制链接]

14

帖子

1

主题

0

精华

入门

F 币
63 元
贡献
34 点
跳转到指定楼层
楼主
发表于 2023-8-22 10:20:26 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
大家好,在这里发一个求助帖。
问题是这样的:在数学上可以验证出来三个函数表达式相加(三个函数表达式相加的结果与任何数都无关,之和就是守恒的)是绝对守恒的,但是用Fortran程序运行出来的结果不守恒,请问一下大家可能是什么问题?
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

14

帖子

1

主题

0

精华

入门

F 币
63 元
贡献
34 点
22#
 楼主| 发表于 2023-8-31 09:27:13 | 只看该作者
风平老涡 发表于 2023-8-30 22:00
可以百度一下,双精度数值范围在正负 2.2x10^-308 到 1.7x10^308,有效位数15~17。对于指数函数e^x的直接 ...

好的,我这边试一下,非常感谢

213

帖子

2

主题

0

精华

宗师

F 币
2126 元
贡献
875 点

规矩勋章

21#
发表于 2023-8-30 22:00:41 | 只看该作者
八爪鱼 发表于 2023-8-30 09:51
您好,哥,关于函数变量的可用范围,能再稍微提示一下吗?或者说Fortran程序书上是不是有关于溢出这一块 ...

可以百度一下,双精度数值范围在正负 2.2x10^-308 到 1.7x10^308,有效位数15~17。对于指数函数e^x的直接计算,x值的范围在正负~710。所以对x值较大的计算,必须对原始数学公式进行变换,比如取对数或提取公约数等。

14

帖子

1

主题

0

精华

入门

F 币
63 元
贡献
34 点
20#
 楼主| 发表于 2023-8-30 09:51:59 | 只看该作者
风平老涡 发表于 2023-8-28 23:02
用你的数据算了一下,当p32=0.1时发现几个问题:
1)当t=0时, yn1和 yn2 相对精确, yn3 误差较大。这是 ...

您好,哥,关于函数变量的可用范围,能再稍微提示一下吗?或者说Fortran程序书上是不是有关于溢出这一块的介绍?我自己看一下。刚刚接触Fortran和数值计算这一块,还是小白,有点不太懂。非常感谢!

14

帖子

1

主题

0

精华

入门

F 币
63 元
贡献
34 点
19#
 楼主| 发表于 2023-8-30 09:31:22 | 只看该作者
风平老涡 发表于 2023-8-29 10:17
数值分析的书有很多,关於误差传递的基础知识所有的书都会涉及。

好的,非常感谢提醒,我去看一下。谢谢

213

帖子

2

主题

0

精华

宗师

F 币
2126 元
贡献
875 点

规矩勋章

18#
发表于 2023-8-29 10:17:14 | 只看该作者
八爪鱼 发表于 2023-8-29 09:40
非常感谢,我这边再试一下。关于数值分析的书,有哪些好的可以推荐一下吗?
如果改变算法,考虑范围的话 ...

数值分析的书有很多,关於误差传递的基础知识所有的书都会涉及。

14

帖子

1

主题

0

精华

入门

F 币
63 元
贡献
34 点
17#
 楼主| 发表于 2023-8-29 09:40:08 | 只看该作者
风平老涡 发表于 2023-8-28 23:02
用你的数据算了一下,当p32=0.1时发现几个问题:
1)当t=0时, yn1和 yn2 相对精确, yn3 误差较大。这是 ...

非常感谢,我这边再试一下。关于数值分析的书,有哪些好的可以推荐一下吗?
如果改变算法,考虑范围的话,不守恒的问题是不是大概率就可以解决了。

213

帖子

2

主题

0

精华

宗师

F 币
2126 元
贡献
875 点

规矩勋章

16#
发表于 2023-8-28 23:02:52 | 只看该作者
本帖最后由 风平老涡 于 2023-8-29 02:11 编辑
八爪鱼 发表于 2023-8-28 13:41
您好,哥。我刚才用Excel表格分步算了一下。当p32=0.1时,r1和r2相差了12个数量级。我在想是不是在后续的 ...

用你的数据算了一下,当p32=0.1时发现几个问题:
1)当t=0时, yn1和 yn2 相对精确, yn3 误差较大。这是典型的误差传递,因为 yn3运算步骤较多。请参考有关数值分析书开头几章关于误差传递的描述。
2)当t>0时, 如t=1, 计算指数函数有溢出,无法得到准确解。
建议改变算法,算法需考虑误差传递及函数的变量可用范围。

14

帖子

1

主题

0

精华

入门

F 币
63 元
贡献
34 点
15#
 楼主| 发表于 2023-8-28 13:41:06 | 只看该作者
风平老涡 发表于 2023-8-28 10:16
看上去入r1和r2是二元方程的两个根。如果两个根很接近的话,根据程序中的算法, c1, c2和c3会产生较大误差 ...

您好,哥。我刚才用Excel表格分步算了一下。当p32=0.1时,r1和r2相差了12个数量级。我在想是不是在后续的计算时,由于r1,r2相差太大造成的误差,计算机把较小的数忽略了。

14

帖子

1

主题

0

精华

入门

F 币
63 元
贡献
34 点
14#
 楼主| 发表于 2023-8-28 13:26:01 | 只看该作者
风平老涡 发表于 2023-8-28 10:16
看上去入r1和r2是二元方程的两个根。如果两个根很接近的话,根据程序中的算法, c1, c2和c3会产生较大误差 ...

对的,r1和r2是一元二次方程的两个根
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-5-18 09:33

Powered by Tencent X3.4

© 2013-2024 Tencent

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