Fortran Coder

查看: 7799|回复: 3
打印 上一主题 下一主题

[数值问题] 运行时一直运行不出来

[复制链接]

12

帖子

2

主题

0

精华

入门

F 币
51 元
贡献
31 点
跳转到指定楼层
楼主
发表于 2019-9-19 13:43:43 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
求助
请问我下面的程序,build时并没有问题,但是运行时一直运行不出来(就是我按回车他没有反应)。请问我下面的程序是有什么问题吗
[Fortran] 纯文本查看 复制代码
01program main
02  implicit none
03  external roots1
04  external roots2
05  integer::x,y
06  real::a,b,c,m,n
07 
08  write(*,*) "please input two positive numbers"
09  read(*,*) x,y
10  a=real(x)
11  b=real(y)
12  call roots2(a,b,c)
13 
14  write(*,*) "the first root:"
15  call roots1(a,c,m)
16 
17  write(*,*) "the second root:"
18  call roots1(c,b,n)
19 
20end program
21 
22subroutine roots1(a,b,c)
23    implicit none
24    real,intent(in)::a,b
25    real::p,q
26    real,intent(out)::c
27 
28    p=a
29    q=b
30    do
31        if(f1(p)*f1(q)<0)then
32            c=(p+q)/2
33            if(abs(f1(c))<0.0000001)then
34                write(*,100) c
35                100 format(F10.4)
36                exit
37            elseif(f1(p)*f1(c)<0)then
38                q=c
39 
40            else
41                p=c
42 
43            end if
44        end if
45    end do
46 
47    contains
48    real function f1(x)
49    implicit none
50    real,intent(in)::x
51    f1=x**3-5*x+3
52    end function
53 
54  end subroutine
55 
56  subroutine roots2(a,b,c)
57 
58    real,intent(in)::a,b
59    real::p,q
60    real,intent(out)::c
61 
62    p=a
63    q=b
64    do
65        if(f2(p)*f2(q)<0)then
66           c=(p+q)/2
67           if(abs(f2(c))<0.0000001)then
68            c=(p+q)/2
69            exit
70           elseif(f2(p)*f2(c)<0)then
71            q=c
72 
73           else
74            p=c
75 
76          end if
77        end if
78 
79    end do
80 
81    contains
82     real function f2(x)
83      implicit none
84      real,intent(in)::x
85      f2=3*x**2-5
86     end function
87 
88  end subroutine

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

12

帖子

2

主题

0

精华

入门

F 币
51 元
贡献
31 点
沙发
 楼主| 发表于 2019-9-19 13:44:27 | 只看该作者
是一个方程 求解的问题

837

帖子

2

主题

0

精华

大宗师

F 币
3934 元
贡献
2338 点
板凳
发表于 2019-9-19 19:37:50 | 只看该作者
本帖最后由 li913 于 2019-9-19 19:46 编辑

死循环,跳出循环的条件 abs(f2(c))<0.0000001 太苛刻。改为 abs(f2(c))<1.0e-5。用盛金公式直接求得所有根,快多了。

QQ截图20190919154500.png (221.98 KB, 下载次数: 265)

QQ截图20190919154500.png

12

帖子

2

主题

0

精华

入门

F 币
51 元
贡献
31 点
地板
 楼主| 发表于 2019-9-19 20:15:39 | 只看该作者
谢谢!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2025-4-4 16:34

Powered by Discuz! X3.4

© 2013-2025 Comsenz Inc.

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