首页
实用工具
我的旅程
在线壁纸
更多
✒️ 问题反馈
📦 文章统计
🌍 国内镜像
🎬 次元视界
📒 流水账本
🎨 在线 PS
推荐
🕵️ 开源情报
🌆 图片压缩
🍭 资产清洗
💡 我的作品
👤 关于站长
⚔️ 次 元 剑
搜索
1
【工具分享】逆向工具箱 - 次元剑
89,537 阅读
2
【技术分享】PE文件结构分析 ( RVA转FOA )
7,350 阅读
3
【技术分享】NASM x86 Assembly Language
5,982 阅读
4
【技术分享】CK竞技之王游戏辅助制作
3,725 阅读
5
【每日随记】天涯明月刀无限飞修改思路
2,816 阅读
技术分享
CTF解题
英语笔记
数学笔记
网络通信
每日随记
攻防技术
工具分享
Search
标签搜索
Windows
Web安全
Python3
Linux
逆向工程
CTF
红队技术
人工智能
C/C++
黑客工具
Go
密码学
二进制安全
数学
漏洞挖掘
Android
eNSP
渗透测试
蓝队技术
黑客大会
发光的神
累计撰写
160
篇文章
累计收到
103
条评论
首页
栏目
技术分享
CTF解题
英语笔记
数学笔记
网络通信
每日随记
攻防技术
工具分享
页面
实用工具
我的旅程
在线壁纸
✒️ 问题反馈
📦 文章统计
🌍 国内镜像
🎬 次元视界
📒 流水账本
🎨 在线 PS
推荐
🕵️ 开源情报
🌆 图片压缩
🍭 资产清洗
💡 我的作品
👤 关于站长
⚔️ 次 元 剑
搜索到
4
篇与
的结果
2022-07-21
【数学笔记】高等数学 函数、极限、连续
简介高数里,函数、极限、连续这三个是基础中的基础,三者是连在一起的:先懂函数,才能学极限,搞懂极限了,才能理解连续。这三个搞不明白,后面的导数、积分根本学不进去。而且我发现,用咱们写代码的思路去理解这些抽象概念,会简单很多!下面我就结合Python代码,把这三个知识点捋清楚,记下来方便自己后续复习,也尽量写得直白,别搞那些花里胡哨的书面话。函数函数类似编程中的函数比如:def f(x): # x 是自变量 :代表它可以发生变化,比如 x = 5,定义域就是x的取值范围,还要排除算不了的数 res = x**2 + 1 # 通过函数的对应法则,x=5时输出的因变量等于 26,就是5²+1的结果 return res f(3) # 因变量输出:10,和数学里算的f(3)=10一模一样,这就是“一个输入对应一个输出”在 $f(x)$ 中的 $x$ 值是自变量,x取值范围就叫做定义域,试想当 $x$ 发生变化比如取任何一个数 $5$,那么通过函数的对应法则 $x ^ 2 + 1$ 进行公式运算后得出 因变量 结果为:$26$。这里要注意,定义域不是随便取的,比如分式分母不能为0、平方根里不能是负数,不然就像编程报错一样,数学里叫“无定义”,x不能取这种数。而且一个x只能对应一个因变量,不能一个x算出两个结果,这是函数的基本规矩,记死就行。为了加深印象,我再补一个代码例子,重点看定义域和函数的确定性:def g(x): # 这个函数是1/x,分式函数,定义域是x≠0,不然报除零错误,数学里无定义 return 1/x # 测试定义域内的数 print(g(2)) # 输出0.5,一个输入对应一个输出,没问题 # 测试定义域外的数x=0 try: g(0) except ZeroDivisionError: print("x=0不在g(x)的定义域内,算不了") # 报错,对应数学里的“无定义”另外,因变量的取值范围叫值域,比如f(x)=x²+1,不管x取啥实数,结果都≥1,值域就是[1, +∞),用代码随便测几个x就能验证:# 验证f(x)=x²+1的值域 test_x = [-3, -2, 0, 1, 4, 10] for x in test_x: print(f"f({x}) = {x**2 + 1}") # 输出依次为10、5、1、2、17、101,都≥1总的来说,函数没什么难的,核心就是“一个输入对应一个输出”,用编程的思路理解,就是“一个参数,一段计算代码,一个返回值”。定义域和值域就是x和f(x)的取值范围,记牢定义域要排除无意义的数,后面学极限、连续都会用到。极限极限描述的是当自变量趋近某个值时,函数的值趋近于什么def f(x): return (x**2 - 1) / (x - 1) # x=1时分母为0,编程报错,数学里无定义,但极限能解决这个问题计算 $\lim_{x \to 1} f(x) = L$,直接代入x=1会导致除零错误,但从极限的角度,可以简化并发现 $x$ 接近 1 时,函数值趋近于 2。这就是函数在 $x=1$ 处的极限。具体来说,把分子因式分解成(x-1)(x+1),因为x是靠近1不是等于1,x-1不等于0,约掉后就是x+1,x靠近1时,x+1就靠近2。我用代码模拟x从1的左右两边慢慢靠近,能更直观看到趋势:def f(x): return (x**2 - 1) / (x - 1) # 从左边靠近1,delta越小,x越接近1 print("从左边趋近x=1:") for delta in [0.1, 0.01, 0.001, 0.0001, 0.00001]: x = 1 - delta val = f(x) print(f"x={x},f(x)={val}") # 输出:x越靠近1,f(x)越靠近2(比如x=0.9→1.9,x=0.99→1.99) # 从右边靠近1 print("\n从右边趋近x=1:") for delta in [0.1, 0.01, 0.001, 0.0001, 0.00001]: x = 1 + delta val = f(x) print(f"x={x},f(x)={val}") # 输出:x越靠近1,f(x)越靠近2(比如x=1.1→2.1,x=1.01→2.01)这里补充个知识点:x从左边靠近的极限叫左极限,右边的叫右极限,只有左右极限都存在且相等,这个点的极限才存在(这里都是2,所以极限就是2)。极限不关心x等于某个值的情况,只看趋势,这是它的核心作用,能解决函数无定义但能看趋势的问题。另外极限还有几个好理解的性质:一是唯一的,一个点的极限只有一个值;二是局部有界,极限存在的话,x附近的f(x)不会无限大/小;三是保号,极限是正数,x附近的f(x)也都是正数。总的来说,极限就是个“看趋势”的工具,搞懂x“靠近”和“等于”的区别,极限就没什么难的了,也是后面学连续的基础。连续函数的连续性表示函数在某一点没有间断。如果函数在某个点的极限值等于该点的函数值,则该函数在此点是连续的def f(x): if x == 2: return 6 # 故意设成6,和极限值5不一样,体现不连续 return x**2 + 1虽然函数在 $x=2$ 处有定义,但由于函数值与极限值不相等,函数在 $x=2$ 处是不连续的。这里要记牢连续的三个条件,少一个都不行:①函数在该点有定义;②极限存在(左右极限都有且相等);③极限值=函数值。先验证x=2处的极限和函数值:# 验证x=2处的极限(趋近2的函数值) print("x趋近于2时,函数值的变化:") for delta in [0.1, 0.01, 0.001, 0.0001]: x1 = 2 - delta # 从左边靠近2 x2 = 2 + delta # 从右边靠近2 print(f"x={x1}时,f(x)={f(x1)};x={x2}时,f(x)={f(x2)}") # 输出:x越靠近2,f(x)越靠近5(极限值是5) # 验证x=2处的函数值 print(f"\nx=2时,f(x)={f(2)}") # 输出6,和极限值5不相等x=2处满足①有定义(f(2)=6)、②极限存在(是5),但③极限值≠函数值,所以不连续,这个点叫“可去间断点”——把x=2的函数值改成5,就连续了:def continuous_f(x): if x == 2: return 5 # 改成和极限值一样的5 return x**2 + 1 # 验证连续性 print(f"x=2处函数值:{continuous_f(2)}") # 5,满足① print("x趋近于2时的函数值:") for delta in [0.1, 0.01, 0.001]: x1 = 2 - delta x2 = 2 + delta print(f"x={x1}→{continuous_f(x1)};x={x2}→{continuous_f(x2)}") # 都趋近5,满足② print(f"极限值={2**2 + 1},函数值={continuous_f(2)}") # 都是5,满足③,连续了除了可去间断点,还有两种常见的间断点,记下来方便复习:1. 跳跃间断点(左右极限都存在但不相等)def jump_f(x): if x < 2: return x + 1 # 左极限=3 else: return x - 1 # 右极限=1 # 验证左右极限 print("x从左边趋近2:") for delta in [0.1, 0.01, 0.001]: x = 2 - delta print(f"x={x},f(x)={jump_f(x)}") # 趋近3 print("\nx从右边趋近2:") for delta in [0.1, 0.01, 0.001]: x = 2 + delta print(f"x={x},f(x)={jump_f(x)}") # 趋近1 # 左≠右,极限不存在,不连续2. 无穷间断点(x靠近时f(x)无限大/小)def infinite_f(x): return 1 / (x - 2) # x=2无定义,x靠近2时f(x)无限大/小 # 验证 print("x从左边趋近2:") for delta in [0.1, 0.01, 0.001]: x = 2 - delta print(f"x={x},f(x)={infinite_f(x)}") # 趋近-∞ print("\nx从右边趋近2:") for delta in [0.1, 0.01, 0.001]: x = 2 + delta print(f"x={x},f(x)={infinite_f(x)}") # 趋近+∞ # 极限是无穷大,不存在,不连续最后补个小性质:连续函数的和/差/积/商(分母≠0)、复合函数还是连续的;闭区间上的连续函数一定有最大值和最小值,结合例子很好理解。总的来说,连续的核心就是“极限值=函数值”,搞懂了极限,连续就很简单,而且连续也是后面学导数、积分的基础,大部分能求导、能积分的函数都是连续的。用编程例子理解这些抽象概念最实用,把公式转化成熟悉的代码,一下子就不懵了。记这个笔记就是为了后续复习,把零散知识点串起来,搞懂本质不硬背,后面可以再补复杂例子巩固。总结函数是核心,和编程函数逻辑一致,核心是“一个输入对应一个输出”,记牢定义域、对应法则、因变量三个核心;极限是看趋势的工具,重点在“趋近”而非“等于”,解决了函数无定义但能判断趋势的问题;连续是函数的性质,核心是“极限值=函数值”,需满足有定义、极限存在、极限值=函数值三个条件,还要分清可去、跳跃、无穷三种常见间断点。
2022年07月21日
117 阅读
0 评论
10 点赞
2022-07-05
【数学笔记】常用数学符号速查表
留言在数学领域中,符号是一种强大的语言工具,用于表达各种数学概念、关系和运算,它们不仅简洁而精确,还为我们提供了一种统一的方式来描述和解释数学现象,使得数学变得更加可视化和易于理解。从基础的算术运算、几何图形,到高等数学的极限、积分、集合论,数学符号贯穿数学学习的全阶段,熟练识别、书写和运用这些符号,是高效学习数学的基础,也能让数学表达更严谨、更简洁。四则运算加法:$a + b$,表示$a$与$b$的和减法:$a - b$,表示$a$与$b$的差乘法:$a \times b$ 或 $a \cdot b$ 或 $ab$(字母/数字与字母相乘可省略乘号,数字相乘建议保留$\times$),表示$a$与$b$的积除法:$\dfrac{a}{b}$ 或 $a \div b$($b\neq0$,分母不能为0),表示$a$除以$b$的商乘方:$a^n$,表示$n$个$a$连续相乘,$a^2$(平方)、$a^3$(立方)为常用特例,如$5^2=5\times5$开方:$\sqrt[n]{a}$,表示$a$的$n$次方根,$n=2$时省略为$\sqrt{a}$(平方根),$n=3$为$\sqrt[3]{a}$(立方根),如$\sqrt[3]{8}=2$括号:$()$(小括号/圆括号)、$[]$(中括号/方括号)、$\lbrace \rbrace$(大括号/花括号),用于改变运算优先级,如$2\times(3+4)=14$数学符号基础关系与运算符号正号:$+x$,表示一个正数 $x$负号:$-y$,表示一个负数 $y$等于:$a = b$,表示 $a$ 等于 $b$不等于:$\neq$,表示不等于的关系,例如 $a \neq b$,表示 $a$ 不等于 $b$约等于:$\approx$,表示约等于的关系,例如 $\pi \approx 3.14$,表示 $\pi$ 约等于 $3.14$小于:$a < b$,表示 $a$ 小于 $b$大于:$a > b$,表示 $a$ 大于 $b$小于等于:$\leq$,表示小于等于的关系,例如 $a \leq b$,表示 $a$ 小于或等于 $b$大于等于:$\geq$,表示大于等于的关系,例如 $a \geq b$,表示 $a$ 大于或等于 $b$正比/反比:$\propto$,表示成正比,$a\propto b$即$a=kb$($k$为常数);$a\propto \dfrac{1}{b}$表示$a$与$b$成反比百分号/千分号:$\%$ / $\‰$,$1\%=\dfrac{1}{100}$,$1\‰=\dfrac{1}{1000}$,如$20\%x=0.2x$阶乘:$n!$,表示$n$的阶乘,$n!=n\times(n-1)\times\cdots\times1$,特例$0!=1$、$1!=1$,如$5!=5\times4\times3\times2\times1=120$恒等:$\equiv$,表示恒等的关系,例如 $a \equiv b$,表示无论变量取何值,$a$ 与 $b$ 始终相等绝对值:$|x|$,表示 $x$ 的绝对值,即数轴上$x$到原点的距离,$|x|\geq0$,如$|-5|=5$、$|0|=0$无穷:$\infty$,表示无穷大,正无穷$+\infty$、负无穷$-\infty$,如$x\to+\infty$表示$x$趋近于正无穷闭区间:$[a, b]$,表示一个闭区间,包含端点 $a$ 和 $b$,即$a\leq x\leq b$开区间:$(a, b)$,表示一个开区间,不包含端点 $a$ 和 $b$,即$a< x< b$半开半闭区间:$(a, b]$ / $[a, b)$,前者包含$b$不包含$a$,后者包含$a$不包含$b$,如$x\in(1,5]$即$1<x\leq5$集合符号属于:$\in$,表示属于的关系,例如 $x \in A$,表示 $x$ 是集合 $A$ 的元素不属于:$\notin$,表示不属于的关系,例如 $x \notin A$,表示 $x$ 不是集合 $A$ 的元素包含于:$\subset$ 或 $\subseteq$,$\subset$为真包含于($A\subset B$表示$A$是$B$的真子集,$A\neq B$),$\subseteq$为包含于(允许$A=B$)包含:$\supset$ 或 $\supseteq$,与包含于互逆,$A\supset B$表示集合$A$包含集合$B$交集:$A \cap B$,表示集合 $A$ 和集合 $B$ 的公共元素组成的集合,如$A=\{1,2\}$、$B=\{2,3\}$,则$A\cap B=\{2\}$并集:$A \cup B$,表示集合 $A$ 和集合 $B$ 的所有元素组成的集合,如$A=\{1,2\}$、$B=\{2,3\}$,则$A\cup B=\{1,2,3\}$空集:$\emptyset$ 或 $\varnothing$,表示一个不包含任何元素的集合,$\emptyset\subset$任意非空集合全集:$U$,表示研究问题中所有元素组成的集合,如研究实数时,$U=\mathbb{R}$补集:$\complement_U A$,表示在全集$U$中,不属于$A$的所有元素组成的集合,如$U=\{1,2,3,4\}$、$A=\{1,2\}$,则$\complement_U A=\{3,4\}$常用数集:$\mathbb{N}$(自然数集,$0,1,2,\dots$)、$\mathbb{Z}$(整数集,$\dots,-1,0,1,\dots$)、$\mathbb{Q}$(有理数集)、$\mathbb{R}$(实数集)、$\mathbb{C}$(复数集)几何符号角:$\angle$,表示角度,如$\angle ABC$表示以$B$为顶点,$BA$、$BC$为边的角度:$^\circ$,角度单位,$1^\circ=\dfrac{1}{360}$周角分:$'$,角度小单位,$1^\circ=60'$秒:$''$,角度小单位,$1'=60''$,如$30^\circ15'30''$平行:$\parallel$,表示平行的关系,如$AB \parallel CD$表示直线$AB$与直线$CD$无交点垂直:$\perp$,表示垂直的关系,如$AB \perp CD$表示直线$AB$与直线$CD$的夹角为$90^\circ$圆弧:$\widehat{AB}$,表示以点 $A$ 和点 $B$ 为端点的圆弧扇形:$\overset{\frown}{AB}O$,表示以$O$为圆心、$\widehat{AB}$为弧的扇形圆:$\odot$,标准圆符号,$\odot O$表示以点$O$为圆心的圆,原$\circ$为简易写法圆周率:$\pi$,圆的周长与直径的比值,$\pi\approx3.1415926535$,为无理数全等:$\cong$,表示图形完全重合,如$\triangle ABC \cong \triangle DEF$(两个三角形全等)相似:$\sim$,表示图形形状相同、大小成比例,如$\triangle ABC \sim \triangle DEF$(两个三角形相似)垂直平分线:$l\perp AB$且$l$平分$AB$,表示直线$l$是线段$AB$的垂直平分线角平分线:$BD$平分$\angle ABC$,表示射线$BD$将$\angle ABC$分为两个相等的角因为:$\because$,用于数学证明的原因推导所以:$\therefore$,用于数学证明的结果推导高等数学与特殊运算符号函数:$f(x)$,表示以$x$为自变量的函数,也可表示为$g(x)$、$y(x)$、$f(x,y)$(二元函数)等极限:$\lim$,极限核心符号,$\lim\limits_{x \to a} f(x)$表示$x$趋近于$a$时$f(x)$的极限;$\lim\limits_{x \to a^+} f(x)$(右极限,$x$从右侧趋近$a$)、$\lim\limits_{x \to a^-} f(x)$(左极限,$x$从左侧趋近$a$)导数:$f'(x)$ 或 $y'$(一阶导数)、$f''(x)$ 或 $y''$(二阶导数)、$\dfrac{dy}{dx}$(微商形式),表示函数的变化率偏导数:$\dfrac{\partial f}{\partial x}$,表示多元函数$f(x,y)$对自变量$x$的偏导数Sigma求和:$\sum$,表示连加,$\sum\limits_{i=1}^n a_i = a_1+a_2+\dots+a_n$,$i$为求和下标,$1$为下限,$n$为上限求积:$\prod$,表示连乘,$\prod\limits_{i=1}^n a_i = a_1\times a_2\times\dots\times a_n$根号:$\sqrt{}$,表示平方根,$\sqrt[n]{}$表示$n$次方根,偶次根下被开方数$\geq0$积分:$\int$,不定积分$\int f(x)dx$;定积分$\int_a^b f(x)dx$,表示区间$[a,b]$上的积分曲线积分:$\int_C f\, ds$ 或 $\int_C \mathbf{F} \cdot d\mathbf{r}$,表示沿曲线$C$的积分二重积分/三重积分:$\iint_D f(x,y)dxdy$(平面区域$D$)、$\iiint_\Omega f(x,y,z)dxdydz$(空间区域$\Omega$)虚数:$i$,虚数单位,满足$i^2=-1$,复数可表示为$a+bi$($a,b\in\mathbb{R}$)无穷小/无穷大:$o(x)$(高阶无穷小)、$O(x)$(同阶无穷大),用于高等数学的极限比较梯度/散度/旋度:$\nabla f$(梯度)、$\nabla\cdot\mathbf{F}$(散度)、$\nabla\times\mathbf{F}$(旋度),高等数学矢量运算常用极限存在:$\exists$(存在)、$\forall$(任意),如$\forall\varepsilon>0,\exists\delta>0$,为极限的严格定义符号常见平面图形面积公式长方形面积公式:$S = 长 \times 宽$ 即:$S = l \times w$($l$为长,$w$为宽)示例:假设长方形,长为$8\text{ cm}$,宽为$9\text{ cm}$ 那么:$S=8 \times 9 = 72 \text{ cm}^2$正方形面积公式:$S = 边长 \times 边长$ 即:$S = a^2$($a$为边长)示例:已知正方形的边长为$5\text{ cm}$,则面积$S = 5^2 = 25 \text{ cm}^2$;逆运算:若已知正方形的面积为$25\text{ cm}^2$,则边长为$\sqrt{25} = 5\text{ cm}$。三角形面积公式:$S = \frac{1}{2} \times 底 \times 高$ 即:$S = \frac{1}{2}ah$($a$为底边长,$h$为底边对应的高,高与底边垂直)示例:假设有一个三角形,其底边长为 $5\text{ cm}$,该底边上的高为$3\text{ cm}$,则:$S=\frac{1}{2}\times5\times3=7.5 \text{ cm}^2$补充:海伦公式$S=\sqrt{p(p-a)(p-b)(p-c)}$($a,b,c$为三边长,$p=\dfrac{a+b+c}{2}$),无高时可用平行四边形面积公式:$S = 底 \times 高$ 即:$S = ah$($a$为底边长,$h$为底边对应的高)示例:平行四边形底为$6\text{ cm}$,高为$4\text{ cm}$,则$S=6\times4=24 \text{ cm}^2$菱形面积公式1:$S = 底 \times 高$(同平行四边形);公式2:$S = \frac{1}{2}d_1d_2$($d_1、d_2$为两条对角线的长度)示例:菱形对角线长分别为$4\text{ cm}$、$6\text{ cm}$,则$S=\frac{1}{2}\times4\times6=12 \text{ cm}^2$梯形面积公式:$S = \frac{1}{2} \times (上底 + 下底) \times 高$ 即:$S = \frac{1}{2}(a+b)h$($a$为上底,$b$为下底,$h$为上下底之间的垂直距离)示例:梯形上底为$3\text{ cm}$,下底为$7\text{ cm}$,高为$5\text{ cm}$,则$S=\frac{1}{2}\times(3+7)\times5=25 \text{ cm}^2$圆形面积公式:$S = \pi r^2$ 或 $S = \frac{1}{4}\pi d^2$($r$为圆的半径,$d$为圆的直径,$d=2r$)示例:圆的半径为$4\text{ cm}$,则面积$S=\pi\times4^2=16\pi \text{ cm}^2\approx50.24 \text{ cm}^2$环形面积公式:$S = \pi (R^2 - r^2)$($R$为外圆半径,$r$为内圆半径,$R>r$)示例:外圆半径$5\text{ cm}$,内圆半径$3\text{ cm}$,则环形面积$S=\pi\times(5^2-3^2)=16\pi \text{ cm}^2\approx50.24 \text{ cm}^2$扇形面积公式:$S = \frac{n}{360}\pi r^2$ 或 $S = \frac{1}{2}lr$($n$为扇形圆心角度数,$r$为半径,$l$为扇形弧长)示例:扇形圆心角$60^\circ$,半径$6\text{ cm}$,则$S=\frac{60}{360}\times\pi\times6^2=6\pi \text{ cm}^2\approx18.84 \text{ cm}^2$常见立体图形体积公式(面积延伸常用知识点,统一补充更实用,单位为立方厘米$\text{cm}^3$、立方米$\text{m}^3$等)长方体体积公式:$V = 长 \times 宽 \times 高$ 即$V=lwh$示例:长$2\text{ cm}$、宽$3\text{ cm}$、高$4\text{ cm}$,则$V=2\times3\times4=24\text{ cm}^3$正方体体积公式:$V = 边长^3$ 即$V=a^3$示例:边长$5\text{ cm}$,则$V=5^3=125\text{ cm}^3$圆柱体体积公式:$V = \pi r^2 h$($r$为底面半径,$h$为圆柱的高)示例:底面半径$2\text{ cm}$、高$5\text{ cm}$,则$V=\pi\times2^2\times5=20\pi\text{ cm}^3\approx62.8\text{ cm}^3$圆锥体体积公式:$V = \frac{1}{3}\pi r^2 h$($r$为底面半径,$h$为圆锥的高,是同底同高圆柱体积的$\dfrac{1}{3}$)示例:底面半径$2\text{ cm}$、高$5\text{ cm}$,则$V=\frac{1}{3}\times\pi\times2^2\times5=\dfrac{20}{3}\pi\text{ cm}^3\approx20.93\text{ cm}^3$球体体积公式:$V = \frac{4}{3}\pi R^3$($R$为球的半径)示例:球的半径$3\text{ cm}$,则$V=\frac{4}{3}\times\pi\times3^3=36\pi\text{ cm}^3\approx113.04\text{ cm}^3$圆台体积公式:$V = \frac{1}{3}\pi h (R^2+Rr+r^2)$($R$为上底半径,$r$为下底半径,$h$为圆台的高)示例:上底半径$1\text{ cm}$、下底半径$2\text{ cm}$、高$3\text{ cm}$,则$V=\frac{1}{3}\pi\times3\times(1+2+4)=7\pi\text{ cm}^3\approx21.98\text{ cm}^3$
2022年07月05日
54 阅读
0 评论
6 点赞
2022-07-01
【数学笔记】常见距离计算:欧氏、曼哈顿、切比雪夫
简介在数据分析、路径规划、机器学习这些场景里,经常要算两个点/向量之间的“距离”,欧氏、曼哈顿、切比雪夫是最基础也最常用的三种,我结合公式和Python代码把它们捋清楚,记下来方便后续用,尽量写得直白,重点在“能看懂、能复用”。1. 欧氏距离(Euclidean Distance)核心说明欧式距离就是咱们最直观的“直线距离”,比如平面上两点间的直线长度,三维空间里两点间的直线长度,本质是勾股定理的延伸,也是最符合日常认知的距离计算方式。公式(1) 二维平面上两点 $a(x_1, y_1)$ 和 $b(x_2,y_2)$ 的直线距离:$d(a,b) = \sqrt{(x_2 - x_1)^2 + (y_2 - y_1)^2}$(2) 三维空间两点 $a(x_1,y_1,z_1)$、$b(x_2,y_2,z_2)$ 间的欧氏距离:$d(a,b) = \sqrt{(x_2 - x_1)^2 + (y_2 - y_1)^2 + (z_2 - z_1)^2}$(3) 两个n维向量 $a(x_{11},x_{12},\dots,x_{1n})$ 和 $b(x_{21},x_{22},\dots,x_{2n})$ 间的欧氏距离:$d(a,b) = \sqrt{\sum_{i=1}^n (x_{2i} - x_{1i})^2}$也可以表示成向量运算的形式:$d(a,b) = \sqrt{(a - b)^T(a - b)}$Python实现(支持n维向量)import math def euclidean_distance(a, b): """ 计算两个n维向量的欧氏距离 :param a: 第一个向量(列表/元组,如[1,50.6]、[1,2,3]) :param b: 第二个向量(维度需和a一致) :return: 欧氏距离值 """ if len(a) != len(b): raise ValueError("两个向量的维度必须一致!") # 先算每个维度差值的平方和,再开平方 squared_sum = sum((x - y)**2 for x, y in zip(a, b)) return math.sqrt(squared_sum) # 测试案例 # 二维案例(原示例) test_a_2d = [1, 50.6] test_b_2d = [1, 1] print(f"二维欧氏距离:{euclidean_distance(test_a_2d, test_b_2d)}") # 输出49.6 # 三维案例 test_a_3d = [1, 2, 3] test_b_3d = [4, 5, 6] print(f"三维欧氏距离:{euclidean_distance(test_a_3d, test_b_3d)}") # 输出√(9+9+9)=√27≈5.1962. 曼哈顿距离(Manhattan Distance)核心说明曼哈顿距离也叫“城市街区距离”,不是直线距离,而是像在城市里走路一样,只能沿横竖方向走,算的是“横向+纵向”的总路程,比如从A点到B点,绕着街区走的总距离。公式(1) 二维平面两点 $a(x_1,y_1)$ 和 $b(x_2,y_2)$ 间的曼哈顿距离:$d(a,b) = |x_2 - x_1| + |y_2 - y_1|$(2) 两个n维向量 $a(x_{11},x_{12},\dots,x_{1n})$ 与 $b(x_{21},x_{22},\dots,x_{2n})$ 间的曼哈顿距离:$d(a,b) = \sum_{i=1}^n |x_{2i} - x_{1i}|$Python实现(支持n维向量)def manhattan_distance(a, b): """ 计算两个n维向量的曼哈顿距离 :param a: 第一个向量(列表/元组) :param b: 第二个向量(维度需和a一致) :return: 曼哈顿距离值 """ if len(a) != len(b): raise ValueError("两个向量的维度必须一致!") # 累加每个维度差值的绝对值 return sum(abs(x - y) for x, y in zip(a, b)) # 测试案例 # 二维案例(原示例) print(f"二维曼哈顿距离:{manhattan_distance(test_a_2d, test_b_2d)}") # 输出0 + 49.6 = 49.6 # 三维案例 print(f"三维曼哈顿距离:{manhattan_distance(test_a_3d, test_b_3d)}") # 输出3+3+3=93. 切比雪夫距离(Chebyshev Distance)核心说明切比雪夫距离可以理解成“国王距离”——国际象棋里国王走一步能到相邻8个方格中的任意一个,从A点到B点,国王最少需要走的步数就是切比雪夫距离,本质是两个点各维度差值的绝对值中最大的那个。公式(1) 二维平面两点 $a(x_1,y_1)$ 和 $b(x_2,y_2)$ 间的切比雪夫距离:$d(a,b) = \max(|x_2 - x_1|, |y_2 - y_1|)$(2) 两个n维向量 $a(x_{11},x_{12},\dots,x_{1n})$ 和 $b(x_{21},x_{22},\dots,x_{2n})$ 间的切比雪夫距离:$d(a,b) = \max_{i=1}^n |x_{2i} - x_{1i}|$Python实现(支持n维向量)def chebyshev_distance(a, b): """ 计算两个n维向量的切比雪夫距离 :param a: 第一个向量(列表/元组) :param b: 第二个向量(维度需和a一致) :return: 切比雪夫距离值 """ if len(a) != len(b): raise ValueError("两个向量的维度必须一致!") # 取每个维度差值绝对值的最大值 return max(abs(x - y) for x, y in zip(a, b)) # 测试案例 # 二维案例(棋盘场景) chess_a = (1, 1) chess_b = (5, 4) print(f"棋盘上国王从{chess_a}到{chess_b}的步数(切比雪夫距离):{chebyshev_distance(chess_a, chess_b)}") # 差值x=4,y=3,最大值4,输出4 # 原示例二维测试 print(f"原示例切比雪夫距离:{chebyshev_distance(test_a_2d, test_b_2d)}") # 差值x=0,y=49.6,最大值49.6,输出49.6 # 三维案例 print(f"三维切比雪夫距离:{chebyshev_distance(test_a_3d, test_b_3d)}") # 差值都是3,最大值3,输出34. 三种距离的整合调用整合代码def calculate_distance(a, b, distance_type="euclidean"): """ 统一计算三种距离的封装函数 :param a: 第一个向量 :param b: 第二个向量 :param distance_type: 距离类型,可选"euclidean"/"manhattan"/"chebyshev" :return: 对应类型的距离值 """ if len(a) != len(b): raise ValueError("两个向量维度必须一致!") if distance_type == "euclidean": return euclidean_distance(a, b) elif distance_type == "manhattan": return manhattan_distance(a, b) elif distance_type == "chebyshev": return chebyshev_distance(a, b) else: raise ValueError("距离类型仅支持euclidean/manhattan/chebyshev!") # 批量测试 test_vec1 = [2, 5, 8] test_vec2 = [6, 9, 12] print(f"批量测试 - 欧氏距离:{calculate_distance(test_vec1, test_vec2, 'euclidean')}") # √(16+16+16)=√48≈6.928 print(f"批量测试 - 曼哈顿距离:{calculate_distance(test_vec1, test_vec2, 'manhattan')}") # 4+4+4=12 print(f"批量测试 - 切比雪夫距离:{calculate_distance(test_vec1, test_vec2, 'chebyshev')}") # 最大值4闵可夫斯基距离(三种统一)其实欧氏、曼哈顿、切比雪夫都是“闵可夫斯基距离”的特例,公式如下:$d(a,b) = \left( \sum_{i=1}^n |x_{2i} - x_{1i}|^p \right)^{\frac{1}{p}}$当 $p=1$ 时,就是曼哈顿距离;当 $p=2$ 时,就是欧氏距离;当 $p \to \infty$ 时,就是切比雪夫距离。def minkowski_distance(a, b, p): """ 计算闵可夫斯基距离(p为参数,覆盖三种基础距离) :param a: 第一个向量 :param b: 第二个向量 :param p: 阶数(p=1→曼哈顿,p=2→欧氏,p越大越接近切比雪夫) :return: 闵可夫斯基距离值 """ if len(a) != len(b): raise ValueError("两个向量维度必须一致!") if p <= 0: raise ValueError("p必须大于0!") # p→∞时直接返回切比雪夫距离(简化版) if p == float("inf"): return chebyshev_distance(a, b) sum_pow = sum(abs(x - y)**p for x, y in zip(a, b)) return sum_pow ** (1/p) # 验证特例 print(f"p=1(曼哈顿):{minkowski_distance(test_vec1, test_vec2, 1)}") # 12,和之前一致 print(f"p=2(欧氏):{minkowski_distance(test_vec1, test_vec2, 2)}") # ≈6.928,和之前一致 print(f"p=∞(切比雪夫):{minkowski_distance(test_vec1, test_vec2, float('inf'))}") # 4,和之前一致5. 三种应用场景距离类型核心特点典型应用场景欧氏距离直线距离,贴合直观认知机器学习(相似度计算、KNN算法)、坐标定位、三维建模曼哈顿距离街区式路程,对异常值更稳健路径规划(外卖配送、城市导航)、推荐系统(用户行为相似度)切比雪夫距离最大维度差值,“步数”思维棋盘类算法、物流配送(最大运输维度优化)、多维度决策总结欧氏、曼哈顿、切比雪夫是最基础的距离计算方式,核心区别在于“维度差值的处理方式”(平方和开方/绝对值和/绝对值最大值);三种距离都能扩展到n维向量,代码实现时要注意“维度一致”的校验,避免报错;闵可夫斯基距离是三者的统一形式,通过调整参数p可以切换不同距离类型,方便灵活调用;实际使用时要根据场景选:要直线距离选欧氏,要路径总长度选曼哈顿,要“最少步数”选切比雪夫。
2022年07月01日
180 阅读
0 评论
60 点赞
2022-03-09
【数学笔记】编程中的数学小知识
简介编程里藏了好多数学小知识,别看这些知识点基础,吃透了能让代码跑得更快、逻辑更通透!我把平时写代码常用的二进制位运算、等差数列求和、进位原理这些整理出来,结合Python代码掰扯清楚,记下来复习用,全是大白话,不搞虚的,重点是“能看懂、能直接用”。一、二进制与位运算在我们写代码时偶尔会碰到位运算,一开始我也懵,后来发现这玩意儿就是直接操弄二进制的0和1,比普通加减乘除快多了!Python里就四种核心位运算,和布尔逻辑的与、或、异或、非对应,先把规则和用法记死,用到的时候直接套就行。位运算符号大白话通俗别名按位与&俩位都为1才是1,否则0AND按位或\只要有一个1就是1,否则0OR按位异或^俩位不一样才是1,一样就是0XOR按位取反~0变1、1变0(Python里要注意补码)NOT左位移<<二进制整体左移,右边补0,等价乘2ⁿ左移右位移>>二进制整体右移,左边补符号位,等价除2ⁿ右移1. 按位与(AND:&)说白了就是“严要求”,必须俩位都为1才给1,不然全是0。我亲测最常用的场景就是判断奇偶——任何数和1做按位与,结果为1就是奇数,为0就是偶数,比取模%快多了!# 二进制数 0b101(十进制5)和 0b111(十进制7)的 AND 运算 a = 0b101 # 十进制5,二进制就是101 b = 0b111 # 十进制7,二进制就是111 c = a & b # 逐位比:1&1=1,0&1=0,1&1=1 → 结果0b101(十进制5) print(f"二进制结果:{bin(c)},十进制结果:{c}") # 输出:0b101,5 # 实用场景:判断奇偶(亲测比num % 2快) def is_odd(num): return num & 1 == 1 # 结果为True就是奇数,False是偶数 print(f"15是奇数吗?{is_odd(15)}") # True print(f"20是奇数吗?{is_odd(20)}") # False2. 按位或(OR:|)这玩意儿是“松要求”,只要有一个位是1,结果就为1,特别适合给二进制的特定位赋值1,比如权限控制里合并多个权限标记。# 二进制数 0b101(十进制5)和 0b110(十进制6)的 OR 运算 a = 0b101 # 十进制5 b = 0b110 # 十进制6 c = a | b # 逐位比:1|1=1,0|1=1,1|0=1 → 结果0b111(十进制7) print(f"二进制结果:{bin(c)},十进制结果:{c}") # 输出:0b111,7 # 实用场景:给数字的二进制某位置1(比如给0b101的第二位设为1) num = 0b101 # 5 mask = 0b010 # 要设置的位 result = num | mask print(f"置1后:{bin(result)}") # 0b111,也就是73. 按位异或(XOR:^)这个是我最喜欢的!俩位不一样就给1,一样就给0,最牛的用法是不用临时变量交换两个数,代码贼简洁,面试也常考!# 二进制数 0b101(十进制5)和 0b110(十进制6)的 XOR 运算 a = 0b101 # 十进制5 b = 0b110 # 十进制6 c = a ^ b # 逐位比:1^1=0,0^1=1,1^0=1 → 结果0b011(十进制3) print(f"二进制结果:{bin(c)},十进制结果:{c}") # 输出:0b11,3 # 实用场景:交换两个数(不用temp变量) x = 10 y = 20 print(f"交换前:x={x},y={y}") x ^= y # 第一步:x = x^y = 10^20 y ^= x # 第二步:y = y^(x^y) = x x ^= y # 第三步:x = (x^y)^x = y print(f"交换后:x={x},y={y}") # x=20,y=10,完美交换!4. 按位取反(NOT:~)这个要注意坑!表面是按位取反,但Python里整数用补码存储,所以取反后不是单纯的0变1,而是 ~x = -(x + 1),记着这个公式就不会错了。# 对二进制数 0b101(十进制5)进行 NOT 运算 a = 0b101 # 十进制5,补码是...00000101 b = ~a # 取反后补码是...11111010 → 对应十进制-6,符合~x=-(x+1) print(f"二进制结果:{bin(b)},十进制结果:{b}") # 输出:-0b110,-6 # 验证公式:~x = -(x+1) print(f"~5 = {~5},-(5+1) = {-6}") # 两边相等,记死这个公式!5. 位移运算(<< / >>)位运算里位移也超常用,说白了就是“二进制搬家”,左移1位等于乘2,右移1位等于除2,比直接乘除快多了!# 左位移:0b101(5)左移1位 → 0b1010(10),等价5*2 num = 5 print(f"5左移1位:{num << 1}") # 10 print(f"5左移2位:{num << 2}") # 20(等价5*4) # 右位移:0b1010(10)右移1位 → 0b101(5),等价10/2 num = 10 print(f"10右移1位:{num >> 1}") # 5 print(f"10右移2位:{num >> 2}") # 2(等价10//4)二、等差数列求和写代码时经常要算连续数字的和,比如统计1到100的和、100到1000的和,要是用for循环累加太笨了!等差数列求和公式直接套,一秒出结果,效率拉满。核心公式基础版(公差=1,比如1,2,3...):项数 $n = a_n - a_1 + 1$($a_1$首项,$a_n$末项)和 $S = n \times (a_1 + a_n) // 2$通用版(公差≠1,比如1,3,5,7...):项数 $n = [(a_n - a_1) ÷ 公差d] + 1$和 $S = n \times [2a_1 + (n-1)d] // 2$Python 实现''' 自定义等差数列求和函数,支持公差≠1的情况 a1:首项,an:末项,d:公差(默认1) 返回值:数列的和 ''' def arithmetic_sum(a1, an, d=1): # 先校验参数,避免传错 if a1 > an or d <= 0: raise ValueError("首项不能大于末项,公差得是正数!") # 计算项数 n = (an - a1) // d + 1 # 通用求和公式 total = n * (2 * a1 + (n - 1) * d) // 2 return total # 测试1:100至1000的连续整数和(公差1) print(f"100到1000的和:{arithmetic_sum(100, 1000)}") # 输出495550 # 测试2:1,3,5,...,99的奇数和(公差2) print(f"1到99的奇数和:{arithmetic_sum(1, 99, 2)}") # 输出2500 # 测试3:2,4,6,...,100的偶数和(公差2) print(f"2到100的偶数和:{arithmetic_sum(2, 100, 2)}") # 输出2550为什么不用循环?我测过,算1到1000000的和,循环要跑0.1秒左右,用公式直接0.0001秒搞定,数据量越大,公式的优势越明显!记着:只要是“相邻数差值固定”的数列,都用这个公式,别傻乎乎写循环。三、进位原理咱平时用的+号,计算机底层其实是靠“进位”实现的!不管十进制还是二进制,核心都是“逢n进1”(十进制逢10进1,二进制逢2进1)。我写了个手动实现加法的函数,吃透这个逻辑,能搞懂计算机加法的底层。1. 十进制进位加法说白了就是“从个位开始加,满10进1”,我写的这个函数能模拟计算机的加法过程,哪怕是999+1这种要连续进位的情况也能搞定!''' 手动实现十进制加法,模拟进位逻辑 a、b:两个加数(整数) 返回值:两数之和 ''' def carry_add(a, b): # 把数字反转,方便从个位开始计算(比如123→"321") a_str = str(a)[::-1] b_str = str(b)[::-1] result = 0 # 最终结果 carry = 0 # 进位标记(0或1) max_len = max(len(a_str), len(b_str)) # 取最长位数,避免漏位 # 逐位计算 for i in range(max_len): # 取出当前位的数字,超出长度就补0 a_digit = int(a_str[i]) if i < len(a_str) else 0 b_digit = int(b_str[i]) if i < len(b_str) else 0 # 当前位总和 = 个位数字和 + 上一位的进位 digit_sum = a_digit + b_digit + carry # 判断是否进位 if digit_sum >= 10: carry = 1 # 满10进1 digit_sum -= 10 # 只保留个位 else: carry = 0 # 无进位 # 把当前位结果加到最终结果里(恢复位数) result += digit_sum * (10 ** i) # 最后还有进位的话,追加到最高位(比如999+1=1000) if carry == 1: result += 10 ** max_len return result # 测试案例,覆盖普通情况和连续进位 print(f"10 + 21 = {carry_add(10, 21)}") # 31 print(f"999 + 1 = {carry_add(999, 1)}") # 1000 print(f"1234 + 5678 = {carry_add(1234, 5678)}") # 69122. 二进制进位加法计算机底层用的是二进制加法,核心是“逢2进1”,和十进制逻辑一样,就是把10换成2而已。搞懂这个,再看位运算加法就通透了!''' 手动实现二进制加法,模拟计算机底层加法逻辑 a_bin、b_bin:二进制字符串(比如"101") 返回值:二进制和的字符串 ''' def binary_carry_add(a_bin, b_bin): # 反转二进制字符串,从最低位开始算 a_rev = a_bin[::-1] b_rev = b_bin[::-1] result = [] # 存储每一位的结果 carry = 0 # 进位标记(0或1) max_len = max(len(a_rev), len(b_rev)) for i in range(max_len): # 取出当前位,补0 a_bit = int(a_rev[i]) if i < len(a_rev) else 0 b_bit = int(b_rev[i]) if i < len(b_rev) else 0 # 当前位总和 = 位和 + 进位 bit_sum = a_bit + b_bit + carry # 逢2进1 if bit_sum >= 2: carry = 1 bit_sum -= 2 else: carry = 0 result.append(str(bit_sum)) # 最后有进位就加上 if carry == 1: result.append("1") # 反转回来,得到最终二进制字符串 return ''.join(result[::-1]) # 测试案例 print(f"101(5) + 110(6) = {binary_carry_add('101', '110')}") # 1011(11) print(f"111(7) + 1(1) = {binary_carry_add('111', '1')}") # 1000(8)总结位运算直接操作二进制,比普通运算快,重点记&判断奇偶、^交换变量、<<>>等价乘除2ⁿ;等差数列求和别用循环,套公式:基础版$S = n×(a1+an)//2$,通用版加个公差d就行;加法的核心是进位,十进制逢10进1,二进制逢2进1,手动实现一遍就能懂计算机加法的底层逻辑。
2022年03月09日
66 阅读
0 评论
8 点赞
0:00