zoukankan      html  css  js  c++  java
  • 常见算法-多项式计算(1)

    最近在学算法,做做笔记,便于以后温习。

    学习资源:《常用算法程序集》


    一。多项式求值

    1.一维多项式

    问题描述:计算形如

    的多项式在指定点x处的函数值。

    问题分析:首先,将多项式表述成如下嵌套形式:


    然后从里往外一层一层地进行计算。其递推计算公式如下:



    最后得到的u即多项式值。


    下面,通过代码计算此多项式:

    #include <stdio.h>
    
    /*  polynome_one函数介绍
     功能:计算并返回一维多项式在指定点x处的函数值
     参数:           int n:多项式的项数
                  double x:指定的自变量的值
     double *modulus_array:存放n-1次多项式的n个系数的数组
     */
    double polynome_one(int n, double x, double *modulus_array)
    {
        int i;
        double result_;     //利用推导出的递推公式进行计算
        result_ = modulus_array[n-1];
        
        for (i=n-2; i>=0; i--)
        {
            result_ = result_ * x + modulus_array[i];
        }
        
        return result_;  //返回多项式值
    }
    int main()
    {
        int i;
        double modulus_array[7] = {-20.0, 7.0, -7.0, 1.0, 3.0, -5.0, 2.0}; //初始化系数数组
        double x[6] = {0.9, -0.9, 1.1, -1.1, 1.3, -1.3};  //初始化自变量x数组
        
        for (i=0; i<=5; i++) //打印每次x对应的结果。 
        {
            printf("x(%d) = %5.2lf   p(x(%d)) = %13.7e
    ", i, x[i], i, polynome_one(7, x[i], modulus_array));
        }
        return 0;
    }
    
    //注:%e 是表示输出的数字以科学计数显示      如:7.234568e+003(即 7.234568*10^(+003) )
    
    /* 
     ****************结果*******************
     x(0) =  0.90   p(x(0)) = -1.8562268e+01
     x(1) = -0.90   p(x(1)) = -2.6715368e+01
     x(2) =  1.10   p(x(2)) = -1.9556128e+01
     x(3) = -1.10   p(x(3)) = -2.1513028e+01
     x(4) =  1.30   p(x(4)) = -2.0875732e+01
     x(5) = -1.30   p(x(5)) = -6.3404320e+00
    */




    2.二维多项式

    问题描述: 计算形如的二维多项式在给定点(x,y)处的函数值


    问题分析: 将二维多项式变形如下:


    令:

    则计算si的递推公式如下:



    最后计算得到的u即si

    最后再将所有的si累加,即可得到最后的解。


    下面通过代码计算此多项式

    其中,系数矩阵为:

    #include <stdio.h>
    
    /*  polynome_two函数介绍
     功能:计算并返回二维多项式在指定点x处的函数值
     参数:           int n:自变量y的最高次数为n-1
                     int m:自变量x的最高次数为m-1
                  double x:指定的自变量x的值
                  double y:指定的自变量y的值
     double *modulus_array:存放二维多项式的系数
     */
    double polynome_two(double *modulus_array, int m, int n, double x, double y)
    {
        int i, j;
        double result_, each_si, now_xi;
        result_ = 0.0;
        now_xi = 1.0;
        
        for (i=0; i<=m-1; i++)
        {
            each_si = modulus_array[i*n+n-1] * now_xi;
            for (j=n-2; j>=0; j--)
            {
                each_si = each_si * y + modulus_array[i*n+j] * now_xi;
            }
            
            result_ += each_si;
            now_xi = now_xi * x;
        }
        return  result_;
    }
    int main()
    {
        double result_;
        double modulus_array[4][5] = {{1.0, 2.0, 3.0, 4.0, 5.0},
                                    {6.0, 7.0, 8.0, 9.0, 10.0},
                                    {11.0, 12.0, 13.0, 14.0, 15.0},
                                    {16.0, 17.0, 18.0, 19.0, 20.0}};
        
        result_ = polynome_two(modulus_array, 4, 5, 0.6, -1.3);
        printf("p(0.6, -1.3) = %13.7e
    ", result_);
        
    }
    
    //注:%e 是表示输出的数字以科学计数显示      如:7.234568e+003(即 7.234568*10^(+003) )
    
    /* 
     ****************结果*******************

    p(0.6, -1.3) = 3.9665544e+01

    */



    3.复数多项式

    问题描述:计算形如

    的复数多项式在给定复数z时的值。


    问题分析:和上面的多项式分析一样,嵌套进行,就不多重复了。关键在于cmul对每组复数相乘的计算过程。


    下面通过代码,计算

    在z=1+j时的函数值

    #include <stdio.h>
    
    /*  cuml函数介绍
     功能:计算两个复数乘积   即(a+bj)*(c+dj) = e+fj
     参数: 对应复数中的各个值
     结果: 对e,f分别计算求得值
    */
    
    void cmul(double a, double b, double c, double d, double *e, double *f)
    {
        double p, q, s;
        p = a * c;
        q = b * d;
        s = (a+b) * (c+d);
        
        *e = p - q;
        *f = s - p - q;
    }
    
    /*  polynome_z函数介绍
     功能:计算复数多项式在给定复数z(x+yj)时的函数值
     参数: double *modulus_r: 存放多项式的实部
          double *modulus_r: 存放多项式的虚部
                   double x: 给定复数z的实部
                   double y: 给定复数z的虚部
                  double *u: 返回多项式值的实部
                  double *v: 返回多项式值的虚部
     */
    void polynome_z(double *modulus_r, double *modulus_i, int n, double x, double y, double *u, double *v)
    {
        int i;
        double now_r, now_i;
        double p, q;
        now_r = modulus_r[n-1];
        now_i = modulus_i[n-1];
        for (i=n-2; i>=0; i--)
        {
            cmul(now_r, now_i, x, y, &p, &q);
            now_r = p + modulus_r[i];
            now_i = q +  modulus_i[i];
        }
        
        *u = now_r;
        *v = now_i;
    }
    
    
    int main()
    {
        double x, y, u, v;
        double modulus_r[4] = {2.0, 2.0, 1.0, 2.0};
        double modulus_i[4] = {1.0, 1.0, 1.0, 2.0};
        
        x = 1.0;
        y = 1.0;
        polynome_z(modulus_r, modulus_i, 4, x, y, &u, &v);
        printf("p(1.0+j) = %10.7lf+%10.7lfj", u, v);
        
    }
    
    //注:%e 是表示输出的数字以科学计数显示      如:7.234568e+003(即 7.234568*10^(+003) )
    
    //计算结果:  p(1.0+j) = -7.0000000+ 6.0000000j




  • 相关阅读:
    Mutex 的正确打开方式
    常用 CMD 命令
    【LeetCode】在排序数组中查找元素的第一个和最后一个位置【三次二分】
    【LeetCode】搜索旋转排序数组【两次二分】
    【手写代码】计算1-n中总共有多少二进制1
    【手写代码】快速计算数字x有多少个二进制1
    【手写代码】建立二叉搜索树
    【LeetCode】下一个排列【找规律】
    【LeetCode】删除排序数组中的重复项&&移除特定元素【双指针,原地算法】
    【LeetCode】删除链表的倒数第N个节点【双指针法】
  • 原文地址:https://www.cnblogs.com/pangblog/p/3299370.html
Copyright © 2011-2022 走看看