Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Fortran应用程序中接收NaN值_Fortran_Nan - Fatal编程技术网

在Fortran应用程序中接收NaN值

在Fortran应用程序中接收NaN值,fortran,nan,Fortran,Nan,我正在开发一个Fortran应用程序,用于数值求解类型为:-y+qx*y=rx的二阶常微分方程的边值问题。在这个应用程序中,我使用高斯椭圆算法来求解线性方程组,并将解写入文件中。但对于解向量,我得到NaN。为什么会这样?下面是一些代码 subroutine gaussian_solve(s, c, error) double precision, dimension(:,:), intent(in out) :: s double precision, dimens

我正在开发一个Fortran应用程序,用于数值求解类型为:-y+qx*y=rx的二阶常微分方程的边值问题。在这个应用程序中,我使用高斯椭圆算法来求解线性方程组,并将解写入文件中。但对于解向量,我得到NaN。为什么会这样?下面是一些代码

      subroutine gaussian_solve(s, c, error)

    double precision, dimension(:,:), intent(in out) :: s
    double precision, dimension(:),   intent(in out) :: c
         integer        :: error

    if(error == 0) then
        call back_substitution(s, c)
    end if

     end subroutine gaussian_solve
!=========================================================================================

!================= Subroutine gaussian_ellimination ===============================
      subroutine gaussion_ellimination(s, c, error)

    double precision, dimension(:,:), intent(in out) :: s
    double precision, dimension(:),   intent(in out) :: c
    integer,            intent(out)  :: error

    real, dimension(size(s, 1)) :: temp_array
    integer, dimension(1)       :: ksave
    integer                     :: i, j, k, n
    real                        :: temp, m

    n = size(s, 1)

    if(n == 0) then
        error = -1 
        return
    end if

    if(n /= size(s, 2)) then
        error = -2 
        return
    end if

    if(n /= size(s, 2)) then 
        error = -3 
        return
    end if

    error = 0
    do i = 1, n-1
        ksave = maxloc(abs(s(i:n, i)))
        k = ksave(1) + i - 1
        if(s(k, i) == 0) then
            error = -4
            return
        end if

        if(k /= i) then
            temp_array = s(i, :)
            s(i, :) = s(k, :)
            s(k, :) = temp_array
            temp = c(i)
            c(i) = c(k)
            c(k) = temp
        end if

        do j = i + 1, n
            m = s(j, i)/s(i, i)
            s(j, :) = s(j, :) - m*s(i, :)
            c(j) = c(j) - m*c(i)
        end do
    end do

     end subroutine gaussion_ellimination
     !==========================================================================================

   !================= Subroutine back_substitution ========================================
     subroutine back_substitution(s, c)

    double precision, dimension(:,:), intent(in) :: s
    double precision, dimension(:),   intent(in out) :: c

    real    :: w
    integer :: i, j, n

    n = size(c)

    do i = n, 1, -1
        w = c(i)
        do j = i + 1, n
            w = w - s(i, j)*c(j)
        end do
        c(i) = w/s(i, i)
    end do

      end subroutine back_substitution
其中si,j是系统系数的矩阵,ci是解向量。

您不应该为高斯消去或类似的矩阵运算编写自己的例程。像LAPACK这样无处不在的软件包将比您自己编写的任何软件包都具有更快、更准确的版本;在LAPACK中,对于一般矩阵,您可以使用and的组合,但如果您有带状矩阵或符号矩阵,则也有针对这些矩阵的特殊例程。您会发现为您的系统找到并安装一个优化的线性代数软件包非常容易。寻找像atlas、flame或gotoblas这样的包名

在上面的代码中,在gaussian_solve例程的开始附近可能会有一个调用gaussion_elliminations,c,error,temp_数组和temp以及m和w也应该是双精度的,以避免失去双精度矩阵的精度,检查是否与浮点零完全相等是一种危险的策略,我会检查你的输入矩阵-如果有任何线性退化,你会得到所有的NaN,特别是如果它是最后一行向量,它与前面的任何一行向量线性退化

如果这不能解决问题,您可以使用信号NAN来找出问题首先出现的位置--但是您最好使用现有的包来处理这样的事情,这是多年来研究线性方程组数值解的人写的。

你不应该为高斯消去法或类似的矩阵运算编写自己的例程。像LAPACK这样无处不在的软件包将比您自己编写的任何软件包都具有更快、更准确的版本;在LAPACK中,对于一般矩阵,您可以使用and的组合,但如果您有带状矩阵或符号矩阵,则也有针对这些矩阵的特殊例程。您会发现为您的系统找到并安装一个优化的线性代数软件包非常容易。寻找像atlas、flame或gotoblas这样的包名

在上面的代码中,在gaussian_solve例程的开始附近可能会有一个调用gaussion_elliminations,c,error,temp_数组和temp以及m和w也应该是双精度的,以避免失去双精度矩阵的精度,检查是否与浮点零完全相等是一种危险的策略,我会检查你的输入矩阵-如果有任何线性退化,你会得到所有的NaN,特别是如果它是最后一行向量,它与前面的任何一行向量线性退化

如果这不能解决问题,你可以使用信号NAN来找出问题首先出现的地方——但是你最好使用现有的软件包来解决这样的问题,这些软件包是由研究线性方程组数值解多年的人编写的