第三章 MATLA 的数值计算功能
3.1 数值矩阵的创建、保存和数据格式
矩阵输入间代码
- 利用 M 文件创建和保存矩阵
- 通过 MAT 文件保存和获取矩阵
- 利用外部数据文件装入指定矩阵
3.2 矩阵的标识
矩阵的元素、子矩阵可以通过标识、向量、冒号的标识来援引和赋值。
3.3 矩阵运算和数组运算
-
inv(A)
:矩阵求逆
3.4 矩阵函数和数组函数
数组函数是对各个元素的函数设计的
矩阵函数
-
det(A)
:方阵的行列式 -
norm(A,1)
:矩阵 1-范数 -
norm(A)
:矩阵的 2-范数 -
norm(A,inf)
:矩阵的无穷范数 -
norm(A,'fro')
:矩阵的 f-范数 -
rank(A)
:矩阵的秩 -
svd(A)
:矩阵的奇异值分解 -
trace(A)
:矩阵的迹
3.5 线性方程组的直接解法
线性方程组$Ax = b$,$A$是$n×m$的系数矩阵
- 当$n = m$且非奇异时,“恰定”方程
- 当$n > m$时,“超定”方程
- 当$n < m$时,“欠定”方程
矩阵逆和出发解恰定方程组
- 采用求逆运算:$x = inv(A) * b$
- 采用左除运算:$x = A \ b$
ps:尽量使用除运算,少用逆运算
代码运行结果显示
- 除法求解速度快,精度高
矩阵除法解超定方程组
- 求正则方程$(A^TA)x = A^Tb$ 的解
- 用Householder变换直接求厡超定方程的最小二乘解
ps:第二种方法采用的是正交变换,据最小二乘理论可知,第二种方法所得的解的准确性、可靠性都比第一种方法好得多。
矩阵除法解欠定方程组
欠定方程的解不唯一。用除法运算所得的解有两个重要特征:
- 在解中至多有 Rank(A) 个非零元素
- 它是这类型解中范数最小的一个
矩阵分解函数
- $[L, U]=lu(X)$:产生一个上三角矩阵$U$和一个“心理上下三角矩阵”$L$,使得$X=L*U$
- $[L, U, P]=lu(X)$:产生一个上三角矩阵$U$和一个下三角矩阵$L$以及一个置换矩阵$P$,使得$PX=LU$
ps:$X$必须是方阵
QR分解
- $[Q, R] = qr(A)$:产生一个与矩阵$A$相同位数的上三角矩阵$Q$和一个酉矩阵$Q$,使得$A = Q * R$
- $[Q, R, E] = qr(A)$:产生一个置换矩阵$E$,上三角矩阵$R$和一个酉矩阵$Q$,使得$AE=QR$
Choleshy 分解
Cholesky 分解要求被分解矩阵 A 为对称正定矩阵
R = chol(A)
:产生一个上三角矩阵$R$,使得$A = R^T * R$
3.7 多项式
多项式的表达和创建
多项式表达方式约定:
多项式$p(x) = a_0 x^n +a_1 x^{n-1} + \cdots + a_{n-1} x + a_n$ 用以下系数行向量表示:
$ p = [a_o, a_1, \cdots , a_{n-1}, a_n]$
多项式行向量的创建方法:
- 多项式系数向量的直接输入方法
- 利用指令:
p = poly(AR)
,产生多项式系数向量
常用多项式运算指令
-
R = roots(p)
:求多项式向量 p 的根 -
PA = polyval(p , S)
:按数组运算规则计算多项式的值 -
PM = polyvalm(p ; S)
:按矩阵运算规则计算多项式值 -
[r, p, k] = residue(b, a)
:部分分式展开 -
P = polyfit(x, y, n)
:用 n 阶多项式拟合 x,y 向量给定的数据
3.8 数值积分
求函数数值积分指令:
-
S = quad('fname', a, b, tol, trace)
:自适用递推 Simpson 数值积分法 -
S = quad8('fname', a, b, tol, trace)
:自适用递推 Newton - Cotes 数值积分法
fname
是被积分函数表达式字符串或函数文件名
a, b
分别是积分上下限
tol
用来控制积分精度,缺省时取 tol = 0.001
trace
若取 1 则用图形展先积分过程
quad8 在新版本中已经移除!!!
3.9 优化和解非线性方程
非线性方程的求根方法很多,常用的有牛顿迭代法,弦截法等。
单变量非线性方程求解(单变量函数求零点)
z = fzero('fname', x0, tol, trace)
- fname:待求根函数名
- x0:搜索起点
- tol:结果精度,默认eps
- trace:迭代过程是否显示
一般非线性方程(组)求解
X = fsolve('fname', X0)
- fname:待求根函数名
- x0:对解的初试猜测值
3.10 微分方程的数值解
[t, x] = ode23('xprime', to, tf, x0, tol, trace)
[t, x] = ode45('xprime', to, tf, x0, tol, trace)
或
[t, x] = ode23('xprime', [to, tf], x0, tol, trace)
[t, x] = ode45('xprime', [to, tf], x0, tol, trace)
- 指令针对一阶常微分设计,对高阶微分方程,须先演化为一节微分方程,即“状态方程”
-
xprime
是定义 $f(x, t)$ 的函数文件名。 -
to
和tf
分别是积分的起始值和终止值。 -
x0
为初始状态列向量。
3.11 盘文件管理与工作平台间交换数据
MATLAB 的 save
和 load
提供了对基本工作空间的保存和重新掉入的功能。
此外,MATLAB 还提供了管理磁盘文件、输入、输出数据等功能。
文件管理
dir
, type
, delete
, cd
等用于文件管理的操作系统命令
执行外部程序
感叹号 !
是 MATLAB 的一个特殊命令,它指示其后的命令为操作系统命令。
利用 !
可以在不退出 MATLAB 的情况下执行其它程序或操作系统命令。
输入和输出数据
fopen
函数打开二进制文件,fread
函数将数据装入一个变量中。
save
命令及 -ascii
选项可按 ASCII
形式保存指定的数据。
工作空间交换数据
fid = fopen('wzs.dat' , 'r')
- 第一个参数为操作对象
- 第二个参数指示允许操作的类型。
r
:读,w
:写,a
:添加,r+
:读/写。
二进制数据读写
%读取
fid = fopen('penny.dat', 'r');
a = fread(fid); %将读入 fid 并写入矩阵 a
a = fread(fid, 100); %读入前100个数据
a = fread(fid, ]10, 10]); %读入前100个数据并组成10阶方阵
ststus = fclose(fid); %关闭
%写入
fwriteid = fopen('magic.bin', 'w');
count = fwrite(fwrited, magic(5), 'integer*4');
status = fclose(fwrieid);
第三章代码
%3.1 数值矩阵的创建、保存和数据格式
%创建矩阵值直接输入法
x = 14; y = 4.32;
A = [x, 2*x-y, 0;
sin(pi/4), 3*y+x, sqrt(y)];
%利用指令reshape创建数值矩阵
av = 1:12;
bm = reshape(av, 3, 4);
%利用指定diag产生对角矩阵
ar = rand(4,4); %4×4的“0-1”均匀分布随机矩阵
d = diag(ar); %用矩阵主对角线元素形成向量d
D = diag(d); %用向量d构成对角矩阵D
%3.2 矩阵的标识
b = [1 2 3 4 5; 6 7 8 9 10; 11 12 13 14 15];
b23 = b(2,3);
b1 = b(1:2, [1 3 5]);
b2 = b([3 1], :);
b([1 3], [2, 4]) = zeros(2);
x = [1 2 3 4 5];
l = x <= 3;
x = x(l) ; %获得元素不超过3的子向量
%3.3 矩阵运算和数组运算
a = [1 2 3; 4 5 6; 7 8 9];
b = [1 2 3; 3 2 1; 1 4 5];
c = [1 1 1; 2 3 1; 1 0 2];
d = a*c^2+b;
%3.4 矩阵函数和数组函数
a = magic(5); %magic魔方矩阵
s = svd(a); %矩阵的奇异值分解
d = det(a); %方阵行列式
t = trace(a); %矩阵迹
rk = rank(a); %矩阵的秩
c = cond(a); %矩阵的条件数
n1 = norm(a, 1); %
n2 = norm(a);
ninf = norm(a, inf);
nf = norm(a, 'fro');
%3.5 线性方程组的直接解法
%“求逆”和“左除”法解恰定方程组的性能对比
rand('seed', 12); %随机种子
A = rand(500) + 1.e8; %500×500均匀分布随机矩阵
x = ones(500, 1); %ones生成全1的500元列向量
b = A * x;
cond(A) %计算矩阵A的条件数
tic %启动计时器
xi = inv(A)*b; %“求逆”法
toc %关闭计时器
eri = norm(x-xi) %解向量xi与真解向量的 2-范数误差
rei = norm(A*xi - b) / norm(b) %方程的 2-范数 相对残差
tic
xd = A\b;
toc
erd=norm(x-xd)
red=norm(A*xd-b)/norm(b)
%矩阵除法解超定方程组
a = [1 2 3; 4 5 -6; 7 8 9; 10 11 12];
b = [1 : 4]';
x = a\b
%矩阵除法解欠定方程组
a = [1 2 3; 4 5 -6;7 8 9; 10 11 12];
b = a';
c = [1 3 3]';
x = b\c
%矩阵分解函数
A = [1 -1 1; 5 -4 3; 2 1 1];
[L, U] = lu(A);
[L, U, P] = lu(A);
A = [4 1 2; 2 5 -1; 5 3 11];
[L, U] = lu(A);
A = [1, -1, 1; 5, -4, 3; 2, 1, 1];
b = [2;-3;1];
[L, U, P]=lu(A);
y = L\(P*b);
%QR分解
a = [1 -1 1;5 -4 3;2 1 1];
[Q, R]=qr(a);
[Q, R, E]=qr(a);
a = [10 -1 1;5 -14 3;2 1 21];
[Q, R]=qr(a);
[Q, R, E]=qr(a);
%Choleshy分解
a = [2,1,1;1,2,-1;1,-1,3];
R = chol(a);
%3.7 多项式
%多项式的表达和创建
a = [11 12 13;14 15 16; 17 18 19];
pa = poly(a);
ppa = poly2str(pa, 's')
%由给定根向量求多项式系数向量
r = [-0.5, -0.3+0.4*i, -0.3-0.4*i];
p = poly(r)
pr = real(p)
ppr = poly2str(pr, 'x')
%x^3-6x^2-72x-27的根
r = roots([1,-6, -72,-27])
%多项式求值指令差别
s = pascal(4)
p = poly(s);
pp = poly2str(p, 'x')
pa = polyval(p, s)
pm = polyvalm(p, s)
%误差函数最小二乘拟合
x = 0:0.1:2.5
y = erf(x) %计算误差函数
p = polyfit(x, y, 6)
px = poly2str(p, 'x')
%有效拟合的区间性图示
x = 0:0.1:5;
x1 = 0:0.1:2.5;
y = erf(x);
y1 = erf(x1);
p = polyfit(x1, y1, 6);
f = polyval(p,x);
plot(x, y, 'bo', x, f, 'r-')
axis([0, 5, 0, 2])
legend('拟合曲线', '厡数据线')
%3.8 数值积分
% function [ f ] = fesin( x )
% %UNTITLED 此处显示有关此函数的摘要
% % 此处显示详细说明
% f = exp(-0.5*x).*sin(x + pi/6);
%
% end
%上边代码写入新创建的M文件 fesin.m 中
S = quad('fesin', 0, 3*pi)
global num;
num = 0;
format long;
I = quad('ftest', 1, 2.5, 1e-6, 1), num
global num;
num = 0;
format long;
I = quadgk(@fx, 1, 2.5, 1e-6, 1), num
%3.9 优化和解非线性方程
p = [1 2 3 4];
r = roots(p)
z = fzero('f2',2)
x = fsolve('myxyz', [1 1 1])
%3.10 微分方程的数值解
t0 = 0;tf = 10; y0 = 2;
[t, y] = ode23('funt', [t0, tf], y0);
y1=sqrt(t+1)+1;
t', y', y1'
plot(t, y, '-r', t, y1, ':b')
legend('数值解','解析解')
t0 = 0; tf = 20; x0 = [0, 0.25]';
ode23t('vdp', t0, tf, x0);
subplot(1, 2, 1)
plot(t, x(:, 1),':b', t, x(:,2), '-r')
legend('速度', '位移')
subplot(1, 2, 2)
plot(x(:,1), x(:,2))