MATLAB中计算多项式零点,积分微分,加减乘除(附完整代码)

目录

一. 多项式的表示

1.1 多项式幂级数的表达形式

1.2 多项式的嵌套形式

1.3 因子形式

二. 多项式的零点

2.1 给定多项式求零点

例题 2

2.2 由零点求多项式

三. 计算多项式的值

例题4

四. 由点拟合多项式

例题5

五.多项式积分

例题6

六. 多项式微分

七.多项式的和差

八. 多项式的乘除

8.1 多项式相乘

8.2 多项式相除

例题7


一. 多项式的表示

多项式在数学中一共有三种表达形式。

1.1 多项式幂级数的表达形式

y=c_1x^n+c_2x^{n-1}+\cdots+c_nx+c_{n+1}

1.2 多项式的嵌套形式

y=(\cdots((c_x+c_2)x+c_3)x+\cdots+c_n)x+c_{n+1}

1.3 因子形式

y=c_1(x-r_1)(x-r_2)\cdots(x-r_n)

N阶多项式有n个根,其中就包含重根复根。如果多项式所有的系数都是实数,那么全部的复根都会以共轭对的形式出现。

在MATLAB中,多项式用行向量表示,其元素为多项式的系数,从左到右按照降幂的形式排列,此种元素称之为幂系数。

例题1

将以下多项式利用MATLAB表示出来。

y=2x^3+x^2+4x+5

解:

MATLAB代码如下:

clc;clear;

p=[2 1 4 5]; %提取系数
poly2sym(p)

运行结果:

ans =
 
2*x^3 + x^2 + 4*x + 5

二. 多项式的零点

2.1 给定多项式求零点

多项式的零点可以由命令roots得到,求出的结果为一个列向量:

r=roots()

例题 2

求例题1中多项式的零点。

解:

MATLAB代码如下:

clc;clear;

p=[2 1 4 5]; %提取系数
r=roots(p)

2.2 由零点求多项式

由零点可得原始多项式的系数,当然,得到的结果可能相差一个倍数关系。MATLAB格式如下:

poly(r)  %r为其零点

例题3

求函数y的零点。

y=x^6-6x^5+15x^4-20x^3+15x^2-6x+1

解:

很明显,函数y是可以合并的,如下:

y=x^6-6x^5+15x^4-20x^3+15x^2-6x+1=(x-1)^6

易得此函数的零点是1。

但来看看MATLAB的运行,你会发现不一样的:

clc;clear;
r=roots([1 -6 15 -20 15 -6 1])

运行结果:

r =

   1.0030 + 0.0017i
   1.0030 - 0.0017i
   1.0000 + 0.0034i
   1.0000 - 0.0034i
   0.9971 + 0.0017i
   0.9971 - 0.0017i

分析:数学的分析和MATLAB运行的结果不太一样。由于舍入误差的影响,如果存在重根,这种MATLAB的计算会有误差。

三. 计算多项式的值

可以利用命令polyval计算多项式的值。如果输入的x含有多个横坐标值,那么对应的输出y也为与x长度相同的向量。

例题4

当x=2.5或3时,分别计算对应的多项式y的值。

y=3x^4-7x^3+2x^2+x+1

解:

MATLAB代码如下:

clc;clear;
c=[3 -7 2 1 1];
x=[2.5,3];
y=polyval(c,x)

运行结果如下:


y =23.8125   76.0000

四. 由点拟合多项式

给定n+1个点,可以唯一确定一个n阶多项式。利用polyfit命令可以确定该多项式的系数。

例题5

某三阶多项式过四个点,(1.1,3.887),(2.3,4.276),(3.9,4.651),(5.1,2.117),请求出该多项式。

解:

MATLAB代码如下:

clc;clear;
x=[1.1,2.3,3.9,5.1];
y=[3.887,4.276,4.651,2.117];%输入四个点
a=polyfit(x,y,length(x)-1)
%此函数的第三个参数代表多项式的阶数

poly2sym(a) %转为符号形式

运行结果:

a =

   -0.2015    1.4385   -2.7477    5.4370

 
ans =
 
