gpt4 book ai didi

c - C 中的牛顿拉夫函数指针

转载 作者:行者123 更新时间:2023-11-30 17:44:38 25 4
gpt4 key购买 nike

我正在尝试使用单个函数指针来实现 Newton-Raphson 方法。该函数必须包含方程及其导数。我在测试函数中很难通过这两个单独的函数。

#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;

}

谢谢

最佳答案

更新 NR 的声明以采用带有 3 个参数的函数指针

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

而不是

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

当您将 0(或 NULL)传递给 primef_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来定义ff_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

}

关于c - C 中的牛顿拉夫函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19913657/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com