Python学习第十三周作业——scipy扩展包

第一题

Python学习第十三周作业——scipy扩展包_第1张图片

先生成矩阵A和向量b,考虑到后期该问题需要有解,向量b不随机生成,而是先随机生成x,然后算出b,之后使用scipy库中的leastsq函数可求解。代码如下:

import scipy as sp
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import leastsq
# 维数
m = 30
n = 20
# 生成矩阵A
A = np.random.normal(size=(m,n), scale=15, loc=10)
# 生成假想的该问题应有的解
xx = np.random.normal(size=n,scale=15, loc=10)
# 生成该解对应的向量b
b = np.dot(A, xx)
# 生成初始向量
x = np.ones(20)

# 误差计算函数
def residual(xx):
    return np.dot(A, xx) - b

x_result,cov_x = leastsq(residual, x)
print(x_result, cov_x)
# 计算误差向量的范数
norm_residual = np.linalg.norm(np.dot(A, x_result) - b)
print(norm_residual)

第二题

Python学习第十三周作业——scipy扩展包_第2张图片

求函数最大值,使用scipy自带的fmin函数(求最小值),由于只有fmin这个函数可用,但问题求解的又是最大值,只需要将函数变为相反数,问题就变成了求最小值。下面是代码:

import numpy as np
from scipy.optimize import fmin
def func(x):
    return -(np.sin(x-2) * np.sin(x-2) * np.exp(-x**2))
minimum = fmin(func, 1)
print(minimum)

经过绘图检验,可见的确是在x≈0.2162这个点处取得最大值。

第三题


在scipy文档中,pdist函数可以实现计算行之间的距离的功能。因此实现的代码如下:

import numpy as np
from scipy.spatial.distance import pdist
m = 40
n = 30
X = np.random.normal(size=(n, m), scale=10, loc=10)
Y = pdist(X, 'sqeuclidean')
print(Y.shape)
print(Y)

需要说明该函数使用的是欧拉距离公式,因此在函数参数中有一个sqeuclidean项。

经过检验,结果是正确的。

你可能感兴趣的:(Python学习,Python学习)