爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 2810|回复: 6

[求助] 新手求大神指点

[复制链接]

新浪微博达人勋

发表于 2016-8-28 12:38:47 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
以下是我编辑的程序,在do while语句语境下出现死循环,如果出去do while 语句,可求出每一步的结果,菜鸟新手实在查不出错误在哪,求大神指点{:eb505:}{:eb505:}
QQ图片20160828123111.png
QQ图片20160828123127.png
QQ图片20160828123136.png
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-8-28 14:08:55 | 显示全部楼层
死循环也是有print的结果吧,贴出来看看
话说代码直接复制上来,不要贴图片
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2016-8-28 14:45:08 | 显示全部楼层
QQ图片20160828144355.png
program mian
    implicit none
    real x(3,2),f(3),xh(2),xl(2),x0(2),xr(2),xe(2),xc(2)
    integer i,k
    real fh,fl,fs,f0,fr,fe,fc,t,q
    external num
    read*,x
     fh=-10
     fl=100
     fs=0
     t=0
     q=1
    call num(x(1,1:2),f(1))
    call num(x(2,1:2),f(2))
    call num(x(3,1:2),f(3))
do while(q.gt.0.2)
  do i=1,3
    if(fh.lt.f(i))then
        fh=f(i)
        xh=x(i,1:2)
        k=i
    end if
  end do
do i=1,3
    if(fl.gt.f(i))then
        fl=f(i)
        xl=x(i,1:2)
    end if
end do
do i=1,3
    if((f(i).lt.fh).and.(f(i).gt.fl))then
        fs=f(i)
    end if
end do
print*,fh,xh,fl,xl
x0=(x(1,1:2)+x(2,1:2)+x(3,1:2)-xh)/2
call num(x0,f0)
xr=2*x0-xh
call num(xr,fr)
if(fr.lt.fl)then
    xe=2*xr-x0
    call num(xe,fe)
    if(fe.lt.fl)then
        x(k,1:2)=xe
        f(k)=fe
        xh=xe
        fh=fe
        else if(fe.ge.fl)then
            x(k,1:2)=xr
            f(k)=fr
            xh=xr
            fh=fr
    end if
else if(fr.ge.fl)then
        if(fr.gt.fl)then
            if(fr.gt.fh)then
            xc=0.5*xh+0.5*x0
            call num(xc,fc)
          else if(fr.le.fh)then
            xh=xr
            fh=fr
            xc=0.5*xh+0.5*x0
            call num(xc,fc)
            end if
            if(fc.gt.fh)then
                do i=1,3
                    x(i,1:2)=(x(i,1:2)+xl)/2
                end do
                else if(fc.le.fh)then
                    x(k,1:2)=xc
                    f(k)=fc
                    xh=xc
                    fh=fc
            end if
        end if
    end if
do i=1,3
    t=t+(f(i)-f0)**2
end do
q=sqrt(t/3)
print*,x,q
end do
end program
!外部子列行程序
subroutine num(a,s)
    implicit none
    real a(2),s
    s=a(1)-a(2)+2*a(1)**2+2*a(1)*a(2)+a(2)**2
end subroutine num

密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-8-28 15:13:34 | 显示全部楼层
程序语法是没问题的,问题也不在do while这个循环上。至于为什么死循环,估计是某个地方编写的有错误导致不收敛吧。
不知道这个程序是要干什么的,所以楼主还是认真检查下具体过程吧。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2016-8-28 16:30:05 | 显示全部楼层
lqouc 发表于 2016-8-28 15:13
程序语法是没问题的,问题也不在do while这个循环上。至于为什么死循环,估计是某个地方编写的有错误导致不 ...

多谢!我把每一步的结果和要带入下一步的值都算出来了,也是正确的,但还是不知道什么原因导致死循环,菜鸟还有许多要学习的地方
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-8-31 09:57:49 | 显示全部楼层
你x数组的取值太大导致的。你可以把值取小一些。比如都取为0.1。如果你感兴趣的话可以把代码好好整理一遍,甚至你可以用MATLAB把t的曲线画出来,你就会发现问题所在。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2016-9-11 13:13:50 | 显示全部楼层
Lighting 发表于 2016-8-31 09:57
你x数组的取值太大导致的。你可以把值取小一些。比如都取为0.1。如果你感兴趣的话可以把代码好好整理一遍, ...

多谢,现在已经找出问题了,是一些初始值赋值不能符合do while语句条件
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

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