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

Python 机器学习求解 PDE 学习项目 基础知识(3)matplotlib 画函数热图

绘制模型输出的热图

前言

在科学计算和工程应用中,偏微分方程(PDE)的数值求解是一项常见且重要的任务。PDE的求解通常需要数值方法的辅助,例如有限元法、有限差分法和有限体积法等。这些方法能够提供对物理系统的精确模拟。然而,仅仅得到数值解是不够的,数据的可视化是理解和分析这些解的关键步骤。

matplotlib是Python中最广泛使用的绘图库之一。它为用户提供了强大的功能来可视化数据。在PDE的后处理阶段,利用matplotlib绘制热图、曲线图等能够帮助我们直观地观察到解的分布和变化趋势,从而进一步分析物理现象。
在这里插入图片描述

代码说明

本节代码展示了如何使用 matplotlib 和 torch(本案例使用 2.1 版本)来绘制一个简单模型的输出热图。由于深度学习求解结果通常是 torch 的 tensor 格式,所以我们这里也使用 tensor 数据格式。

导入必要的库

import numpy as np
import torch
import matplotlib.pyplot as plt
import matplotlib.cm as cm
  • numpy: 提供支持大型多维数组与矩阵运算,以及大量的数学函数库。
  • torch: 一个用于深度学习的开源机器学习框架。
  • matplotlib.pyplot: 一个用于生成图形的命令式接口。
  • matplotlib.cm: 包含用于着色的色彩映射函数。

函数定义:draw_graph

imshow 默认情况下会将 y 轴反向显示。这是因为 imshow 将数组的第一维作为y轴方向,而第二维作为 x 轴方向,从左上角开始绘制。为了纠正 y 轴方向,我们可以通过调整 extent 参数来确保 y 轴从底部向上增长。

def draw_graph(mod, m):"""绘制模型输出与真实值函数的组合图像,在输入值的网格上显示为热图。参数:- mod (callable): 接受张量输入并输出标量的模型。- m (int): 模型期望的输入张量大小。"""# 创建范围为 [-1, 1] 的点网格N = 10points = np.linspace(-1, 1, N)xs, ys = np.meshgrid(points, points)# 将网格转换为 torch 张量xs = torch.tensor(xs)ys = torch.tensor(ys)# 获取网格大小xl, yl = xs.size()# 初始化矩阵以保存计算值z = np.zeros((xl, yl))# 计算网格中每个点的模型输出和真实值for i in range(xl):for j in range(yl):      # 创建大小为 m 的输入张量re = np.zeros(m)re[0] = xs[i, j]re[1] = ys[i, j]re = torch.tensor(re)# 计算输出值z[i, j] = mod(re.float()).item()# 将结果绘制为热图,使用 extent 调整坐标系方向plt.imshow(z, cmap=cm.hot, extent=(-1, 1, -1, 1), origin='lower')plt.colorbar()# 自动生成轴的标签ax = plt.gca()x_ticks = np.linspace(-1, 1, N)y_ticks = np.linspace(-1, 1, N)ax.set_xticks(x_ticks)ax.set_xticklabels([f'{x:.2f}' for x in x_ticks])ax.set_yticks(y_ticks)ax.set_yticklabels([f'{y:.2f}' for y in y_ticks])# 显示图像plt.show()

示例测试用例

class SimpleModel(torch.nn.Module):def forward(self, x):# 一个简单的模型,计算输入元素的和return x.sum()

实例化模型

model = SimpleModel()

使用模型和输入大小 m = 2 测试 draw_graph 函数

draw_graph(model, m=2)

示例测试用例

class SimpleModel(torch.nn.Module):def forward(self, x):# 一个简单的模型,计算输入元素的和return x.sum()

实例化模型

model = SimpleModel()

使用模型和输入大小 m = 2 测试 draw_graph 函数

draw_graph(model, m=2)

绘制结果:

在这里插入图片描述

