秦九韶算法介绍及MATLAB实现

 版权声明:本文为博主原创文章,未经博主允许不得转载。https://blog.csdn.net/weixin_38451800/article/details/90418337

秦九韶算法介绍及MATLAB实现

  • 目录
    • 1 秦九韶算法由来
    • 2 原理公式及MATLAB实现
      • MATLAB代码实现
    • 3 另外一个好处——求f(x)在x*处导数值
    • 4 举例
    • 5 C语言代码实现
    • 6 Java代码实现

目录

数值计算中算法设计好坏不但影响计算结果的精度,还可大量节省计算时间,减少运算次数和舍入误差,这也是算法设计中一个重要原则,下面以多项式求值为例,介绍数值计算中第一个常用的技巧——秦九韶算法或Horner法则(霍纳法则)。

1 秦九韶算法由来

19世纪初,英国数学家威廉·乔治·霍纳重新发现并证明,后世称作霍纳算法(Horner’s method、Horner scheme)。但是,19世纪英国传教士伟烈亚力Alexander Wylie. (1815–1887) 最早对霍纳的发明权提出质疑。他在1852年著的《中国科学扎记》(Jottings on the Science of the Chinese)一篇论文中,详细介绍秦九韶的正负开方术之后写道“读者不难认出这就是霍纳在1819年因为发表《解所有次方程》论文,被数学家奥古斯都·德·摩根评为‘必使其发明人因发现此算法而置身于重要发明家之列’的方法;我以为应该对霍纳的发明权提出辩驳。欧洲的朋友们可能会觉得意外,一位来自天朝帝国的竞争者,有更大的机会确立他的优先权”。此后,日本数学史家三上义夫在《中日数学史》一书中在详述秦九韶的正负开方术后写道:“谁能否认,霍纳的辉煌方法,至少在早于欧洲六百年之前,已经在中国运用了。”。三上义夫还最先指出,秦九韶算法起源于汉代《九章算术》的开方法。其后王玲和李约瑟有专文论述秦九韶算法起源于《九章算术》。前苏联数学史家尤什克维奇说“这是中国传统数学最伟大成就之一”,他还说印度人不知有此方法,而阿拉伯数学家可能从中国前人传入此方法。

2 原理公式及MATLAB实现

设给定n次多项式:
在这里插入图片描述
已知系数矩阵A[]和x*,求f(x*)值。
分析:用常规方法(用重复乘法计算幂,再把各项相加)计算出结果最多需要n次加法和(n^2+n)/2次乘法。若用x迭代的方法计算幂则需要n次加法和2n+1次乘法。如果计算中的数值数据是以字节方式储存的,那么常规方法约需要占用字节的2n倍空间。如果用秦九韶算法呢?
若采用:f(x)=(…( a(0)*x+a(1) )*x+…+a(n-1) )x+a(n) (1),则b=f(x)值即为所求,此算法被称为秦九韶算法。用它计算n次多项式只需作n次加法和n次乘法,最多需要占用的字节的n倍空间。

MATLAB代码实现

 function p=QJS(A,x)
    %秦九韶算法,A为函数系数向量,降幂排列,x为某点
    n=length(A);
    p=A(1);
    for k=1:1:n-1
        p=p*x+A(k+1);
    end

3 另外一个好处——求f(x)在x*处导数值

我们对于上面(1)式变形可得:
b(0)=a(0)
b(i)=b(i-1)*x+a(i),其中i=1,2,3……n。
所以对f(x)求导数可得:
q(x)=b(0)x^(n-1)+…+b(n-1),又是一个多项式。
所以,又可以用秦九韶算法求解。

4 举例

秦九韶算法介绍及MATLAB实现_第1张图片

5 C语言代码实现

    double f (int n,double a[],double x){//n代表a[]的大小,数组的传递需要指定数组大小
        int i;                           //a[]储存每个x项的系数值,在函数外初始化
        double p=a[n];//初始化p;
        for(i=n;i>0;i--)
            p=a[i-1]+x*p;
        return p;
    }

6 Java代码实现

class test{

    public static long poly2(int[] arr, int x, int n){
        //arr存储系数, x 表示基数, n 表示幂
        long poly = 0;
        for(int i = 0; i <= n; i++)
            poly = poly * x + arr[i];
        return poly;
    }

    public static void main(String[] args) {
        int[]b =  {4,8,0,1,2};
        System.out.println(poly2(b,3,4));

    }

}

————————————————————————————————————————
部分内容摘自:CSDN博主:yep,
网址:[1]: https://blog.csdn.net/AC_AC
/article/details/81205232
CSDN博主:远在远方的风比远方更远,
网址[2]: https://blog.csdn.net/qq_22073849/article/details/71515855
如有不妥之处,请联系博主,谢谢。

你可能感兴趣的:(基础算法与程序架构)