Fortran Coder

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

[数值问题] 大佬们帮看看matmul函数的问题

[复制链接]

11

帖子

3

主题

0

精华

入门

F 币
44 元
贡献
41 点
跳转到指定楼层
楼主
发表于 2021-5-21 19:56:17 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
[Fortran] 纯文本查看 复制代码
program main
   implicit none
   integer,parameter::NP = SELECTED_REAL_KIND(8)
   real(Kind = NP)::emod,nu
   real(Kind = NP),dimension(6)::destrain,dstress
   real(Kind = NP),dimension(6,6)::dompl
!=====================================================
   emod=70000.0
   nu=0.15
   dompl=0.0
   dompl(1,1)=(emod*(1.0-nu))/((1+nu)*(1.0-2.0*nu))
   dompl(2,2)=(emod*(1.0-nu))/((1+nu)*(1.0-2.0*nu))
   dompl(3,3)=(emod*(1.0-nu))/((1+nu)*(1.0-2.0*nu))
   dompl(1,2)=(emod*nu)/((1.0+nu)*(1.0-2.0*nu))
   dompl(2,1)=(emod*nu)/((1.0+nu)*(1.0-2.0*nu))
   dompl(2,3)=(emod*nu)/((1.0+nu)*(1.0-2.0*nu))
   dompl(3,2)=(emod*nu)/((1.0+nu)*(1.0-2.0*nu))
   dompl(1,3)=(emod*nu)/((1.0+nu)*(1.0-2.0*nu))
   dompl(3,1)=(emod*nu)/((1.0+nu)*(1.0-2.0*nu))
   dompl(4,4)=emod/(1.0+nu)
   dompl(5,5)=emod/(1.0+nu)
   dompl(6,6)=emod/(1.0+nu)
   destrain(1)=-0.000005
   destrain(2)=-nu*destrain(1)
   destrain(3)=-nu*destrain(1)
   destrain(4)=0.0
   destrain(5)=0.0
   destrain(6)=0.0
   dstress=matmul(dompl,destrain)
   write(*,*) dstress
end program

为什么用matmul函数运算6×6的矩阵乘以6×1的矩阵得到的结果好像不对,结果的第二和第三个参数不应该是一样的吗?


22.png (124.65 KB, 下载次数: 255)

dompl

dompl

11.png (15.83 KB, 下载次数: 232)

结果

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

213

帖子

2

主题

0

精华

宗师

F 币
2126 元
贡献
875 点

规矩勋章

沙发
发表于 2021-5-22 00:37:54 | 只看该作者
本帖最后由 风平老涡 于 2021-5-22 11:21 编辑

因为在你的计算中有两个相近数值大小的数相减,产生的计算误差。
以下是6×6的矩阵乘以6×1的矩阵求和之前各个元素的乘积,红字体的数值相减会产生误差。后面一组蓝字体的数值产生同样结果。从所用的精度考虑,可以认为-5.2041704279304213E-018和 -6.9388939039072284E-018等同于0。

-0.36956520984199237        9.7826093418680333E-003   9.7826093418680333E-003   0.0000000000000000        0.0000000000000000        0.0000000000000000
总和= -0.34999999115825631

-6.5217393020947201E-002   5.5434783679079162E-002   9.7826093418680333E-003   0.0000000000000000        0.0000000000000000        0.0000000000000000     
总和=  -5.2041704279304213E-018; 前两项之和= - 9.782609341868039e-3


-6.5217393020947201E-002   9.7826093418680333E-003   5.5434783679079162E-002   0.0000000000000000        0.0000000000000000        0.0000000000000000     
总和=  -6.9388939039072284E-018;前两项之和= - 5.54347836790791677e-2


  -0.0000000000000000        0.0000000000000000        0.0000000000000000        0.0000000000000000        0.0000000000000000        0.0000000000000000     
总和=   0.0000000000000000     
  -0.0000000000000000        0.0000000000000000        0.0000000000000000        0.0000000000000000        0.0000000000000000        0.0000000000000000     
总和=   0.0000000000000000     
  -0.0000000000000000        0.0000000000000000        0.0000000000000000        0.0000000000000000        0.0000000000000000        0.0000000000000000     
总和=   0.0000000000000000

11

帖子

3

主题

0

精华

入门

F 币
44 元
贡献
41 点
板凳
 楼主| 发表于 2021-5-22 12:56:21 | 只看该作者
风平老涡 发表于 2021-5-22 00:37
因为在你的计算中有两个相近数值大小的数相减,产生的计算误差。
以下是6×6的矩阵乘以6×1的矩阵求和之前 ...

明白了  谢谢大佬
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-4-29 10:26

Powered by Tencent X3.4

© 2013-2024 Tencent

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