例子2

我们可以改变热图的颜色映射 cmap ,网格密度 N 和 SimpleModel 中的函数函表达式:

import numpy as np
import torch
import matplotlib.pyplot as plt
import matplotlib.cm as cmdef draw_graph(mod, m):"""绘制模型输出与真实值函数的组合图像,在输入值的网格上显示为热图。参数:- mod (callable): 接受张量输入并输出标量的模型。- m (int): 模型期望的输入张量大小。"""# 创建范围为 [-1, 1] 的点网格N = 20points = np.linspace(-1, 1, N)xs, ys = np.meshgrid(points, points)# 将网格转换为 torch 张量xs = torch.tensor(xs)ys = torch.tensor(ys)# 获取网格大小xl, yl = xs.size()# 初始化矩阵以保存计算值z = np.zeros((xl, yl))# 计算网格中每个点的模型输出和真实值for i in range(xl):for j in range(yl):      # 创建大小为 m 的输入张量re = np.zeros(m)re[0] = xs[i, j]re[1] = ys[i, j]re = torch.tensor(re)# 计算输出值z[i, j] = mod(re.float()).item()# 将结果绘制为热图,使用 coolwarm cmapplt.imshow(z, cmap=cm.coolwarm, extent=(-1, 1, -1, 1), origin='lower')plt.colorbar()# 自动生成轴的标签ax = plt.gca()x_ticks = np.linspace(-1, 1, 11)y_ticks = np.linspace(-1, 1, 11)ax.set_xticks(x_ticks)ax.set_xticklabels([f'{x:.1f}' for x in x_ticks])ax.set_yticks(y_ticks)ax.set_yticklabels([f'{y:.1f}' for y in y_ticks])# 显示图像plt.show()# 示例测试用例
class SimpleModel(torch.nn.Module):def forward(self, x):# 修改模型表达式,例如使用 sin 函数和 cos 函数return torch.sin(x[0]) + torch.cos(x[1])# 实例化模型
model = SimpleModel()# 使用模型和输入大小 m = 2 测试 draw_graph 函数
draw_graph(model, m=2)

结果如下:
在这里插入图片描述

非正方形区域如何绘图?

例如我们想要要绘制一个三角形区域而不是矩形,我们需要对点的选择和处理进行一些更改,以确保只计算和绘制位于三角形区域内的点。具体来说,可以在遍历网格点时只保留位于特定三角形内的点来计算模型的输出。
假设我们想要画出
x + y < = 0 x+y<=0 x+y<=0 以下的三角形区域,只需要在遍历时加入判断语句,区域之外的点值设置为 NaN 即可:

import numpy as np
import torch
import matplotlib.pyplot as plt
import matplotlib.cm as cmdef draw_graph(mod, m):"""绘制模型输出与真实值函数的组合图像,在输入值的三角形网格上显示为热图。参数:- mod (callable): 接受张量输入并输出标量的模型。- m (int): 模型期望的输入张量大小。"""# 创建范围为 [-1, 1] 的点网格N = 100  # 增加点的密度以获得更高分辨率的图像points = np.linspace(-1, 1, N)xs, ys = np.meshgrid(points, points)# 将网格转换为 torch 张量xs = torch.tensor(xs)ys = torch.tensor(ys)# 获取网格大小xl, yl = xs.size()# 初始化矩阵以保存计算值z = np.zeros((xl, yl))# 计算三角形内每个点的模型输出for i in range(xl):for j in range(yl):      # 检查点是否在三角形内if xs[i, j] >= -1 and ys[i, j] >= -1 and ys[i, j] + xs[i, j] <=  0:# 创建大小为 m 的输入张量re = np.zeros(m)re[0] = xs[i, j]re[1] = ys[i, j]# 新增第三个维度使用固定值,例如 0.1re[2] = 0.1  re = torch.tensor(re)# 计算输出值z[i, j] = mod(re.float()).item()else:z[i, j] = np.nan  # 对于三角形之外的点,设为 NaN,不显示# 将结果绘制为热图,使用 coolwarm cmapplt.imshow(z, cmap=cm.coolwarm, extent=(-1, 1, -1, 1), origin='lower')plt.colorbar()# 自动生成轴的标签ax = plt.gca()x_ticks = np.linspace(-1, 1, 11)y_ticks = np.linspace(-1, 1, 11)ax.set_xticks(x_ticks)ax.set_xticklabels([f'{x:.1f}' for x in x_ticks])ax.set_yticks(y_ticks)ax.set_yticklabels([f'{y:.1f}' for y in y_ticks])# 显示图像plt.show()# 示例测试用例
class SimpleModel(torch.nn.Module):def forward(self, x):# 修改模型表达式,使用 sin 和 cos 函数并结合第三个维度return torch.sin(x[0]) + torch.cos(x[1]) + 2*x[2]**2# 实例化模型
model = SimpleModel()# 使用模型和输入大小 m = 3 测试 draw_graph 函数
draw_graph(model, m=3)

