[EMAIL PROTECTED] writes:

> This is a multi-part message in MIME format.
> --------------020909040800030906040005
> Content-Type: text/plain; charset=KOI8-R; format=flowed
> Content-Transfer-Encoding: 7bit
> 
> Hi,
> 
> I've attached two files with the sources for a function to implement the 
> finite difference method for solving a particular differential equation.
> 
> One of them works correctly, the other gives wrong results or returns an 
> error, depending on the version of R.
> 
> The difference between them is that in the 'broken' version in line 42 I 
> check if the items in the two-dimensional array are bigger than a 
> certain value, and in the working one I do it in a separate loop.
> 
> A 2.1.1 build for Solaris returns the following error
> 
> Error in if ((X - (j - 1) * dS) > f[i, j]) f[i, j] = (X - (j - 1) * dS) 
> : missing value where TRUE/FALSE needed
> 
> On Windows both the stable 2.2.1 and 2.3.0rc gui versions will silently 
> produce incorrect data.

Why do you file a bug report for a bug in your own code?

The two loops can not be expected to give the same result since the
term f[i,2] might differ when j is in 3:M.

The platform difference could easily be due to floating point issues,
e.g. the difference between divide by zero and divide by near-zero.
 
> Nikolai.
> 
> --------------020909040800030906040005
> Content-Type: text/plain;
>  name="broken.txt"
> Content-Transfer-Encoding: 7bit
> Content-Disposition: inline;
>  filename="broken.txt"
> 
> findiff<-function(T,S_0,X,sigma,r,N,M)
> {
>       f=array(,c(N+1,M+1))
>       dT=T/N;
>       dS=2*S_0/M;
>       for (i in (1:(N+1))) 
>       {
>               f[i,1]=X;
>               f[i,M+1]=0;
>       }
>       for (j in (1:(M+1))) 
>       {
>               f[N+1,j]=max(X-(j-1)*dS,0);
>       }
>       a=0;
>       b=0;
>       c=0;
>       for (j in 1:M-1)
>       {
>               a[j+1]=.5*r*j*dT-.5*sigma^2*j^2*dT;
>               b[j+1]=1+sigma^2*j^2*dT+r*dT;
>               c[j+1]=-.5*r*j*dT-.5*sigma^2*j^2*dT;
>       } 
>       i=N;
>       while (i>0)
>       {
>               d=0;
>               e=0;
>               d[1]=f[i+1,1];
>               e[1]=0;
>               d[2]=0;
>               e[2]=1;
>               for (j in 2:M)
>               {
>                       d[j+1]=(f[i+1,j]-a[j]*d[j-1]-b[j]*d[j])/c[j];
>                       e[j+1]=(-a[j]*e[j-1]-b[j]*e[j])/c[j];
>               }
>               f[i,2]=(f[i,M+1]-d[M+1])/e[M+1];
>               for (j in 2:M)
>               {
>                       f[i,j]=d[j]+e[j]*f[i,2];
>                       if ((X-(j-1)*dS)>f[i,j]) f[i,j] = (X-(j-1)*dS);
>               }
>               i=i-1;
>       }
>       f;
> }
> 
> findiff(1,10,10,.3,.1,2,4)
> 
> --------------020909040800030906040005
> Content-Type: text/plain;
>  name="working.txt"
> Content-Transfer-Encoding: 7bit
> Content-Disposition: inline;
>  filename="working.txt"
> 
> findiff<-function(T,S_0,X,sigma,r,N,M)
> {
>       f=array(,c(N+1,M+1))
>       dT=T/N;
>       dS=2*S_0/M;
>       for (i in (1:(N+1))) 
>       {
>               f[i,1]=X;
>               f[i,M+1]=0;
>       }
>       for (j in (1:(M+1))) 
>       {
>               f[N+1,j]=max(X-(j-1)*dS,0);
>       }
>       a=0;
>       b=0;
>       c=0;
>       for (j in 1:M-1)
>       {
>               a[j+1]=.5*r*j*dT-.5*sigma^2*j^2*dT;
>               b[j+1]=1+sigma^2*j^2*dT+r*dT;
>               c[j+1]=-.5*r*j*dT-.5*sigma^2*j^2*dT;
>       } 
>       i=N;
>       while (i>0)
>       {
>               d=0;
>               e=0;
>               d[1]=f[i+1,1];
>               e[1]=0;
>               d[2]=0;
>               e[2]=1;
>               for (j in 2:M)
>               {
>                       d[j+1]=(f[i+1,j]-a[j]*d[j-1]-b[j]*d[j])/c[j];
>                       e[j+1]=(-a[j]*e[j-1]-b[j]*e[j])/c[j];
>               }
>               f[i,2]=(f[i,M+1]-d[M+1])/e[M+1];
>               for (j in 2:M)
>               {
>                       f[i,j]=d[j]+e[j]*f[i,2];
>               }
>               for (j in 2:M)
>               {
>                       if ((X-(j-1)*dS)>f[i,j]) f[i,j]=X-(j-1)*dS;
>               }
>               i=i-1;
>       }
>       f;
> }
> 
> findiff(1,10,10,.3,.1,2,4)
> 
> --------------020909040800030906040005--
> 
> ______________________________________________
> R-devel@r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
> 

-- 
   O__  ---- Peter Dalgaard             Ă˜ster Farimagsgade 5, Entr.B
  c/ /'_ --- Dept. of Biostatistics     PO Box 2099, 1014 Cph. K
 (*) \(*) -- University of Copenhagen   Denmark          Ph:  (+45) 35327918
~~~~~~~~~~ - ([EMAIL PROTECTED])                  FAX: (+45) 35327907

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to