我正在尝试在C中创建一个数值根查找器,以找到贝塞尔函数的零点。通过将函数除以(x-x0),数学函数F(x)可以放气,其中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;
但现在我不知道如何迭代修改函数,每次除以我用求解算法找到的根。
感谢您的帮助!
答案 0 :(得分:0)
你可以在带有起始案例的递归函数中将它作为参数传递。如果你试图解决iterativley,这样的事情可能有用。
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)
答案 1 :(得分:0)
经验丰富之后,我意识到我真正想要的是一个匿名函数或lambda函数。关于lambda函数的一个很好的介绍可以在SO question找到。
不幸的是,C不支持lambda函数,但是,GCC(使用宏)和Clang编译器都支持语言扩展来实现可以在Wikipedia上找到的lambda函数。