很朴素的方法,如果在区间[a,b]内有根,那么f(a)*f(b)<0
不难得到以下代码:
#include <iostream>
#include <memory>
using namespace std;
double f(int m, double c [], double x)
{
int i;
double p = c[m];
for (i = m; i > 0; i--)
p = p*x + c[i - 1];
return p;
}
int newton(double x0, double *r,
double c [], double cp [], int n,
double a, double b, double eps)
{
int MAX_ITERATION = 1000;
int i = 1;
double x1, x2, fp, eps2 = eps / 10.0;
x1 = x0;
while (i < MAX_ITERATION) {
x2 = f(n, c, x1);
fp = f(n - 1, cp, x1);
if ((fabs(fp)<0.000000001) && (fabs(x2)>1.0))
return 0;
x2 = x1 - x2 / fp;
if (fabs(x1 - x2) < eps2) {
if (x2<a || x2>b)
return 0;
*r = x2;
return 1;
}
x1 = x2;
i+