应用统计的作业实在是手算不出来,于是顺应一下时代需求用python解题,稍微梳理一下用python求范数的内容。
先看一下诱导范数的定义:
由此可以看到,对于一般的矩阵,列和范数和行和范数的求解比较简单,主要是算子范数/谱范数的求解需要先求特征值较为复杂。下面以一道简单的题由此梳理了一下求第二范数的三种思路。
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)
得到结果如下图:
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))
得到结果如下图:
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))
得到结果如下图: