当前位置: 首页 > article >正文

Python 数值计算与数值分析基础

Python 数值计算与数值分析基础

示例演示

当涉及到Python数值计算和数值分析时,下面是20个示例,涵盖了一些常见的用法:

1.数值积分:

在 Python 中,你可以使用 scipy.integrate 模块中的 quad 函数来进行数值积分

import numpy as np
from scipy.integrate import quad

# 定义被积函数
f = lambda x: np.sin(x)

# 计算积分
result, error = quad(f, 0, np.pi)

# 输出结果
print("积分结果:", result)
print("误差估计:", error)
积分结果: 2.0
误差估计: 2.220446049250313e-14

2.数值微分:

import numpy as np

# 定义函数
f = lambda x: np.cos(x)

# 定义微分点和一个很小的h值
x0 = 0.5
h = 1e-5

# 计算数值微分(使用中心差分法)
numerical_derivative = (f(x0 + h) - f(x0 - h)) / (2 * h)

# 输出结果
print("数值导数结果:", numerical_derivative)
数值导数结果: -0.47942553859647846

3.非线性方程求根:

在 Python 中,你可以使用 scipy.optimize 模块的 fsolve 函数来求解方程。

import numpy as np
from scipy.optimize import fsolve

# 定义方程
def equation(x):
    return x**2 - 2

# 使用 fsolve 进行求解
solution = fsolve(equation, 1.5)

# 输出结果
print("方程的解:", solution[0])
方程的解: 1.4142135623730951

4.线性方程组求解:

在 Python 中,使用 NumPy 库可以方便地处理矩阵和线性代数运算。使用 np.linalg.solve(A, b) 函数求解线性方程组Ax=b。

import numpy as np

# 定义矩阵 A 和向量 b
A = np.array([[1, 2], [3, 4]])
b = np.array([5, 6])

# 求解线性方程 Ax = b
x = np.linalg.solve(A, b)

# 输出结果
print("解 x:", x)
解 x: [-4.   4.5]

5.曲线拟合:

在 Python 中,你可以使用 NumPy 和 SciPy 库来生成数据,并使用 Matplotlib 进行绘图。对于拟合功能,可以使用 scipy.optimize.curve_fit 来实现。

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit

# 定义 sine 函数
def sin_func(x, a, b, c, d):
    return a * np.sin(b * x + c) + d

# 生成数据
x = np.linspace(0, 2 * np.pi, 100)
y = np.sin(x) + np.random.rand(len(x)) * 0.2  # 添加随机噪声

# 拟合数据
initial_guess = [1, 1, 0, 0]  # 初始猜测参数
params, covariance = curve_fit(sin_func, x, y, p0=initial_guess)

# 生成拟合曲线
y_fit = sin_func(x, *params)

# 绘制结果
plt.scatter(x, y, label='Data', color='blue')
plt.plot(x, y_fit, label='Fitted Curve', color='red')
plt.title('Sine Fit')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.show()

在这里插入图片描述

6.矩阵特征值和特征向量:

在 Python 中,你可以使用 NumPy 库来计算矩阵的特征值和特征向量。使用 np.linalg.eig 函数计算特征值和特征向量。

import numpy as np

# 定义矩阵 A
A = np.array([[1, 2], [3, 4]])

# 计算特征值和特征向量
eig_val, eig_vec = np.linalg.eig(A)

# 输出结果
print("特征值:\n", eig_val)
print("特征向量:\n", eig_vec)
特征值:
 [-0.37228132  5.37228132]
特征向量:
 [[-0.82456484 -0.41597356]
 [ 0.56576746 -0.90937671]]

7.傅里叶变换:

import numpy as np
import matplotlib.pyplot as plt

# 设置采样频率
Fs = 1000
# 生成时间序列
t = np.arange(0, 1, 1/Fs)
# 生成信号
x = np.sin(2 * np.pi * 50 * t) + np.sin(2 * np.pi * 120 * t)
# 进行快速傅里叶变换
y = np.fft.fft(x)
# 计算频率轴
f = np.fft.fftfreq(len(y), d=1/Fs)

# 绘制幅度谱
plt.plot(f, np.abs(y))
plt.title('FFT of the Signal')
plt.xlabel('Frequency (Hz)')
plt.ylabel('Magnitude')
plt.xlim(0, Fs/2)  # 只显示正频率部分
plt.grid()
plt.show()

在这里插入图片描述

8.信号滤波:

以下代码创建了一个包含 50 Hz 和 120 Hz 正弦波的信号,然后使用带通滤波器对信号进行滤波,并将原始信号和滤波后的信号绘制在同一图中。

import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import butter, filtfilt

