【问题标题】:Iteratively Modifying a Function in C在 C 中迭代地修改函数
【发布时间】:2014-10-21 23:34:17
【问题描述】:

我正在尝试在 C 中创建一个数字根查找器,以查找贝塞尔函数的零点。数学函数 F(x) 可以通过将函数除以 (x-x0) 来缩小,其中 x0 是已知的根。结果函数 G(x) = F(x)/(x-x0) 具有 F(x) 除了 x0 以外的所有根。这很有用,因为它可以防止求解器两次找到相同的根。

当我使用求解器找到根时,它会写入数组Roots[]。 贝塞尔函数在math.h 中定义为double j0(double x)

我想迭代修改double j0(double x),这样我就可以拥有:

double my_j0(double x) = j0(x)/(x-Roots[n]);

然后我可以在我的求解器中调用这个新的、压缩的函数。

上面的语法没有意义,但我不知道如何表示它。

我尝试使用函数指针并定义

double (*my_j0)(double); my_j0 = &j0;

但现在我不知道如何迭代地修改函数,每次除以我用我的求解算法找到的根。

感谢您的帮助!

【问题讨论】:

  • 函数F(x)/(x - x0)x0 有一个可移除的奇点。您真正想要解决的是该函数在奇点上的解析延拓。
  • 本质上我想我想问的是这个:stackoverflow.com/questions/1839965/… 我认为结果是我想要做的事情在 C 语言中实际上是不可能/非常困难的。

标签: c numerical-methods


【解决方案1】:

您可以将它作为参数传递给带有起始案例的递归函数。如果您尝试解决迭代问题,这样的事情可能会起作用。

double my_j0(double x, double my_root){
    if(//some base case){
        //final calculation
        return calculation
    }
    if(my_root == some_initialization){
    //do initial calculation work
        my_root = calculated_root;
    }
    else{
    //do calculations using your root
        my_root = calculated_root;
    }
    return my_j0(x, my_root)

【讨论】:

    【解决方案2】:

    经过更多的经验,我意识到我真正需要的是匿名函数或 lambda 函数。可以在 SO question 上找到关于什么是 lambda 函数的精彩介绍。

    不幸的是,C 不支持 lambda 函数,但是,GCC(使用宏)和 Clang 编译器都支持用于实现 lambda 函数的语言扩展,可以在 Wikipedia 上找到。

    【讨论】:

      猜你喜欢
      • 2021-10-08
      • 2019-02-17
      • 2016-03-26
      • 1970-01-01
      • 1970-01-01
      • 2017-03-04
      • 2015-02-05
      • 2011-03-02
      • 2013-01-15
      相关资源
      最近更新 更多