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

别死记硬背了!用Python代码可视化理解离散数学中的集合与关系

用Python代码可视化理解离散数学中的集合与关系离散数学是计算机科学的基石之一而集合论作为其核心组成部分常常让初学者感到抽象难懂。传统的数学教材往往侧重于理论推导和符号表达这对于习惯了动手实践的编程学习者来说可能会形成一道无形的门槛。本文将带你用Python代码和可视化工具将抽象的集合论概念转化为直观的图形和可运行的示例让学习过程变得更加生动有趣。1. 集合的基本操作与Python实现集合是现代数学的基础概念也是编程中常用的数据结构。在Python中集合(set)是一种无序且不重复的元素集合这与数学中的集合定义高度吻合。让我们从最基本的集合操作开始# 创建两个集合 A {1, 2, 3, 4, 5} B {4, 5, 6, 7, 8} # 并集 union A | B # 或者 A.union(B) print(f并集: {union}) # 交集 intersection A B # 或者 A.intersection(B) print(f交集: {intersection}) # 差集 difference A - B # 或者 A.difference(B) print(fA-B差集: {difference}) # 对称差集 symmetric_diff A ^ B # 或者 A.symmetric_difference(B) print(f对称差集: {symmetric_diff})提示Python的集合操作符与数学符号对应关系|(并集)、(交集)、-(差集)、^(对称差集)1.1 幂集的可视化实现幂集是指一个集合的所有子集构成的集合。对于集合A{1,2,3}其幂集为P(A) {∅, {1}, {2}, {3}, {1,2}, {1,3}, {2,3}, {1,2,3}}我们可以用Python的itertools模块生成幂集from itertools import combinations def power_set(s): s list(s) return {frozenset(subset) for i in range(len(s)1) for subset in combinations(s, i)} A {1, 2, 3} print(f集合A的幂集: {power_set(A)})为了更直观地展示幂集的结构我们可以用matplotlib绘制幂集的层次图import matplotlib.pyplot as plt import networkx as nx def draw_power_set(s): ps power_set(s) G nx.DiGraph() # 添加节点和边 for subset in ps: size len(subset) G.add_node(str(subset), subsetsubset, sizesize) # 添加边表示包含关系 for u in ps: for v in ps: if u.issubset(v) and len(v) len(u)1: G.add_edge(str(u), str(v)) # 绘制图形 pos nx.multipartite_layout(G, subset_keysize) plt.figure(figsize(10, 6)) nx.draw(G, pos, with_labelsTrue, node_size1000, node_colorskyblue) plt.title(幂集的层次结构) plt.show() draw_power_set({1, 2, 3})2. 关系与笛卡尔积的可视化关系是集合论中的重要概念它描述了集合元素之间的联系。在编程中关系可以表示为有序对的集合。2.1 笛卡尔积的实现笛卡尔积是关系的基础。对于集合A和B它们的笛卡尔积A×B是所有可能的有序对(a,b)的集合其中a∈Ab∈B。def cartesian_product(A, B): return {(a, b) for a in A for b in B} A {1, 2, 3} B {a, b} print(fA×B笛卡尔积: {cartesian_product(A, B)})我们可以用矩阵形式可视化笛卡尔积import numpy as np import seaborn as sns def plot_cartesian_product(A, B): A sorted(A) B sorted(B) matrix np.zeros((len(A), len(B))) plt.figure(figsize(8, 6)) sns.heatmap(matrix, annotTrue, xticklabelsB, yticklabelsA, cmapBlues, cbarFalse) plt.title(笛卡尔积矩阵表示) plt.xlabel(集合B) plt.ylabel(集合A) plt.show() plot_cartesian_product({1, 2, 3}, {a, b, c})2.2 关系矩阵与关系图关系可以用矩阵和图两种方式表示。让我们实现一个关系类支持这两种表示方法class Relation: def __init__(self, elements, pairs): self.elements sorted(elements) self.pairs set(pairs) self.size len(self.elements) self.index_map {e: i for i, e in enumerate(self.elements)} def matrix(self): mat [[0]*self.size for _ in range(self.size)] for (a, b) in self.pairs: i self.index_map[a] j self.index_map[b] mat[i][j] 1 return mat def plot_matrix(self): mat self.matrix() plt.figure(figsize(8, 8)) sns.heatmap(mat, annotTrue, xticklabelsself.elements, yticklabelsself.elements, cmapBlues, cbarFalse) plt.title(关系矩阵) plt.show() def plot_graph(self): G nx.DiGraph() G.add_nodes_from(self.elements) G.add_edges_from(self.pairs) plt.figure(figsize(8, 6)) nx.draw(G, with_labelsTrue, node_size800, node_colorlightgreen, arrowsize20) plt.title(关系图) plt.show() # 示例整除关系 elements {1, 2, 3, 4, 6, 12} pairs {(a, b) for a in elements for b in elements if b % a 0} div_relation Relation(elements, pairs) div_relation.plot_matrix() div_relation.plot_graph()3. 特殊关系等价关系与偏序关系3.1 等价关系的判定与可视化等价关系是自反、对称且传递的关系。我们可以编写函数来验证一个关系是否是等价关系def is_reflexive(relation): elements relation.elements return all((e, e) in relation.pairs for e in elements) def is_symmetric(relation): return all((b, a) in relation.pairs for (a, b) in relation.pairs) def is_transitive(relation): pairs relation.pairs return all((a, c) in pairs for a in relation.elements for b in relation.elements for c in relation.elements if (a, b) in pairs and (b, c) in pairs) def is_equivalence(relation): return (is_reflexive(relation) and is_symmetric(relation) and is_transitive(relation))等价关系的一个重要概念是等价类。我们可以实现等价类的划分def equivalence_classes(relation): if not is_equivalence(relation): raise ValueError(关系不是等价关系) classes [] elements set(relation.elements) while elements: representative elements.pop() eq_class {rep for rep in relation.elements if (representative, rep) in relation.pairs} classes.append(eq_class) elements - eq_class return classes # 示例模3同余关系 elements set(range(8)) pairs {(a, b) for a in elements for b in elements if a % 3 b % 3} mod3_relation Relation(elements, pairs) print(这是一个等价关系吗?, is_equivalence(mod3_relation)) print(等价类:, equivalence_classes(mod3_relation))3.2 偏序关系与哈斯图偏序关系是自反、反对称且传递的关系。哈斯图是表示偏序关系的简化图。def is_antisymmetric(relation): return not any((a, b) in relation.pairs and (b, a) in relation.pairs for a in relation.elements for b in relation.elements if a ! b) def is_partial_order(relation): return (is_reflexive(relation) and is_antisymmetric(relation) and is_transitive(relation)) def hasse_diagram(relation): if not is_partial_order(relation): raise ValueError(关系不是偏序关系) G nx.DiGraph() elements relation.elements pairs relation.pairs # 找出盖住关系 covers set() for (a, b) in pairs: if a b: continue is_cover True for c in elements: if (a, c) in pairs and (c, b) in pairs and c ! a and c ! b: is_cover False break if is_cover: covers.add((a, b)) G.add_nodes_from(elements) G.add_edges_from(covers) # 使用层级布局 levels {} remaining set(elements) current_level 0 while remaining: minimal {x for x in remaining if not any((y, x) in covers for y in remaining)} for node in minimal: levels[node] current_level remaining - minimal current_level 1 pos {node: (i, -levels[node]) for i, node in enumerate(sorted(elements))} plt.figure(figsize(10, 6)) nx.draw(G, pos, with_labelsTrue, node_size800, node_colorlightcoral, arrowsize20) plt.title(哈斯图) plt.show() # 示例整除关系 elements {1, 2, 3, 4, 6, 12} pairs {(a, b) for a in elements for b in elements if b % a 0} div_order Relation(elements, pairs) hasse_diagram(div_order)4. 关系运算与闭包关系可以进行多种运算如复合运算、逆运算和闭包运算。这些运算在数据库查询优化、图算法等领域有广泛应用。4.1 关系复合运算关系的复合类似于函数的复合。给定关系R⊆A×B和S⊆B×C它们的复合R∘S⊆A×C定义为R∘S {(a,c) | 存在b∈B使得(a,b)∈R且(b,c)∈S}Python实现def compose(R, S): R: Relation from A to B S: Relation from B to C returns: Relation from A to C B_in_R {b for (a,b) in R.pairs} B_in_S {b for (b,c) in S.pairs} common_B B_in_R B_in_S composed_pairs set() for (a, b1) in R.pairs: for (b2, c) in S.pairs: if b1 b2: composed_pairs.add((a, c)) A {a for (a,b) in R.pairs} C {c for (b,c) in S.pairs} return Relation(A | C, composed_pairs) # 示例 A {1, 2, 3} B {x, y, z} C {True, False} R_pairs {(1, x), (2, y), (3, z)} S_pairs {(x, True), (y, False), (z, True)} R Relation(A | B, R_pairs) S Relation(B | C, S_pairs) R_o_S compose(R, S) R_o_S.plot_matrix()4.2 关系闭包运算闭包运算是指向关系添加最少的元素使其具有某种性质自反、对称或传递。自反闭包的实现def reflexive_closure(relation): new_pairs relation.pairs | {(e, e) for e in relation.elements} return Relation(relation.elements, new_pairs) # 示例 elements {1, 2, 3} pairs {(1, 2), (2, 3)} rel Relation(elements, pairs) ref_cl reflexive_closure(rel) ref_cl.plot_matrix()传递闭包可以使用Warshall算法高效计算def transitive_closure(relation): mat relation.matrix() n len(mat) closure [row[:] for row in mat] for k in range(n): for i in range(n): for j in range(n): closure[i][j] closure[i][j] or (closure[i][k] and closure[k][j]) elements relation.elements new_pairs {(elements[i], elements[j]) for i in range(n) for j in range(n) if closure[i][j]} return Relation(elements, new_pairs) # 示例 elements {1, 2, 3, 4} pairs {(1, 2), (2, 3), (3, 4)} rel Relation(elements, pairs) trans_cl transitive_closure(rel) trans_cl.plot_matrix()5. 函数与特殊函数类型函数是一种特殊的关系满足每个输入对应唯一输出的条件。在编程中函数是最基本的概念之一。5.1 函数判定与性质检查我们可以编写函数来验证一个关系是否是函数以及它具有哪些特殊性质def is_function(relation): domain {a for (a, b) in relation.pairs} if domain ! set(relation.elements): return False inputs {} for (a, b) in relation.pairs: if a in inputs: if inputs[a] ! b: return False else: inputs[a] b return True def is_injective(func): if not is_function(func): return False outputs set() for (a, b) in func.pairs: if b in outputs: return False outputs.add(b) return True def is_surjective(func, codomain): if not is_function(func): return False outputs {b for (a, b) in func.pairs} return outputs codomain def is_bijective(func, codomain): return is_injective(func) and is_surjective(func, codomain) # 示例 elements {1, 2, 3} pairs {(1, a), (2, b), (3, a)} rel Relation(elements, pairs) print(是函数吗?, is_function(rel)) print(是单射吗?, is_injective(rel)) print(是满射吗?, is_surjective(rel, {a, b})) print(是双射吗?, is_bijective(rel, {a, b}))5.2 函数复合与逆函数函数的复合与关系的复合类似但结果保证仍然是函数def function_compose(f, g): if not (is_function(f) and is_function(g)): raise ValueError(输入必须是函数) # 检查g的定义域是否包含f的值域 f_codomain {b for (a, b) in f.pairs} g_domain {a for (a, b) in g.pairs} if not f_codomain.issubset(g_domain): raise ValueError(函数不可复合) composed_pairs {(a, c) for (a, b) in f.pairs for (b2, c) in g.pairs if b b2} elements {a for (a, b) in f.pairs} | {c for (b, c) in g.pairs} return Relation(elements, composed_pairs) # 示例 f_pairs {(1, a), (2, b), (3, c)} g_pairs {(a, True), (b, False), (c, True)} f Relation({1, 2, 3} | {a, b, c}, f_pairs) g Relation({a, b, c} | {True, False}, g_pairs) f_o_g function_compose(f, g) f_o_g.plot_matrix()对于双射函数我们可以求其逆函数def inverse_function(func): if not is_bijective(func, {b for (a, b) in func.pairs}): raise ValueError(函数不是双射没有逆函数) inverse_pairs {(b, a) for (a, b) in func.pairs} elements {a for (a, b) in func.pairs} | {b for (a, b) in func.pairs} return Relation(elements, inverse_pairs) # 示例 f_pairs {(1, a), (2, b), (3, c)} f Relation({1, 2, 3} | {a, b, c}, f_pairs) f_inv inverse_function(f) f_inv.plot_matrix()

