Horner 算法是以英国数学家 William George Horner 命名的一种多项式求值的快速算法,实际上,这种快速算法在他之前就已经被Paolo Ruffini使用过了。而中国数学家秦九韶提出这种算法要比William George Horner 早600多年。

P(x) 是一个多项式:

我们希望计算x取某个特殊值x0时多项式的值p(x0).

构造一个序列:

那么这个序列b0的值就是多项式的值了。

用程序实现如下:

double horner(double p[], int n, double x)
{double sum;sum = p[--n];while ( n > 0 ){sum = p[--n] + sum * x;}return sum;
}

我经常要设计FIR、IIR 滤波器,设计完滤波器后都要验证一下频率特性是否正确。这时就需要计算实系数多项式在x取复数值时的结果。因此就有了下面的代码:

 double _Complex horner_C(double p[], int n, double _Complex x){double _Complex sum;sum = p[--n];while ( n > 0 ){sum = p[--n] + sum * x;}return sum;}

这个代码用到了C99中对复数支持的新特性,需要编译器支持C99标准。

最后给一个测试代码,其中多项式p构成了一个FIR低通滤波器,这个低通滤波器是我用scilab 中的ffilt 函数设计的。

滤波器构造的代码如下:

ffilt('lp',20 , 0.2 , 0.5);

下面是计算这个滤波器的频响特性的代码。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <complex.h>
double horner(double p[], int n, double x);
double _Complex horner_C(double p[], int n, double _Complex x);
int main()
{int i;double p[] = {-0.0196945,    -0.0356154,1.559E-17,    0.0465740,0.0340178,    -0.0415773,-0.0864945,    1.559E-17,0.2018205,    0.3741957,0.3741957,    0.2018205,1.559E-17,    -0.0864945,-0.0415773,    0.0340178,0.0465740,    1.559E-17,-0.0356154,    -0.0196945};double x[201], mag[201], pha[201];double _Complex xx;for(i = 0; i <= 200; i++){x[i] = 0.5 * i / 200.0;xx = cexp(-2 * M_PI * x[i] * I);mag[i] = cabs(horner_C(p, 20, xx));pha[i] = carg(horner_C(p, 20, xx));printf("%f, %f, %f\n", x[i] , mag[i], pha[i]);}return 0;
}

将输出结果画出了可以得到如下的幅频特性:

scilab 计算出的幅频特性如下图:

可以看出两幅图完全相同,说明我们的代码计算结果是正确的。

多项式计算的Horner 方法相关推荐

  1. MATLAB使用符号工具箱计算函数的5阶麦克劳林多项式的四种方法(附指定阶数、指定点的泰勒展开)

    此篇博客是对MATLAB符号工具箱taylor的用法进行总结和拓展. 先通过两个具体的例子进行讲述: 1.MATLAB中使用符号工具箱计算exp(x)的5阶麦克劳林多项式 %计算exp(x)的5阶麦克 ...

  2. java规则计算_java实现的霍纳规则的多项式计算

    java实现的霍纳规则的多项式计算 霍纳规则多项式计算如果使用朴素的多项式求值,时间复杂度为O(n*n),而是用了霍纳规则可以使用递归或者迭代来实现,时间复杂度是O(n),下面是源代码: /* * 实 ...

  3. matlab实验8数据分析与多项式计算,hashidamatlab实验八数据处理与多项式计算.doc

    实验八电子二班张秀云 一.实验目的 [据处理与多项式计算 1.掌握数据统计和分析的方法 2.掌握数值插值与曲线拟合的方法及其应用 3.掌握多项式的常用运算 二.实验内容 1.利用MATLAB提供的ra ...

  4. 三次多项式曲线php,多项式计算的效率测试,多项式计算效率_PHP教程

    多项式计算的效率测试,多项式计算效率 多项式计算调用库函数pow方法和秦九韶算法,我们来测算下他们的运行效率 计算函数f(x)=1+(Σxi/i)(i从1取到m); 用ctime时间函数来测试运行时间 ...

  5. 用正割对数计算积分的方法

    用正割对数计算积分的方法 下面介绍一种利用正割对数,计算积分的方法. 相关资料下载网址: 链接:https://pan.baidu.com/s/1z3R9b-UmV3AcJKLPFNNT3A?pwd= ...

  6. matlab多项式计算题目,MATLAB数据分析与多项式计算-习题答案

    <MATLAB数据分析与多项式计算-习题答案>由会员分享,可在线阅读,更多相关<MATLAB数据分析与多项式计算-习题答案(4页珍藏版)>请在人人文库网上搜索. 1.第6章 M ...

  7. Matlab:数据分析与多项式计算

    Matlab 数据分析 求最大值与最小值 求平均值与中值 求和与积 求累加和与累乘积 统计描述函数 标准差 方差 相关系数 协方差 排序 多项式计算 多项式的加减运算 多项式的乘除运算 多项式的求导 ...

  8. MATLAB实验8:数据处理与多项式计算

    一.实验目的 1.掌握数据统计与分析的方法 2.掌握数值插值与曲线拟合的方法及其应用 3.掌握多项式的常用计算 二.实验内容 1.利用matlab提供的rand函数生成30000个符合均匀分布的随机数 ...

  9. MATLAB 矩阵处理及多项式计算

    一.实验目的 (1)掌握生成特殊矩阵以及矩阵处理的方法 (2)掌握数据统计和分析的方法 (3)掌握多项式的常用计算 二.实验原理与实验设备 原理:计算机编程相关知识技能和MATLAB软件编译环境 设备 ...

  10. matlab 实验四 数据处理与多项式计算

    实验四 数据处理与多项式计算 实验要求: 为达到理想的实验效果,同学们务必做到: 1.实验前认真准备,要根据实验目的和实验内容,复习好实验中可能要用到的命令,想好编程的思路,做到胸有成竹,提高上机效率 ...

最新文章

  1. mysql邮箱认证_邮箱验证功能的实现
  2. UFLDL深度学习笔记 (三)无监督特征学习
  3. 我理解的--java 单例模式
  4. 高并发核心Selector详解
  5. Filter高级开发
  6. css3 animate基本属性
  7. MySQL内核月报 2014.11-MySQL· 5.7改进·Recovery改进
  8. 高性能stun服务器搭建,STUN/TURN服务器搭建
  9. 从零开始学习CANoe(二)—— CANdb++ 创建 dbc文件
  10. Java反射基础指南
  11. Centos版Linux 一些常用操作命令 收集
  12. scp远程复制文件自动输入密码
  13. 对抗拖延症最直接有效的方法
  14. 开通知乎专栏和公众号啦!
  15. Pytorch 学习率衰减 之 余弦退火与余弦warmup 自定义学习率衰减scheduler
  16. CSDN如何转载他人文章
  17. 单链表Java数据结构
  18. JAVA项目红叉问题
  19. WindowsServer2019下Php(php-7.4.3-Win32-vc15-x64) 调用C# .dll文件
  20. 编程复制文件到system32文件夹中

热门文章

  1. 微信二级不死域名和微信白名单的区别?
  2. Linux Intel 无线网卡Wifi+蓝牙
  3. Windows XP SP3安装教程(图)
  4. MathType 运行时错误‘53’:文件未找到:MathPage.WLL
  5. 2011年上半年五大臭名昭著的数据库泄密事件--转载
  6. 徐耀赐:道路安全——交通安全会议整理稿(1)
  7. 排查tomcat项目假死原因的简单方法
  8. ultravnc服务器不接收消息,远程控制软件UltraVNC的教程
  9. 只鳞片爪聊红楼——《红楼梦》读后感笔记3200字
  10. postgresql的下载与安装