多项式函数插值:多项式形式函数求值的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-1次乘积和常系数浮点数乘法,n-1次浮点数加法 $\Rightarrow$ 总计n-1次 $q_i(t)$ 求值和 $T(n)\approx 3n$ 次浮点数运算。这需要在计算过程中存储保留一个 $\prod\limits_{j=1}^{i-1}q_j(t)$ 的结果,避免重复运算(那样将会使得生成乘积的n次浮点乘法变成$n^2/2$ 次)。

  利用Horner嵌套算法,可以在 $T(n)\approx 3n$ 的基础上再进一步。Horner嵌套算法的表达式是:$$p(t)=x_1+q_1(t)(x_2+q_2(t)(x_3+q_3(t)(...(x_{n-1}+q_{n-1}(t)x_n)...)))$$  迭代的伪代码可以写成:

$poly = x_n\\for\quad i = n -1 to 1\\ \quad poly = x_i+q_i(t)\times poly\\ end$

  Horner嵌套算法需要n-1次 $q_i(t)$ 求值(这是免不了的),n-1次浮点数乘法,和n-1次浮点数加法,这将把复杂度再削减到n次求值和 $T(n)\approx 2n$ 次浮点数运算。考虑到函数求值是非常普遍和基本的操作,即使只是在复杂度上打个折扣也是非常可观的事情。因此形如上式的多项式型表达式,只要可以使用Horner嵌套算法就应当使用。

  Horner嵌套算法适用于通过单项式表达的多项式求值,即 $p(t)=x_1+x_2t+x_3t^2+...+x_nt^{n-1}$ ,此处 $q_1(t)=q_2(t)=...=q_n(t)=t$;同样也适用于通过牛顿插值表达的多项式,即 $p(t)=x_1+x_2(t-t_1)+...+x_n(t-t_1)..(t-t_n)$ ,此处 $q_i(t)=t-t_i$ 。

原文地址:https://www.cnblogs.com/gentle-min-601/p/9746725.html

时间: 2024-09-29 22:18:10

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

条件表达式的短路求值与函数的延迟求值

延迟求值是 .NET的一个很重要的特性,在LISP语言,这个特性是依靠宏来完成的,在C,C++,可以通过函数指针来完成,而在.NET,它是靠委托来完成的.如果不明白什么是延迟求值的同学,我们先看看下面的一段代码: static void TestDelayFunction() { TestDelayFunton1(true,trueFun3); } static void TestDelayFunton1(bool flag , Func<bool> fun ) { if(flag) fun(

表达式求值:从“加减”到“带括号的加减乘除”的实践过程

本文乃Siliphen原创,转载请注明出处:http://blog.csdn.net/stevenkylelee ● 为什么想做一个表达式求值的程序 最近有一个需求,策划想设置游戏关卡的某些数值,这个数值不是一个常量,而是根据关卡的某些环境数据套上一个计算表达式算出来的.这个需求无法用excel拖表预计算出,因为关卡的环境数据只有在游戏中才能产生,在excel制表时,这些都是未知的.作为程序员,我可以把计算表达式硬编码在代码中,但这个做法有缺陷,如果策划要修改计算表达式的话,只能通过我修改程序并

C++求值顺序

<C++Primer5th>中文版第124页 C++语言没有明确规定大多数二元运算符的求值顺序, 给编译器优化留下了余地. 这种策略实际上是在代码生成效率和程序潜在缺陷之间进行了权衡,这个是否可以接受? 1.首先可以知道优先级规定了运算对象的组合方式,但是没有说明运算对象按照什么顺序求值. 比如: int i=f1()*f2(); 在这里虽然f1和f2在乘法之前被调用,但是f1先调用还是f2先调用却不得而知. 2.再比如结合律: -- int i=0; cout<<i<<

@算法 - [email&#160;protected] 多项式的多点求值与快速插值

目录 @0 - 参考资料@ @1 - 多点求值@ @理论推导@ @参考代码@ @例题与应用@ @2 - 快速插值@ @理论推导@ @(不建议参考的)代码@ @例题与应用@(暂无) @0 - 参考资料@ Cyhlnj 的博客 @1 - 多点求值@ @理论推导@ 假设已知多项式 \(A(x)\),使用 FFT 可以将 \(A(w_n^0)\),\(A(w_n^1)\),...,\(A(w_n^{n-1})\) 的值在 \(O(n\log n)\) 的时间内快速求出. 那么问题来了,假如我现在要求解任

多项式多点求值和插值

本文以存板子为主= = 对于比较一般的情况,n次多项式在n个点求值和用n个点插值可以做到,并且这也是下界. 多项式多点求值 给一个多项式F和一堆值,求出. 设,. 那么对于,,对于,.递归即可. 多项式多点插值 给一堆值.,要求求出一个n-1次多项式满足. 考虑拉格朗日插值:. 我们先考虑对于每个i,如何求出.设,那么我们就是要求. 取的时候这个式子分子分母都为0,那么我们可以用洛必达法则,这个式子就等于.那么我们可以用多点求值求出每个. 设为,现在我们就是要求,显然可以分治FFT. 具体地,还

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

摘要:多项式是由多个单项(符号项如: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)

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

问题通式: 求指定点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

多项式求值

一.一维多项式求值: 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

c++中函数参数的求值顺序

c++中如果函数的参数列表包含多个实参,那么对参数的求值顺序是不确定的. 在谭浩强的<C++程序设计>(第二版)P94中提到,GCC对参数求值是按从右到左的顺序求值的. 但我实测并非如此. #include <iostream> #include <iomanip> using namespace std; void test(int x, int y) { cout << 'x' << x << " y" <