相关文章:

别死记硬背了!用Python代码可视化理解离散数学中的集合与关系

用Python代码可视化理解离散数学中的集合与关系 离散数学是计算机科学的基石之一,而集合论作为其核心组成部分,常常让初学者感到抽象难懂。传统的数学教材往往侧重于理论推导和符号表达,这对于习惯了动手实践的编程学习者来说,可能…...

Windows 11 + Python 3.10 下,用智谱GLM-4-Flash API零成本跑通DB-GPT(保姆级避坑指南)

Windows 11 Python 3.10 下零成本跑通DB-GPT全流程指南 最近发现不少朋友对DB-GPT这个开源项目很感兴趣,但被复杂的部署流程和硬件要求劝退。作为过来人,我完全理解这种困扰——去年第一次尝试时,光是处理依赖冲突就花了整整两天。不过现在…...

NCMDump:突破网易云音乐格式限制的开源解密工具

NCMDump:突破网易云音乐格式限制的开源解密工具 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 当你下载了喜爱的音乐却发现文件格式被加密,无法在其他设备播放时;当你想备份音乐收藏却受限于专有…...

弃投《Nature Communications》转投它?这些期刊正在让这批科研人弯道超车!

《Science Advances》影响因子分区自引率12.5JCR Q1 / 综合1区 1.6%研究方向:多学科综合、自然科学与工程期刊亮点:AAAS顶刊,年发文约2000篇,国人占比约30%,审稿3-5个月,OA发表,是各学科冲一区顶…...

