9.1题是进行矩阵的运算,由于这些操作都已经有对应的函数,所以只用直接调用函数即可
#Exercise 9.1
import numpy as npfrom scipy.linalg import toeplitz
def caculate_with_k(A,B,m,k):
I = np.eye(m,m,0)
return np.dot(A,B-k*I)
n = 200
m = 500
k = np.random.randn()
A = np.random.randn(n,m)
B = toeplitz(np.random.randn(1,m), r=np.random.randn(1,m))
print(A+A)
print(np.dot(A,A.T))
print(np.dot(A.T,A))
print(np.dot(A,B))
print("k=",k)
print(caculate_with_k(A,B,m,k))#计算A(B-λI) 其中λ用k表示
9.2题是求一个线性方程组,由于numpy中也已经定义了这个函数,所以也是直接调用即可
#Exercise 9.2
import numpy as np
from scipy.linalg import toeplitz
m = 500
B = toeplitz(np.random.randn(1,m), r=np.random.randn(1,m))
b = np.random.randn(m)
x = np.linalg.solve(B,b)
print(x)
9.3题是求范数以及最大最小特征值,同样numpy中也已经定义了相关函数函数,所以也是直接调用即可
#Exercise 9.3
import numpy as np
from scipy.linalg import toeplitz
n = 200
m = 500
A = np.random.randn(n,m)
B = toeplitz(np.random.randn(1,m), r=np.random.randn(1,m))
U,sigma,vt = np.linalg.svd(B)
print(np.linalg.norm(A,ord='fro'))#Frobenius norm of A
print(np.linalg.norm(B,ord=np.inf))#infinity norm of B
print(sigma.max())#largest singular values of B
print(sigma.min())#smallest singular values of B
9.4题是要求利用幂迭代求矩阵最大的特征值及其对应的特征向量
通过查找相关资料找到了幂迭代的算法如下:
①输入矩阵 A、初始向量v(0),误差 eps,实用中一般取 v(0)=(1,1,···,1)T ;
②k←1;
③计算 v(k) ←Au(k-1);
④mk ←max{ v(k) },mk-1 ←{ v(k-1) };
⑤u(k) ←v(k)/ mk ;
⑥如果▕ mk - m k-1▕<eps,则显示特征值λ1←和对应的特征 向量x(1),终止;
⑦k=k+1,转③
然后照着这个算法写循环即可。
import numpy as np
from scipy.linalg import toeplitz
n = 200
Z = np.random.randn(n,n)
V = np.ones(n).T
U = V/V.max()
k=0
eps = 0.00001
while(1):
k=k+1
m0 = V.max()
V = np.dot(Z,U)
m1 = V.max()
U = V/m1
if(abs(m1-m0)<eps):
print("特征值:",m1)
print("对用的特征向量:",U*m1)
print("次数k:",k)
break
9.5题是利用二项分布的生成只有0,1随机数的一个n*n矩阵,然后求该矩阵的最大特征值。
由于求特征值已有相关函数,所以直接调用即可。然后让n为2~200之间的一个随机整数,p为0~1之间的一个随机数,运行多次后发现,但n和p越大,最大的特征值也会越大。
import numpy as np
from scipy.linalg import toeplitz
n = np.random.randint(2,200)
p = np.random.rand()
print("n=",n)
print("p=",p)
C = np.random.binomial(1,p,(n,n))
e = np.linalg.eigvals(C)
print("largest singular value:",e.max())
9.6题是写一个函数,该函数可以求一个给定数组距离z最接近的数。
由于numpy提供了argmin这个函数可以返回最小数的索引值,所以只用将原数组复制给A,让A中的每一个数等于本来的数与Z的差值的绝对值,然后利用argmin找到最小值的索引,最后返回这个索引对应的数即可
#Exercise 9.6
import numpy as npfrom scipy.linalg import toeplitz
def cloest_value(array,z):
A = array[:]
A = abs(A-z)
return np.ravel(array)[np.argmin(A)]
array = np.random.randn(1,20)
z = np.random.randn()
print(array)
print("z=",z)
print("cloest value=",cloest_value(array,z))