深度解析 SRS-Net:基于物理信息神经网络的非线性光纤光学求解框架

【信息科学与工程学】【物理/化学科学和工程技术】知识体系081 磁学——系列二 电磁学——电磁学理论模型01 编号模型名称核心数学描述关键参数与物理意义应用场景与说明EM1.001​麦克斯韦微分方程组∇·D=ρ, ∇·B=0, ∇×E=-∂B/∂t, ∇×H=J+∂D/∂tD-电通密度(C/m²), B-磁通密度(T), E-电场强度(V/m), H-磁场强度(A/m)所有电磁现象的基本控制方程,集成电路电磁分析基础EM1.002​麦克斯韦积分方程组∮S D·dS=Q, ∮S B·dS=0, ∮C E·dl=-dΦ_B/dt, ∮C H·dl=I+dΦ_D/dtQ-电荷(C), Φ_B-磁通(Wb), I-电流(A 阅读详情

目录

1. 引言

2. 物理模型推导:SRS耦合功率方程

2.1 系统假设与变量定义

2.2 相互作用机制分析

2.3 能量守恒修正与光子通量

2.4 完整的耦合常微分方程组 (CPEs)

3. SRS-Net 算法架构与原理

3.1 神经网络映射构建

3.2 自动微分 (Automatic Differentiation, AD)

3.3 物理残差流形 (Physics Residual Manifold)

4. 优化目标与损失函数设计

4.1 数据损失 ($\mathcal{L}_{Data}$)

4.2 物理信息损失 ($\mathcal{L}_{Physics}$)

4.3 总变分损失

5. 算法的通用性:正向预测与反向演化

5.1 正向问题 (Forward Problem)

5.2 反向问题 (Inverse Problem)

6. 总结

7.PyTorch 实现骨架(含注释与关键细节)

1) 主要思路概览(中文、简短)

2) 关键实现(PyTorch)—— 主文件 srs_pinn.py

3) 物理解算子(残差)实现

4) 损失函数(loss)与训练(forward / inverse / combined)

5) 频域 / 多通道扩展说明(实现提示)

6) 初始/边界条件与观测点选取策略

7) 反问题(Inverse)实现要点

8) 性能优化 & 实战建议(工程级细节)

9) 小型完整示例:合成数据 + 训练(可直接试跑)


1. 引言

在现代高容量波分复用(WDM)光通信系统与高功率光纤激光器中,受激拉曼散射(Stimulated Raman Scattering, SRS)是限制系统性能的核心非线性效应。传统的数值求解方法(如龙格-库塔法、分步傅里叶法)虽然成熟,但在处理高维参数空间、反向参数辨识及实时优化问题时,面临计算复杂度高且难以微分的瓶颈。

SRS-Net 是一种创新性的科学机器学习(SciML)框架,它将光纤非线性光学的物理控制方程(偏微分方程组)直接嵌入深度神经网络的损失流形中。本章将从第一性原理出发,详细推导控制SRS功率演化的耦合方程组,并从数学角度证明SRS-Net如何利用自动微分机制实现对该物理系统的精确逼近与求解。


2. 物理模型推导:SRS耦合功率方程

为了构建SRS-Net的物理约束核心,我们首先必须推导描述多信道光波在光纤中相互作用的数学模型。

2.1 系统假设与变量定义

2.2 相互作用机制分析

2.3 能量守恒修正与光子通量

2.4 完整的耦合常微分方程组 (CPEs)


3. SRS-Net 算法架构与原理

SRS-Net 的核心思想是利用深度神经网络作为上述物理方程解的通用逼近器,并通过物理残差约束网络的训练。

3.1 神经网络映射构建

3.2 自动微分 (Automatic Differentiation, AD)

3.3 物理残差流形 (Physics Residual Manifold)


4. 优化目标与损失函数设计

4.1 数据损失 ($\mathcal{L}_{Data}$)

4.2 物理信息损失 ($\mathcal{L}_{Physics}$)

4.3 总变分损失


5. 算法的通用性:正向预测与反向演化

SRS-Net 框架的一个显著数学特性是其参数反演能力。

5.1 正向问题 (Forward Problem)

5.2 反向问题 (Inverse Problem)


6. 总结

