24小时热门版块排行榜    

查看: 606  |  回复: 1

lernen8

新虫 (初入文坛)

[求助] 求帮助!改Function中的可变系数进行循环计算的问题

没有金币了啊!!!希望发扬雷锋精神啊!求大神帮忙解决问题啊!
我想用Fortran 求解非线性方程组,程序是Monte Carlo法
程序由主程序,Function, Subroutine三部分组成。
Function给出了非线性方程组,通过subroutine进行计算非线性方程组,主程序给出了初始计算值X1,X2,X3。

问题是, Function 中有个系数M是变化的,
在subroutine(或者主程序)中,先设定了初始值M0,每次计算结束了X后,由X计算新的M=f(x).
如果新Mc 和旧M差别在1.0E-05内就结束计算,
否则重新赋予Function 系数M, 重新调用子程序循环计算X.

     DIMENSION X(N), Y( N)
     REAL NRND1
     External F
      Double precision R, M, M0, Mc
      Double precision R=1.0E-4; d=30.0E-3; k=383.0;
     * h=40000.0; T=303.0
        A= B
        K= 1
        R= 1.0E0
        M0=450.0
40      M=M0
       Z= F(X, N, M)
  10   IF (A. GE. EPS) THEN
      L= L+ 1
      DO 20 I= 1, N
  20  Y(I) = -A+ 2.0* A* NRND1(R) + X(I)
      Z1= F(Y, N, M)
      K= K+ 1
      IF ( Z1. GE. Z) THEN
      IF (K .GT. M) THEN
       K= 1
       A= A/2.0
      ENDIF
      GOTO 10
      ELSE
       K= 1
      DO 30 I= 1, N
  30   X(I) = Y( I)
       Z= Z1
       IF ( Z. GE. EPS) GOTO 10
      ENDIF
       ENDIF
      
      Mc=T+(1000.0*X(1)-M)*(d/k+1/h)/R
      IF(ABS(M-Mc) .GE. EPS) THEN
      M0=(M+Mc)/2
      GOTO 40   
      
      ENDIF
      END

上面程序是对subroutine的修改。倒数第6行直接调用X1对新的Mc计算,并赋值给M0,然后返回行40。
但是貌似根本就没有把新的M传递给方程F(X,N,M)进行循环计算。最后只有第一次的结果。

难道计算得到的X1不能直接调用,用于方程计算么?(尝试过把X1直接调出主程序计算倒数第6行的方程,方程结果根本就不对)
此子程序有否错误呢?
谢谢!
回复此楼

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

学虫dj

金虫 (正式写手)

看了半天没看懂~楼主最好把代码打包,问题说清楚~
穷则独善其事,达则兼济天下
2楼2014-05-26 16:40:35
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 lernen8 的主题更新
信息提示
请填处理意见