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,如果它解决了您的查询,请将其作为答案接受。