基于数值分析思想对多项式求值的原理和应用进行探究

摘要:多项式是由多个单项(符号项如:5x或者常数项4)通过四则运算组合起来的式子,如P(x)=2x^4+3x^3-3x^2+5x-1

一般的求解会将特定的x代入到上式中,一个一个的计算,共需要花费10次的乘法和4次加法运算,但是我们可以通过霍纳方法对多项式进行组合计算,在需要每秒对多个不同输入的x多次计算多项式对应的值时,该方法可以极大的提高计算效率。

原理:采用霍纳方法对上式进行分解步骤如下:

        P(x) = -1+x(5-3x+3x^2+2x^3)

           = -1+x(5+x(-3+3x+2x^2))

           = -1+x(5+x(-3+x(3+2x)))

           = -1+x*(5+x*(-3+x*(3+2*x)))                 (1)

这里的多项式是从低阶向高阶项分解,关于x的幂次被分解为余下的多项式的乘积,然后可以从括号内层向外层进行求值计算。

算法实现:本文采用递归方式求解多项式,其中向量a 存储的是从低次到高次多项式的常数项值,x为变量,n为多项式的次数,最开始为0

template < class T>
inline T Algorithm::polynomial(vector<T > a, T x, int n) //可定义模板类和模板函数 //多项式相加
{
if (n < a.size() - 1)
{
return a[n] + polynomial(a, x, n + 1)*x;
}
else
{
return a[n]; //递归终止条件:当n等于最大值的前个数是,递归截止
}
}

void main()
{
Algorithm testPloy;
vector<double> a;
double t;
cin >> t;
while (t)
{
a.push_back(t);
cin >> t;
}
cout<<testPloy.polynomial(a, 0.5, 0);
cout << endl;
system("pause");
}

总结:

通过对多项式求值的计算,让我更深刻的理解到在计算领域计算效率往往可以从最基础的理论找到突破点,结果却会产生巨大的效果。

其中,多项式求值的原理和应用体现了科学计算方法的最重要的特征:

(1)计算机在做简单计算的时候速度很快;

(2)由于简单计算可能会被进行多次,尽可能有效地进行简单计算,可以大大提高计算的效率;

最后,在对多项式求值理论进行研究后,我们将其推广到更一般的形式,以适应更多实际的应用:

f(x)=c1+(x-r1)(c2+(x-r2)(c3+(x-r3)(c4+(x-r4)(c5))))

其中,r1,r2,r3,r4表示基点,当r1,r2,r3,r4为0时,则就是上式(1)中的特殊形式。

原文地址:http://blog.51cto.com/12482074/2135207

时间: 2024-10-12 12:22:29

基于数值分析思想对多项式求值的原理和应用进行探究的相关文章

多项式求值

一.一维多项式求值: P(x)=3x^6+7x^5+3x^4+3x^3+8x^2+5x+23 一个通用的计算多项式的值的算法可以采用递推的方式.首先可以将上面多项式变形为如下的等价方式: P(x)=(...((an-1x+an-2)x+an-3)x+...+a1)x+a0 通过以上表达式可以看出,只要从里往外逐层按照如下的方式递推,便可以计算得到一个一维多项式的值: Rk=Rk+1*x+ak 具体示例代码如下: 1 /* 2 * @author 3 * 一维多项式求值,从最高一项开始迭代计算 4

算法研究:一维多项式求值(秦九韶算法)

问题通式: 求指定点X处的函数值. 思路: 运用秦九韶算法 将多项式表述成如下嵌套模式: 于是可以转换成程序语言思想: 可通过for循环来实现. 代码实现: C语言代码如下: #include <stdio.h> /* *函数名:double odpf(double array[], int n, double x) *参数:double array[] 系数数组 * int n 表示n项 * double x x的值 *返回值:计算结果sum *说明:One dimensional poly

4-2 多项式求值

本题要求实现一个函数,计算阶数为n,系数为a[0] ... a[n]的多项式f(x)=∑ni=0(a[i]*xi)f(x) 在x点的值. 函数接口定义: double f( int n, double a[], double x ); 其中n是多项式的阶数,a[]中存储系数,x是给定点.函数须返回多项式f(x)的值. 裁判测试程序样例: #include <stdio.h> #define MAXN 10 double f( int n, double a[], double x ); int

4-2 多项式求值 (15分)

本题要求实现一个函数,计算阶数为n,系数为a[0] ... a[n]的多项式f(x)=\sum_{i=0}^{n}(a[i]\times x^i)f(x)=∑?i=0?n??(a[i]×x?i??) 在x点的值. 函数接口定义: double f( int n, double a[], double x ); 其中n是多项式的阶数,a[]中存储系数,x是给定点.函数须返回多项式f(x)的值. 裁判测试程序样例: #include <stdio.h> #define MAXN 10 double

多项式求值 n维多项式 Horner解法

#include<iostream> using namespace std; template<class T> T ploy(T *coeff,int n,const T&x){ T value=coeff[n]; for(int i=1;i<=n;i++) value=value*x+coeff[i-1];//你麻痹 return value; } int main() { int n,x; cin>>n>>x; int a[n+1];

递归很耗内存+多项式求值的两种方法+c语言计时方法

1.用for循环写一个函数,实现从1开始输出到N的正整数. 有两宗实现方法,一种是递归,另一种是非递归 //非递归 void PrintN1(int N){ int i; for(i=1;i<=N;i++){ printf("%d\n",i); } return; } //递归 递归对空间的需求很大,当数字很大的时候,需要很大的内存,当数字是十万的时候递归就崩了 void PrintN2(int N){ if(N){ PrintN2(N-1); printf("%d\n

多项式函数插值:多项式形式函数求值的Horner嵌套算法

设代数式序列 $q_1(t), q_2(t), ..., q_{n-1}(t)$ ,由它们生成的多项式形式的表达式(不一定是多项式): $$p(t)=x_1+x_2q_1(t)+...x_nq_1(t)q_2(t)..q_{n-1}(t)=\sum\limits_{i=1}^n(x_i\prod\limits_{j=1}^{i-1}q_j(t))$$ 一般来讲,按照这个形式计算函数在 $t_0$ 点的取值的复杂度为:n-1次 $q_i(t)$ 求值,n-1次浮点数乘法(生成n个不同的乘积),n-

基于Proxy思想的Android插件框架

意义 研究插件框架的意义在于下面几点: 减小安装包的体积,通过网络选择性地进行插件下发 模块化升级.减小网络流量 静默升级,用户无感知情况下进行升级 解决低版本号机型方法数超限导致无法安装的问题 代码解耦 现状 Android中关于插件框架的技术已经有过不少讨论和实现.插件通常打包成apk或者dex的形式. dex形式的插件往往提供了一些功能性的接口,这样的方式类似于java中的jar形式.仅仅是因为Android的Dalvik VM无法直接动态载入Java的Byte Code,所以须要我们提供

惰性求值——lodash源码解读

前言 lodash受欢迎的一个原因,是其优异的计算性能.而其性能能有这么突出的表现,很大部分就来源于其使用的算法--惰性求值. 本文将讲述lodash源码中,惰性求值的原理和实现. 一.惰性求值的原理分析 惰性求值(Lazy Evaluation),又译为惰性计算.懒惰求值,也称为传需求调用(call-by-need),是计算机编程中的一个概念,它的目的是要最小化计算机要做的工作. 惰性求值中的参数直到需要时才会进行计算.这种程序实际上是从末尾开始反向执行的.它会判断自己需要返回什么,并继续向后