告别破解风险,用快马AI五分钟搭建你的专属数据库管理工具原型

最近在做一个需要频繁操作数据库的小项目,原本想用Navicat这类工具,但正版价格不菲,破解版又担心安全和法律风险。正好发现InsCode(快马)平台可以快速生成代码原型,就尝试用它5分钟搭建了一个简易的数据库管理工具。 为什么选择W…...

保姆级教程:手把手教你用Dify 0.6.0源码搭建自己的AI工作流引擎(附避坑指南)

从零构建AI工作流引擎:Dify 0.6.0源码实战指南 当你第一次打开Dify的源码仓库,可能会被那些复杂的目录结构和抽象类搞得一头雾水。别担心,三周前我也和你一样,直到我亲手将这套系统跑起来并修改了第一个工作流节点。本文将带你用最…...

当Texstudio遇见AI:构想一个基于快马平台的智能LaTeX代码助手插件

作为一个长期使用LaTeX撰写学术论文的用户,我经常在Texstudio和各类在线工具之间来回切换。最近尝试了InsCode(快马)平台的AI辅助功能后,突然萌生了一个想法:如果能将AI代码生成能力直接集成到Texstudio里,该有多方便?…...

2026毕业论文降AI工具指南:实测4款高通过率方案

答辩前三天被通知AI率超标要重改的焦虑,我至今印象深刻。去年帮二十多位同专业学弟学妹调整过毕业论文的AI检测问题,整理出的实用经验今天全部分享给大家。 先说结论:SpeedAI科研小助手和思笔AI是我最推荐的两款。前者性价比极高且全平台适配…...

