24小时热门版块排行榜    

查看: 2551  |  回复: 10

Bai_xuan

铜虫 (初入文坛)

[求助] matlab和fortran语言计算结果差别很大 已有1人参与

求助呀~
同一个程序同一套数据为什么用fortran和用matlab计算的结果差很多?
第一次计算的结果基本一致,当迭代5000次以后结果竟然差了将近5倍。
这该怎么办呀?为什么会这样啊。。。要相信哪套结果?

[ 发自手机版 http://muchong.com/3g ]
回复此楼

» 猜你喜欢

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

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

浔荆

木虫 (正式写手)

【答案】应助回帖

感谢参与,应助指数 +1
任何语言都是图灵等价的,结果不同肯定是代码的问题。
你看看两套代码算法是否相同,数据结构、类型是否也相同?
可以把源代码贴上来让大家帮你分析分析。
2楼2015-04-20 09:20:56
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

Bai_xuan

铜虫 (初入文坛)

matlab程序如下


function Lambda_1 = Wolf_lyap_timeseries(data,N,m,tau,DT,LMX,LMN,EVOLV)

global LE;
global ITS;

% 该函数根据Alan Wolf 1985年发表的文章中附录B给出的fortran代码进行翻译
% Determining lyapunov exponents from a time series,Physica 16D,1985
% data:所求实验系统的时间序列
% N:data数据的长度
% m:相空间重构时的嵌入维数
% tau:相空间重构时的时间延迟(s)
% DT:数据的采样间隔(s)
% EVOLV:替换步之间的演化时间(s)
% LE:时间序列的最大Lyapunov指数(bits/s)

Y = reconstitution(data,N,m,tau);               
IND = 1;                                       
SUM = 0.0;                                      
ITS = 0;                                       

N = N - m * tau - EVOLV;                        

% 寻找初始点的最近点,并计算最短距离DI
DI = 1e+38;                                    
for i = 11 : N                                 
    D = 0.0;                                    
    for j = 1 : m
        D = D + (Y(j,IND)-Y(j,i))*(Y(j,IND)-Y(j,i));
    end
    D = sqrt(D);
    if D > DI || D < LMN                        
        continue;
    else
        DI = D;
        IND2 = i;                              
        continue;
    end
end   

% 确定演化后的坐标点
Lock = 1;                                       
while ( Lock )
    for j = 1 : m
        PT1(j) = Y(j,IND+EVOLV);               
        PT2(j) = Y(j,IND2+EVOLV);
    end

% 计算演化后的距离DF
    DF = 0.0;
    for j = 1 : m
        DF = DF + (PT1(j)-PT2(j))*(PT1(j)-PT2(j));
    end
    DF = sqrt(DF);
    ITS = ITS + 1;                              
    SUM = SUM + log(DF/DI)/(EVOLV*DT*log(2));   
    LE(ITS) = SUM/ITS;                           
     
    % 寻找替换点
    INDOLD = IND2;                              
   
    Lock1 = 1;
    ZMULT = 1.0;                                
    ANGLMX = 0.3;                              
    while ( Lock1 )                                   
        THMIN = 3.14;
        for i = 1 : N
            iii = abs(i-(IND+EVOLV));           
            if iii > 10   
                DNEW = 0.0;                        
                for j = 1 : m
                    DNEW = DNEW + (PT1(j)-Y(j,i))*(PT1(j)-Y(j,i));
                end
                DNEW = sqrt(DNEW);
        
                if DNEW < ZMULT*LMX && DNEW > LMN
                    DOT = 0.0;                     
                    for j = 1 : m
                        DOT = DOT + (PT1(j)-Y(j,i)*(PT1(j)-PT2(j)));
                    end
                    CTH = abs(DOT/DNEW*DF);         
                    if CTH > 1
                        CTH = 1;
                    end
                    TH = acos(CTH);
        
                    if TH < THMIN
                        THMIN = TH;                 
                        DII = DNEW;                 
                        IND2 = i;                  
                    end
                end
            end
        end
   
        if THMIN > ANGLMX                       
            ZMULT = ZMULT + 1;                  
            if ZMULT > 5                        
                ZMULT = 1.0;                  
                ANGLMX = ANGLMX*2;            
                if ANGLMX > 3.14               
                    IND2 = INDOLD + EVOLV;     
                    DII = DF;                  
                    Lock1 = 0;                  
                end
            end
        else
            Lock1 = 0;                          
        end
    end
   
    IND = IND + EVOLV;                          
    if IND >= N                                 
        Lambda_1 = LE(end);                     
        Lock = 0;                              
    else
        DI = DII;                              
    end
end
3楼2015-04-20 19:33:33
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

Bai_xuan

铜虫 (初入文坛)

fortran程序如下: 这是Wolf文献中的,没有进行任何改变。


    PROGRAM FET1
    INTEGER DIM,TAU,EVOLV
    DIMENSION X(50000),PT1(30),PT2(30)
!
!   **DEFINE DELAY COORDINATES WITH A STATEMENT FUNCTION**
!   **Z(I,J)=JTH COMPONENT OF ITH RECONSTRUCTED ATTRACTOR POINT**
!
    Z(I,J) = X(I+(J-1)*TAU)
!
    OPEN (UNIT=1,FILE='a.txt',STATUS='OLD')
    OPEN (UNIT=20,FILE='result.txt',STATUS='OLD')
!
    TYPE*,'PLEASE INPUT NPT,DIM,TAU,DT,SCALMX,SCALMN,EVOLV'
    ACCEPT*,NPT,DIM,TAU,DT,SCALMX,SCALMN,EVOLV
!
!   **IND POINTS TO FIDUCIAL TRAJECTORY**
!   **IND2 POINTS TO SECOND TRAJECTORY**
!   **SUM HOLDS RUNNING EXPONENT ESTIMATE SANS 1/TIME**
!   **ITS IS TOTAL NUMBER OF PROPAGATION STEPS**
!
    IND = 1
    SUM = 0.0
    ITS = 0
!
!   **READ IN TIME SERIES**
!
    DO 10 I = 1,NPT
        READ (1,*) X(I)
10  CONTINUE
!
!   **CALCULATE USEFUL SIZE OF DATAFILE
!
    NPT = NPT - DIM*TAU - EVOLV
!
!   **FIND NEAREST NEIGHBOR TO FIRST DATA POINT**
!
    DI = 1.E38
!
!   **DONT TAKE POINT TOO CLOSE TO FIDUCIAL POINT**
!
    DO 30 I = 11,NPT
!
!   **COMPUTE SEPARATION BETWEEN FIDUCIAL POINT AND CANDIDATE**
!
        D = 0.0
        DO 20 J = 1,DIM
            D = D + (Z(IND,J)-Z(I,J))**2
20      CONTINUE
        D = SQRT(D)
!
!   **STORE THE BEST POINT SO FAR BUT NO CLOSER THAN NOISE SCALE**
!
        IF (D.GT.DI.OR.D.LT.SCALMN) GO TO 30
        DI = D
        IND2 = I
30  CONTINUE
!
!   **GET COORDINATES OF EVOLVED POINTS**
!
40  DO 50 J = 1,DIM
        PT1(J) = Z(IND+EVOLV,J)
        PT2(J) = Z(IND2+EVOLV,J)
50  CONTINUE
!
!   **COMPUTE FINAL SEPARTION BETWEEN PAIR,UPDATE EXPONENT**
!
    DF = 0.0
    DO 60 J = 1,DIM
        DF = DF+(PT1(J)-PT2(J))**2
60  CONTINUE
    DF = SQRT(DF)
    ITS = ITS + 1
    SUM = SUM + ALOG(DF/DI)/(FLOAT(EVOLV)*DT*ALOG(2.))
    ZLYAP = SUM/FLOAT(ITS)
    TYPE*,ZLYAP,EVOLV*ITS,DI,DF
    WRITE(20,*) ZLYAP
!
!   **LOOK FOR REPLACEMENT POINT**
!   **ZMULT IS MULTIPLIER OF SCALMX WHEN GO TO LONGER DISTANCES**
!
    INDOLD = IND2
    ZMULT = 1.0
    ANGLMX = 0.3
70  THMIN = 3.14
!
!   **SEARCH OVER ALL POINTS**
!
    DO 100 I = 1,NPT
!
!   **DONT TAKE POINTS TOO CLOSE IN TIME TO FIDUCIAL POINT**
!
        III = IABS(I-(IND+EVOLV))
        IF (III.LT.10) GO TO 100
!
!   **COMPUTE DISTANCE BETWEEN FIDUCIAL POINT AND CANDIDATE**
!
        DNEW = 0.0
        DO 80 J = 1,DIM
            DNEW = DNEW + (PT1(J)-Z(I,J))**2
80      CONTINUE
        DNEW = SQRT(DNEW)
!
!   **LOOK FURTHER AWAY THAN NOISE SCALE,CLOSER THAN ZMULT*SCALMX**
!
        IF (DNEW.GT.ZMULT*SCALMX.OR.DNEW.LT.SCALMN) GO TO 100
!
!   **FIND ANGULAR CHANGE OLD TO NEW VECTOR**
!
        DOT = 0.0
        DO 90 J = 1,DIM
            DOT = DOT + (PT1(J)-Z(I,J))*(PT1(J)-PT2(J))
90      CONTINUE
        CTH = ABS(DOT/(DNEW*DF))
        IF (CTH.GT.1.0) CTH = 1.0
        TH = ACOS(CTH)
!
!   **SAVE POINT WITH SMALLEST ANGULAR CHANGE SO FAR**
!
        IF (TH.GT.THMIN) GO TO 100
        THMIN = TH
        DII = DNEW
        IND2 = I
100 CONTINUE
    IF (THMIN.LT.ANGLMX) GO TO 110
!
!   **CANT FIND A REPLACEMENT - LOOK AT LONGER DISTANCES**
!
    ZMULT = ZMULT + 1.
    IF (ZMULT.LE.5.) GO TO 70
!
!   **NO REPLACEMENT AT 5*SCALE,DOUBLE SEARCH ANGLE,RESET DISTANCE**
!
    ZMULT = 1.0
    ANGLMX = 2.*ANGLMX
    IF (ANGLMX.LT.3.14) GO TO 70
    IND2 = INDOLD + EVOLV
    DII = DE
110 CONTINUE
    IND = IND + EVOLV
!
!   **LEAVE PROGRAM WHEN FIDUCIAL TRAJECTORY HITS END OF FILE**
!
    IF (IND.GE.NPT) GO TO 120
    DI = DII
    GO TO 40
120 CALL EXIT
    END
4楼2015-04-20 19:34:28
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

Bai_xuan

铜虫 (初入文坛)

这张图片是显示了计算得到的LE随迭代次数的变化。。。matlab和fortran基本保持一致,所以应该不是程序的问题吧。。。
matlab和fortran语言计算结果差别很大
matlab和fortran.png

5楼2015-04-20 19:39:44
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

Bai_xuan

铜虫 (初入文坛)

引用回帖:
2楼: Originally posted by 浔荆 at 2015-04-20 09:20:56
任何语言都是图灵等价的,结果不同肯定是代码的问题。
你看看两套代码算法是否相同,数据结构、类型是否也相同?
可以把源代码贴上来让大家帮你分析分析。

程序已发,求指导。。。
6楼2015-04-20 19:40:10
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

1120110239

银虫 (小有名气)

看了一下,果然不会~~~~~~
奋斗!
7楼2015-04-20 19:50:29
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

Bai_xuan

铜虫 (初入文坛)


之前那张图片好像没发成功,重发一张
8楼2015-04-20 19:58:34
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

Bai_xuan

铜虫 (初入文坛)

额,图片上只计算了1000个数据,所以只迭代了300多次。
9楼2015-04-20 20:01:50
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

thomas2011

铁杆木虫 (正式写手)

引用回帖:
5楼: Originally posted by Bai_xuan at 2015-04-20 19:39:44
这张图片是显示了计算得到的LE随迭代次数的变化。。。matlab和fortran基本保持一致,所以应该不是程序的问题吧。。。

matlab和fortran.png
...

楼主问题解决了吗?
我也遇到了类似的问题,Fortran结果与matlab相差较大,刚开始还差不多重合,后来相差越来越大。
快乐学习
10楼2015-11-05 10:38:36
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 Bai_xuan 的主题更新
信息提示
请填处理意见