欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MATLAB(五)在线性代数中的应用

程序员文章站 2022-07-12 14:00:47
...

MATLAB在线性代数中的应用

(一)向量组的线性相关性

求列向量组A的一个最大线性无关组,可用命令rref(A)将A化成行最简形,其中单位向量对应的列向量即为最大线性无关组所含向量,其他列向量的坐标即为其对应向量用最大线性无关组线性表示的系数。

例1. 求下列矩阵列向量组的一个最大无关组。

MATLAB(五)在线性代数中的应用

程序如下:

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是列向量组的一个最大无关组,且有

MATLAB(五)在线性代数中的应用

例2.设

MATLAB(五)在线性代数中的应用

验证a1、a2、a3是MATLAB(五)在线性代数中的应用的一个基,并把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   

说明a1、a2、a3是MATLAB(五)在线性代数中的应用的一个基,且有MATLAB(五)在线性代数中的应用

(二)齐次线性方程组

在Matlab中,函数null用来求解零空间,即满足Ax = 0的解空间,实际上是求出解空间的一组基(基础解系)。格式如下:

z = null(A)  %z的列向量为方程组的正交规范基,满足zTz=E
z = null(A,'r')  %z的列向量是方程Ax=0的有理基

例3. 求方程组的通解

MATLAB(五)在线性代数中的应用

程序如下:

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.求超定方程组

MATLAB(五)在线性代数中的应用

程序如下:

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     

求得最小二乘解为

MATLAB(五)在线性代数中的应用

例5.求解方程组

MATLAB(五)在线性代数中的应用

程序如下:

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(五)在线性代数中的应用

求解非齐次线性方程组需要先判断方程组是否有解,若有解,再去求通解。因此,步骤为:

  • 第一步,判断Ax=b是否有解,若有解则进行第二步;
  • 第二步,求Ax=b的一个特解;
  • 第三步,求Ax=0的通解;
  • 第四步,写出Ax=b的通解。

(四)相似矩阵及二次型

有时候我们需要精确的特征值和特征向量,就必须利用Matlab的符号运算功能,在Matlab中创建符号矩阵和创建数值矩阵的形式很相似,只不过要用到符号定义函数sym。下面介绍shi使用次函数创建符号矩阵的几种形式。

1.  使用sym函数直接创建符号矩阵

此方法和直接创建数值矩阵的方法几乎完全相同,矩阵元素可以是符号表达式,各符号表达式的长度可以不同,矩阵元素之间可用逗号或空格分隔。例如:

clc,clear;
x = sym('[a+sin(d),b;1/c,d]');
y = det(x)

结果为:

y =
(a*c*d - b + c*d*sin(d))/c

2.  将数值矩阵转化为符号矩阵

在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]

3.  符号矩阵的索引和修改

Matlab的符号矩阵索引和修改同数值矩阵的索引和修改完全相同。

b(2,2) = 'log(2)'
b =
[ 2/3, 2^(1/2)]
[   3,  log(2)]

例6. 求一个正交变换x = Py, 把二次型

MATLAB(五)在线性代数中的应用

化为标准型。

二次型矩阵为

MATLAB(五)在线性代数中的应用

程序如下:

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就是所求的正交矩阵,使得MATLAB(五)在线性代数中的应用,x = Py,其中MATLAB(五)在线性代数中的应用,

化简后的二次型为MATLAB(五)在线性代数中的应用

例7.  判别二次型MATLAB(五)在线性代数中的应用的正定性,并求正交变换把二次型化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