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

devtools/2024/10/19 14:36:11/

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

示例演示

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

1.数值积分:

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

python">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.数值微分:

python">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 函数来求解方程。

python">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。

python">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 来实现。

python">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 函数计算特征值和特征向量。

python">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.傅里叶变换:

python">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 正弦波的信号,然后使用带通滤波器对信号进行滤波,并将原始信号和滤波后的信号绘制在同一图中。

python">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.最小二乘拟合:

python">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 函数来实现无约束优化。

python">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 函数来进行数值积分。

python">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 进行插值。

python">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 来绘制图形。

python">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 库提供了计算均值和标准差的函数。

python">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 函数生成随机数。

python">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.482015430.27400168 0.62454063 0.63461248 0.64493564]]

16.多项式求根:

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

python">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的逆。

python">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.线性插值:

python">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 来生成随机数,并估算圆周率 π 的值。

python">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)。

python">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.ppmy.cn/devtools/127034.html

相关文章

cartographer在ros和vscode上进行debug

一、概述 因为在对代码进行了解之后&#xff0c;需要运行过程中对代码进行调试&#xff0c;因而需要配置cartographer的Debug配置。 二、具体实现 &#xff08;一&#xff09;版本 使用Ubuntu20.04&#xff0c;vscode&#xff0c;ros-noetic&#xff0c;cartographer &#…

第21~22周Java主流框架入门-Spring 3.SpringJDBC事务管理

Spring JDBC模块与事务管理课程总结 1. 课程介绍 本课程主要讲解Spring框架中的JDBC模块及其事务管理的相关内容&#xff0c;重点包括以下三个方面&#xff1a; Spring JDBC模块及核心对象JDBC Template的使用 通过学习如何使用Spring JDBC模块&#xff0c;了解JDBC Template…

RabbitMQ 高级特性——死信队列

文章目录 前言死信队列什么是死信常见面试题死信队列的概念&#xff1a;死信的来源&#xff08;造成死信的原因有哪些&#xff09;死信队列的应用场景 前言 前面我们学习了为消息和队列设置 TTL 过期时间&#xff0c;这样可以保证消息的积压&#xff0c;那么对于这些过期了的消…

使用Docker启动的Redis容器使用的配置文件路径等问题以及Python使用clickhouse_driver操作clickhouse数据库

一、使用Docker启动的Redis容器使用的配置文件路径等问题 1.docker启动的redis使用的配置文件路径是什么 使用docker搭建redis服务&#xff0c;本身redis启动的时候可以指定配置文件的&#xff0c; redis-server /指定配置文件路径/redis.conf。 但手上也没有一个redis配置文件…

408算法题leetcode--第37天

1049. 最后一块石头的重量 II 题目地址&#xff1a;1049. 最后一块石头的重量 II - 力扣&#xff08;LeetCode&#xff09; 题解思路&#xff1a;01背包 时间复杂度&#xff1a;O(n*m) 空间复杂度&#xff1a;O(m) 代码: class Solution { public:int lastStoneWeightII(…

Java基于SSM微信小程序物流仓库管理系统设计与实现(源码+lw+数据库+讲解等)

选题背景 随着社会的发展&#xff0c;社会的方方面面都在利用信息化时代的优势。互联网的优势和普及使得各种系统的开发成为必需。 本文以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#xff0c;它主要是采用java语言技术和mysql数据库来完成对系统的设计。整个…

JS中Array的常用方法

文章目录 1. 创建和初始化数组2. 添加和删除元素3. 查找元素4. 遍历数组5. 数组转换6. 排序和反转7. 其他方法 JavaScript 中的 Array 对象提供了许多常用的方法&#xff0c;这些方法可以帮助你更方便地操作数组。以下是一些常用的 Array 方法及其用法&#xff1a; 1. 创建和…

【学术会议-6】激发灵感-计算机科学与技术学术会议邀您参与,共享学术盛宴,塑造明天的科技梦想!

【学术会议-6】激发灵感-计算机科学与技术学术会议邀您参与&#xff0c;共享学术盛宴&#xff0c;塑造明天的科技梦想&#xff01; 【学术会议-6】激发灵感-计算机科学与技术学术会议邀您参与&#xff0c;共享学术盛宴&#xff0c;塑造明天的科技梦想&#xff01; 文章目录 【…