应用统计的作业实在是手算不出来,于是顺应一下时代需求用python解题,稍微梳理一下用python求范数的内容。

先看一下诱导范数的定义:

python 向量的二范数 python求二范数_特征向量

由此可以看到,对于一般的矩阵,列和范数和行和范数的求解比较简单,主要是算子范数/谱范数的求解需要先求特征值较为复杂。下面以一道简单的题由此梳理了一下求第二范数的三种思路。

python 向量的二范数 python求二范数_numpy_02

 

1.直接用numpy的linalg.norm函数求范数

用np.linalg.norm()函数可以直接求解

a=[[1,2,0],[-1,2,-1],[0,1,1]]#写入矩阵
A=np.array(a)#转换成np.array格式
a1=np.linalg.norm(A,ord=1)
a2=np.linalg.norm(A,ord=2)
a3=np.linalg.norm(A,ord=np.Inf)  #分别计算范数
print("第一范数为",a1)
print("第二范数为",round(a2,2))
print("无穷范数为",a3)

得到结果如下图:

python 向量的二范数 python求二范数_特征值_03

2.算得特征多项式对一元三次方程求解得特征值,对最大特征值求平方根得第二范数

计算出转置矩阵与原矩阵乘积后得特征多项式,行列式计算得到一元三次方程求解特征值

#法二:第二范数:先求最大特征值再求

#先得到A的转置矩阵与A相乘的矩阵d
b=np.transpose(A)
B=np.array(b)
d=np.matmul(B,A)

#根据特征多项式得一元三次方程求解
import sympy as sp # 导入sympy包
x=sp.Symbol('x')
f=x**3-13*(x**2)+38*x-25   #见前面运算过程
x=sp.solve(f)  #得到的解析解比较复杂,故后续转换成浮点数

#取四位小数输出
for i in range(0,3):
    x[i]=round(x[i].evalf(),4) #求出表达式的浮点数
    print(x[i])
maxX=x[0]
for i in x:   ## 求最大值
    if i > maxX:
        maxX= i
print("第二范数为",round(maxX**0.5,4))

得到结果如下图:

python 向量的二范数 python求二范数_特征向量_04

3.直接求解特征值与特征向量,对最大特征值求平方根得第二范数

用np.linalg.eig()函数求解特征值和特征向量之后求解。

#直接求解特征值与特征向量
w,v=np.linalg.eig(d)
print('特征值:{}\n特征向量:{}'.format(w,v))
#求最大特征值的算数平方根
W=w.tolist()
maxW= W[0]
for i in W:   ## 求最大值
    if i > maxW:
        maxW= i
print("第二范数为",round(maxW**0.5,4))

得到结果如下图:

python 向量的二范数 python求二范数_特征向量_05