Scipy的简单使用

SciPy是一款方便、易于使用、专为科学和工程设计的python工具包,它包括了统计、优化、整合以及线性代数模块、傅里叶变换、信号和图像图例,常微分方差的求解等

官方:https://www.scipy.org/


使用前安装该模块:使用pycharm可以进入 Settings-> Project ->Project Interpreter -> 点击右侧,绿色加号

在出来的搜索框输入Scipy -> 点击下面的Install Package 等待提示安装成功即可。


积分:

from pylab import *
from scipy.integrate import quad, dblquad, nquad

# 计算积分 定义一个函数 范围从0到无穷大
print("积分", quad(lambda x: np.exp(-x), 0, np.inf))  # 关于x的函数 函数为 np.exp(-x)  下界0 上界无穷大

# 计算二元积分
# 方式一
area = dblquad(lambda x, y: x * y, 0, 0.5, lambda x: 0, lambda x: 1 - 2 * x)
print("二元积分面积", area)  # 关于x,y的函数 被积函数为x*y x下界0 x上界0.5  y的下界0     y的上界 1-2y


# 方式二:
def f(x, y):  # 定义函数
    return x * y


def bound_y():  # y的上下界
    return [0, 0.5]


def bound_x(y):  # x的上下界
    return [0, 1 - 2 * y]


print("二元积分面积", nquad(f, [bound_x, bound_y]))  # 指定函数 指定x,y的上下界

# optimizer 优化器
from scipy.optimize import minimize


def rosen(x):
    return sum(100.0 * (x[1:] - x[:-1] ** 2.0) ** 2.0 + (1 - x[:-1]) ** 2.0)


x0 = np.array([1.3, 0.7, 0.8, 1.9, 1.2])
res = minimize(rosen, x0, method="nelder-mead", options={"xtol": 1e-8, "disp": True})
# print("ROSE MINT:", res.x) #不展示过程
print("ROSE MINT:", res)  # 展示过程

小结:

  • quad(lambda x:函数,下界,上界) 求积分
  • dbquad(lambda x,y:函数,下界,上界,lambda x:y的下界,lambda x:y的上界) 求二元积分 方式一
  • nquad(函数,[x上下界,y的上下界]) 求二元积分 方式二
  • minimize(待优化函数,数组,method="nelder-mead",options={"xtol":1e-8,"disp":True})

插值:

# interpolation 插值
from scipy.interpolate import interp1d  # 注意是1,2,3,的1 不是l,m,n,的l
import matplotlib.pyplot as plt

# 图1
x = np.linspace(0, 10, num=11, endpoint=True)  # 0-10之间 11个点
y = np.cos(-x ** 2 / 9.0)  # 函数

f = interp1d(x, y)
f2 = interp1d(x, y, kind='cubic')  # 'zero', 'slinear', 'quadratic', 'cubic' 分别是:阶梯插值 线性插值 二阶曲线插值 三阶曲线插值

xnew = np.linspace(0, 10, num=41, endpoint=True)  # 0-10之间 41个点 最后一个点存在

plt.plot(x, y, 'o', xnew, f(xnew), '-', xnew, f2(xnew), '--')  # o表示圆点 -表示实线 --表示虚线
plt.legend(['data', 'linear', 'cubic'], loc='best')  # 图释
plt.show()  # 展示

# 图2
x = np.linspace(0, 1, 10)  # 产生0-1之间10个数
y = np.sin(2 * np.pi * x)  # 指定函数
li = interp1d(x, y, kind="cubic")  # 定义一个三阶函数曲线插值

x_new = np.linspace(0, 1, 50)  # 定义0-1 50个数
y_new = li(x_new)  # 获取结果

figure()  # 画出来
plot(x, y, "r")  # 用红色表示原数据
plot(x_new, y_new, "k")  # 用黑色表示新数据
show()
print(y_new)

小结:

  • np.linspace(0,10,num=11,endpoint=True) 1-10之间,共11个点,最后一个点
  • np.cos() 指定函数
  • interp1d(x,y,kind="cubic") 三阶曲线插值 类型有:zero,slinear,quadratic,cubic 分别是阶梯插值,线性插值,二阶曲线插值,三阶曲线插值
  • plt.plot(x,y,'o',xnew,f(xnew),'-',xnew,f2(xnew),'--')   'o'表示圆点,'-'表示实线,'--'表示虚线  指定划线样式
  • plt.plot(x,y,'r') 表示用红色线 。'r' 表示红色 'k' 表示黑色
  • plt.legend(['data','linear','cubic'],loc='best') 图示
  • plt.show() 展示

图片效果:

图1:

图2:


傅里叶变换:

from scipy.fftpack import fft
import matplotlib.pyplot as plt

# Number of sample points
N = 600
# sample spacing
T = 1.0 / 800.0
x = np.linspace(0.0, N * T, N)
y = np.sin(50.0 * 2.0 * np.pi * x) + 0.5 * np.sin(80.0 * 2.0 * np.pi * x)
yf = fft(y)
xf = np.linspace(0.0, 1.0 / (2.0 * T), N // 2)
plt.plot(xf, 2.0 / N * np.abs(yf[0:N // 2]))
plt.grid()
plt.show()

图片效果:

线性代数:

from scipy import linalg as lg

arr = np.array([[1, 2], [3, 4]])
# 1 2
# 3 4
print("Det:", lg.det(arr))  # 计算行列式
print("Inv:", lg.inv(arr))  # 求逆矩阵
b = np.array([6, 14])
print("Sol:", lg.solve(arr, b))  # 求解线性方程组
print("Eig:", lg.eig(arr))  # 求特征值 特征向量
print("LU:", lg.lu(arr))  # 矩阵分解
print("QR:", lg.qr(arr))  # 矩阵分解
print("SVD:", lg.svd(arr))  # 矩阵分解
print("Schur:", lg.schur(arr))  # 矩阵分解

小结:linalg as lg

  • lg.det(arr) 计算行列式
  • lg.inv(arr) 求逆矩阵
  • lg.solve(arr1,arr2) 求解线性方程组
  • lg.eig(arr) 求特征值 特征向量
  • lg.lu(arr) 矩阵分解
  • lg.qr(arr) 矩阵分解
  • lg.svd(arr) 矩阵分解
  • lg.schur(arr) 矩阵分解

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章