Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/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
C语言中的牛顿图函数指针_C_Function Pointers_Numerical Analysis - Fatal编程技术网

C语言中的牛顿图函数指针

C语言中的牛顿图函数指针,c,function-pointers,numerical-analysis,C,Function Pointers,Numerical Analysis,我试图用一个函数指针来实现牛顿-拉斐逊方法。函数必须同时包含方程及其导数。在测试函数中,我很难通过这两个单独的函数 #include<stdio.h> #include<stdlib.h> #include<math.h> #include<string.h> double NR(double, double(*)(double, double*), double); void test_function( double x, double *

我试图用一个函数指针来实现牛顿-拉斐逊方法。函数必须同时包含方程及其导数。在测试函数中,我很难通过这两个单独的函数

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>

double NR(double, double(*)(double, double*), double);

void test_function( double x, double * f, double * f_prime )
{
  *f = (x-2) * (x-2);
    *f_prime = 2*x - 4;
}

double NR( double x0, double (*test_function)(double x, double *f, double *f_prime), double precision )
{
  int i;
    while(!isnan(x0)){
      i = x0;
      x0 = (x0 - (test_function(x0, f, 0)/test_function(x0, 0, f_prime)));
      if(!isnan(x0))
    printf("%f\n",x0);
      if ( i - x0 < 0 )
    printf("NO ROOT FOUND");
      return -1;
      else if ( i - x0 > 0 && i - x0 < precision )
    break;
    }

}


int main(void)
{
  double x0 = 300;
  double precision = .0000001;

  double root = NR( x0, test_function, precision);

  printf("%f\n",root);

  return 0;

}
#包括
#包括
#包括
#包括
双号码(双,双(*)(双,双*),双);
无效测试函数(双x,双f,双f素数)
{
*f=(x-2)*(x-2);
*f_素数=2*x-4;
}
双NR(双x0,双(*测试_函数)(双x,双f,双f_素数),双精度)
{
int i;
而(!isnan(x0)){
i=x0;
x0=(x0-(test_函数(x0,f,0)/test_函数(x0,0,f_素数));
如果(!isnan(x0))
printf(“%f\n”,x0);
if(i-x0<0)
printf(“未找到根”);
返回-1;
否则如果(i-x0>0&&i-x0<精度)
打破
}
}
内部主(空)
{
双x0=300;
双精度=.0000001;
双根=NR(x0,测试函数,精度);
printf(“%f\n”,根);
返回0;
}

感谢您

更新
NR
的声明,以获取以3个参数为参数的函数指针

double NR(double, double(*)(double, double*, double *), double);
而不是

double NR(double, double(*)(double, double*), double);
当您将
0
(或
NULL
)传递到
prime
f_prime
时,您可以将测试函数更新为

void test_function( double x, double * f, double * f_prime )
{
    if(f)
      *f = (x-2) * (x-2);
    if(f_prime)
      *f_prime = 2*x - 4;
}
此外,您还需要如下更新
NR
,以定义
f
f\u prime

double NR( double x0, double (*test_function)(double x, double *f, double *f_prime), double precision )
{
  int i;
  double f, f_prime;
  ...
  //your code
  ...
  //----------------------------v pass address -------------v
  x0 = (x0 - (test_function(x0, &f, 0)/test_function(x0, 0, &f_prime)));
  ....
  //your code

}

当实际使用test_函数时,我如何表明我想单独使用函数*f而不是函数*f_prime,反之亦然-因为我们使用了3个参数?这消除了许多问题,谢谢。由于某些原因,我仍然收到“f未在NC中声明”和“f_prime未在NC中声明”警告。它们没有在我的函数中正确传递吗?@RobertPenfield,是的,
f
f_prime
不是
NR
函数的参数,因此需要在
NR
中定义它们。再次查看更新的答案。@RobertPenfield,如果它解决了您的查询,请将其作为答案接受。