数值分析之牛顿法多项式求根
来源:互联网 发布:现言推荐知乎 编辑:程序博客网 时间:2024/05/21 04:16
很朴素的方法,如果在区间[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++;}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);elsereturn root;}int main(){double c[2] = { 1,2 };int n = 1, a = -5, b = 5;double eps = 1e-8;double root = Polynomial_Root(c, n, a, b, eps);cout << root << endl;}
- 数值分析之牛顿法多项式求根
- 数值分析学习(一)之交叉法(Bracketing Methods)求根
- 牛顿法求根
- 数值分析学习(二)之Open Methods求根
- 二分求根及牛顿迭代求根分析
- OJ刷题之《牛顿迭代法求根》
- 多项式求根
- 数值分析:Hermite多项式
- 数值分析4 非线性方程求根
- 数值分析 第四章 非线性方程组求根
- 数值分析之 拉格朗日插值、牛顿插值、分段线性插值实现
- 数值分析牛顿切线法python3实现并绘图
- 牛顿迭代法求根
- 用牛顿迭代法求根
- 牛顿迭代法求根
- 牛顿迭代法求根
- 牛顿迭代法求根
- 牛顿迭代法求根
- 购物车案例分析(初学三层架构)
- 网站登录案例分析(初学三层架构)
- 客户管理系统
- Strust2第(九)篇《内置拦截器和自定义拦截器详解(附源码)》
- 学习笔记之单例模式
- 数值分析之牛顿法多项式求根
- java poi修改excel
- Strust2第(十)篇《ognl概念和原理详解》
- Inno安装完运行指定程序
- UML入门
- OpenSSL在linux下的编译安装与使用
- VM虚拟机下添加一个硬盘
- 杭电4510-小Q系列故事——为什么时光不能倒流
- Eclipse 添加 user library