- (361*x^3)/1792 + (15467*x^2)/10752 - (3093646650838585*x)/1125899906842624 + 3060758582605503/562949953421312

五.多项式积分

原多项式y如下:

y=c_1x^n+c_2x^{n-1}+\cdots+c_nx+c_{n+1}

积分后的Y如下:

Y=\int ydx=\frac{c_1}{n+1}x^{n+1}+\frac{c_2}{n}x^{n}+\cdots+\frac{c_n}{2}x^{2}+c_{n+1}x+c_{n+2}

MATLAB求多项式的积分,格式如下:

q=polyint(p,k) %k代表k阶积分

当然,也可以自己构造函数进行积分。思路如下:

%调用格式为 py=poly_itg(p)

function py=poly_itg(p)
n=length(p); %p代表被积多项式的系数
py=[p.*[n:-1:1].^(-1),0] %py代表求积后多项式的系数
end %此种方法不包括最后一项积分常数

例题6

按多项式的方法求解以下积分:

I=\int_{-1}^3(3x^4-4x^2+10x-25)dx

解:

MATLAB代码如下:

clc;clear;
p=[3 0 -4 10 -25]; %创建一个向量来表示多项式
q=polyint(p); %也可以写成 q=polyint(p,1)
a=-1;
b=3;
I=diff(polyval(q,[a b])) %diff函数代表相减

运行结果:
I =49.0667

六. 多项式微分

原多项式如下:

y=c_1x^n+c_2x^{n-1}+\cdots+c_nx+c_{n+1}

微分后的多项式,如下:

y'=nc_1x^{n-1}+(n-1)c_2x^{n-2}+\cdots+c_n

可以利用polyder()函数来求多项式的一阶导数的系数,c为多项式y的系数。MATLAB调用格式如下:

b=polyder(c) 

上式子中b是微分后的系数,可以表示为如下:

[nc_1,(n-1)c_2,\cdots,c_n]

七.多项式的和差

多项式y_a表示为如下:

y_a=a_1x^m+a_2x^{m-1}+\cdots+a_mx+a_{m+1}

多项式y_b表示为如下:

y_b=b_1x^m+b_2x^{m-1}+\cdots+b_mx+b_{m+1}

由此,可自己定义两个多项式相加的函数poly_add(p1,p2),自定义如下:


function p3=poly_add(p1,p2)
n1=length(p1);
n2=length(p2);
if n1=n2
    p3=p1+p2;
end
if n1>n2
    p3=p1+[zeros(1,n1-n2),p2];
end
if n1

 由此,两个多项式相加的调用格式如下:

c=poly_add(a,b) %c为求和后的系数数组

两个多项式相减,调用格式如下:

c=poly_add(a,-b)

八. 多项式的乘除

8.1 多项式相乘

根据数学经验,m阶多项式与n阶多项式的乘积是m+n阶的多项式。

多项式y_a表示为如下:

y_a=a_1x^m+a_2x^{m-1}+\cdots+a_mx+a_{m+1}

多项式y_b表示为如下:

y_b=b_1x^m+b_2x^{m-1}+\cdots+b_mx+b_{m+1}

由此两个多项式的乘积可表示如下:

y_c=y_ay_b=c_1x^d+c_2x^{d-1}+\cdots+c_dx+c_{d+1}

计算系数的MATLAB命令,如下:

c=conv(a,b)

8.2 多项式相除

多项式y_b除多项式y_a,满足如下式子:

y_a=y_qy_b+y_r

上式子中,y_q代表商,y_r代表除法的余数。

由此,多项式y_qy_r,可以由MATLAB命令得到,如下:

[q,r]=deconv(a,b)

例题7

计算多项式a与多项式b相乘的结果。

a=2x^4-5x^3+6x^2-x+9,\quad b=3x^2-90x-18

解:

MATLAB代码如下:

clc;clear;

a=[2 -5 6 -1 9];
b=[3 -90 -18];
c=conv(a,b); %相乘
poly2sym(c)  %写成符号的形式

运行结果:

ans =6*x^6 - 195*x^5 + 432*x^4 - 453*x^3 + 9*x^2 - 792*x - 162

你可能感兴趣的:(MATLAB,matlab,线性代数,矩阵)