赞
踩
目录
NumPy 和 SciPy 是 Python 进行科学计算和数据分析非常重要的两个基础包,它们各有侧重。
NumPy: 提供高性能的多维数组对象 ndarray 和丰富的数组操作方法;包含基础数学、统计、线性代数、随机数生成等功能;数组广播、向量化操作,提高计算效率;与其他Python科学计算包集成良好。
SciPy: 在NumPy基础上提供更多数学算法和高级数据处理工具;包含优化、积分、插值、拟合、特殊函数等模块;提供信号处理、图像处理、常微分方程求解等功能;统计分析模块,如分布拟合、假设检验等;提供有效的数值计算算法,可解决多种数学问题
总结:NumPy提供数组和基础运算,侧重数学计算;SciPy在NumPy基础上提供更高级的科学与工程计算算法,侧重数据处理与分析;两者DAILY配合使用,构成 Python强大的科学计算生态系统。
例1
代码如下:
- import numpy as np
- # a=np.mat('1,2,3;2,4,8;9,6,3')
- a=np.mat('-11,2,4,3,1;1,18,6,-3,5;3,-1,9,1,-2;3,-2,4,13,2;4,-2,3,-8,18')
- b=np.mat('-9;4;-12;6;-15')
- # b=np.mat('1;1;3')
- c=np.linalg.solve(a,b)
- print(c)
结果截图:
例2
代码如下:
- def f(x):
- return x**5-3*x**4+6*x**3-x**2+7*x-2
-
- # 确定区间并设置精度
- left = 0
- right = 1
- epsilon = 0.0001
-
- # 二分法求解
- while right - left > epsilon:
- middle = (left + right) / 2 # 计算中间点
- if f(middle) == 0:
- break # 中间点是根,结束循环
- if f(left) * f(middle) < 0: # 根处于(left, middle)区间
- right = middle
- else: # 根处于(middle, right)区间
- left = middle
-
- # 输出结果
- print((left + right) / 2)
结果截图:
代码如下:
- def f(x):
- return x**5-3*x**4+6*x**3-x**2+7*x-2
-
- # 定义函数的导数
- def f_prime(x):
- return 5*x**4-12*x**3+18*x**2+7
-
- # 设置初始值和精度
- x0 = 0
- epsilon = 0.0001
-
- # 牛顿法迭代
- x1 = x0 - f(x0)/f_prime(x0)
- while abs(x1 - x0) > epsilon:
- x0 = x1
- x1 = x0 - f(x0)/f_prime(x0)
-
- # 输出结果
- print(x1)
结果截图:
例3
x | 9 | 11 | 13 | 15 | 17 |
lnx | 2.197225 | 2.397895 | 2.564949 | 2.708050 | 2.833213 |
求出ln11.63 , ln14.13. (2.4536) (2.6483)
代码如下:
- def f(x):
- return np.log(x)
- # 构建差商表
- def generate_diff_table(x_data, y_data):
- n = len(x_data)
- diff_table = [y_data]
- for r in range(1, n):
- diff_row = [0] * (n - r)
- for j in range(n - r):
- diff_row[j] = (diff_table[r-1][j+1] - diff_table[r-1][j]) / (x_data[j+r] - x_data[j])
- diff_table.append(diff_row)
- return diff_table
-
- # 插值求解
- def interpolation(x_data, x):
- n = len(x_data)
- y = 0
- diff_table = generate_diff_table(x_data, [f(x_i) for x_i in x_data])
-
- for i in range(n):
- p = 1
- for j in range(i):
- p = p * (x - x_data[j])
- y += diff_table[i][0] * p
-
- return y
-
- x_data = [9, 11, 13, 15, 17]
- x = 11.63
- result = interpolation(x_data, x)
- print(result)
-
- y_data = [9, 11, 13, 15, 17]
- y = 14.13
- result = interpolation(y_data, y)
- print(result)
结果截图:
例4
x | 26.8 | 25.4 | 28.9 | 27.7 | 23.9 | 24.7 | 28.1 | 26.9 | 27.4 | 22.6 | 25.6 |
y | 26.5 | 27.3 | 24.2 | 23.6 | 25.9 | 26.3 | 22.5 | 21.7 | 21.4 | 25.8 | 24.9 |
代码如下:
- # 拟合曲线
- import numpy as np
- import matplotlib.pyplot as plt
- import scipy as sp
- from scipy.optimize import leastsq
-
- # 样本数据
- Xi = np.array([26.8, 25.4, 28.9, 27.7, 23.9, 24.7, 28.1, 26.9, 27.4, 22.6,25.6])
- Yi = np.array([26.5, 27.3, 24.2, 23.6, 25.9, 26.3, 22.5, 21.7, 21.4, 25.8, 24.9])
-
-
- # 需要拟合的函数func()指定函数的形状
- def func(p, x):
- k, b = p
- return k*x + b
-
-
- # 定义偏差函数,x,y为数组中对应Xi,Yi的值
- def error(p, x, y):
- return func(p, x) - y
-
-
- # 设置k,b的初始值,可以任意设定,经过实验,发现p0的值会影响cost的值:Para[1]
- p0 = [1, 20]
-
- # 把error函数中除了p0以外的参数打包到args中,leastsq()为最小二乘法函数
- Para = leastsq(error, p0, args=(Xi, Yi))
- # 读取结果
- k, b = Para[0]
- print('k=', k, 'b=', b)
-
- # 画样本点
- plt.figure(figsize=(8, 6))
- plt.scatter(Xi, Yi, color='red', label='Sample data', linewidth=2)
-
- # 画拟合直线
- x = np.linspace(30, 20, 10)
- y = k * x + b
-
- # 绘制拟合曲线
- plt.plot(x, y, color='blue', label='Fitting Curve', linewidth=2)
- plt.legend() # 绘制图例
-
- plt.xlabel('X-value', fontproperties='simHei', fontsize=12)
- plt.ylabel('Y-value', fontproperties='simHei', fontsize=12)
-
- plt.show()
结果截图:
例5
代码如下:
- import numpy as np
- x = np.linspace(0, 3, 1001)
- # f = lambda x: x**3 - 4*x**2 + 4*x + 2
- f = lambda x: 1/(1+x)
- a = 0
- b = 2
- Ax = np.linspace(a, b, 101)
- Ay = f(Ax)
- def defInt_middle(f, a, b, N):
- # middle point
- result = 0; FX = []; Xn = []
- dx = abs(b - a)/N
- while a < b:
- result += f(a + dx/2)*dx
- FX += [f(a + dx/2)]
- Xn += [a]
- a += dx
- return result, FX, Xn, dx
-
- N = 4
- I_mid, FX, Xn, dx = defInt_middle(f, a, b, N)
- print(I_mid)
结果截图:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。