SRS-Net 并非简单的黑盒模型,而是一个物理可解释的计算框架。它通过严格推导的耦合功率方程(CPEs)定义了假设空间,利用自动微分消除了数值离散误差,并通过多任务损失函数实现了从稀疏数据到全域物理场的高精度重构。这一算法原理为非线性光纤光学中的复杂系统建模、参数辨识及逆向设计提供了统一且严密的数学解法。

7.PyTorch 实现骨架(含注释与关键细节)

说明:下面的实现为可直接运行的模板,需要根据你的具体通道数(N)、频段、边界条件、数据读取等做小的参数替换。代码尽量详尽注释以便用于论文复现实验与工程改进。论文中方程与论述已被用作物理约束的来源。Nature


1) 主要思路概览(中文、简短)

SRS-Net 本质上是一个 PINN:神经网络 A^k(z,t;θ) \hat{A}_k(z,t;\theta)A^k​(z,t;θ) 用来表示第 k 个通带的复包络场(或实虚部),并通过自动微分计算对 z,tz,tz,t 的导数,构造 PDE 残差并纳入损失,从而同时解决:

  • 前向问题(预测功率/场演化)

  • 反问题(识别频率相关衰减、Raman 增益谱等物理参数)

  • 联合问题(同时优化泵功率、物理参数与预测)
    论文给出的耦合 PDE 在形式上为(简写)带衰减、二阶 GVD、Kerr 和 Raman 相互作用的非线性耦合方程,SRS 的耦合项在论文中用 gjkg_{jk}gjk​ 项表示(见论文方程部分)。Nature


2) 关键实现(PyTorch)—— 主文件 srs_pinn.py

# srs_pinn.py
# 运行环境:Python 3.9+, PyTorch 2.x
# 安装依赖:pip install torch numpy tqdm

import torch
import torch.nn as nn
import torch.optim as optim
from torch.autograd import grad
import numpy as np
from tqdm import tqdm

# ---------------------------
# 1) 工具函数
# ---------------------------
def to_tensor(x, dtype=torch.float32, device='cpu'):
    return torch.tensor(x, dtype=dtype, device=device)

def complex_from_two(real, imag):
    return torch.complex(real, imag)

def split_complex(u):
    return u.real, u.imag

# 小技巧:用于初始化频域/时间归一化
class Normalizer:
    def __init__(self, arr):
        self.mean = np.mean(arr)
        self.std = np.std(arr) + 1e-12
    def normalize(self, arr):
        return (arr - self.mean) / self.std
    def denormalize(self, arr):
        return arr * self.std + self.mean

# ---------------------------
# 2) 网络:复数 MLP(输出实部+虚部)
#    支持 Fourier features 输入(对时间 t 做高频特征扩充)
# ---------------------------
class FourierFeatures(nn.Module):
    def __init__(self, in_dim, n_fours=64, scale=10.0):
        super().__init__()
        self.B = nn.Parameter(torch.randn(in_dim, n_fours) * scale, requires_grad=False)  # fixed random proj
    def forward(self, x):  # x: [..., in_dim]
        proj = 2 * np.pi * x @ self.B  # [..., n_fours]
        return torch.cat([torch.sin(proj), torch.cos(proj)], dim=-1)

class ComplexMLP(nn.Module):
    def __init__(self, in_dim, width=256, depth=6, fourier_t=None, out_channels=1):
        super().__init__()
        self.fourier = fourier_t
        last_in = in_dim
        if self.fourier is not None:
            self.ff_dim = self.fourier.B.shape[1] * 2
            last_in += self.ff_dim

        layers = []
        for i in range(depth):
            layers.append(nn.Linear(last_in if i==0 else width, width))
            layers.append(nn.GELU())
        # 输出实部和虚部
        self.net = nn.Sequential(*layers)
        self.head_real = nn.Linear(width, out_channels)
        self.head_imag = nn.Linear(width, out_channels)

    def forward(self, x):  # x shape [batch, in_dim]
        if self.fourier is not None:
            t = x[:, -1:].clone()  # 假设 time 在最后一维
            ff = self.fourier(t)
            x = torch.cat([x, ff], dim=-1)
        h = self.net(x)
        real = self.head_real(h)
        imag = self.head_imag(h)
        return real, imag

