scipy作业

Exercise 10.1: Least squares

跟上一次作业差不多

import scipy.linalg
import numpy as np

m = 20
n = 10
A = np.random.randint(0, 100, size=(m,n))
x = np.random.randint(10, size=(n, 1))
b = [list(np.random.normal(0, 1, 1)) for _ in range(m)]
y = A.dot(x) + b
Q, R = scipy.linalg.qr(A)
x_ = scipy.linalg.inv(R).dot(Q.T).dot(y)

print('x:')
print(x.T)
print('the norm of the residual:')
print(x_.T)
scipy作业_第1张图片
Exercise 10.2: Optimization
 
  

    

观察改函数,发现该函数恒为非负函数,并且当x区域无穷时函数值趋于0。进一步的,sin^2(x-2)是周期函数,而e^(-x^2)关于y轴对称,且当x>0时随着x的增加而减小。故函数的极值肯定在[-a, a]之间。因为sin^2(x-2)是周期函数,令a=10足以包括sin^2(x-2)的一个周期。

    此时发现x越小e^(-x^2)越大,而[-10 10]又包含了sin^2(x-2)的一个周期。因此在[-10, 10]之间找最大值是合理的。

    scipy提供一个fminbound函数可计算函数在一个区间的最小值。那么我们只要让f(x)取负再使用scipy库中的optimize.fminbound便可得到最大值的x0。故f(x0)为最大值。

from scipy import optimize
from math import *


def f(x):
    return -1 * pow(sin(x-2), 2) * exp(-pow(x, 2))

maximum = optimize.fminbound(f, -10, 10)
print('maximum:', -1 * f(maximum))
Exercise 10.3: Pairwise distances

使用scipy.spatial.distance.cdist可以计算两个坐标向量代表的点的距离。首先随机生成一个20*10的矩阵,该矩阵储存着20个点的坐标向量。然后分别计算它们各行之间的距离,储存到一个20*20的矩阵中。该矩阵的第i行第j列表示城市i到城市j的距离。

import scipy.spatial
import numpy as np

n = 20
m = 10
X = np.random.randint(0, 100, (n, m))
distance = np.zeros((n, n))
for i in range(n):
    for j in range(i+1, n):
        distance[i][j] = scipy.spatial.distance.cdist([X[i]], [X[j]])
        distance[j][i] = distance[i][j]
print(distance)
scipy作业_第2张图片

你可能感兴趣的:(scipy作业)