DNN(深度神经网络)近似 Lyapunov 函数

import torch
import torch.nn as nn
import torch.optim as optim
import matplotlib.pyplot as plt
# from torchviz import make_dot
import torchviz# 1. Lyapunov 函数近似器(MLP 结构)
class LyapunovNet(nn.Module):def __init__(self, input_dim, hidden_dim=32):super(LyapunovNet, self).__init__()self.model = nn.Sequential(nn.Linear(input_dim, hidden_dim),nn.ReLU(),nn.Linear(hidden_dim, hidden_dim),nn.ReLU(),nn.Linear(hidden_dim, 1)  # 输出一个标量,表示Lyapunov函数值)def forward(self, x):return self.model(x)# 2. 梯度伴随网络(计算 Lyapunov 函数的梯度)
def compute_gradient(model, x):x.requires_grad_(True)V = model(x)grad_V = torch.autograd.grad(V.sum(), x, create_graph=True)[0]return V, grad_V# 3. 训练数据(随机生成一些状态数据)
def generate_data(num_samples=1000, state_dim=2):return torch.randn(num_samples, state_dim) * 5  # 扩大范围# 4. 网络权重初始化
def init_weights(m):if isinstance(m, nn.Linear):torch.nn.init.xavier_uniform_(m.weight)if m.bias is not None:torch.nn.init.zeros_(m.bias)# 5. 训练 Lyapunov 网络并绘制损失曲线
def train_lyapunov_net(state_dim=2, epochs=500, lr=0.001):model = LyapunovNet(input_dim=state_dim)model.apply(init_weights)  # 重新初始化网络optimizer = optim.Adam(model.parameters(), lr=lr)loss_history = []for epoch in range(epochs):x = generate_data()V, grad_V = compute_gradient(model, x)# 修正损失函数loss = torch.mean(torch.relu(-grad_V.sum(dim=1))) + torch.mean(torch.relu(-V))optimizer.zero_grad()loss.backward()optimizer.step()loss_history.append(loss.item())if epoch % 50 == 0:print(f"Epoch {epoch}, Loss: {loss.item():.6f}")# 绘制损失曲线plt.plot(loss_history)plt.xlabel("Epoch")plt.ylabel("Loss")plt.title("Training Loss Curve")plt.grid()plt.show()return model# 6. 可视化神经网络计算图
def visualize_lyapunov_network(model, state_dim=2):x = torch.randn(1, state_dim, requires_grad=True)  # 生成一个测试输入V = model(x)dot = make_dot(V, params=dict(model.named_parameters()))dot.format = 'png'dot.render('lyapunov_network')  # 生成 PNG 图片dot.view()  # 打开图像if __name__ == "__main__":trained_model = train_lyapunov_net()visualize_lyapunov_network(trained_model)

在这里插入图片描述
在这里插入图片描述

这段代码的核心目标是使用神经网络近似 Lyapunov 函数,并通过梯度信息优化其参数,以确保 Lyapunov 函数在物理系统的状态空间中满足稳定性条件。以下是详细的解析:


1. 代码整体架构

该代码主要包含 6 个部分:

  1. 定义 Lyapunov 函数近似器(MLP 神经网络)。
  2. 计算 Lyapunov 函数的梯度(用于优化)。
  3. 生成训练数据(模拟状态空间点)。
  4. 初始化网络权重(Xavier 初始化)。
  5. 训练 Lyapunov 网络(基于梯度信息优化 Lyapunov 函数)。
  6. 可视化网络结构(绘制计算图)。

2. 详细解析每个部分

(1) Lyapunov 函数近似器

class LyapunovNet(nn.Module):def __init__(self, input_dim, hidden_dim=32):super(LyapunovNet, self).__init__()self.model = nn.Sequential(nn.Linear(input_dim, hidden_dim),nn.ReLU(),nn.Linear(hidden_dim, hidden_dim),nn.ReLU(),nn.Linear(hidden_dim, 1)  # 输出一个标量,表示Lyapunov函数值)def forward(self, x):return self.model(x)

📌 作用

  • 这是一个

    多层感知机(MLP)

    结构:

    • 输入 x 代表系统状态变量(维度 input_dim)。
    • 两个隐藏层,每层 hidden_dim=32,激活函数为 ReLU
    • 输出是一个标量,表示 Lyapunov 函数值 V(x)

📌 数学意义

  • 训练后,神经网络会学习到一个 Lyapunov 函数近似 V(x),用于判定系统稳定性

(2) 计算 Lyapunov 函数的梯度

def compute_gradient(model, x):x.requires_grad_(True)  # 使 x 可微分V = model(x)  # 计算 Lyapunov 函数值grad_V = torch.autograd.grad(V.sum(), x, create_graph=True)[0]  # 计算梯度return V, grad_V

📌 作用

  • 计算 V(x)x 的梯度 ∇V(x)
  • torch.autograd.grad() 自动计算梯度,用于 Lyapunov 函数优化。

📌 数学意义

V ( x ) V(x) V(x)的梯度 ∇ V ( x ) ∇V(x) V(x)

需要满足:

d V d t = ∇ V ( x ) ⋅ f ( x ) ≤ 0 \frac{dV}{dt} = \nabla V(x) \cdot f(x) \leq0 dtdV=V(x)f(x)0

  • 这个条件保证 Lyapunov 函数单调递减,从而保证系统稳定性

(3) 生成训练数据

def generate_data(num_samples=1000, state_dim=2):return torch.randn(num_samples, state_dim) * 5  # 生成随机状态点

📌 作用

  • 生成服从标准正态分布的随机状态数据,用于训练 Lyapunov 神经网络。

📌 数学意义

  • 这些数据点可以看作是随机抽取的系统状态,用于训练神经网络使其学会合适的 Lyapunov 函数。

(4) 网络权重初始化

def init_weights(m):if isinstance(m, nn.Linear):torch.nn.init.xavier_uniform_(m.weight)if m.bias is not None:torch.nn.init.zeros_(m.bias)

📌 作用

  • 采用 Xavier(Glorot)初始化 线性层权重,保证网络初始梯度不会过大或过小。
  • bias 初始化为 0

📌 数学意义

  • Xavier 初始化

    W ∼ U ( − 6 n i n + n o u t , 6 n i n + n o u t ) W \sim U\left(-\sqrt{\frac{6}{n_{in} + n_{out}}}, \sqrt{\frac{6}{n_{in} + n_{out}}}\right) WU(nin+nout6 ,nin+nout6 )

    • 其中 n i n n_{in} nin n o u t n_{out} nout分别是输入和输出的神经元数目。

(5) 训练 Lyapunov 网络

def train_lyapunov_net(state_dim=2, epochs=500, lr=0.001):model = LyapunovNet(input_dim=state_dim)model.apply(init_weights)  # 重新初始化网络optimizer = optim.Adam(model.parameters(), lr=lr)loss_history = []for epoch in range(epochs):x = generate_data()V, grad_V = compute_gradient(model, x)# 修正损失函数loss = torch.mean(torch.relu(-grad_V.sum(dim=1))) + torch.mean(torch.relu(-V))optimizer.zero_grad()loss.backward()optimizer.step()loss_history.append(loss.item())if epoch % 50 == 0:print(f"Epoch {epoch}, Loss: {loss.item():.6f}")# 绘制损失曲线plt.plot(loss_history)plt.xlabel("Epoch")plt.ylabel("Loss")plt.title("Training Loss Curve")plt.grid()plt.show()return model

📌 作用

  • 优化 Lyapunov 函数 V(x),使其满足 Lyapunov 稳定性条件

    • V(x) > 0(Lyapunov 函数应该是正的)。
    • ∇V(x) ≤ 0(Lyapunov 函数应该单调递减)。

📌 数学意义

  • 损失函数

    L = E [ m a x ⁡ ( 0 , − ∇ V ( x ) ) ] + E [ m a x ⁡ ( 0 , − V ( x ) ) ] L=E[max⁡(0,−∇V(x))]+E[max⁡(0,−V(x))] L=E[max(0,V(x))]+E[max(0,V(x))]

    • 其中:
      • torch.relu(-grad_V.sum(dim=1)):强制 ∇V(x) ≤ 0,确保 Lyapunov 单调递减。
      • torch.relu(-V):确保 V(x) ≥ 0

(6) 可视化 Lyapunov 神经网络

def visualize_lyapunov_network(model, state_dim=2):x = torch.randn(1, state_dim, requires_grad=True)  # 生成一个测试输入V = model(x)dot = make_dot(V, params=dict(model.named_parameters()))dot.format = 'png'dot.render('lyapunov_network')  # 生成 PNG 图片dot.view()  # 打开图像

📌 作用

  • 使用 torchviz 绘制计算图,直观展示神经网络结构。

3. main-run

if __name__ == "__main__":trained_model = train_lyapunov_net()visualize_lyapunov_network(trained_model)

📌 作用

  1. 训练 Lyapunov 网络
  2. 可视化网络结构

4. 总结

模块作用
LyapunovNet使用 MLP 近似 V(x)
compute_gradient计算 ∇V(x)
generate_data生成随机状态数据
init_weightsXavier 权重初始化
train_lyapunov_net训练神经网络,使其满足 Lyapunov 条件
visualize_lyapunov_network可视化计算图

这个代码的核心思想是通过深度学习构建 Lyapunov 函数,确保 V(x) 单调递减,从而评估系统的瞬态稳定性。🔥

5.延伸

将以上的损失函数改为平方-以下为改后的损失函数公式展示

给定状态 x x x的动态系统:

d x d t = f ( x ) \frac{dx}{dt} = f(x) dtdx=f(x)

定义 Lyapunov 近似函数 V ( x ) V(x) V(x) 及其梯度:

∇ V = ∂ V ∂ x \nabla V = \frac{\partial V}{\partial x} V=xV

损失函数由两个部分组成:

  1. Lyapunov 下降约束(确保 d V d t ≤ 0 \frac{dV}{dt} \leq 0 dtdV0 ):

    L decay = E x [ max ⁡ ( 0 , − ∇ V ⋅ f ( x ) ) ] \mathcal{L}_{\text{decay}} = \mathbb{E}_x \left[ \max\left( 0, -\nabla V \cdot f(x) \right) \right] Ldecay=Ex[max(0,Vf(x))]

    其中 ∇ V ⋅ f ( x ) = ∑ i ∂ V ∂ x i f i ( x ) \nabla V \cdot f(x) = \sum_{i} \frac{\partial V}{\partial x_i} f_i(x) Vf(x)=ixiVfi(x)是 Lyapunov 函数关于时间的导数。

  2. Lyapunov 函数非负性约束(确保 V ( x ) ≥ 0 V(x)≥0 V(x)0 ):

    L positivity = E x [ V ( x ) 2 ] ] \mathcal{L}_{\text{positivity}} = \mathbb{E}_x \left[ V(x)^2 \right]] Lpositivity=Ex[V(x)2]]

    这里我们使用平方损失 V ( x ) 2 V(x)^2 V(x)2 代替 ReLU 约束 m a x ⁡ ( 0 , − V ( x ) ) max⁡(0,−V(x)) max(0,V(x)) 以增强稳定性。

