多项式的计算.docx
- 文档编号:24613158
- 上传时间:2023-05-29
- 格式:DOCX
- 页数:26
- 大小:40.17KB
多项式的计算.docx
《多项式的计算.docx》由会员分享,可在线阅读,更多相关《多项式的计算.docx(26页珍藏版)》请在冰豆网上搜索。
多项式的计算
第1章多项式的计算
1.1一维多项式求值
1.功能
计算多项式
p(x)=an-1xn-1+an-2xn-2+…+a1x+a0
在指定点x处的函数值。
2.方法说明
首先将多项式表述成如下嵌套形式:
p(x)=(…((an-1x+an-2)x+an-3)x+…+a1)x+a0
然后从里往外一层一层地进行计算。
其递推计算公式如下:
un-1=an-1
uk=uk+1x+ak,k=n-2,…,1,0
最后得到的u0即是多项式值p(x)。
3.函数语句与形参说明
doubleplyv(a,n,x)
形参与函数类型
参数意义
doublea[n]
存放n-1次多项式的n个系数
intn
多项式的项数
doublex
指定的自变量值
doubleplyv()
返回多项式值p(x)
4.函数程序(文件名:
1plyv.c)
doubleplyv(a,n,x)
intn;
doublex,a[];
{inti;
doubleu;
u=a[n-1];
for(i=n-2;i>=0;i--)
u=u*x+a[i];
return(u);
}
5.例
计算多项式
p(x)=2x6-5x5+3x4+x3-7x2+7x-20
在x=±0.9,±1.1,±1.3处的函数值。
主函数程序(文件名:
1plyv0.c)如下:
#include"stdio.h"
#include"1plyv.c"
main()
{inti;
staticdoublea[7]={-20.0,7.0,-7.0,1.0,3.0,-5.0,2.0};
staticdoublex[6]={0.9,-0.9,1.1,-1.1,1.3,-1.3};
printf("\n");
for(i=0;i<=5;i++)
printf("x(%d)=%5.2lfp(%d)=%13.7e\n",i,x[i],i,plyv(a,7,x[i]));
printf("\n");
}
运行结果为:
x(0)=0.90p(0)=-1.856227e+01
x
(1)=-0.90p
(1)=-2.671537e+01
x
(2)=1.10p
(2)=-1.955613e+01
x(3)=-1.10p(3)=-2.151303e+01
x(4)=1.30p(4)=-2.087573e+01
x(5)=-1.30p(5)=-6.340432e+00
1.2一维多项式多组求值
1.功能
利用系数预处理法对多项式
p(x)=an-1xn-1+an-2xn-2+…+a1x+a0
进行多组求值。
其中n=2k(k≥1)。
2.方法说明
首先将多项式变为首一多项式,即
T(x)=p(x)/an-1=xn-1+tn-2xn-2+…+t1x+t0
其中tk=ak/an-1(k=n-2,…,1,0)。
然后对首一多项式T(x)的系数进行预处理。
其预处理过程如下:
将T(x)分解为
T(x)=(xj+b)q(x)+r(x)
其中j=2k-1,q(x)与r(x)均为2k-1-1次的首一多项式。
b,q(x)与r(x)按以下规则确定:
多项式中的中项系数减1即为b,即
b=
多项式左半部分除以xj即为q(x),即
q(x)=xs-1+qs-2xs-2+…+q1x+q0
其中s=2k-1,qi=ti+s(i=s-2,…,1,0)。
多项式右半部分减去b与q(x)的乘积即为r(x),即
r(x)=xs-1+rs-2xs-2+…+r1x+r0
其中ri=ti-bqi(i=s-2,…,1,0)。
由于q(x)与r(x)还是首一多项式,因此,它们也可以按照上述方法分别进行分解。
这个过程一直做到q(x)与r(x)的次数为1为止。
在分解过程中,每次分解后的系数仍存放在T(x)的各系数的存储单元中,最后得到T(x)经分解处理后的系数。
首一多项式T(x)的系数经预处理后,就可以用这些预处理后的系数对不同的x求函数值。
这种方法特别适用于对多个x进行求值,减少求值中的乘法次数。
如果原来的多项式不满足n=2k这个条件,则可以添加系数为0的各项及系数为1的最高次项。
3.函数语句与形参说明
voidplys(a,n,x,m,p)
形参与函数类型
参数意义
doublea[n]
存放n-1次多项式的n个系数。
返回时其值将被改变
intn
多项式的项数
doublex[m]
存放给定的m个自变量值
intm
给定自变量的个数
doublep[m]
返回时存放与给定m个自变量值对应的多项式值
voidplys()
过程
4.函数程序(文件名:
1plys.c)
#include"math.h"
#include"stdlib.h"
voidplys(a,n,x,m,p)
intn,m;
doublea[],x[],p[];
{inti,j,mm,nn,ll,t,s,kk,k;
double*b,y,z;
b=malloc(2*n*sizeof(double));
y=a[n-1];
for(i=0;i<=n-1;i++)b[i]=a[i]/y;
k=log(n-0.5)/log(2.0)+1;
nn=1;
for(i=0;i<=k-1;i++)nn=2*nn;
for(i=n;i b[nn-1]=1.0; t=nn;s=1; for(i=1;i<=k-1;i++) {t=t/2;mm=-t; for(j=1;j<=s;j++) {mm=mm+t+t;b[mm-1]=b[mm-1]-1.0; for(kk=2;kk<=t;kk++) b[mm-kk]=b[mm-kk]-b[mm-1]*b[mm+t-kk]; } s=s+s; } for(kk=1;kk<=m;kk++) {for(i=0;i<=(nn-2)/2;i++) a[i]=x[kk-1]+b[2*i]; mm=1;z=x[kk-1]; for(i=1;i<=k-1;i++) {mm=mm+mm;ll=mm+mm;z=z*z; for(j=0;j<=nn-1;j=j+ll) a[j/2]=a[j/2]+a[(j+mm)/2]*(z+b[j+mm-1]); } z=z*z/x[kk-1]; if(nn! =n)a[0]=a[0]-z; p[kk-1]=a[0]*y; } return; } 5.例 利用系数预处理法计算多项式 p(x)=2x6-5x5+3x4+x3-7x2+7x-20 在x=±0.9,±1.1,±1.3处的函数值。 主函数程序(文件名: 1plys0.c)如下: #include"stdio.h" #include"1plys.c" main() {inti; doublep[6]; staticdoublea[7]={-20.0,7.0,-7.0,1.0,3.0,-5.0,2.0}; staticdoublex[6]={0.9,-0.9,1.1,-1.1,1.3,-1.3}; plys(a,7,x,6,p); printf("\n"); for(i=0;i<=5;i++) printf("x(%d)=%5.2lfp(%d)=%13.7e\n",i,x[i],i,p[i]); printf("\n"); } 运行结果为: x(0)=0.90p(0)=-1.856227e+01 x (1)=-0.90p (1)=-2.671537e+01 x (2)=1.10p (2)=-1.955613e+01 x(3)=-1.10p(3)=-2.151303e+01 x(4)=1.30p(4)=-2.087573e+01 x(5)=-1.30p(5)=-6.340432e+00 1.3二维多项式求值 1.功能 计算二维多项式 p(x,y)= 在给定点(x,y)处的函数值。 2.方法说明 将二维多项式变形如下: p(x,y)= = 令 si= ,i=0,1,…,m-1 则计算si的递推公式如下: un-1=ai,n-1xj uj=uj+1y+aijxi,j=n-2,…,1,0 其中最后的u0即为si。 最后将所有的si(i=0,1,…,m-1)累加,即 p(x,y)= 3.函数语句与形参说明 doublebply(a,m,n,x,y) 形参与函数类型 参数意义 doublea[m][n] 存放二维多项式的系数 intm 自变量x的最高次数为m-1 intn 自变量y的最高次数为n-1 doublex,y 给定的一对自变量值 doublebply() 返回函数值p(x,y) 4.函数程序(文件名: 1bply.c) doublebply(a,m,n,x,y) intm,n; doublea[],x,y; {inti,j; doubleu,s,xx; u=0.0;xx=1.0; for(i=0;i<=m-1;i++) {s=a[i*n+n-1]*xx; for(j=n-2;j>=0;j--) s=s*y+a[i*n+j]*xx; u=u+s;xx=xx*x; } return(u); } 5.例 计算二维多项式 p(x,y)= 在给定点(0.6,-1.3)处的函数值。 其中系数矩阵为 A= 主函数程序(文件名: 1bply0.c)如下: #include"stdio.h" #include"1bply.c" main() {doublez; staticdoublea[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}}; printf("\n"); z=bply(a,4,5,0.6,-1.3); printf("p(0.60,-1.30)=%13.7e\n",z); printf("\n"); } 运行结果为: p(0.60,-1.30)=3.966554e+01 1.4复系数多项式求值 1.功能 计算复系数多项式 p(z)=an-1zn-1+an-2zn-2+…+a1z+a0 在给定复数z时的函数值。 2.方法说明 同1.1节,只是改成复数运算。 有关复数乘法的方法说明见2.1节。 3.函数语句与形参说明 voidcply(ar,ai,n,x,y,u,v) 形参与函数类型 参数意义 doublear[n],ai[n] 分别存放多项式系数的实部与虚部 intn 多项式的项数,其最高次数为n-1 doublex,y 给定复数z的实部与虚部 double*u,*v 指向返回多项式值p(z)的实部与虚部 voidcply() 过程 4.函数程序(文件名: 1cply.c) voidcply(ar,ai,n,x,y,u,v) intn; doublex,y,ar[],ai[],*u,*v; {inti; doublep,q,s,t; voidcmul(double,double,double,double,double*,double*); s=ar[n-1];t=ai[n-1]; for(i=n-2;i>=0;i--) {cmul(s,t,x,y,&p,&q); s=p+ar[i];t=q+ai[i]; } *u=s;*v=t; return; } staticvoidcmul(a,b,c,d,e,f) doublea,b,c,d,*e,*f; {doublep,q,s; p=a*c;q=b*d;s=(a+b)*(c+d); *e=p-q;*f=s-p-q; return; } 5.例 计算复系数多项式 p(z)=(2+j2)z3+(1+j)z2+(2+j)z+(2+j) 当z=1+j时的函数值。 主函数程序(文件名: 1cply0.c)如下: #include"stdio.h" #include"1cply.c" main() {doublex,y,u,v; staticdoublear[4]={2.0,2.0,1.0,2.0}; staticdoubleai[4]={1.0,1.0,1.0,2.0}; printf("\n"); x=1.0;y=1.0; cply(ar,ai,4,x,y,&u,&v); printf("p(1.0+j1.0)=%10.7lf+j%10.7lf\n",u,v); printf("\n"); } 运行结果为: p(1.0+j1.0)=-7.0000000+j6.0000000 1.5多项式相乘 1.功能 求两个多项式 P(x)=pm-1xm-1+pm-2xm-2+…+p1x+p0 Q(x)=qn-1xn-1+qn-2xn-2+…+q1x+q0 的乘积多项式 S(x)=P(x)Q(x) =sm+n-2xm+n-2+…+s2x2+s1x+s0 2.方法说明 乘积多项式S(x)中的各系数按如下公式进行计算: sk=0,k=0,1,…,m+n-2 si+j=si+j+piqj,i=0,1,…,m-1;j=0,1,…,n-1 3.函数语句与形参说明 voidpmul(p,m,q,n,s,k) 形参与函数类型 参数意义 doublep[m] 存放多项式P(x)的系数 intm 多项式P(x)的项数,其最高次数为m-1 doubleq[n] 存放多项式Q(x)的系数 intn 多项式Q(x)的项数,其最高次数为n-1 doubles[k] 返回乘积多项式的系数 intk 乘积多项式S(x)的项数,其最高次数为k-1,其中k=m+n-1 voidpmul() 过程 4.函数程序(文件名: 1pmul.c) voidpmul(p,m,q,n,s,k) intm,n,k; doublep[],q[],s[]; {inti,j; for(i=0;i<=k-1;i++)s[i]=0.0; for(i=0;i<=m-1;i++) for(j=0;j<=n-1;j++) s[i+j]=s[i+j]+p[i]*q[j]; return; } 5.例 计算下列两个多项式 P(x)=3x5-x4+2x3+5x2-6x+4 Q(x)=2x3-6x2+3x+2 的乘积多项式S(x)=P(x)Q(x)。 其中m=6,n=4,k=9。 主函数程序(文件名: 1pmul0.c)如下: #include"stdio.h" #include"1pmul.c" main() {inti; staticdoublep[6]={4.0,-6.0,5.0,2.0,-1.0,3.0}; staticdoubleq[4]={2.0,3.0,-6.0,2.0}; doubles[9]; pmul(p,6,q,4,s,9); printf("\n"); for(i=0;i<=8;i++) printf("s(%d)=%13.7e\n",i,s[i]); printf("\n"); } 运行结果为: s(0)=8.000000e+00 s (1)=0.000000e+00 s (2)=-3.200000e+01 s(3)=6.300000e+01 s(4)=-3.800000e+01 s(5)=1.000000e+00 s(6)=1.900000e+01 s(7)=-2.000000e+01 s(8)=6.000000e+00 1.6复系数多项式相乘 1.功能 求两个复系数多项式 P(z)=pm-1zm-1+pm-2zm-2+…+p1z+p0 Q(z)=qn-1zn-1+qn-2zn-2+…+q1z+q0 的乘积多项式 S(z)=P(z)Q(z) =sm+n-2zm+n-2+…+s2z2+s1z+s0 其中所有的系数均为复数。 2.方法说明 同1.5节,只是改成复数运算。 有关复数乘法的方法说明见2.1节。 3.函数语句与形参说明 voidcpml(pr,pi,m,qr,qi,n,sr,si,k) 形参与函数类型 参数意义 doublepr[m],pi[m] 存放多项式P(z)系数的实部与虚部 intm 多项式P(z)的项数,其最高次数为m-1 doubleqr[n],qi[n] 存放多项式Q(z)系数的实部与虚部 intn 多项式Q(z)的项数,其最高次数为n-1 doublesr[k],si[k] 返回乘积多项式系数的实部与虚部 intk 乘积多项式S(z)的项数,其最高次数为k-1,其中k=m+n-1 voidcpml() 过程 4.函数程序(文件名: 1cpml.c) voidcpml(pr,pi,m,qr,qi,n,sr,si,k) intm,n,k; doublepr[],pi[],qr[],qi[],sr[],si[]; {inti,j; doublea,b,c,d,u,v; voidcmul(double,double,double,double,double*,double*); for(i=0;i<=k-1;i++) {sr[i]=0.0;si[i]=0.0;} for(i=0;i<=m-1;i++) for(j=0;j<=n-1;j++) {a=pr[i];b=pi[i];c=qr[j];d=qi[j]; cmul(a,b,c,d,&u,&v); sr[i+j]=sr[i+j]+u; si[i+j]=si[i+j]+v; } return; } staticvoidcmul(a,b,c,d,e,f) doublea,b,c,d,*e,*f; {doublep,q,s; p=a*c;q=b*d;s=(a+b)*(c+d); *e=p-q;*f=s-p-q; return; } 5.例 求下列两个多项式 P(z)=(3+j2)z5+(-1-j)z4+(2+j)z3+(5-j4)z2+ (-6+j3)z+(4+j2) Q(z)=(2+j)z3+(-6-j4)z2+(3+j2)z+(2+j) 的乘积多项式S(z)。 其中m=6,n=4,k=9。 主函数程序(文件名: 1cpml0.c)如下: #include"stdio.h" #include"1cpml.c" main() {inti; staticdoublepr[6]={4.0,-6.0,5.0,2.0,-1.0,3.0}; staticdoublepi[6]={2.0,3.0,-4.0,1.0,-1.0,2.0}; staticdoubleqr[4]={2.0,3.0,-6.0,2.0}; staticdoubleqi[4]={1.0,2.0,-4.0,1.0}; doublesr[9],si[9]; cpml(pr,pi,6,qr,qi,4,sr,si,9); printf("\n"); for(i=0;i<=8;i++) printf("s(%d)=%13.7e+j%13.7e\n",i,sr[i],si[i]); printf("\n"); } 运行结果为: s(0)=6.000000e+00+j8.000000e+00 s (1)=-7.000000e+00+j1.400000e+01 s (2)=-2.600000e+01+j-3.400000e+01 s(3)=8.000000e+01+j1.600000e+01 s(4)=-5.800000e+01+j8.000000e+00 s(5)=9.000000e+00+j-1.500000e+01 s(6)=1.000000e+01+j2.600000e+01 s(7)=-1.100000e+01+j-2.700000e+01 s(8)=4.000000e+00+j7.000000e+00 1.7多项式相除 1.功能 求多项式 P(x)=pm-1xm-1+pm-2xm-2+…+p1x+p0 被多项式 Q(x)=qn-1xn-1+qn-2xn-2+…+q1x+q0 除得的商多项式S(x)和余多项式R(x)。 2.方法说明 本函数采用综合除法求商多项式S(x)中的各系数。 设商多项式S(x)的最高次数为k=m-n,则S(x)的系数由下列递推公式进行计算: sk-i=pm-1-i/qn-1 pj=pj-sk-iqj+i-k,j=m-i-1,…,k-i 其中i=0,1,…,k。 最后的p0,p1,…,pn-2即为余多项式的系数r0,r1,…,rn-2。 3.函数语句与形参说明 voidpdiv(p,m,q,n,s,k,r,l) 形参与函数类型 参数意义 doublep[m] 存放多项式P(x)的系数。 返回时其中的值将被破坏 intm 多项式P(x)的项数,其最高次数为m-1 doubleq[n] 存放多项式Q(x)的系数 intn 多项式Q(x)的项数,其最高次数为n-1 doubles[k] 返回商多项式S(x)的系数 intk 商多项式S(x)的项数,其最高次数为k-1,其中k=m-n+1 doubler[l] 返回余多项式R(x)的系数 intl 余多项式R(x)的项数,其最高次数为l-1,其中l=n-1 voidpdiv() 过程 4.函数程序(文件名: 1pdiv.c) voidpdiv(p,m,q,n,s,k,r,l) intm,n,k,l; doublep[],q[],s[],r[]; {inti,j,mm,ll; for(i=0;i<=k-1;i++)s[i]=0.0; if(q[n-1]+1.0==1.0)return; ll=m-1; for(i=k;i>=1;i--) {s[i-1]=p[ll]/q[n-1]; mm=ll; for(j=1;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 多项式 计算