3) 物理解算子(残差)实现

(实际论文里还有多项耦合与频依赖项 —— 在代码里我们把这些项模块化以便替换/扩展)。Nature

 
# ---------------------------
# PDE residual 函数
# ---------------------------
def compute_pde_residual(net, zk_tensor, tk_tensor, params, mode='time'):
    """
    net: ComplexMLP 网络,输入 [z,t],输出 real, imag
    zk_tensor, tk_tensor: torch tensors with requires_grad=True
    params: dict 包含 alpha_k, beta2_k, gamma_k, g_jk 等(torch tensors)
    returns: residual_real, residual_imag (both shape [batch, channels])
    """
    # 拼输入
    x = torch.cat([zk_tensor, tk_tensor], dim=-1)  # assume shape [B, 2]
    real, imag = net(x)  # shape [B, channels]
    Ak = torch.complex(real, imag)  # complex field

    # 1) z 导数
    # 注意:需要 ensure zk_tensor requires_grad=True
    grads_z = grad(real.sum() + imag.sum(), zk_tensor, create_graph=True)[0]  # shape [B, 1]
    dreal_dz = grads_z[:, 0:1]  # if multiple dims, adapt
    # imag part
    grads_z_im = grad(imag.sum(), zk_tensor, create_graph=True)[0]
    dimag_dz = grads_z_im[:, 0:1]

    dAk_dz = torch.complex(dreal_dz, dimag_dz)

    # 2) t 二阶导
    grads_t = grad(real.sum() + imag.sum(), tk_tensor, create_graph=True)[0]
    dreal_dt = grads_t[:, 0:1]
    dimag_dt = grad(imag.sum(), tk_tensor, create_graph=True)[0][:,0:1]
    # 第二阶(对 t 再微分)
    d2real_dt2 = grad(dreal_dt.sum(), tk_tensor, create_graph=True)[0][:,0:1]
    d2imag_dt2 = grad(dimag_dt.sum(), tk_tensor, create_graph=True)[0][:,0:1]
    d2Ak_dt2 = torch.complex(d2real_dt2, d2imag_dt2)

    # 参数(广播到 batch)
    alpha = params['alpha']  # shape [channels]
    beta2 = params['beta2']
    gamma = params['gamma']
    g_jk = params['g']  # shape [channels, channels] or function

    # 注意广播匹配;Ak shape [B, C]
    # Self / cross terms
    abs2 = (Ak.abs()**2)  # [B, C]

    # Kerr term: - i * gamma_k ( |Ak|^2 + 2 * sum_{j != k} |Aj|^2 ) * Ak
    cross = 2.0 * (abs2.sum(dim=1, keepdim=True) - abs2)  # [B, C]
    kerr_factor = -1j * gamma * (abs2 + cross)  # [B] or [C] broadcast
    kerr_term = kerr_factor * Ak

    # Raman term: sum_j g_jk |Aj|^2 Ak
    # implement matrix multiplication per-sample
    # abs2 [B, C], g_jk [C, C] -> result [B, C]
    raman_factors = (abs2.unsqueeze(1) @ g_jk).squeeze(1)  # check dims
    raman_term = raman_factors * Ak  # complex

    # GVD term: i * beta2 / 2 * d2Ak_dt2
    gvd_term = 1j * beta2/2.0 * d2Ak_dt2

    # Attenuation: alpha * Ak
    atten_term = alpha * Ak

    # sign for direction: if backward propagation then -d/dz ? paper uses ±
    # assume forward: +dAk_dz ...
    residual = dAk_dz + atten_term + gvd_term + kerr_term + raman_term

    return residual.real, residual.imag

注:上面 grad 的用法对批量可能需要更细的实现(例如对每个样本单独调用 grad 或使用 torch.autograd.functional.jacobian),这里给出逻辑骨架。实际工程中应使用矢量化/批次策略以提升速度(见性能建议)。


4) 损失函数(loss)与训练(forward / inverse / combined)

下面给出训练循环样板(包含学参训练):