# 设置采样频率
Fs = 1000
# 生成时间序列
t = np.arange(0, 1, 1/Fs)
# 生成信号
x = np.sin(2 * np.pi * 50 * t) + np.sin(2 * np.pi * 120 * t)

# 设计带通滤波器
lowcut = 45  # 低截止频率
highcut = 55  # 高截止频率
b, a = butter(3, [lowcut, highcut], fs=Fs, btype='bandpass')

# 使用 filtfilt 进行零相位滤波
filtered_signal = filtfilt(b, a, x)

# 绘制原始信号和滤波后的信号
plt.figure(figsize=(10, 6))
plt.plot(t, x, label='Original Signal', alpha=0.7)
plt.plot(t, filtered_signal, label='Filtered Signal', linewidth=2)
plt.title('Signal Before and After Bandpass Filtering')
plt.xlabel('Time (seconds)')
plt.ylabel('Amplitude')
plt.legend()
plt.grid()
plt.show()

在这里插入图片描述

9.最小二乘拟合:

import numpy as np
import matplotlib.pyplot as plt

# 定义数据点
x = np.array([1, 2, 3, 4, 5])
y = np.array([1, 3, 6, 10, 15])

# 进行二次多项式拟合
p = np.polyfit(x, y, 2)

# 计算拟合值
f = np.polyval(p, x)

# 绘制数据点和拟合曲线
plt.plot(x, y, 'o', label='Data Points')  # 原始数据点
plt.plot(x, f, label='Fitted Curve')      # 拟合曲线
plt.title('Polynomial Fit')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.grid()
plt.show()

在这里插入图片描述

10.数值优化问题求解:

使用 scipy.optimize 库中的 minimize 函数来实现无约束优化。

import numpy as np
from scipy.optimize import minimize

# 定义目标函数
def fun(x):
    return x[0]**2 + x[1]**2

# 初始猜测
x0 = np.array([1, 1])

# 使用 minimize 进行无约束优化
result = minimize(fun, x0)

# 输出优化结果
print("Optimized parameters:", result.x)
print("Objective function value at optimized parameters:", result.fun)
Optimized parameters: [-1.07505143e-08 -1.07505143e-08]
Objective function value at optimized parameters: 2.311471135620994e-16

11.数值积分:

使用 scipy.integrate 模块中的 quad 函数来进行数值积分。

import numpy as np
from scipy.integrate import quad

# 定义被积函数
def func(x):
    return 1 / (1 + x**2)

# 进行定积分
integral_value, error = quad(func, 0, 1)

# 输出积分值和误差
print("Integral value:", integral_value)
print("Estimated error:", error)
Integral value: 0.7853981633974484
Estimated error: 8.719671245021581e-15

12.插值:

使用 numpy 处理数组,使用 matplotlib.pyplot 绘制图形,使用 scipy.interpolate 进行插值。

import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import interp1d

# 原始数据点
x = [0, 1, 2, 3]
y = [1, 4, 9, 16]

# 生成插值点
xi = np.arange(0, 3.1, 0.1)

# 创建插值函数
interp_func = interp1d(x, y, kind='linear')

# 计算插值结果
yi = interp_func(xi)

# 绘制原始数据点和插值结果
plt.plot(x, y, 'o', label='Original data')
plt.plot(xi, yi, label='Interpolated data')
plt.xlabel('x')
plt.ylabel('y')
plt.title('Interpolation Example')
plt.legend()
plt.grid()
plt.show()

在这里插入图片描述

13.求解常微分方程组:

使用 scipy.integrate 模块中的 solve_ivp 函数来解决常微分方程,并使用 matplotlib 来绘制图形。

import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import solve_ivp

# 定义微分方程
def func(t, y):
    return [y[1], -y[0]]

# 设定时间范围和初始条件
t_span = (0, 10)
y0 = [1, 0]

# 使用 solve_ivp 解决微分方程
sol = solve_ivp(func, t_span, y0, t_eval=np.linspace(0, 10, 100))

# 绘制结果
plt.plot(sol.t, sol.y[0])
plt.xlabel('Time (t)')
plt.ylabel('y(t)')
plt.title('Solution of ODE')
plt.grid()
plt.show()

在这里插入图片描述

14.数值统计:

在 Python 中,numpy 库提供了计算均值和标准差的函数。

import numpy as np

# 定义数据
data = [1, 2, 3, 4, 5]

# 计算均值和标准差
mean_value = np.mean(data)
std_value = np.std(data)

# 打印结果
print("Mean:", mean_value)
print("Standard Deviation:", std_value)
Mean: 3.0
Standard Deviation: 1.4142135623730951

15.随机数生成:

在 Python 中,可以使用 numpy 库的 random.rand 函数生成随机数。

import numpy as np