如何高效捕获网页资源?这款浏览器扩展让下载效率提升300%

如何高效捕获网页资源?这款浏览器扩展让下载效率提升300% 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 在数字化时代,网页…...

Windows远程桌面防爆破实战:用PowerShell自动封禁恶意IP(附完整脚本)

Windows远程桌面安全加固:基于PowerShell的智能IP封禁系统 远程桌面服务(RDP)作为企业IT基础设施的核心组件,其安全性直接关系到整个系统的稳定运行。根据2023年全球网络安全报告显示,针对3389端口的暴力破解尝试占所有…...

Cosmos-Reason1-7B在计算机组成原理教学中的应用:图解CPU工作流程

Cosmos-Reason1-7B在计算机组成原理教学中的应用:图解CPU工作流程 计算机组成原理这门课,对很多学生来说,就像在学一门“黑魔法”。课本上那些抽象的指令周期、数据通路、控制器,听起来都懂,但一合上书,脑…...

Llama Pro用户必看:如何用LoRA_targets只微调新增的Block,大幅节省你的显存

Llama Pro高效微调指南:精准控制LoRA_targets优化显存使用 当Llama Pro模型规模不断扩展时,全参数微调对显存的消耗往往令人望而却步。实际上,通过巧妙配置LoRA_targets参数,我们可以仅针对新增模块进行定向微调,在保证…...

