for n = 200, m = 500
import numpy as np
from scipy import linalg
n = 200
m = 500
A = np.random.normal(size = (n,m) )
B = linalg.toeplitz(np.random.normal(size = (1,m)), np.random.normal(size = (1,m)))
9.1
Calculate A + A, AAT; ATA and AB. Write a function that computes A(B - λI) for any λ
print("A+A=",A+A)
print("AAT=",np.dot(A,A.T))
print("ATA=",np.dot(A.T,A))
print("AB=",np.dot(A,B))
def func(x):
return np.dot(A,B - x * np.eye(m))
9.2
Generate a vector b with m entries and solve Bx = b
b = np.random.random(m)
x = np.linalg.solve(B,b)
print("Bx = ",np.dot(B,x))
print("b = ",b)
9.3
Compute the Frobenius norm of A: kAkF and the infinity norm of B: kBk1. Also find the largest and
smallest singular values of B
print("the fro norm of A = ",linalg.norm(A))
print("the infinity norm of B = ",linalg.norm(B, np.inf))
u,sigma,vt = linalg.svd(B)
print("the largest singular values of B = ",np.max(sigma))
print("the smallest singular values of B = ",np.min(sigma))
9.4
Generate a matrix Z, n × n, with Gaussian entries, and use the power iteration to find the largest
eigenvalue and corresponding eigenvector of Z. How many iterations are needed till convergence?
Optional: use the time.clock() method to compare computation time when varying n
import numpy as np
from scipy import linalg
import time
def eig(n):
Z = np.random.normal(size = (n,n))
v = np.ones(n)
a = linalg.norm(v, np.inf)
temp = 0
x = 0
t = time.clock()
while True:
temp = a
y = np.dot(Z, v)
a = linalg.norm(y, np.inf)
v = y / a
x = x + 1
if abs(temp - a) < 0.00000100:
break
t = time.clock() - t
print("times:",x)
print("time:",t)
print("eigenvector:",v)
print("eigenvalue:",a)
9.5
Generate an n × n matrix, denoted by C, where each entry is 1 with probability p and 0 otherwise. Use
the linear algebra library of Scipy to compute the singular values of C. What can you say about the
relationship between n, p and the largest singular value?
import numpy as np
from scipy import linalg
def Singular(n,p):
C = np.random.binomial(1,p,[n,n])
u,sigma,vt = linalg.svd(C)
print("p = ", p, "n = ",n, "MAX SINGULAR = ",np.max(sigma))
Singular(50,0.3)
Singular(50,0.6)
Singular(80,0.2)
Singular(100,0.9)
Singular(200,0.5)
執行效果如下:
結論是:N足夠大時,此時最大的奇異值收斂於np
9.6
Write a function that takes a value z and an array A and finds the element in A that is closest to z. The
function should return the closest value, not index
import numpy as np
def find(A,z):
a = np.abs(A - z)
return A[np.argmin(a)]