常见算法-多项式计算(1)

 

常见算法-多项式计算(1)

分类: c/c++ 一步一步学算法   242人阅读  评论(0)  收藏  举报
C 算法

目录(?)[+]

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

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


一。多项式求值

1.一维多项式

问题描述:计算形如

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

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


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



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


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

[cpp]  view plain copy
  1. #include <stdio.h>  
  2.   
  3. /*  polynome_one函数介绍 
  4.  功能:计算并返回一维多项式在指定点x处的函数值 
  5.  参数:           int n:多项式的项数 
  6.               double x:指定的自变量的值 
  7.  double *modulus_array:存放n-1次多项式的n个系数的数组 
  8.  */  
  9. double polynome_one(int n, double x, double *modulus_array)  
  10. {  
  11.     int i;  
  12.     double result_;     //利用推导出的递推公式进行计算  
  13.     result_ = modulus_array[n-1];  
  14.       
  15.     for (i=n-2; i>=0; i--)  
  16.     {  
  17.         result_ = result_ * x + modulus_array[i];  
  18.     }  
  19.       
  20.     return result_;  //返回多项式值  
  21. }  
  22. int main()  
  23. {  
  24.     int i;  
  25.     double modulus_array[7] = {-20.0, 7.0, -7.0, 1.0, 3.0, -5.0, 2.0}; //初始化系数数组  
  26.     double x[6] = {0.9, -0.9, 1.1, -1.1, 1.3, -1.3};  //初始化自变量x数组  
  27.       
  28.     for (i=0; i<=5; i++) //打印每次x对应的结果。   
  29.     {  
  30.         printf("x(%d) = %5.2lf   p(x(%d)) = %13.7e\n", i, x[i], i, polynome_one(7, x[i], modulus_array));  
  31.     }  
  32.     return 0;  
  33. }  
  34.   
  35. //注:%e 是表示输出的数字以科学计数显示      如:7.234568e+003(即 7.234568*10^(+003) )  
  36.   
  37. /*  
  38.  ****************结果******************* 
  39.  x(0) =  0.90   p(x(0)) = -1.8562268e+01 
  40.  x(1) = -0.90   p(x(1)) = -2.6715368e+01 
  41.  x(2) =  1.10   p(x(2)) = -1.9556128e+01 
  42.  x(3) = -1.10   p(x(3)) = -2.1513028e+01 
  43.  x(4) =  1.30   p(x(4)) = -2.0875732e+01 
  44.  x(5) = -1.30   p(x(5)) = -6.3404320e+00 
  45. */  




2.二维多项式

问题描述: 计算形如常见算法-多项式计算(1)_第1张图片的二维多项式在给定点(x,y)处的函数值


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

常见算法-多项式计算(1)_第2张图片

令:常见算法-多项式计算(1)_第3张图片

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

常见算法-多项式计算(1)_第4张图片


最后计算得到的u即si

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


下面通过代码计算此多项式常见算法-多项式计算(1)_第5张图片

其中,系数矩阵为:常见算法-多项式计算(1)_第6张图片

[cpp]  view plain copy
  1. #include <stdio.h>  
  2.   
  3. /*  polynome_two函数介绍 
  4.  功能:计算并返回二维多项式在指定点x处的函数值 
  5.  参数:           int n:自变量y的最高次数为n-1 
  6.                  int m:自变量x的最高次数为m-1 
  7.               double x:指定的自变量x的值 
  8.               double y:指定的自变量y的值 
  9.  double *modulus_array:存放二维多项式的系数 
  10.  */  
  11. double polynome_two(double *modulus_array, int m, int n, double x, double y)  
  12. {  
  13.     int i, j;  
  14.     double result_, each_si, now_xi;  
  15.     result_ = 0.0;  
  16.     now_xi = 1.0;  
  17.       
  18.     for (i=0; i<=m-1; i++)  
  19.     {  
  20.         each_si = modulus_array[i*n+n-1] * now_xi;  
  21.         for (j=n-2; j>=0; j--)  
  22.         {  
  23.             each_si = each_si * y + modulus_array[i*n+j] * now_xi;  
  24.         }  
  25.           
  26.         result_ += each_si;  
  27.         now_xi = now_xi * x;  
  28.     }  
  29.     return  result_;  
  30. }  
  31. int main()  
  32. {  
  33.     double result_;  
  34.     double modulus_array[4][5] = {{1.0, 2.0, 3.0, 4.0, 5.0},  
  35.                                 {6.0, 7.0, 8.0, 9.0, 10.0},  
  36.                                 {11.0, 12.0, 13.0, 14.0, 15.0},  
  37.                                 {16.0, 17.0, 18.0, 19.0, 20.0}};  
  38.       
  39.     result_ = polynome_two(modulus_array, 4, 5, 0.6, -1.3);  
  40.     printf("p(0.6, -1.3) = %13.7e\n", result_);  
  41.       
  42. }  
  43.   
  44. //注:%e 是表示输出的数字以科学计数显示      如:7.234568e+003(即 7.234568*10^(+003) )  
  45.   
  46. /*  
  47.  ****************结果******************* 
  48. <p style="margin-top: 0px; margin-bottom: 0px; ">  p(0.6, -1.3) = 3.9665544e+01</p>*/  



3.复数多项式

问题描述:计算形如

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


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


下面通过代码,计算

在z=1+j时的函数值