# ---------------------------
# Training loop skeleton
# ---------------------------
def train(model, params, data_loader, epochs=10000, device='cuda'):
    model.to(device)
    # 将待学习的物理参数作为 torch.nn.Parameter 放入优化器(若做 inverse)
    learnables = [p for p in model.parameters()]
    # 假设 params_to_learn 为 dict of torch.nn.Parameter
    if 'learnables' in params:
        for k, p in params['learnables'].items():
            learnables.append(p)

    optimizer = optim.Adam(learnables, lr=1e-3)
    scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=2000, gamma=0.5)

    for epoch in range(epochs):
        model.train()
        total_loss = 0.0
        pbar = tqdm(data_loader)
        for batch in pbar:
            # batch should provide z_pts, t_pts, data_obs (optional)
            z_batch = batch['z'].to(device).requires_grad_(True)
            t_batch = batch['t'].to(device).requires_grad_(True)
            # Observed complex field/power if available
            obs_real = batch.get('real', None)
            obs_imag = batch.get('imag', None)

            optimizer.zero_grad()
            res_real, res_imag = compute_pde_residual(model, z_batch, t_batch, params)

            # physics loss (MSE) on residuals
            L_phys = (res_real**2 + res_imag**2).mean()

            # data loss if observations exist
            L_data = torch.tensor(0.0, device=device)
            if obs_real is not None:
                # forward pass to get predictions at observed points
                x_obs = torch.cat([z_batch, t_batch], dim=-1)
                pred_r, pred_i = model(x_obs)
                L_data = ((pred_r - obs_real.to(device))**2 + (pred_i - obs_imag.to(device))**2).mean()

            # optional bc loss, param reg
            L = params.get('w_phys', 1.0) * L_phys + params.get('w_data', 1.0) * L_data

            L.backward()
            # Optional: gradient clipping
            torch.nn.utils.clip_grad_norm_(learnables, max_norm=1.0)
            optimizer.step()
            total_loss += L.item()
            pbar.set_description(f"loss {total_loss:.4e}")

        scheduler.step()
    return model, params

5) 频域 / 多通道扩展说明(实现提示)

论文指出 SRS-Net 结合时域 PINN 与频域分析来处理多信道 / 宽带系统(C+L 带 ~10 THz)。实现要点:

  1. 把时间维度做 FFT:对于宽带多信道,直接在频域上描述耦合会更自然(Raman 增益谱、频依赖衰减等)。使用 torch.fft.fft 与 torch.fft.ifft 在网络-物理约束之间来回转换。

  2. 网络输出可为频域复谱:网络输入仍可为 z(传播坐标)与 channel index(one-hot 或连续频率值),输出为复频谱 A~k(z,ω) \tilde{A}_k(z,\omega)A~k​(z,ω)。对网络输出做 ifft 得到时域,再计算非线性项(Kerr、|A|^2)——注意非线性最好在时域计算(因为 |A|^2 是时域操作),然后再 FFT 回频域以与线性项/频域增益匹配。

  3. 频域-时域来回(关键开销点):实现时应尽量批量化并在 GPU 上完成全部 FFT 操作,避免 CPU-GPU 往返。

  4. Raman 增益 g_{jk}:可预先构建频依赖增益矩阵(channels × channels),并把它作为常数或可学的参数(用于 inverse)。

示例伪代码片段(频域 forward):

# 输入: z_grid shape [B,1], freq_grid shape [Nf]  (or channel dim)
# 网络直接输出 complex spectrum S(z, f)
real, imag = model(torch.cat([z_repeat, freq_coord], dim=-1))
S = torch.complex(real, imag)  # [B, Nf]

# 时域转换
a_t = torch.fft.ifft(S, dim=-1)  # [B, Nt]
# 非线性计算在时域: |a_t|^2 * a_t etc.
nl_time = compute_nonlinear_time(a_t)  # [B, Nt]
# 回频域
nl_freq = torch.fft.fft(nl_time, dim=-1)
# 构造残差:线性 frequency-dependent operator + nl_freq + losses...