017 华夏之光永存:华为破局(架构师级)- 多设备、多版本鸿蒙碎片化兼容的底层设计思路

原创:华为破局(架构师级)- 多设备多版本鸿蒙碎片化兼容底层设计思路 摘要 本文针对鸿蒙全场景生态下多终端硬件差异、多系统版本迭代导致的碎片化痛点,深度拆解鸿蒙统一内核抽象、分层适配隔离、分布式兼容协同、版本平滑演进四大…...

终极指南:如何构建轻量级Arduino设备与Home Assistant的无缝MQTT集成

终极指南:如何构建轻量级Arduino设备与Home Assistant的无缝MQTT集成 【免费下载链接】arduino-home-assistant ArduinoHA allows to integrate an Arduino/ESP based device with Home Assistant using MQTT. 项目地址: https://gitcode.com/gh_mirrors/ar/ardui…...

16 华夏之光永存:华为破局(架构师级)- 星盾安全体系与 TEE 可信执行环境交互原理

原创:华为破局(架构师级)- 星盾安全体系与TEE可信执行环境交互原理 摘要 本文聚焦鸿蒙星盾安全体系与TEE可信执行环境,拆解全域安全架构、TEE核心特性、二者全流程交互原理,揭示鸿蒙硬件级可信全域防护的底层逻辑&…...

Shell脚本进阶:如何用while循环处理未知次数的任务(避坑指南)

Shell脚本进阶:while循环处理未知次数任务的实战艺术 在Linux系统管理和自动化运维领域,Shell脚本是不可或缺的利器。当我们面对需要重复执行但次数未知的任务时,while循环展现出其独特的价值。与for循环不同,while循环不依赖预先…...

在Discord上实时展示你的网易云音乐和QQ音乐播放状态

在Discord上实时展示你的网易云音乐和QQ音乐播放状态 【免费下载链接】NetEase-Cloud-Music-DiscordRPC 在Discord上显示网抑云/QQ音乐. Enables Discord Rich Presence For Netease Cloud Music/Tencent QQ Music. 项目地址: https://gitcode.com/gh_mirrors/ne/NetEase-Cl…...

从广播风暴到安全隔离:用Wireshark抓包分析VLAN工作原理(实验对比版)

从广播风暴到安全隔离:用Wireshark抓包分析VLAN工作原理(实验对比版) 当你按下回车键发送一个广播消息时,这个数据包会像野火一样蔓延到整个网络——至少在没有VLAN的传统以太网中是这样。我曾亲眼见证过一个简单的ARP请求如何拖垮…...

