(工具:matlab)
第一题:
利用自己的学号建立一个维数为n的行向量a1; (n为学号所含数字个数)
建立n阶Vandermonde(范德蒙)矩阵A, A的第二行向量为a1
【假设笔者学号为:114514】
方法一:直接生成法
最简单直接的方法,调用matlab中的vander()函数直接生成:
clc,clear,close all
A = vander([1,1,4,5,1,4])
但是我们这样做会有一个问题,我们发现生成的矩阵是这样的:
A =
1 1 1 1 1 1
1 1 1 1 1 1
1024 256 64 16 4 1
3125 625 125 25 5 1
1 1 1 1 1 1
1024 256 64 16 4 1
这显然不符合题目的要求:希望我生成的第二行是我的学号114514,
所以我们只需要调用rot90()函数,将我们生成的矩阵逆时针旋转90度就可以了:
clc,clear,close all
A1 = vander([1,1,4,5,1,4])
A2 = rot90(A1)
生成的矩阵A2就是我们的目标矩阵:
A2 =
1 1 1 1 1 1
1 1 4 5 1 4
1 1 16 25 1 16
1 1 64 125 1 64
1 1 256 625 1 256
1 1 1024 3125 1 1024
方法二:“中间矩阵”法
我们也可以先建立两个矩阵A1,B1:
clc,clear,close all
A1 = [1,1,4,5,1,4]
B1 = reshape(0:5,6,1)
它们的结果是:
A1 =
1 1 4 5 1 4
B1 =
0
1
2
3
4
5
接下来我们利用repmat()函数生成有重复内容的矩阵A2,B2:
clc,clear,close all
A1 = [1,1,4,5,1,4]
B1 = reshape(0:5,6,1)
A2 = repmat(A1,6,1)
B2 = repmat(B1,1,6)
生成的A2,B2:
A2 =
1 1 4 5 1 4
1 1 4 5 1 4
1 1 4 5 1 4
1 1 4 5 1 4
1 1 4 5 1 4
1 1 4 5 1 4
B2 =
0 0 0 0 0 0
1 1 1 1 1 1
2 2 2 2 2 2
3 3 3 3 3 3
4 4 4 4 4 4
5 5 5 5 5 5
我们不难发现,对于我们的目标范德蒙矩阵,A2可以看作目标矩阵的“底数矩阵”,B2可以看作目标矩阵的“指数矩阵”,所以我们只需要将这两个矩阵结合一下:
clc,clear,close all
A1 = [1,1,4,5,1,4]
B1 = reshape(0:5,6,1)
A2 = repmat(A1,6,1)
B2 = repmat(B1,1,6)
M = A2.^B2
就可以生成目标矩阵了:
M =
1 1 1 1 1 1
1 1 4 5 1 4
1 1 16 25 1 16
1 1 64 125 1 64
1 1 256 625 1 256
1 1 1024 3125 1 1024
第二题:解线性方程组
方法一:我们可以利用左除符号“\”,对方程组进行直接求解:
clc,clear,close all
A = [2,5,-8;4,3,-9;2,3,-5;1,8,-7]
B = [8,9,7,12]'
x = A\B
得出结果:
x =
3.0000
2.0000
1.0000
方法二:与左除同理,我们也可以用A的逆矩阵去乘B,然而A是非方阵,非方阵是没有逆矩阵的,但是会存在一个广义逆(也称伪逆),用pinv()函数求得,同样可以帮助我们解决问题:
clc,clear,close all
A = [2,5,-8;4,3,-9;2,3,-5;1,8,-7]
B = [8,9,7,12]'
x = pinv(A)*B
得出结果:
x =
3.0000
2.0000
1.0000
方法三:我们也可以使用linsolve()函数对方程组进行直接求解:
clc,clear,close all
A = [2,5,-8;4,3,-9;2,3,-5;1,8,-7]
B = [8,9,7,12]'
x = linsolve(A,B)
同样可以得出结果:
x =
3.0000
2.0000
1.0000
(如有错误或改进建议欢迎联系作者)