6) 初始/边界条件与观测点选取策略

  • 对 PINN:在 z=0 处强制输入边界(已知输入功率谱/场),在 z=L 处如有观测则作为 L_data。

  • 对 bidirectional 情形:分别定义正向/反向网络或者在网络中加入 direction token(+1 或 -1),并在 PDE 残差中引入 ±∂/∂z 符号(正向和反向同时优化)。

  • 点采样:把训练点分为:

    • PDE 内点(随机采样 z×t 或 z×freq)

    • 边界点(z=0,z=L)

    • 观测点(实验/仿真测得)
      这样可以让 L_phys、L_bc、L_data 协同优化。


7) 反问题(Inverse)实现要点

  • 把需要识别的物理量(如 alpha(ω),g(ω))作为 torch.nn.Parameter,并加入优化器;在 compute_pde_residual 中使用这些参数(记得对其设定合理初值与约束范围)。

  • 为稳定性,可对参数加 log 或 sigmoid 变换来保证正值或在合理区间。

  • 加入 L_reg(例如 L2 或 Tikhonov)以避免过拟合 / 非唯一解。

示例:

# 将 alpha(ω) 设为可学参数
alpha_param = nn.Parameter(torch.ones(num_channels) * 0.2)  # 初值
params['learnables'] = {'alpha': alpha_param}
# 在残差里使用 torch.abs(alpha_param) 或 softplus 保证正值
alpha = torch.nn.functional.softplus(params['learnables']['alpha'])

8) 性能优化 & 实战建议(工程级细节)

  1. 归一化:对 z,t,频率与功率做归一化(零均值单位方差)能大幅提升训练稳定性。

  2. 批次与向量化:尽量把残差计算矢量化(避免 for-loop),对大模型使用较大 batch。

  3. 自动微分注意:对高阶导数(如 ∂²/∂t²)使用 torch.autograd.grad 时要注意内存消耗,必要时使用 checkpointing 或分块计算。

  4. 权重平衡:物理损失与数据损失量级差异大时,使用自适应权重(例如根据各损失梯度范数动态缩放)。

  5. 混合精度:对于大规模频域 FFT、网络,可尝试 torch.cuda.amp 混合精度来减少显存并加速。

  6. 初始化:Fourier feature + small init 能帮助表征高频时间结构(波形)。

  7. 调试技巧:先只训练 L_data(监督)确认网络能拟合,再加入 L_phys 逐步调权重。

  8. 验证速度:论文指出 SRS-Net 在实验设置下相较经典数值方法能达到数十到上百倍的速度提升——在工程实现中,关键瓶颈通常在频域 FFT 与高阶 autodiff,上述优化能显著缩短训练/推理时间。Nature


9) 小型完整示例:合成数据 + 训练(可直接试跑)

下面是一个最小可跑示例(时域单通道问题)把上面模块拼起来,省略了一些工程代码(数据加载、保存、详尽日志),但足够演示完整流程:

# example_run.py
import numpy as np
import torch
from torch.utils.data import DataLoader, TensorDataset

# 导入上面定义的 ComplexMLP, FourierFeatures, train, compute_pde_residual 等

device = 'cuda' if torch.cuda.is_available() else 'cpu'

# 合成:简单单通道传输 (长度 L, 时间窗口 T)
L = 1.0
Tmax = 1.0
n_samples = 2000

# 采样 z in [0, L], t in [-Tmax/2, Tmax/2]
z_samples = np.random.rand(n_samples, 1) * L
t_samples = (np.random.rand(n_samples, 1) - 0.5) * Tmax

# 构造合成 ground-truth: 简单高斯脉冲推进(仅示例)
def ground_truth_field(z, t):
    # 简单相位/衰减示例
    amp = np.exp(-z*0.1) * np.exp(- (t**2)/(0.02))
    phase = -2.0 * z + 5.0 * t
    return amp * np.cos(phase), amp * np.sin(phase)

real_gt, imag_gt = ground_truth_field(z_samples, t_samples)

# DataLoader
dataset = TensorDataset(torch.tensor(z_samples, dtype=torch.float32),
                        torch.tensor(t_samples, dtype=torch.float32),
                        torch.tensor(real_gt, dtype=torch.float32),
                        torch.tensor(imag_gt, dtype=torch.float32))
loader = DataLoader(dataset, batch_size=256, shuffle=True)

# 网络
fourier = FourierFeatures(in_dim=1, n_fours=64, scale=10.0)
model = ComplexMLP(in_dim=2, width=128, depth=5, fourier_t=fourier, out_channels=1)

