非可微紧支撑函数的最小化平滑算法及代码实现需求
构造紧支撑光滑函数的简便方法
核心思路
不用卷积,直接通过C^∞光滑截断函数构造分段光滑的逼近函数,满足:
- 支撑集严格为
[0, s+ε] - 当
ε→0时,k_ε(r)一致收敛到原函数k(r) - 整体无限光滑(C^∞)
具体构造分为三段:
- 保持原函数段:在
[0, s-ε]区间,k_ε(r) = s - r,完全贴合原函数; - 光滑过渡段:在
(s-ε, s+ε)区间,利用光滑截断函数将k(r)的值从ε(在r=s-ε处)平滑过渡到0(在r=s+ε处),同时保证导数连续; - 零值段:在
r < 0或r ≥ s+ε时,k_ε(r) = 0。
用到的光滑截断函数是基于指数函数的C^∞函数,通过组合实现从1到0的光滑衰减。
Python 实现代码
import numpy as np import matplotlib.pyplot as plt def smooth_truncation(t): """C^∞光滑截断函数:t≤0时返回1,0<t<1时从1平滑降到0,t≥1时返回0""" if t <= 0: return 1.0 elif t >= 1: return 0.0 psi_t = np.exp(-1/t) psi_1mt = np.exp(-1/(1-t)) return psi_1mt / (psi_t + psi_1mt) def k_epsilon(r, s, eps): """构造逼近k(r)的光滑函数k_ε(r)""" if r < 0 or r >= s + eps: return 0.0 elif r <= s - eps: return s - r else: # 计算过渡参数t ∈ (0,1) t = (r - (s - eps)) / (2 * eps) # 原函数在当前r处的值 original_val = s - r # 光滑过渡到0 return original_val * smooth_truncation(t) # 测试参数 s = 5.0 eps = 0.8 r_vals = np.linspace(-1, s + eps + 1, 500) k_vals = [k_epsilon(r, s, eps) for r in r_vals] original_k = [s - r if 0 <= r <= s else 0.0 for r in r_vals] # 绘图对比 plt.figure(figsize=(10,6)) plt.plot(r_vals, original_k, label="原函数k(r)", linestyle="--", color="black") plt.plot(r_vals, k_vals, label=f"光滑逼近k_ε(r) (ε={eps})", color="blue") plt.xlabel("r") plt.ylabel("函数值") plt.title("原函数与光滑逼近函数对比") plt.legend() plt.grid(True) plt.show()
R 实现代码
smooth_truncation <- function(t) { # C^∞光滑截断函数:t≤0时返回1,0<t<1时从1平滑降到0,t≥1时返回0 if (t <= 0) { return(1.0) } else if (t >= 1) { return(0.0) } else { psi_t <- exp(-1/t) psi_1mt <- exp(-1/(1-t)) return(psi_1mt / (psi_t + psi_1mt)) } } k_epsilon <- function(r, s, eps) { # 构造逼近k(r)的光滑函数k_ε(r) if (r < 0 || r >= s + eps) { return(0.0) } else if (r <= s - eps) { return(s - r) } else { # 计算过渡参数t ∈ (0,1) t <- (r - (s - eps)) / (2 * eps) # 原函数在当前r处的值 original_val <- s - r # 光滑过渡到0 return(original_val * smooth_truncation(t)) } } # 测试参数 s <- 5.0 eps <- 0.8 r_vals <- seq(-1, s + eps + 1, length.out = 500) k_vals <- sapply(r_vals, k_epsilon, s = s, eps = eps) original_k <- sapply(r_vals, function(r) ifelse(0 <= r & r <= s, s - r, 0.0)) # 绘图对比 plot(r_vals, original_k, type = "l", lty = 2, col = "black", xlab = "r", ylab = "函数值", main = "原函数与光滑逼近函数对比") lines(r_vals, k_vals, col = "blue") legend("topright", legend = c("原函数k(r)", paste0("光滑逼近k_ε(r) (ε=", eps, ")")), lty = c(2,1), col = c("black", "blue")) grid()
说明
- 当
ε趋近于0时,过渡区间长度2ε趋近于0,k_ε(r)会一致收敛到原函数k(r); - 构造的
k_ε(r)是C^∞光滑函数,满足支撑集为[0, s+ε]; - 代码实现简单,无需卷积运算,计算效率更高。
内容的提问来源于stack exchange,提问作者Mathguest
相关产品推荐
相关产品推荐