[cpp]  view plain copy
  1. #include <stdio.h>  
  2.   
  3. /*  cuml函数介绍 
  4.  功能:计算两个复数乘积   即(a+bj)*(c+dj) = e+fj 
  5.  参数: 对应复数中的各个值 
  6.  结果: 对e,f分别计算求得值 
  7. */  
  8.   
  9. void cmul(double a, double b, double c, double d, double *e, double *f)  
  10. {  
  11.     double p, q, s;  
  12.     p = a * c;  
  13.     q = b * d;  
  14.     s = (a+b) * (c+d);  
  15.       
  16.     *e = p - q;  
  17.     *f = s - p - q;  
  18. }  
  19.   
  20. /*  polynome_z函数介绍 
  21.  功能:计算复数多项式在给定复数z(x+yj)时的函数值 
  22.  参数: double *modulus_r: 存放多项式的实部 
  23.       double *modulus_r: 存放多项式的虚部 
  24.                double x: 给定复数z的实部 
  25.                double y: 给定复数z的虚部 
  26.               double *u: 返回多项式值的实部 
  27.               double *v: 返回多项式值的虚部 
  28.  */  
  29. void polynome_z(double *modulus_r, double *modulus_i, int n, double x, double y, double *u, double *v)  
  30. {  
  31.     int i;  
  32.     double now_r, now_i;  
  33.     double p, q;  
  34.     now_r = modulus_r[n-1];  
  35.     now_i = modulus_i[n-1];  
  36.     for (i=n-2; i>=0; i--)  
  37.     {  
  38.         cmul(now_r, now_i, x, y, &p, &q);  
  39.         now_r = p + modulus_r[i];  
  40.         now_i = q +  modulus_i[i];  
  41.     }  
  42.       
  43.     *u = now_r;  
  44.     *v = now_i;  
  45. }  
  46.   
  47.   
  48. int main()  
  49. {  
  50.     double x, y, u, v;  
  51.     double modulus_r[4] = {2.0, 2.0, 1.0, 2.0};  
  52.     double modulus_i[4] = {1.0, 1.0, 1.0, 2.0};  
  53.       
  54.     x = 1.0;  
  55.     y = 1.0;  
  56.     polynome_z(modulus_r, modulus_i, 4, x, y, &u, &v);  
  57.     printf("p(1.0+j) = %10.7lf+%10.7lfj", u, v);  
  58.       
  59. }  
  60.   
  61. //注:%e 是表示输出的数字以科学计数显示      如:7.234568e+003(即 7.234568*10^(+003) )  
  62.   
  63. //计算结果:  p(1.0+j) = -7.0000000+ 6.0000000j  



二。多项式乘法


1.多项式相乘(实数)


算法本身没什么难度,两个循环,遍历p,q两个多项式各个项的系数相乘,所得结果加到对应结果项上。

下面通过代码计算



[cpp]  view plain copy
  1. #include <stdio.h>  
  2.   
  3. /* ***********polynome_mul函数功能介绍*************/  
  4. /* 函数功能:计算两个多项式相乘                      */  
  5. /* 参数说明:*polynome_first,第一个多项式系数数组     */  
  6. /*         *polynome_second,第二个多项式系数数组    */  
  7. /*         *polynome_result,相乘结果多项式系数数组   */  
  8. /* num_first,num_second,num_result分别对应多项式项数*/  
  9. /* ******************************************** */  
  10. void polynome_mul(double *polynome_first, double *polynome_second, double *polynome_result, int num_first, int num_second, int num_result)  
  11. {  
  12.     int i, j;  
  13.       
  14.     for (i=0; i<num_result; i++)  //先初始化为0,(下面加法要用到,不初始化出错)  
  15.     {  
  16.         polynome_result[i] = 0.0;  
  17.     }  
  18.     for (i=0; i<num_first; i++)  
  19.     {  
  20.         for (j=0; j<num_second; j++)   //S(i+j) = S(i+j) + P(i)*p(j) 算法核心  
  21.         {  
  22.             polynome_result[i+j] = polynome_result[i+j] + polynome_first[i] * polynome_second[j];  
  23.         }  
  24.     }  
  25. }  
  26.   
  27. int main()  
  28. {  
  29.     int i;  
  30.     double polynome_first[6] = {4.0, -6.0, 5.0, 2.0, -1.0, 3.0};  
  31.     double polynome_second[4] = {2.0, 3.0, -6.0, 2.0};  
  32.       
  33.     double polynome_result[9];  // 6+4-1  
  34.     polynome_mul(polynome_first, polynome_second, polynome_result, 6, 4, 9);  
  35.   
  36.     for (i=0; i<9; i++)  
  37.     {  
  38.         printf("S(%d) = %13.7e\n", i, polynome_result[i]); //打印结果为各个项的系数  
  39.     }  
  40. }  
  41.   
  42. //注:%e 是表示输出的数字以科学计数显示      如:7.234568e+003(即 7.234568*10^(+003) )  
  43.   
  44. /*计算结果: 
  45.  S(0) = 8.0000000e+00 
  46.  S(1) = 0.0000000e+00 
  47.  S(2) = -3.2000000e+01 
  48.  S(3) = 6.3000000e+01 
  49.  S(4) = -3.8000000e+01 
  50.  S(5) = 1.0000000e+00 
  51.  S(6) = 1.9000000e+01 
  52.  S(7) = -2.0000000e+01 
  53.  S(8) = 6.0000000e+00 
  54.  */  

你可能感兴趣的:(c/c++,一步一步学算法)