博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
常见算法-多项式计算(1)
阅读量:5362 次
发布时间:2019-06-15

本文共 4073 字,大约阅读时间需要 13 分钟。

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

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

一。多项式求值

1.一维多项式

问题描述:计算形如

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

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

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

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

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

#include 
/* 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\n", 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 
/* 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\n", result_); }//注:%e 是表示输出的数字以科学计数显示 如:7.234568e+003(即 7.234568*10^(+003) )/* ****************结果*******************

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

*/

 

3.复数多项式

问题描述:计算形如

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

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

下面通过代码,计算

在z=1+j时的函数值

 

#include 
/* 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

 

 

转载于:https://www.cnblogs.com/pangblog/p/3299370.html

你可能感兴趣的文章
SniperOJ-leak-x86-64
查看>>
bzoj 4260: Codechef REBXOR (01 Trie)
查看>>
学好python
查看>>
css-IE中的border-radius和box-shadow
查看>>
利用bootstrap和webform的异步CRUD及分页
查看>>
HDUOJ 1879继续畅通工程(并查集)
查看>>
OC12_自动释放池
查看>>
Saiku资源帖
查看>>
解决手机页面中点击文本框,网页放大问题
查看>>
2-5
查看>>
牛客多校3 A-PACM Team(状压降维+路径背包)
查看>>
HDU - 4284 Travel(floyd+状压dp)
查看>>
1027 制作表格
查看>>
Android之Socket通信、List加载更多、Spinner下拉列表
查看>>
面向对象的介绍与特性
查看>>
typing-python用于类型注解的库
查看>>
20189215 2018-2019-2 《密码与安全新技术专题》第13周作业
查看>>
第四周作业
查看>>
一、HTML基础
查看>>
蓝牙进阶之路 (002) - HC-05与HC-06的AT指令的区别(转)
查看>>