# params(示例常数)
params = {
    'alpha': torch.tensor([0.1], device=device),
    'beta2': torch.tensor([0.0], device=device),
    'gamma': torch.tensor([0.0], device=device),
    'g': torch.zeros((1,1), device=device),  # single channel no cross-term
    'w_phys': 1.0,
    'w_data': 1.0,
}

# 简化 train wrapper(使用上面 train 函数)
model, params = train(model, params, loader, epochs=5000, device=device)

电感损耗 DCR/ACR/磁芯损耗 3 大来源解析:从集肤效应到磁滞回线 本文深入解析电感损耗的三大来源:DCR(直流电阻)、ACR(交流电阻)和磁芯损耗,从集肤效应到磁滞回线的微观机制。通过对比不同材料和设计策略,提供高频开关电源中电感损耗的优化方案,帮助工程师提升系统效率和可靠性。 阅读详情

相关推荐

【74HC595芯片】核心驱动代码

74HC595是一个8位串行输入、并行输出的位移缓存器:并行输出为三态输出。在SCK 的上升沿,串行数据由SDL输入到内部的8位位移缓存器,并由Q7’输出,而并行输出则是在LCK的上升沿将在8位位移缓存器的数据存入到8位并行输出缓存器。当串行数据输入端OE的控制信号为低使能时,并行输出端的输出值等于并行输出缓存器所存储的值。

weixin_67147824的博客 1849

【算法拾光】队列|在每个树⾏中找最⼤值 + 最后⼀块⽯头的重量

本文总结两道经典算法题:一是通过层序遍历(BFS)逐层找最大值,利用队列分层处理,每层维护最大值;二是用大根堆(优先队列)模拟石头碰撞过程,每次取最大两块石头,差值重新入堆,直至剩余一块或无石。前者适用于树的层次遍历,后者适合动态获取最值场景。核心思想:队列用于分层遍历,堆用于高效取极值。

wuqingyigexiaoba的博客 131

保姆级教程:彻底清理Win11更新缓存并解除外设,一次搞定0xc1900101更新错误

本文提供了一套完整的Win11更新报错0xc1900101解决方案,涵盖软件环境净化和硬件设备隔离。通过终止干扰进程、重置更新组件、清理临时文件以及断开外设等步骤,有效提升更新成功率。特别强调外设驱动兼容性对解决0xc1900101错误的关键作用。

weixin_33483304的博客 420

视频隐私脱敏工程化:CSRT/KCF追踪算法在本地推理中的实现与边界

在短视频内容合规审查中,动态遮挡(Dynamic Masking)是高频且高耗时的环节。传统手动关键帧打码不仅效率低下,且在目标快速移动或遮挡时极易出现遮罩漂移。本文从计算机视觉工程角度,解析基于CSRT与KCF算法的目标追踪方案在视频隐私处理中的技术路径、性能权衡及落地实践。

Mysssone的博客 384

LLaMA-Factory全面指南:从训练到部署

LLaMA-Factory项目是一个专注于大模型训练、微调、推理和部署的开源平台。其主要目标是提供一个全面且高效的解决方案,帮助研究人员和开发者快速实现大模型的定制化需求。简化大模型训练流程:通过提供一系列预设的训练脚本和参数配置,降低用户在训练大模型时的技术门槛,使得即使是初学者也能轻松上手。增强模型微调能力:支持多种微调方法,如LoRA、QLoRA等,使用户能够根据特定任务需求对模型进行精细调整,从而提升模型性能。优化推理和部署体验。

全世界的博客 1万+

别再死记硬背MAML原理了!用PyTorch手撸一个Omniglot小样本分类器(附完整代码)

本文详细介绍了如何使用PyTorch实现MAML(模型无关的元学习)算法,构建一个Omniglot小样本分类器。通过实战代码演示,帮助读者理解MAML的双层优化原理,并提供了完整的训练循环、网络架构设计及调试技巧,适合想要掌握元学习技术的开发者。

weixin_29191669的博客 132

【算法拾光】链表 哈希表|K个一组翻转链表 + 两数之和

