第三章 MATLA 的数值计算功能

第三章 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)$ 的函数文件名。
  • totf 分别是积分的起始值和终止值。
  • x0 为初始状态列向量。

3.11 盘文件管理与工作平台间交换数据

MATLAB 的 saveload 提供了对基本工作空间的保存和重新掉入的功能。
此外,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))
第三章 MATLA 的数值计算功能_第1张图片
3.7-有效拟合的区间型图示.png
第三章 MATLA 的数值计算功能_第2张图片
微分方程的数值解.png

你可能感兴趣的:(第三章 MATLA 的数值计算功能)