LabaKeKZEVX()无法收敛——如何在C++中用2×DLAMCH(s’)增加AbSTOL? 这是一个关于用C++中的LaPaCKEZEZVX函数收敛特征值计算的适当公差ABSTOL的问题。p>

LabaKeKZEVX()无法收敛——如何在C++中用2×DLAMCH(s’)增加AbSTOL? 这是一个关于用C++中的LaPaCKEZEZVX函数收敛特征值计算的适当公差ABSTOL的问题。p>,c++,lapack,lapacke,C++,Lapack,Lapacke,当LAPACKE_zheev在使用默认值Absol(即Absol=-1)计算特征值/特征向量时无法收敛时,LAPACK手册要求设置Absol=2*DLAMCH'S。但是,DLAMCH是FORTRAN函数,而我使用C++,它不把它看作一个有效的C++函数。有没有人可以帮助我如何正确地设置AbSTOL=2 *DLAMCH’,当使用LabAcc+C++时,即使用LAPACKE?< /P> 非常感谢 背景: LAPACKE是用于数值代数的LAPACK FORTRAN库的C++接口。LAPACKEZEZV

当LAPACKE_zheev在使用默认值Absol(即Absol=-1)计算特征值/特征向量时无法收敛时,LAPACK手册要求设置Absol=2*DLAMCH'S。但是,DLAMCH是FORTRAN函数,而我使用C++,它不把它看作一个有效的C++函数。有没有人可以帮助我如何正确地设置AbSTOL=2 *DLAMCH’,当使用LabAcc+C++时,即使用LAPACKE?< /P> 非常感谢

背景: LAPACKE是用于数值代数的LAPACK FORTRAN库的C++接口。LAPACKEZEZVX是LAPACK的ZEVEX函数的LAPACKE C++接口。 关键词:
LAPACK、LAPACKE、C++、AbSTOL、DLAMCH、收敛、特征值、特征向量

< P>我对这些库一无所知,但有点Google显示有一个相应的函数:

double LAPACKE_dlamch(char cmach)
因此,您应该能够将LAPACKE_dlamch’作为以下参数的Absol第12个参数传递:


我对这些库一无所知,但通过谷歌搜索发现有一个对应的函数:

double LAPACKE_dlamch(char cmach)
因此,您应该能够将LAPACKE_dlamch’作为以下参数的Absol第12个参数传递:


除了Jon Purdy的答案之外,这实际上是一条路:

是Fortran中dlamch.f的定义。通过该函数,并获得LAPACK内在函数,人们看到对于输入的函数,转换为C++的函数变成:

auto dlamch_s()
{
    auto one = 1.0;
    auto rnd = one;
    auto eps = (one == rnd ? 0.5 : 1.0) * std::numeric_limits<double>::epsilon();
    auto sfmin = std::numeric_limits<double>::min();
    auto small = one / std::numeric_limits<double>::max();
    if(small>=sfmin)
    {
        sfmin = small*(one + eps);
    }
    return sfmin;
}

但是,不要问我为什么需要one==rnd步骤。

除了Jon Purdy的答案之外,这实际上是一条路:

是Fortran中dlamch.f的定义。通过该函数,并获得LAPACK内在函数,人们看到对于输入的函数,转换为C++的函数变成:

auto dlamch_s()
{
    auto one = 1.0;
    auto rnd = one;
    auto eps = (one == rnd ? 0.5 : 1.0) * std::numeric_limits<double>::epsilon();
    auto sfmin = std::numeric_limits<double>::min();
    auto small = one / std::numeric_limits<double>::max();
    if(small>=sfmin)
    {
        sfmin = small*(one + eps);
    }
    return sfmin;
}

但是,不要问我为什么需要一个==rnd步骤。

我完全不知道你在问什么。起初它看起来像是机器人生成的文本。谢谢你的评论,让我重新表述一下这个问题。我真的不知道你在问什么。一开始它看起来像是机器人生成的文本。谢谢你的评论,让我重新表述一下这个问题。谢谢大家!这周让我试试,我会发布我的发现。谢谢大家!这周让我试试,我会把我的发现贴出来。