K个一组翻转链表需分段反转,借助哑节点与前驱指针维护连接,避免断链;两数之和利用哈希表实现O(1)查找,空间换时间,高效定位目标组合。前者考察链表指针操作,后者聚焦映射关系构建,均为面试高频题。

wuqingyigexiaoba的博客 334

K210开发板学习笔记(三)——STM32+K210+SD卡实现人脸识别(完整K210代码)

更新日记:2022年4月26日 更新了串口通信部分的内容,本文写的略为粗糙,恐有不当之处,希望大家不吝赐教。 人脸识别 一、MaixPy IDE开发 参考博主晨少hc的博文(https://blog.csdn.net/HuangChen666/article/details/113995079)来实现人脸识别功能,我用的硬件是亚博智能的K210开发板,在配置工程中有几步和这个博主的不一样,需要注意。 所需要的文件有:模型文件),脚本文件,ide需要的bin文件...

Embedded learner的博客 4万+

把 KV Cache 压到 FP4:BitDecoding-FP4 的算法-系统协同设计复盘

长上下文推理卡在KV Cache的显存与带宽上,而现有FP4方案要么精度崩、要么速度废。这篇文章复盘BitDecoding-FP4如何用三个算法补丁加一个系统重构,在B300上把服务吞吐提升2.4–3.0倍,精度几乎不掉。

helloagent的博客 315

Ubuntu技巧-Ubuntu远程访问之SSH反向代理

💡大家好,我是可夫小子,《小白玩转ChatGPT》专栏作者,关注AIGC、互联网和自媒体。要把内网的一台的Ubuntu服务器让外面也能访问,总共有三种可行的方案,前面已经介绍了两种方式,今天就来介绍更健壮稳定的方式——ssh反向代理。大概的框架图如下,今天就从服务器购买到设置,手把手的教程,让你花费100块以内,就拥有一个强大的「云服务器」。

可夫小子的频道 1153

【知识图谱】neo4j安装与配置_社区版_2025(附完整安装软件包)

(经历过各种版本NEO4J,遇见杂七杂八的各种问题,也看过非常多很好的教程,特此来分享一下,为大家排排坑。

知识靠谱的博客 2万+

排序算法深度笔记(下):非比较类排序的线性突破与工程边界

排序算法时间复杂度额外空间复杂度稳定性是否基于比较选择排序O(N^2)(O(1))不稳定是冒泡排序O(N^2)(O(1))稳定是插入排序O(N^2)(O(1))稳定是归并排序O(N\log N)(O(N))稳定是快速排序O(N\log N)O(log N)不稳定是堆排序O(N\log N)O(1)不稳定是计数排序(O(N + M))O(M))稳定否基数排序O(N)稳定否桶排序平均O(N) / 最坏O(N^2)

2401_87069538的博客 608

【Python】no module named distutils问题怎么解决-Numpy 启动时报错:缺少 distutils 模块的解决方法

看distutils这个名字,似乎是什么通用模块,可能不一定是numpy的问题。

每日出拳老爷子的博客 6002

优选算法:分治-归并排序

交易逆序对的总数

Wangshijie1015的博客 149

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

算法日常・每日刷题--<动态规划>42

本题为“不相交的线”,与最长公共子序列问题相似。使用动态规划求解:定义 dp[i][j] 表示 nums1[0:i] 与 nums2[0:j] 的最大不相交连线数。若元素相等,则继承左上值加1;否则取上方或左方最大值。最终返回 dp[m][n],即两数组的最大不相交连线数。时间复杂度 O(mn),空间复杂度 O(mn)。

2503_92261635的博客 26

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

408 算法 06|堆与 Top-K:最小的 10 个数,到底该用数组还是堆

2022(42) 找 100 万个数里最小的 10 个,官方给了"10 元素有序数组"和"大根堆"两种答案。我把两种都实现并数了比较次数:k=10 时两者几乎打平,k=10000 时堆少 111 倍。另附 2021(42) 计数排序的比较次数与稳定性实测。

m0_56226131的博客 446

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

408 算法 04|主元素与三元组最小距离:两种“扫描时做决定“的思路

2013(41) 的主元素用摩尔投票一遍选出候选,但真正的考点是"选完必须验票";2020(41) 的三元组最小距离,三指针每次只挪最小的那个,靠的是 D=2×(max−min) 这个恒等式。两套完整 C 代码加真实输出,附官方评分档位表。

m0_56226131的博客 442

牛客周赛165C题(前后缀性质,递推,排序,枚举)

题目大意:给定长度为 `n` 的数组,选择 `k ∈ [1,n]`,将前 `k` 个元素整体翻转,后面的元素不变。要求操作后的整个数组非递减,统计满足条件的 `k` 的数量。题目链接:https://ac.nowcoder.com/acm/contest/141721/C。时间复杂度:O(nlogn)

2501_94316951的博客 174

算法64,字母异位词分组

代码核心思路是:互为字母异位词的字符串,在对其字符进行排序后,一定会得到相同的字符串。因此,可以将排序后的字符串作为哈希表的键(Key)来进行分组。

sheshibenniaodan的博客 218

【MPC 算法】Python 实战:模型预测控制(MPC)算法原理与代码实现

本文介绍模型预测控制(MPC)原理与Python实现。MPC通过滚动优化预测未来状态,结合系统模型、目标函数与约束条件,动态生成最优控制序列。以一阶温度系统为例,使用CVXPY构建凸优化问题,实现加热功率的智能调控。代码包含模型预测、目标函数设计(含温度跟踪与控制平滑惩罚)、输入约束及滚动更新机制。仿真结果表明,MPC能快速稳定温度至目标值60℃,且控制动作平滑合理,体现其在复杂系统中的优越性。

赖德发的博客 57

算法61,判定是否为字符重排

两字符串能互为重排 ⇔。

sheshibenniaodan的博客 224

【前缀和+复合离散化】题解:双色矩形(two)_数据结构_算法优化_预处理_二维前缀和_STL_C++算法竞赛

给定一个 $n \times n$ 的黑白棋盘,初始按 $i+j$ 奇偶染色,经 $k$ 个格子颜色翻转后,求子矩形中黑白格子数差的绝对值最大值。由于 $n$ 可达 $10^9$,但 $k \leq 50$,可离散化关键点。枚举所有由修改点构成的矩形及其四边向外扩展(共 $16$ 种扩展方式),利用二维前缀和快速计算变化量,结合奇偶性判断多出的格子颜色,最终取最大绝对差。时间复杂度为 $O(k^4)$,在 $k \leq 50$ 下可行。

YLCHUP的博客 210

算法62&&63,存在重复元素

判断整数数组中是否有任意元素出现至少两次。:判断数组中是否存在两个。,且索引差值的绝对值。

sheshibenniaodan的博客 102

商业综合体公摊电费分摊算法:512 商户双层权重与尾差实测

公摊电费分摊算法是指把公共回路电量按公示权重拆到每户的规则化计算过程,核心不是权重多精巧,而是每张账单都能被租户手算复现。某珠三角商业综合体 512 户商户实测:固定费与变动费按 4:6 加权,尾差用余数递补压到 0.01 千瓦时精度,24 个月 12288 张账单重算差异为零,月度争议从 31 起降到 2 起。适用边界:商铺与租户已独立装表、公共回路已分项计量的商业综合体适用;末端未装表、靠总表减合计倒推公摊的场景不适用,先把表补齐再谈分摊。

176

考拉兹猜想 - 7

本文通过引入虚数单位重构Collatz猜想的迭代逻辑,指出偶数减半与奇数“乘3加1”的过程在虚数坐标下等价于归结操作。关键在于:乘3加1使奇数跃升至偶数,随后持续减半,而虚数单位代表“无限减1”,实现无限向有限的转化。无论初始值如何,减半始终主导,最终归结为4-2-1循环。该视角消解了正向思维中的速度竞争疑虑,证明归结是必然结果。

杨铸人的博客 69

2026华为OD机试真题 10月14日 新系统 【分组字符串排序】

华为OD机试真题 新系统【分组字符串排序】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题 【分组字符串排序】多语言题解。

qq_45776114的博客 435
上一篇: 物理信息神经网络在实验室地震预测中的应用原理
下一篇: 基于傅里叶特征PINN的地震多频波场模拟算法原理
VectorShift
博客等级 码龄1年 1840粉丝 1109原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

VectorShift

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值