Fortran Coder

查看: 15108|回复: 16
打印 上一主题 下一主题

[数值问题] 大家好,负数取小数指数的问题

[复制链接]

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
楼主
发表于 2014-12-9 11:59:57 | 显示全部楼层
9个屏幕输入,你只给了8个。

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
沙发
发表于 2014-12-9 23:20:40 | 显示全部楼层
你的问题在于:

FunCO2 函数中
[Fortran] 纯文本查看 复制代码
FunCO2 = ( QB*AbCO2 + (DLCO2/Cos*QE*AaCO2)/(DLCO2/Cos+QE*AaCO2))*x
     +      + QB*XNCO2*(0.063*x**0.83083)
这里有 x ** 0.83083 这个语句。 Fortran 中的指数为小数时,x 不能为负数。

这个 0.83083 是什么含义?可否写成分数的形式?

另外,为了安全,我建议你把 **2.0 都改为 **2,**3.0 都改为 **3
指数如果可以是整数,就不要写成小数。

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
板凳
发表于 2014-12-10 16:04:53 | 显示全部楼层
本帖最后由 vvt 于 2014-12-10 16:06 编辑

负数不能开偶次方,所以负数也就不能取偶数倒数的指数。

这是数学问题决定的。不是 fortran 决定的。

解决方法:
1.寻求 0.83083 的分数形式。比如 多少除以多少这种。
2.保证 x 大于 0。

没有别的办法。

如果这两个办法你都无法做到,那我就帮不了你了。

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
地板
发表于 2014-12-10 20:02:03 | 显示全部楼层
i , j , k 循环是。当 i = 1 , j = 2 , k = 2 时,
PaCO2 = PaCO20 - FunCO2(PaCO20)/ dFunCO2(PaCO20)
结果大概是 -2.0 导致负数

在上一次迭代时,PaCO20 = 55.41635,FunC02(PaCO20) = 342.9697 , dFunCO2 = 5.932721

所以 55.41635 - 342.9697 / 5.932721 = -2

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
5#
发表于 2014-12-11 23:30:50 | 显示全部楼层
本帖最后由 vvt 于 2014-12-11 23:50 编辑

我说寻找 0.83083 的小数形式,并不是说,改成小数形式就可以解决问题的。
而是可以看出它是一个偶函数(只考虑实数域),所以可以在 x 上取一个 abs(x) 绝对值。

比如:
[Fortran] 纯文本查看 复制代码
SCO2  = 0.063*abs(PaCO20)**(50000./60181)
     +  /(1+0.63*abs(PaCO20)**(50000./60181)+0.275*ST(PaO20+COMM*PaCO0) )
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-5-26 21:01

Powered by Tencent X3.4

© 2013-2024 Tencent

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