绘制效果图:

对于其他多边形区域,也可以类似切割,并加入判断语句,实现在指定区域画图的效果。
请添加图片描述


本专栏致力于普及各种偏微分方程的不同数值求解方法,所有文章包含全部可运行代码。欢迎大家支持、关注!

作者 :计算小屋
个人主页 : 计算小屋的主页

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 十六、【Python】基础教程 - 【Flask】网络编程开发
  • SpringBoot可以同时处理多少请求?
  • WHAT - xmlhttprequest vs fetch vs wretch
  • YOLO系列:从yolov1至yolov8的进阶之路 持续更新中
  • 【数据结构】队列,你必须知道的内部原理!!!
  • 大数据Flink(一百零九):阿里云Flink的基本名称概念
  • 保障速度与安全合规的前提下,如何传文件到国外?
  • 【解压既玩】PS3模拟器v0.0.32+战神3+战神升天+各存档 整合包 ,完美不死机,没有BUG,旷世神作,强力推荐
  • AI编程工具合集整理优缺点
  • HarmonyOS Developer之生命周期
  • Java设计模式-单例模式最佳实践
  • 第26课 Scratch入门篇:乘坐公交车
  • 服务器CPU天梯图2024年8月,含EYPC/至强及E3/E5
  • 使用 Java Swing 创建一个最大公约数计算器 GUI 应用
  • 【Linux】输入输出重定向
  • 0x05 Python数据分析,Anaconda八斩刀
  • Android交互
  • CSS盒模型深入
  • express.js的介绍及使用
  • JavaScript对象详解
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • Terraform入门 - 3. 变更基础设施
  • Webpack 4 学习01(基础配置)
  • 阿里云前端周刊 - 第 26 期
  • 从零开始的无人驾驶 1
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • Spring Batch JSON 支持
  • 通过调用文摘列表API获取文摘
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • ​批处理文件中的errorlevel用法
  • #include<初见C语言之指针(5)>
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (2024.6.23)最新版MAVEN的安装和配置教程(超详细)
  • (C++20) consteval立即函数
  • (php伪随机数生成)[GWCTF 2019]枯燥的抽奖
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (二)学习JVM —— 垃圾回收机制
  • (数据结构)顺序表的定义
  • (四)库存超卖案例实战——优化redis分布式锁
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • ******IT公司面试题汇总+优秀技术博客汇总
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .equals()到底是什么意思?
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .Net Core 中间件验签
  • .net framework 4.0中如何 输出 form 的name属性。
  • .NET 依赖注入和配置系统
  • .net8.0与halcon编程环境构建
  • .Net程序猿乐Android发展---(10)框架布局FrameLayout
  • .net中调用windows performance记录性能信息
  • @vueup/vue-quill使用quill-better-table报moduleClass is not a constructor