Fortran Coder

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

[数值问题] 二分法无法处理浮点数,出现断点如何解决

[复制链接]

2

帖子

1

主题

0

精华

新人

F 币
22 元
贡献
5 点
跳转到指定楼层
楼主
发表于 2023-3-20 16:23:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 kyra 于 2023-3-21 08:54 编辑

[Fortran] 纯文本查看 复制代码
01module NUMERTICAL
02    implicit none
03    real, parameter :: zero = 0.00001
04    contains
05    real function bisect(A,B)!这是声明bisect返回值为一个浮点数
06    IMPLICIT NONE
07    real A,B
08    real C
09    real FA
10    real FB
11    real FC
12     
13     
14    C=(A+B)/2.0
15    FC=func(C)
16     
17    do while (abs(fc)> zero)
18        FA = func(A)
19        FB = func(B)
20        if(FA*FB < 0)then
21            B=C
22            C=(A+B)/2.0
23        else
24            A=C
25            C=(A+B)/2.0
26        end if
27        FC = FUNC(C)
28    end do
29    bisect = C
30    return
31    end function
32     
33     
34     
35    real function func(X)
36    implicit none
37    real X
38    FUNC = (X+3)*(X-3)
39    return
40    end function
41    end module
42     
43    program main
44    use NUMERTICAL
45    implicit none
46    real A,B
47    real ANS
48    do while(.true.)
49        write(*,*) '输入两个猜测值'
50        read(*,*)A,B
51        if(func(A)*func(B)<0) exit
52        write(*,*) "不正确的猜测"
53    end do
54     
55    ANS=bisect(A,B)
56    write(*,"('x=',F6.3)")ans
57    stop
58    end

当输入浮点数如2.1和4.1时就会显示出现断点,求助大佬如何解决
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

268

帖子

0

主题

0

精华

版主

World Analyser

F 币
749 元
贡献
526 点

新人勋章美女勋章元老勋章热心勋章规矩勋章管理勋章

QQ
沙发
发表于 2023-3-21 08:49:03 | 只看该作者
二分法的判断条件弄错了。

(1) 若f(c)=0,则c就是函数的零点;
(2) 若f(a)·f(c)<0,则令b=c;
(3) 若f(c)·f(b)<0,则令a=c.

[Fortran] 纯文本查看 复制代码
01module NUMERTICAL
02  implicit none
03  real, parameter :: zero = 0.00001
04 
05contains
06 
07  real function bisect(A,B) result(C)!这是声明bisect返回值为一个浮点数
08    real A,B,FA,FB,FC
09    C=(A+B)/2.0
10    FC=func(C)
11    do while (abs(fc)> zero)
12      FA = func(A)
13      FB = func(B)
14      if(FA*FC < 0)then !//这里注意
15        B=C
16      else if( fc*fb < 0 ) then !//这里注意
17        A=C
18      end if
19      C=(A+B)/2.0
20      FC = FUNC(C)
21    end do
22  end function bisect
23 
24  real function func(X)
25    real X
26    func = (X+3)*(X-3)
27  end function func
28   
29end module NUMERTICAL
30 
31program main
32  use NUMERTICAL
33  implicit none
34  real A,B
35  do
36    write(*,*) '输入两个猜测值'
37    read(*,*)A,B
38    if(func(A)*func(B)<0) exit
39    write(*,*) "不正确的猜测"
40  end do
41  write(*,"('x=',F6.3)") bisect(A,B)
42end program main

2

帖子

1

主题

0

精华

新人

F 币
22 元
贡献
5 点
板凳
 楼主| 发表于 2023-3-31 16:19:54 | 只看该作者
弄懂了,谢谢
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2025-3-15 18:16

Powered by Discuz! X3.4

© 2013-2025 Comsenz Inc.

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