总损失函数

L = L decay + L positivity L = \mathcal{L}_{\text{decay}} + \mathcal{L}_{\text{positivity}} L=Ldecay+Lpositivity

该损失函数的优化目标是找到一个满足 Lyapunov 条件的近似函数 V ( x ) V(x) V(x),使得:

  1. Lyapunov 下降条件 d V d t ≤ 0 \frac{dV}{dt} \leq 0 dtdV0 适用于所有 x x x
  2. Lyapunov 函数非负性 V ( x ) ≥ 0 V(x)≥0 V(x)0 确保稳定性分析的正确性。

这样,我们训练出的神经网络可以逼近一个合适的 Lyapunov 函数,从而用于评估瞬态稳定性

代码

import torch
import torch.nn as nn
import torch.optim as optim
import matplotlib.pyplot as plt
from torchviz import make_dot# 1. Lyapunov 函数近似器(MLP 结构)
class LyapunovNet(nn.Module):def __init__(self, input_dim, hidden_dim=32):super(LyapunovNet, self).__init__()self.model = nn.Sequential(nn.Linear(input_dim, hidden_dim),nn.ReLU(),nn.Linear(hidden_dim, hidden_dim),nn.ReLU(),nn.Linear(hidden_dim, 1)  # 输出一个标量,表示Lyapunov函数值)def forward(self, x):return self.model(x)# 2. 定义系统动力学方程(如果已知)
def system_dynamics(x):return -x  # 示例:简单的线性动力学 dx/dt = -x# 3. 计算 Lyapunov 函数的梯度
def compute_gradient(model, x):x.requires_grad_(True)V = model(x)grad_V = torch.autograd.grad(V.sum(), x, create_graph=True)[0]return V, grad_V# 4. 训练数据(随机生成一些状态数据)
def generate_data(num_samples=1000, state_dim=2):return torch.randn(num_samples, state_dim) * 5  # 扩大范围# 5. 网络权重初始化
def init_weights(m):if isinstance(m, nn.Linear):torch.nn.init.xavier_uniform_(m.weight)if m.bias is not None:torch.nn.init.zeros_(m.bias)# 6. 训练 Lyapunov 网络并绘制损失曲线
def train_lyapunov_net(state_dim=2, epochs=500, lr=0.001):model = LyapunovNet(input_dim=state_dim)model.apply(init_weights)  # 重新初始化网络optimizer = optim.Adam(model.parameters(), lr=lr)loss_history = []for epoch in range(epochs):x = generate_data()V, grad_V = compute_gradient(model, x)dx_dt = system_dynamics(x)  # 获取系统的动态方程# 1. 约束 Lyapunov 下降条件: dV/dt = ∇V · f(x) ≤ 0lyapunov_decay = torch.mean(torch.relu(-(grad_V * dx_dt).sum(dim=1)))# 2. 确保 Lyapunov 函数 V(x) 是非负的lyapunov_positivity = torch.mean(V**2)  # 使 V(x) 逼近 0 而不是仅仅大于 0loss = lyapunov_decay + lyapunov_positivityoptimizer.zero_grad()loss.backward()optimizer.step()loss_history.append(loss.item())if epoch % 50 == 0:print(f"Epoch {epoch}, Loss: {loss.item():.6f}")# 绘制损失曲线plt.plot(loss_history)plt.xlabel("Epoch")plt.ylabel("Loss")plt.title("Training Loss Curve")plt.grid()plt.show()return model# 7. 可视化神经网络计算图
def visualize_lyapunov_network(model, state_dim=2):x = torch.randn(1, state_dim, requires_grad=True)  # 生成一个测试输入V = model(x)dot = make_dot(V, params=dict(model.named_parameters()))dot.format = 'png'dot.render('lyapunov_network')  # 生成 PNG 图片dot.view()  # 打开图像if __name__ == "__main__":trained_model = train_lyapunov_net()visualize_lyapunov_network(trained_model)

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/70318.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从 HTTP/1.1 到 HTTP/3:如何影响网页加载速度与性能

一、前言 在最近使用Apipost时,突然注意到了http/1.1和http/2,如下图: 在我根深蒂固的记忆中,对于http的理解还停留在TCP协议、三次握手。由于我的好奇心,于是触发了我被动“开卷”,所以有了这篇文章&…

6 加密技术与认证技术

6 加密技术与认证技术 6.1:对称加密与非对称加密技术 6.1.1:对称加密 对称加密:; 特点: 1、加密强度不高,但效率高;2、密钥分发困难。 常见对称密钥(共享秘钥)加密算法:DES、3DES(三重DES)、RC-5、IDEA算法。 6.1.1.2非对称加密技术 非对称…

【Block总结】CoT,上下文Transformer注意力|即插即用

一. 论文信息 标题: Contextual Transformer Networks for Visual Recognition论文链接: arXivGitHub链接: https://github.com/JDAI-CV/CoTNet 二. 创新点 上下文Transformer模块(CoT): 提出了CoT模块,能够有效利用输入键之间的上下文信息,指导动态注意力矩阵的学习,从而…

pycharm集成通义灵码应用

在pycharm中安装通义灵码 1、打开files-settings 2、选中plugins-搜索”TONGYI Lingma“,点击安装 3.安装完成后在pycharm的右侧就有通义灵码的标签 4、登录账号 5、查看代码区域代码,每一个方法前面都多了通义灵码的标识,可以直接选择…

保姆级教程Docker部署Zookeeper官方镜像

目录 1、安装Docker及可视化工具 2、创建挂载目录 3、运行Zookeeper容器 4、Compose运行Zookeeper容器 5、查看Zookeeper运行状态 6、验证Zookeeper是否正常运行 1、安装Docker及可视化工具 Docker及可视化工具的安装可参考:Ubuntu上安装 Docker及可视化管理…

3.【BUUCTF】XSS-Lab1

进入题目页面如下 好好好&#xff0c;提示点击图片&#xff0c;点进去页面如下&#xff0c;且url中有传参&#xff0c;有注入点 发现题目给出了源码 查看得到本题的源码 分析一下代码 <!DOCTYPE html><!--STATUS OK--> <!-- 声明文档类型为 HTML5&#xff0c;告…

react关于手搓antd pro面包屑的经验(写的不好请见谅)

我们先上代码&#xff0c;代码里面都有注释&#xff0c;我是单独写了一个组件&#xff0c;方便使用&#xff0c;在其他页面引入就行了 还使用了官方的Breadcrumb组件 import React, { useEffect, useState } from react; import { Breadcrumb, Button } from antd; import { …

高端入门:Ollama 本地高效部署DeepSeek模型深度搜索解决方案

目录 一、Ollama 介绍 二、Ollama下载 2.1 官网下载 2.2 GitHub下载 三、模型库 四、Ollmal 使用 4.1 模型运行&#xff08;下载&#xff09; 4.2 模型提问 五、Ollama 常用命令 相关推荐 一、Ollama 介绍 Ollama是一个专为在本地机器上便捷部署和运行大型语言模型&…

Windows Docker笔记-Docker容器操作

在文章《Windows Docker笔记-Docker拉取镜像》中&#xff0c;已经拉取成功了ubuntu镜像&#xff0c;本章来讲解如何通过镜像来创建容器并运行容器。 这里再类比一下&#xff0c;加深理解&#xff0c;比如&#xff0c;我们现在想开一个玩具厂&#xff0c;我们的最终目的肯定是想…

Java语法糖详解

前言 在现代编程语言的发展历程中&#xff0c;语法糖&#xff08;Syntactic Sugar&#xff09;作为一种提升代码可读性和开发效率的重要特性&#xff0c;已经成为语言设计的重要组成部分。Java作为一门成熟且广泛应用的编程语言&#xff0c;在其长期演进过程中&#xff0c;语法…

机器学习中的关键概念:通过SKlearn的MNIST实验深入理解

欢迎来到我的主页&#xff1a;【Echo-Nie】 本篇文章收录于专栏【机器学习】 1 sklearn相关介绍 Scikit-learn 是一个广泛使用的开源机器学习库&#xff0c;提供了简单而高效的数据挖掘和数据分析工具。它建立在 NumPy、SciPy 和 matplotlib 等科学计算库之上&#xff0c;支持…

Java数据结构与算法之“树”

目录 一、什么是树 ​编辑 二、树的相关组成 1. 常用名词 2.需要了解的名词 三、树的分类 &#xff08;一&#xff09;初级树 1.普通树 2.二叉树 &#xff08;二&#xff09;中级树 1.哈夫曼树HuffmanTree 2.二叉搜索树BST 3.平衡二叉树AVL &#xff08;三&#x…

【Linux】27.Linux 多线程(1)

文章目录 1. Linux线程概念1.1 线程和进程1.2 虚拟地址是如何转换到物理地址的1.3 线程的优点1.4 线程的缺点1.5 线程异常1.6 线程用途 2. Linux进程VS线程2.1 进程和线程2.2 关于进程线程的问题 3. Linux线程控制3.1 POSIX线程库3.2 创建线程3.3 线程终止3.4 线程等待3.5 分离…

SpringAI系列 - 使用LangGPT编写高质量的Prompt

目录 一、LangGPT —— 人人都可编写高质量 Prompt二、快速上手2.1 诗人 三、Role 模板3.1 Role 模板3.2 Role 模板使用步骤3.3 更多例子 四、高级用法4.1 变量4.2 命令4.3 Reminder4.4 条件语句4.5 Json or Yaml 方便程序开发 一、LangGPT —— 人人都可编写高质量 Prompt La…

2025.2.6

一、C思维导图&#xff1a; 二、C&#xff1a; 三、注释代码 1> 配置文件&#xff1a;.pro文件 QT core gui # 引入的类库&#xff0c;core表示核心库 gui图形化界面库greaterThan(QT_MAJOR_VERSION, 4): QT widgets # 超过版本4的qt&#xff0c;会自动加widgets…

【算法应用】Alpha进化算法求解二维栅格路径规划问题

目录 1.算法原理2.二维路径规划数学模型3.结果展示4.参考文献5.代码获取 1.算法原理 Alpha进化&#xff1a;一种具有进化路径自适应和矩阵生成的高效进化算法 2.二维路径规划数学模型 栅格法模型最早由 W.E. Howden 于 1968 年提出&#xff0c;障碍物的栅格用黑色表示&#…

ubuntu20.04+RTX4060Ti大模型环境安装

装显卡驱动 这里是重点&#xff0c;因为我是跑深度学习的&#xff0c;要用CUDA&#xff0c;所以必须得装官方的驱动&#xff0c;Ubuntu的附件驱动可能不太行. 进入官网https://www.nvidia.cn/geforce/drivers/&#xff0c;选择类型&#xff0c;最新版本下载。 挨个运行&#…

Spring Boot 2 快速教程:WebFlux优缺点及性能分析(四)

WebFlux优缺点 【来源DeepSeek】 Spring WebFlux 是 Spring 框架提供的响应式编程模型&#xff0c;旨在支持非阻塞、异步和高并发的应用场景。其优缺点如下&#xff1a; 优点 高并发与低资源消耗 非阻塞 I/O&#xff1a;基于事件循环模型&#xff08;如 Netty&#xff09;&am…

DeepSeek 硅基流动

DeepSeek 硅基流动 &#x1f381; 四大神仙优势&#x1f31f; 三步拥有官网同款671B大模型1️⃣ 戳这里&#x1f449; 国内直连通道2️⃣ 复制API密钥3️⃣ 安装Chatbox贴进软件秒变AI大佬 &#x1f4c1; 网盘地址&#xff1a;&#xff08;所用到的软件可以直接下载&#xff09…

mysql 学习10 多表查询 -多表关系,多表查询

多表关系 一对多 多对多 创建学生表 #多对多表 学生选课系统create table student(id int primary key auto_increment comment 主键ID,name varchar(64) comment 姓名,studentnumber varchar(10) comment 学号 )comment 学生表;insert into student(id,name,studentnumber)va…