高编课后作业------第十一周-Numpy exercise

Generate matrices A , with random Gaussian entries, B , a Toeplitz matrix, where A   R n × m and B   R m × m ,

for n = 200, m = 500.  为了显示方便,用规模小一点的矩阵,n=10,m=25

  

from scipy.linalg import toeplitz
import numpy as np
#选用服从 N(0,1)的正态分布 , 生成之后 reshape
A = np.random.normal(0,1,100000)
A = A.reshape(200,500)
B = toeplitz(list(range(1,501)))
A2 = A+A
AAt = [email protected]
AtA = A.T@A
AmB = A@B

def compute(A,B,lam):
    temp = B-lam*np.eye(500)
    return A@temp

print(compute(A,B,3))

在上面基础上,加上:

b = np.array(list(range(1,501)))
x = np.linalg.solve(B,b)

    norm(矩阵,哪种范数) , Frobenius范数就是'fro', 无穷范数就是np.inf 。然后就是svd分解函数,full_matrices=True就是全部分解

na = np.linalg.norm(A,'fro')
nb = np.linalg.norm(B,np.inf)

u, s, vh = np.linalg.svd(B,full_matrices=True)
maxvalue = max(s)
minvalue = min(s)


就是用幂法求主特征值和主特征向量,数值计算刚刚学过就用上了,精度设置为1e-4,返回值为

lam:主特征值

u:规格化之后的主特征向量

cnt: 迭代次数

cost:使用的时间

n = 100
Z = np.random.normal(5,1,n*n).reshape(n,n)
def powerit(Z,n):
    from time import clock
    start = clock()
    u = np.random.normal(5,1,n)
    last = 1000
    lam = 0
    cnt = 0
    while abs(last-lam) > 0.0001:
        cnt = cnt+1
        v = Z@u
        big = -1
        last = lam
        for vv in v:
            if abs(vv)>big:
                lam = vv
                big = abs(vv)
        u = v/lam
    end = clock()
    return lam, u, cnt, end-start

n=100时,只用6次就收敛了。。。


改成n=1000,甚至精度改成了1e-10,也只用了8次.....这个收敛速度是真的快.....


写到这里才发现生成正态分布矩阵的参数中有一个size参数 可以直接生成2维矩阵........

0-1分布是一种特殊的二项分布,而numpy.random里只有二项分布,所以就用n=1的二项分布生成。。。

for n in (10,50,100):
    for p in (0.2,0.5,0.8):
        print("n = %d, p = %.3f" % (n,p))
        C = np.random.binomial(1,p,(n,n))
        u, s, vh = np.linalg.svd(C,full_matrices=True)
        maxvalue = max(s)
        print(maxvalue)
结果是:

可以看到随着n和p的增加,最大奇异值maxvalue也会增加。

而且好像是成倍增加的!!!

大概是 maxvalue = t * n * p的形式


def closest(A,z):
    B = A - z
    idx = np.argmin(np.abs(B))
    return A[idx]
    

提示说用argmin,就是获取最小值的下标,而离z最近的元素,就是先把A每项都减去z,然后取绝对值,哪一项绝对值最小哪一项就离z最近,然后通过argmin获取下标,返回原矩阵A中的idx下标的值就可以了。


猜你喜欢

转载自blog.csdn.net/syyjiang/article/details/80364480