原理
参考链接牛顿法——知乎。比如说我想求一个函数
f
(
x
)
=
0
f(x)=0
f(x)=0的解,利用牛顿迭代法的话可以如下构造:
x
n
+
1
=
x
n
−
f
(
x
n
)
f
′
(
x
n
)
x_{n+1}=x_n-\frac{f(x_n)}{f'(x_n)}
xn+1=xn−f′(xn)f(xn)
代码
下面时C语言实现代码
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#define N 200 //最大迭代次数
#define EPS 0.000001 //收敛误差
double newton(double (*fun)(double), double (*partialfun)(double), double); //牛顿迭代法,包括两个函数指针
double fun(double x); //原函数
double partialfun(double x); //导函数
int main(int argc, char* argv[])
{
double x0, root;
x0 = 1;
root = newton(fun, partialfun, x0);
printf("迭代初值:%lf\n根:%lf\n", x0, root);
return 0;
}
double fun(double x) //原函数
{
return cos(x) - x * x * x;
}
double partialfun(double x) //原函数的导数
{
return -sin(x) - 3 * x * x;
}
double newton(double (*fun)(double), double (*partialfun)(double), double xn)
{
double xn1;
for (int i = 0; i < N; i++) {
xn1 = -(*fun)(xn) / (*partialfun)(xn) + xn;
if (fabs(xn1 - xn) < EPS) {
printf("迭代次数:%d\n", i+1);
return xn1;
}
xn = xn1;
}
printf("迭代发散!");
exit(0);
}