数值计算基础
1、多项式
1.1 多项式的创建
1.1.1 直接输入系数向量创建多项式
1.1.2 特殊多项式输入法
1.1.3 由多项式的根逆推多项式
1.2 多项式的运算
1.2.1 多项式的求值
1.2.2 求多项式的根
1.2.3 多项式的乘除法
1.2.4 多项式的微积分
1.2.5 多项式的部分分式展开
1.2.6 多项式的估值
1.2.7 多项式的拟合
1.2.8 多项式的插值
2、线性方程
2.1 有唯一解线性方程组求法
2.2 有无穷解的线性方程组求法
2.2.1 齐次线性方程组的通解
2.2.2 非齐次线性方程组通解
2.3 自编函数判断唯一解或者无穷解
3、数据分析
3.1 协方差阵与相关阵
3.1.1 协方差阵
3.1.2 相关阵
3.2 差分和梯度
3.2.1 差分
3.2.2 梯度
由于在matlab中多项式的以向量的形式存储的,直接输入向量,matlab将降幂自动把向量的元素分配给多项式各项的系数。
创建方法:
在matlab的命令窗口直接输入多项式的系数矢量,然后利用转换函数poly2sym将多项式由系数质量形式转换为符号形式。
例如:输入系数矢量,创建多项式
>> poly2sym([2 -5 3 7])
ans=
2x^3-5*x^2+3*x+7
创建方法:
matlab提供了poly函数,使用它可以由矩阵的特征多项式创建多项式。使用该方法生成多项式时,其首项的系数必为1.
>> a=[1 2 3; 4 5 6; 7 8 0];
>> p=poly(a)
p=
1.0000 -6.0000 -72.00000 -27.0000
>> poly2sym(p)
ans=
x^3-6*x^2-72*x-27
创建方法:
如果已知某个多项式的根,那么使用poly函数可以很好产生其对应的多项式。
>> roots=[-4 -2+2i -2-2i 5];
>> p=poly(roots)
p=
1 3 -16 -88 -160
>> disp(poly2sym(p))
x^4+3*x^3-16*x^2-88*x-160
matlab中有指定的函数求多项式的值,调用格式如下:
y=polyval(p,x) % p在x点的值
y=polyval(p,x,[],mu) % p在x点的值
[y,delta]=polyval(p,x,s) % 产生误差估计
y=polyvalm(p,x) % 其中x是方阵
例如:求解在x=8时多项式(x-1)(x-2) (x-3)(x-4)的值。
>> p=poly([1 2 3 4]);
>> polyvalm(p,8)
ans =
840
直接调用求根函数roots
那么如何表示系数与根?
》》先把多项式转化为伴随矩阵,再求特征值
例如:求解多项式x3-7x2+2x+40的根。
>> r=[1 -7 2 40];
>> p=roots(r);
-0.2151
0.4459
0.7949
0.2707
c=conv(a,b)%多项式a与b相乘(卷积)
a=deconv(c,b)%多项式相除(解卷积)
>> a=[2 3 4 2 59 8];
b=[12 2 4 3 5 7 8 9 1];
>> polyval(a,1)%当x=1时,多项式的值
ans =
78
>>c=conv(a,b)%多项式a与b相乘(卷积)
c=
24 40 62 50 747 263 315 289 394 508 550 597 131 8
>>deconv(c,b)%多项式相除(解卷积)
d =
2.0000 3.0000 4.0000 2.0000 59.0000 8.0000
>>roots(a)%当多项式a=0时,x的值
ans =
-1.8991 + 1.7358i
-1.8991 - 1.7358i
1.2172 + 1.7203i
1.2172 - 1.7203i
-0.1361 + 0.0000i
例如:计算多项式乘法。
>> c=conv([1 2 2],[1 5 4])
c =
1 7 16 18 8
计算多项式除法。
>> d=deconv([3 13 6 8],[1 4])
d =
3 1 2
微分运算
积分运算
例如:计算多项式的微分和积分。
>> p=[4 –12 –14 5];
>> pder=polyder(p);
>> pders=poly2sym(pder)
>> pint=polyint(p);
>> pints=poly2sym(pint)
pders =
12*x^2-24*x-14
pints =
x^4-4*x^3-7*x^2+5*x
matlab中,有理多项式由它们的分子多项式和分母多项式表示。对有理多项式进行运算的两个函数是residue和polyder。redidue执行部分分式展开的运算
例如:对下式进行部分分式展开:
>> a=[1 3 4 2 7 2];
>> b=[3 2 5 4 6];
>> [r,p,k]=residue(b,a)
r =
1.1274 + 1.1513i
1.1274 - 1.1513i
-0.0232 - 0.0722i
-0.0232 + 0.0722i
0.7916
p =
-1.7680 + 1.2673i
-1.7680 - 1.2673i
0.4176 + 1.1130i
0.4176 - 1.1130i
-0.2991
k =
[]
matlab提供了polyval函数与polyvalm函数用于求多项式p(x)在x=a的取值。输入可以是标量或矩阵
polyvalm函数的输入参数只能是N阶方阵,这时可以将多项式看作矩阵函数
>> X = pascal(4)
X =
1 1 1 1
1 2 3 4
1 3 6 10
1 4 10 20
>> p = poly(X)
p =
1.0000 -29.0000 72.0000 -29.0000 1.0000
>> P = poly2str(p,'x')
P =
x^4 - 29 x^3 + 72 x^2 - 29 x + 1
>> y = polyval(p,X)
y =
1.0e+04 *
0.0016 0.0016 0.0016 0.0016
0.0016 0.0015 -0.0140 -0.0563
0.0016 -0.0140 -0.2549 -1.2089
0.0016 -0.0563 -1.2089 -4.3779
>> y = polyvalm(p,X)
y =
1.0e-10 *
-0.0003 -0.0036 -0.0052 -0.0143
-0.0021 -0.0136 -0.0179 -0.0464
-0.0059 -0.0330 -0.0400 -0.1047
-0.0130 -0.0639 -0.0750 -0.1962
拟合:polyfit()函数,不一定用离散点建立多项式函数关系,但是建立的多项式要与离散点误差(平方和距离)最小。
p=polyfit(x,y,n)
[p,s]= polyfit(x,y,n)
说明:x,y为数据点,n为多项式阶数,返回p为幂次从高到低的多项式系数向量p。x必须是单调的。矩阵s用于生成预测值的误差估计。
例如:用多项式拟合法求一个形如 的公式,使它与表中所列数据拟合
>> x=[19 25 31 38 44];
y=[19.0 32.3 49.0 73.3 97.8];
a=polyfit(x,y,2); %拟合2次函数
x0=19:0.1:44; %步长为0.1
y0=polyval(a,x0); %返回值y0是对应于x0的函数值
plot(x,y,'o',x0,y0,'r') %画图,o表示圆圈,r表示红色red
legend('拟合前','拟合后') %给曲线加上说明
xlabel('x'); %给x轴加上说明
ylabel('y');
grid on; %添加网格线
set(gca,'GridLineStyle',':','GridColor','k','GridAlpha',1); %将网格线变成虚线
a %直接输出a
a =
0.0497 0.0193 0.6882
所以可以得出拟合函数
数据插值可分为多项式(高次)插值、分段(低次)插值、三角插值等。多项式插值包括Lagrange插值、Aitken插值、Newton插值、Hermite插值,但高次插值会出现Runge现象,因此更多使用分段低次样条插值。
使用最多的为三次样条插值。
例如:有一正弦衰减数据y=sin(x).*exp(-x/10),其中x=0:pi/5:4*pi,用三次样条法进行插值。
>> x0=0:pi/5:4*pi;
>> y0=sin(x0).*exp(-x0/10);
>> x=0:pi/20:4*pi;
>> y=spline(x0,y0,x);
>> plot(x0,y0,'or',x,y,'b')
对于一般的,有唯一解的线性方程组,我们可以转换成矩阵的形式:A x = b
则可以用矩阵运算求解x,即x=A\b
求解齐次线性方程组基础解系的函数是null
Z=null(A)表示返回矩阵A的基础解系组成的矩阵。Z还满足
Z=null(A,‘r’)得出的Z不满足,但得出的矩阵元素多为整数,顾一般都带参数r。
非齐次线性方程组在求出基础解析后还要求一个特解。对于矩阵形式的非齐次线性方程组A x = b 特解x0的求法为x0=pinv(A)*b;其中函数pinv的意思是伪逆矩阵。
>> a=[2 9 0;3 4 11;2 2 6];
>> b=[13 6 6]';
>> x=a\b
x =
7.4000
-0.2000
-1.4000
求解线性方程组:
由输出结果可知方程的解为
编写一个函数,给入矩阵A和b,给出方程的解,函数自动判断是有唯一解还是无穷解。
function varargout = gaussion(varargin)
% gaussion 用高斯消元法解线性方程组
% A是系数矩阵,b是常熟矩阵。varargin={A,b};如果b为0,则不输入b
% varargout=[S flag],S给出结果
% flag为0无解;1唯一解;2齐次通解;3非齐次通解
A=cell2mat(varargin(1));
Alie=length(A);
Asum=numel(A);
Ahang=Asum/Alie;
if(nargin==2)
b=cell2mat(varargin(2));
else
b(Ahang,1)=0;
end
B=A;
B(:,Alie+1)=b;
varargout(1)={S};
if(nargout==2)
varargout(2)={flag};
end
end
Ar=rank(A); Br=rank(B);
B=rref(B);
if (Ar
矩阵中的数据按行排列与按列排列求出的协方差矩阵是不同的,这里默认数据是按行排列。即每一行是一个observation(or sample),那么每一列就是一个随机变量。
协方差矩阵:
clear; clc;
X = [1 2 3;
3 1 1];
Y = X;
[rows, cols] = size(X);
% get mean of each dimension(each column).
meanMatrix = mean(X);
% X - mean.
X = X - ones(rows, 1) * meanMatrix;
% get the cov matrix.
covMatrix = 1 / (rows - 1) * (X' * X)
% the given 'cov' function
cov(Y)
corrcoef(X):返回从矩阵X形成的一个相关系数矩阵,若X是一个m*n的矩阵,那么得到的相关系数矩阵A就是一个n*n的对称矩阵,A中的第i行第j列的元素表示的就是X第i列和第j列的相关系数。
corrcoef(X,Y):它的作用和corrcoef([X,Y])是一样的,表示序列x和序列y的相关系数,得到的结果是一个2*2矩阵,其中对角线上的元素分别表示x和y的自相关,非对角线上的元素分别表示x与y的相关系数和y与x的相关系数,两个是相等的。
corrcoef函数算出来的是皮尔逊相关系数。
corrcoef函数计算相关系数是在matlab提供的cov函数基础上进行计算的,形成的矩阵是
corr(X)输出的结果和corrcoef是一致的,但是corr可以自己选择相关系数的类型。matlab提供三种,默认的是皮尔逊相关系数,剩下的两种是kendall和spearman.
1. X与Y是两个变量取值所构成的向量
Pearson相关系数:corr(X,Y,'type','Pearson')
Kendall相关系数:corr(X,Y,'type','Kendall')
Spearman相关系数:corr(X,Y,'type','Spearman')
2. X是一个数据矩阵,列为个变量取值
Pearson相关系数:corr(X,'type','Pearson')
Kendall相关系数:corr(X,'type','Kendall')
Spearman相关系数:corr(X,'type','Spearman')
计算数据差分的函数diff()
>> A=[1 2 3;4 5 6;7 8 9; 10 11 12]
A =
1 2 3
4 5 6
7 8 9
10 11 12
>> B=diff(A,1,1)%按列求一阶差分
B =
3 3 3
3 3 3
3 3 3
>> B=diff(A,1,2)%按行求一阶差分
B =
1 1
1 1
1 1
1 1
[Fx,Fy]=gradient(F),其中Fx为其水平方向上的梯度,Fy为其垂直方向上的梯度,Fx的第一列元素为原矩阵第二列与第一列元素之差,Fx的第二列元素为原矩阵第三列与第一列元素之差除以2,以此类推:Fx(i,j)=(F(i,j+1)-F(i,j-1))/2。最后一列则为最后两列之差。同理,可以得到Fy。
1、如果F是一维矩阵,则FX=gradient(F,H)返回F的一维数值梯度。H是F中相邻两点间的间距。
2、如果F是二维矩阵,返回F的二维数值梯度。
[FX,FY]=gradient(F,HX,HY) HX,HY参数表示各方向相邻两点的距离
3、如果F是三维矩阵,返回F的三维数值梯度。
[FX,FY,FZ]=gradient(F,HX,HY,HZ) HX,HY,HZ参数表示各方向相邻两点的距离。
>> x=[6,9,3,4,0;5,4,1,2,5;6,7,7,8,0;7,8,9,10,0]
x =
6 9 3 4 0
5 4 1 2 5
6 7 7 8 0
7 8 9 10 0
>> [Fx,Fy]=gradient(x)
Fx =
3.0000 -1.5000 -2.5000 -1.5000 -4.0000
-1.0000 -2.0000 -1.0000 2.0000 3.0000
1.0000 0.5000 0.5000 -3.5000 -8.0000
1.0000 1.0000 1.0000 -4.5000 -10.0000
Fy =
-1.0000 -5.0000 -2.0000 -2.0000 5.0000
0 -1.0000 2.0000 2.0000 0
1.0000 2.0000 4.0000 4.0000 -2.5000
1.0000 1.0000 2.0000 2.0000 0
>> v = -2:0.2:2;
>> [x,y] = meshgrid(v);
>> z=10*(x.^3-y.^5).*exp(-x.^2-y.^2);
>> [px,py] = gradient(z,.2,.2);
>> contour(x,y,z)
>> hold on
>> quiver(x,y,px,py)
>> hold off
全文共9504个字,码字总结不易,老铁们来个三连:点赞、关注、评论
作者:左手の明天
原创不易,转载请联系作者并注明出处
敬请期待下一篇:
matlab从无到有系列(四):符号数学基础