求列向量组A的一个最大线性无关组,可用命令rref(A)将A化成行最简形,其中单位向量对应的列向量即为最大线性无关组所含向量,其他列向量的坐标即为其对应向量用最大线性无关组线性表示的系数。
例1. 求下列矩阵列向量组的一个最大无关组。
程序如下:
format rat %有理分数的显示格式
a = [1 2 -1 0 2;-2 4 2 6 -6;2 -1 0 2 3;3 3 3 3 4];
b = rref(a)
format %恢复到短小数的显示格式
结果为:
b =
1 0 0 0 11/6
0 1 0 0 0
0 0 1 0 -1/6
0 0 0 1 -1/3
记矩阵A的五个列向量依次为a1、a2、a3、a4、a5,则a1、a2、a3、a4是列向量组的一个最大无关组,且有
例2.设
验证a1、a2、a3是的一个基,并把b1、b2用这个基线性表示。
程序如下:
clc,clear;
format rat
a = [2 2 -1;2 -1 2;-1 2 2];
b = [1 4;0 3;-4 2];
c = rref([a,b])
format %恢复到短小数的显示格式
结果为:
c =
1 0 0 2/3 4/3
0 1 0 -2/3 1
0 0 1 -1 2/3
在Matlab中,函数null用来求解零空间,即满足Ax = 0的解空间,实际上是求出解空间的一组基(基础解系)。格式如下:
z = null(A) %z的列向量为方程组的正交规范基,满足zTz=E
z = null(A,'r') %z的列向量是方程Ax=0的有理基
例3. 求方程组的通解
程序如下:
clc,clear;
format rat
a = [1 2 2 1;2 1 -2 -2;1 -1 -4 -3];
b = null(a,'r')
syms k1 k2
x = k1*b(:,1)+k2*b(:,2) %写出方程组的通解
基础解系和通解分别为:
b =
2 5/3
-2 -4/3
1 0
0 1
x =
2*k1 + (5*k2)/3
- 2*k1 - (4*k2)/3
k1
k2
Matlab中解非齐次线性方程组可以使用‘\’,虽然表面上只是一个简单的符号,而它的内部却包含许多自适应算法,如对超定方程(无解)用最小二乘法,对欠定方程(多解)它将给出范数最小的一个解。
另外求解欠定方程组(多解)可以使用求矩阵A的行最简形命令rref(A),求出所有的基础解系。
例4.求超定方程组
程序如下:
clc,clear;
format rat
a = [1 1 0;1 0 1;1 1 1;1 2 -1];
b = [1;2;0;-1];
x1 = a\b %这里\和pinv是等价的
x2 = pinv(a)*b
结果为:
x1 =
17/6
-13/6
-2/3
x2 =
17/6
-13/6
-2/3
求得最小二乘解为
例5.求解方程组
程序如下:
clc,clear;
format rat
a = [1 -1 -1 1 0;1 -1 1 -3 1;1 -1 -2 3 -1/2];
b = rref(a)
format %恢复到短小数的显示格式
结果为:
b =
1 -1 0 -1 1/2
0 0 1 -2 1/2
0 0 0 0 0
所以,方程组有解,并有
因而方程组的通解为
求解非齐次线性方程组需要先判断方程组是否有解,若有解,再去求通解。因此,步骤为:
有时候我们需要精确的特征值和特征向量,就必须利用Matlab的符号运算功能,在Matlab中创建符号矩阵和创建数值矩阵的形式很相似,只不过要用到符号定义函数sym。下面介绍shi使用次函数创建符号矩阵的几种形式。
此方法和直接创建数值矩阵的方法几乎完全相同,矩阵元素可以是符号表达式,各符号表达式的长度可以不同,矩阵元素之间可用逗号或空格分隔。例如:
clc,clear;
x = sym('[a+sin(d),b;1/c,d]');
y = det(x)
结果为:
y =
(a*c*d - b + c*d*sin(d))/c
在Matlab中,数值矩阵不能直接参与符号运算,必须先转化为符号矩阵。例如:
clc,clear;
a = [2/3, sqrt(2);3,1]
b = sym(a)
结果为:
a =
0.666666666666667 1.414213562373095
3.000000000000000 1.000000000000000
b =
[ 2/3, 2^(1/2)]
[ 3, 1]
Matlab的符号矩阵索引和修改同数值矩阵的索引和修改完全相同。
b(2,2) = 'log(2)'
b =
[ 2/3, 2^(1/2)]
[ 3, log(2)]
例6. 求一个正交变换x = Py, 把二次型
化为标准型。
二次型矩阵为
程序如下:
clc,clear;
A = [0, 1, 1, -1;1, 0, -1, 1;1, -1, 0, 1;-1, 1, 1, 0];
[P, D] = eig(A)
结果为:
P =
-0.5000 0.2887 0.7887 0.2113
0.5000 -0.2887 0.2113 0.7887
0.5000 -0.2887 0.5774 -0.5774
-0.5000 -0.8660 0 0
D =
-3.0000 0 0 0
0 1.0000 0 0
0 0 1.0000 0
0 0 0 1.0000
P就是所求的正交矩阵,使得,x = Py,其中,
化简后的二次型为
例7. 判别二次型的正定性,并求正交变换把二次型化che成标准型。
程序如下:
clc,clear;
a = [2 -2 0;-2 4 0;0 0 5];
b = eig(a)
if all(b>0)
fprintf('二次型正定\n');
else
fprintf('二次型非正定\n');
end
[c,d]=eig(a)
结果为:
b =
0.7639
5.0000
5.2361
二次型正定
c =
-0.8507 0 -0.5257
-0.5257 0 0.8507
0 1.0000 0
d =
0.7639 0 0
0 5.0000 0
0 0 5.2361