# 生成 1 到 10 之间的随机数
random_num = np.random.rand(1, 10)

# 打印结果
print(random_num)
[[0.08318904 0.2923153  0.1923046  0.96278395 0.93616543 0.48201543
  0.27400168 0.62454063 0.63461248 0.64493564]]

16.多项式求根:

在 Python 中,可以使用 numpy 库的 numpy.roots 函数来计算多项式的根。

import numpy as np

# 定义多项式系数
coefficients = [1, -3, 2]

# 计算多项式的根
roots_of_polynomial = np.roots(coefficients)

# 打印结果
print("Roots of the polynomial:", roots_of_polynomial)
Roots of the polynomial: [2. 1.]

17.矩阵求逆:

在 Python 中,可以使用 numpy 库来创建矩阵并计算其逆。使用 np.linalg.inv(A) 计算矩阵A的逆。

import numpy as np

# 定义矩阵 A
A = np.array([[1, 2], [3, 4]])

# 计算矩阵 A 的逆
inv_A = np.linalg.inv(A)

# 打印结果
print("Inverse of A:\n", inv_A)
Inverse of A:
 [[-2.   1. ]
 [ 1.5 -0.5]]

18.线性插值:

import numpy as np
import matplotlib.pyplot as plt

# 定义数据点
x = [0, 1, 2]
y = [1, 3, 2]

# 定义插值点
xi = np.arange(0, 2.1, 0.1)  # 生成从0到2(包括2)的数,步长为0.1

# 进行线性插值
yi = np.interp(xi, x, y)

# 绘制结果
plt.plot(x, y, 'o', label='Data Points')  # 绘制原始数据点
plt.plot(xi, yi, label='Linear Interpolation')  # 绘制插值曲线
plt.xlabel('x')
plt.ylabel('y')
plt.title('Linear Interpolation Example')
plt.legend()
plt.grid()
plt.show()

在这里插入图片描述

19.蒙特卡洛方法:

以下Python 代码,使用 numpy 来生成随机数,并估算圆周率 π 的值。

import numpy as np

# 初始化计数器和样本数
count = 0
n = 100000

# 进行 Monte Carlo 模拟
for _ in range(n):
    x = np.random.rand()  # 生成 [0, 1) 之间的随机数
    y = np.random.rand()  # 生成 [0, 1) 之间的随机数
    if x**2 + y**2 <= 1:  # 检查是否在单位圆内
        count += 1

# 估算 π
pi_estimate = 4 * count / n
print(f"Estimated value of π: {pi_estimate}")
Estimated value of π: 3.14684

20.矩阵求秩:

在 Python 中,可以使用 numpy 库来创建矩阵并计算其秩(rank)。

import numpy as np

# 定义矩阵 A
A = np.array([[1, 2], [3, 4]])

# 计算矩阵 A 的秩
rank_A = np.linalg.matrix_rank(A)

print(f"Rank of matrix A: {rank_A}")
Rank of matrix A: 2

这些示例展示了Python中数值计算和数值分析的一些常见用法。你可以通过这些示例来了解如何使用Python进行数值计算和分析,并可根据具体需求进行进一步修改和调整。在实际应用中,可以根据具体问题选择合适的函数和方法进行数值计算和分析。


http://www.kler.cn/news/355275.html

相关文章:

  • 拿到snp的rawdata后如何使用GATK进行筛选(GATK硬筛选文档翻译)
  • 基于BERT的语义分析实现(论文复现)
  • 51单片机的超声波视力保护仪【proteus仿真+程序+报告+原理图+演示视频】
  • PCL 点云配准-4PCS算法(粗配准)
  • Tbox编译注意问题
  • java基于SpringBoot+Vue+uniapp微信小程序的自助点餐系统的详细设计和实现(源码+lw+部署文档+讲解等)
  • 基于Springboot+Vue的宠物援助平台(含源码+数据库)
  • 【编程语言】Kotlin快速入门 - 集合与Lambda
  • 删除 Word 空白页的 3 种方法总结
  • 中标麒麟v5安装qt512.12开发软件
  • Python进阶知识2
  • 2024第七届全国大学生数学竞赛暨数学精英挑战赛第二场,第一场获奖名单已公布
  • 重生之我爱上了k8s!
  • 【论文分享】ShEF: Shielded Enclaves for Cloud FPGAs 22‘ASPLOS
  • [Windows]文件搜索利器Everything(附zip)
  • 《探索 Python 音频利器:sounddevice》
  • 大数据治理:确保数据质量与合规性的战略
  • 【SpringCloud】02-Nacos注册中心
  • 【Flutter】Dart:类
  • 2024金九银十版Java基础、中级、高级面试题总结(1000道题含答案解析)