You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

非可微紧支撑函数的最小化平滑算法及代码实现需求

构造紧支撑光滑函数的简便方法

核心思路

不用卷积,直接通过C^∞光滑截断函数构造分段光滑的逼近函数,满足:

  • 支撑集严格为[0, s+ε]
  • 当ε→0时,k_ε(r)一致收敛到原函数k(r)
  • 整体无限光滑(C^∞)

具体构造分为三段:

  1. 保持原函数段:在[0, s-ε]区间,k_ε(r) = s - r,完全贴合原函数;
  2. 光滑过渡段:在(s-ε, s+ε)区间,利用光滑截断函数将k(r)的值从ε(在r=s-ε处)平滑过渡到0(在r=s+ε处),同时保证导数连续;
  3. 零值段:在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()

说明

  1. 当ε趋近于0时,过渡区间长度2ε趋近于0,k_ε(r)会一致收敛到原函数k(r);
  2. 构造的k_ε(r)是C^∞光滑函数,满足支撑集为[0, s+ε];
  3. 代码实现简单,无需卷积运算,计算效率更高。

内容的提问来源于stack exchange,提问作者Mathguest

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 06:20:41