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

两个函数的卷积

卷积是将两个函数生成第三个函数。记这两个函数为 fffggg,则它们的卷积 f∗gf*gfg 定义为

fffggg 都是连续函数:
(f∗g)(t)=∫−∞+∞f(x)g(t−x)dx (f*g)(t)=\int_{-\infty}^{+\infty}f(x)g(t-x)dx (fg)(t)=+f(x)g(tx)dx

fffggg 都是离散函数:
(f∗g)(n)=∑k=−∞+∞f(k)g(n−k) (f*g)(n)=\sum_{k=-\infty}^{+\infty}f(k)g(n-k) (fg)(n)=k=+f(k)g(nk)

卷积的几何意义为:

  • 将一个函数转化为它的镜像 (即 g(−t)g(-t)g(t)),然后平移 (即 g(x−t)g(x-t)g(xt)),与另外一个函数 fff 乘积,最后在定义域内积分

下面的图形展示了两个函数 f=e−x2f=e^{-x^2}f=ex2g=e−(x−2)2g=e^{-(x-2)^2}g=e(x2)2 生成卷积的过程:
在这里插入图片描述
其中:

  • 绿色是第一个函数 fff
  • 橙色是第二个函数 ggg
  • 蓝色为两个函数的卷积函数
  • 淡蓝色区域的面积为 ttt 固定一个值时,两个函数的卷积值,即 (f∗g)(t)(f*g)(t)(fg)(t)(因为固定 t 时,卷积值本质上是关于x的一个积分,所以对应的是面积)
  • 这个横坐标轴根据所表示的函数的定义域,既可以表示 xxx ,也可以表示 ttt

让 AI 帮助生成的画图代码如下:

"""
@Python version : 3.12
@Author  : Zhen Chen
@Email   : chen.zhen5526@gmail.com
@Time    : 27/07/2025, 12:11
@Desc    : """
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
from scipy.integrate import simps# 定义函数
def f(x):return np.exp(-x ** 2)def g(x):return np.exp(-(x - 2) ** 2)x = np.linspace(-5, 5, 400)
t_vals = np.linspace(-3, 7, 100)fx = f(x)
gx = g(x)  # 原始g(x)fig, ax = plt.subplots(figsize=(10, 6))
ax.set_xlim(-5, 10)
ax.set_ylim(-0.1, 1.3)
ax.set_xlabel('x / t')
ax.set_title('Convolution of two continuous functions')line_f, = ax.plot(x, fx, 'g-', lw=2, label='f(x)')
line_g_fixed, = ax.plot(x, gx, 'orange', lw=2, label='g(x) (fixed)')
line_g_slide, = ax.plot([], [], 'r-', lw=2, label='g(t - x)')
line_conv, = ax.plot([], [], 'b-', lw=2, label='(f * g)(t)')fill = ax.fill_between(x, 0, 0, color='b', alpha=0.3)
text = ax.text(0.02, 0.95, '', transform=ax.transAxes)ax.legend(loc='upper right')conv_x, conv_y = [], []def init():global conv_x, conv_y, fillconv_x, conv_y = [], []  # 清空旧数据line_conv.set_data([], [])line_g_slide.set_data([], [])text.set_text('')if fill is not None:fill.remove()fill = ax.fill_between(x, 0, 0, color='b', alpha=0.3)  # 重设为透明return line_conv, line_g_slide, fill, textdef update(i):global fill, conv_x, conv_yt = t_vals[i]gx_slide = g(t - x)prod = fx * gx_slideconv_val = simps(prod, x)line_g_slide.set_data(x, gx_slide)if fill is not None:fill.remove()fill = ax.fill_between(x, 0, prod, color='b', alpha=0.3)conv_x.append(t)conv_y.append(conv_val)line_conv.set_data(conv_x, conv_y)text.set_text(f't = {t:.2f}, convolution = {conv_val:.4f}')return line_g_slide, fill, line_conv, textimport matplotlib.patches as mpatches# 之前已有的图例句柄
handles, labels = ax.get_legend_handles_labels()# 新增一个 Patch,代表填充区域
fill_patch = mpatches.Patch(color='lightblue', alpha=0.5, label=r'Product area: $f(x) \cdot g(t - x)$')# 添加到图例句柄和标签中
handles.append(fill_patch)
labels.append(r'Product area: $f(x) \cdot g(t - x)$')ax.legend(handles, labels, loc='upper right')
ax.set_xlabel('x (function variable) and t (sliding parameter)')ani = FuncAnimation(fig, update, frames=len(t_vals), interval=100, blit=True, repeat=True, init_func=init)
# ani.save('convolution.gif', dpi=72)
plt.show()
http://www.lryc.cn/news/601753.html

相关文章:

  • Node.js特训专栏-配置与环境部署:20.PM2进程守护与负载均衡
  • 以使命为帆,结业是重新出发的号角
  • 电科金仓 KingbaseES 深度解码:技术突破・行业实践・沙龙邀约 -- 融合数据库的变革之力
  • 从0开始学linux韦东山教程Linux驱动入门实验班(6)
  • c# everthing.exe 通信
  • Android基础(一) 运行HelloWorld
  • 【java】 IntelliJ IDEA高效编程设置指南
  • 大模型算法面试笔记——常用优化器SGD,Momentum,Adagrad,RMSProp,Adam
  • Java 代理机制详解:从静态代理到动态代理,彻底掌握代理模式的原理与实战
  • 雪花算法原理深度解析
  • 【0基础PS】PS工具详解--选择工具--快速选择工具
  • 【n8n教程笔记——工作流Workflow】文本课程(第一阶段)——5.4 计算预订订单数量和总金额 (Calculating booked orders)
  • 使用Python,OpenCV,K-Means聚类查找图像中最主要的颜色
  • Unity Catalog与Apache Iceberg如何重塑Data+AI时代的企业数据架构
  • 【LeetCode 热题 100】35. 搜索插入位置——二分查找(左闭右开)
  • 高格办公空间:以 “空间为基,服务为翼”,重塑办公场景生态
  • 【语义分割】记录2:yolo系列
  • libomxil-bellagio移植到OpenHarmony
  • java小白闯关记第一天(两个数相加)
  • Python-初学openCV——图像预处理(三)
  • XSS利用
  • Web-Machine-N7靶机攻略
  • 文件权限标记机制在知识安全共享中的应用实践
  • JavaEE初阶第十二期:解锁多线程,从 “单车道” 到 “高速公路” 的编程升级(十)
  • C++学习(线程相关)
  • 05 - spring security权限控制
  • Java Ai(day04)
  • [Linux入门] Linux 远程访问及控制全解析:从入门到实战
  • 【工具】python汇总发票(含源码)
  • InfluxDB 与 MQTT 协议集成实践(二)