多项式求根
2016-07-10 01:31
232 查看
ACM模版
多项式求根(牛顿法)
/* * 牛顿法解多项式的根 * 输入:多项式系数c[],多项式度数n,求在[a,b]间的根 * 输出:根 要求保证[a,b]间有根 */ double fabs(double x) { return (x < 0) ? -x : x; } 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++; } return 0; } double Polynomial_Root(double c[], int n, double a, double b, double eps) { double *cp; int i; double root; cp = (double *)calloc(n, sizeof(double)); for (i = n - 1; i >= 0; i--) { cp[i] = (i + 1) * c[i + 1]; } if (a > b) { root = a; a = b; b = root; } if ((!newton(a, &root, c, cp, n, a, b, eps)) && (!newton(b, &root, c, cp, n, a, b, eps))) { newton((a + b) * 0.5, &root, c, cp, n, a, b, eps); } free(cp); if (fabs(root) < eps) { return fabs(root); } else return root; }
相关文章推荐
- C语言简单实现求n阶勒让德多项式的方法
- 利用java与链表的实现与应用
- 多项式分布的理解概率公式的理解
- 单链表表示多项式ADT&多项式加法
- FFT 快速傅里叶变换 初探
- C++ 队列 实现 多项式 加减法
- POJ 1060/ ZOJ 1026 : Modular Multiplication of Polynomials - f(x)g(x) mod h(x)
- 【SCOI2013】【BZOJ3323】多项式的运算
- 概率图模型(PGM)学习笔记(四)-贝叶斯网络-伯努利贝叶斯-多项式贝叶斯
- 生成随机的多项式
- 两个多项式的加法
- VC多项式运算
- 数据结构-多项式
- 判断两多项式之积是否等于另一多项式
- 朴素贝叶斯分类及两个模型
- 1002. A+B for Polynomials
- 泰勒展开式
- Matlab 学习 简单多项式篇
- 多项式加减 List
- Fygon