数据分析中的异常值处理:MAD

在数据处理(尤其是金融、生物统计、信号处理等)中,极值(异常值) 会严重影响均值、方差、相关系数等统计量的估计,并扭曲模型训练。MAD法(Median Absolute Deviation,绝对中位差法&am…...

Windows 11系统优化终极指南:如何用Win11Debloat让你的电脑重获新生

Windows 11系统优化终极指南:如何用Win11Debloat让你的电脑重获新生 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to dec…...

如何通过社交媒体来提升网站的 SEO 表现

如何通过社交媒体来提升网站的 SEO 表现 在当今互联网时代,社交媒体已经成为了人们获取信息、交流互动的重要平台。越来越多的企业和个人发现,社交媒体不仅仅是一个交流工具,它还能为网站带来巨大的 SEO 价值。本文将探讨如何通过社交媒体来…...

Mem Reduct内存清理工具:掌握20+语言切换的终极技巧

Mem Reduct内存清理工具:掌握20语言切换的终极技巧 【免费下载链接】memreduct Lightweight real-time memory management application to monitor and clean system memory on your computer. 项目地址: https://gitcode.com/gh_mirrors/me/memreduct 你是否…...

技术对业务的赋能

技术对业务的赋能 技术不只是实现需求,更是提升效率、降低成本、放大增长、控制风险,最终帮业务赚到更多、跑得更快、活得更稳。 1. 提升效率,降本增效 自动化流程:表单、审批、报表自动生成,减少人工重复劳动组件化/低…...

测试数据管理:告别“脏数据”的困扰

在软件测试的日常实践中,测试数据是驱动一切验证活动的血液。然而,这至关重要的“血液”却常常受到“脏数据”的污染,导致测试用例失效、结果失真,最终侵蚀产品质量的基石。所谓“脏数据”,并非字面意义上的污秽&#…...

文档即测试:我们如何用Markdown写自动化用例

在软件测试领域,沟通的鸿沟、文档的滞后性与维护的复杂性,一直是阻碍自动化测试效率提升的痛点。传统的测试脚本虽然功能强大,但可读性往往局限于开发与少数资深测试人员,业务方与项目管理者难以直观理解测试意图与覆盖范围。随着…...

前端日常快速开发必备工具库

一、通用工具库(任何项目都能用) lodash 最常用 JS 工具库:防抖、节流、深拷贝、数组/对象处理、判空等。dayjs 轻量时间格式化,替代 moment,体积小、API 一样。axios 请求封装、拦截器、取消请求、统一错误处理。qs 对…...

代码审查实战:如何写出有建设性的评论

在当今追求快速交付的软件开发流程中,代码审查(Code Review)已成为保障产品质量、促进知识共享和提升团队协作不可或缺的关键环节。然而,代码审查的价值并不仅仅在于“发现错误”,更在于通过有建设性的评论&#xff0c…...

AI大模型系统学习指南:掌握大模型,从入门到精通

随着技术的进步,大模型如OpenAI的GPT-4和Sora、Google的BERT和Gemini等已经展现出了惊人的能力-从理解和生成自然语言到创造逼真的图像及视频。所以掌握大模型的知识和技能变得越来越重要。 下面是学习大模型的一些建议,供大家参考。 必备基础知识 **数学…...

Simulink电气系统建模遇阻?一文详解powergui模块缺失报错与修复

1. 为什么你的Simulink电气模型总是报错? 最近在技术论坛上看到不少电气工程师吐槽:"明明是按照教程搭建的Simscape电机模型,一运行就弹出红色报错框,说什么必须包含powergui模块..." 这让我想起自己刚接触Simulink电气…...

大厂P9:从P5到P9的关键跃迁 (原始ppt)

来源:基于最近一下线下分享,一并粘贴过来分享给大家。 https://mp.weixin.qq.com/s/C0WaiedJslkg1KZwtsNmkA...