计算有理函数的残差

计算科学 复分析
2021-12-28 14:58:02

我有一个函数 所有的都是简单的两极。该函数的残差为 例如要找到首先取消分子和分母,然后取极限所以结果是 同样可以找到 , ,

f(z)=1(zz1)(zz2)(zz3)(zz4)
{z1,z2,z3,z4}
Res(f(z),zi)=limzzi(zzi)(zz1)(zz2)(zz3)(zz4)
Res(f(z),z1)(zz1)zz1
Res(f(z),z1)=1(z1z2)(z1z3)(z1z4)
Res(f(z),z2)Res(f(z),z3)Res(f(z),z4)

我想在一个函数中实现这个残差查找算法。Cpp我试图这样实现

double z1 = 1.0;
double z2 = 2.0;
double z3 = 3.0;
double z4 = 4.0;

auto res = [&](double z){
return [&](double zi){
    return (z-zi)/((z-z1)*(z-z2)*(z-z3)*(z-z4));
}(z);
};

-nan当我计算res(z1)函数变为形式时,这会返回。我想定义一个函数,它首先去掉分子和分母中的公因子,然后将值放入函数中。对于具有简单极点的足够简单的函数,这应该足以找到残差。00z1

如何做到这一点Cpp

1个回答

您可以通过函数的极点对函数进行参数化,而不是使用 switch 子句对所有情况进行硬编码:

double residue(size_t i, const std::vector<double> &poles) {
  double res = 1.0;
  for (size_t j=0; j < poles.size(); j++) {
     if (j != i) {
        res *= 1 / (poles[i] - poles[j]);
     }
  }
  return res;
}

作为旁注,我想知道 de l'Hospital 的规则在不太简单的功能的情况下是否会有所帮助。