PINN学习与实验之拟合sin(x)

news2025/1/13 13:41:12

首先给出数学上的知识。

1.\left ( \sin x \right ){}'=\cos x

2.\sin \left ( 0 \right )=\sin \left ( 3.14 \right )=\sin \left ( -3.14 \right )=0

3.\sin ^{^2}\left ( x \right )+\cos ^{^2}\left ( x \right )-1=0

其次给出PINN最基础的理解与应用说明。

1.PINN中的MLP多层感知机的作用?

答:目的是用来拟合出我们需要的那个 常微分方程,即函数逼近器。

2.PINN中物理信息的作用?

答:用于约束MLP反向传播梯度下降求解时的解空间。所以PINN只需要更少的数据就能完成任务。

拟合sin(x)时的边界条件。

1. \sin \left ( 0 \right )=0

2.参照上面的数学式子。

PINN最容易入手的就是根据各种边界条件设计出不同的损失函数(loss function),让MLP最小化这些损失函数的和或者加权和。

下面是代码部分:

import torch
import torch.nn as nn
import numpy as np
import matplotlib.pyplot as plt
from torch import autograd


class Net(nn.Module):
    def __init__(self, NN): # NN决定全连接层的神经元个数,对拟合快慢直接相关
        super(Net, self).__init__()
        self.input_layer = nn.Linear(1, NN)
        self.hidden_layer = nn.Linear(NN,int(NN/2)) 
        self.output_layer = nn.Linear(int(NN/2), 1)

    def forward(self, x):
        out = torch.tanh(self.input_layer(x))
        out = torch.tanh(self.hidden_layer(out))
        out_final = self.output_layer(out)
        return out_final


net=Net(6) # 6个
mse_cost_function = torch.nn.MSELoss(reduction='mean') # 最小化L2范数
optimizer = torch.optim.Adam(net.parameters(),lr=1e-4)  # 优化器

def ode_01(x,net):
    # 使用神经网络net(x)作为偏微分方程的函数逼近器,每经过一次梯度更新就对对net(x)求一次导,代码中net(x)需要去逼近sin(x)
    y=net(x)
    # 求net(x)在0点的导数
    y_x = autograd.grad(y, x,grad_outputs=torch.ones_like(net(x)),create_graph=True)[0]
    # sin**2 + cos**2 - 1 = 0
    return torch.pow(y, 2)+torch.pow(y_x, 2)-1 

# 动态图
plt.ion()  
# 总的迭代次数
iterations=20000
# 粒度N_,决定将区间分为多少个间隔
N_ = 200
for epoch in range(iterations):

    optimizer.zero_grad()  # 梯度归0

    # sin(0) - 0 = 0
    x_0 = torch.zeros(N_, 1)
    y_0 = net(x_0)
    mse_i = mse_cost_function(y_0, torch.zeros(N_, 1))  

    # sin(-3.14) - 0 = 0
    x_n314= torch.full((N_,1), -3.14)
    y_n = net(x_n314)
    mse_n = mse_cost_function(y_n, torch.zeros(N_, 1))
    
    # sin(3.14) - 0 = 0
    x_p314 = torch.full((N_,1), 3.14)
    y_p = net(x_p314)
    mse_p = mse_cost_function(y_p, torch.zeros(N_, 1)) 

    # 输入数据,-pi到+pi之间
    x_in = np.random.uniform(low=-3.14, high=3.14, size=(N_, 1))
    # 将输入数据转为torch张量
    pt_x_in = autograd.Variable(torch.from_numpy(x_in).float(), requires_grad=True)
    # pt_y_colection 是 sin**2 + cos**2 - 1 = 0 的值
    pt_y_colection=ode_01(pt_x_in,net)
    # 全是0
    pt_all_zeros= autograd.Variable(torch.from_numpy(np.zeros((N_,1))).float(), requires_grad=False)
    # sin**2 + cos**2 - 1 与 0 之间的误差
    mse_f=mse_cost_function(pt_y_colection, pt_all_zeros)

    # 各种误差之和
    loss = mse_i + mse_f +mse_n + mse_p
    
    # 反向传播
    loss.backward()
    
    # 优化下一步
    optimizer.step()  

    if epoch%1000==0:
            y = torch.sin(pt_x_in)  # y 真实值
            y_train0 = net(pt_x_in) # y 预测值,只用于画图,不输入模型,注意区分本代码的PINN与使用MLP进行有监督回归的差别
            print(epoch, "Traning Loss:", loss.data)
            plt.cla()
            plt.scatter(pt_x_in.detach().numpy(), y.detach().numpy())
            plt.scatter(pt_x_in.detach().numpy(), y_train0.detach().numpy(),c='red')
            plt.pause(0.1)

结果展示部分: 

1000次迭代:

3000次迭代:

8000次迭代:

20000次迭代:

        可以看到,20000次迭代之后,MLP完美逼近了sin(x)。而且不是通过有监督回归得到的。参考博客如下:PINN学习与实验(一)__刘文凯_的博客-CSDN博客。

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

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

相关文章

安利一个我喜欢的博主(鱼皮)的项目----鱼聪明AI

大家好,我是鱼皮的粉丝。今天给大家介绍下他们公司的新朋友 —— 鱼聪明! 是不是看上去就像个大聪明哈哈,这其实是他们公司的吉祥物。当然啦,她以后会经常出现在他们的产品家族和周边中~ 比如他们最新上线的 AI 助手网站 —— 鱼…

自动化测试真的会取代手工测试?说这话的人肯定不是干测试的~

在测试行业,一个一直被讨论的问题就是:手工测试没有前途,自动化测试会取代手工测试? 首先说结论:自动化测试不会取代手工测试,这完全是两个维度的事情。为什么不会呢?我们需要从本源上说起。 …

计算机网络期末考试学习记录

1.如果特别想把一个知识点给别人讲懂的话,那自己也会受益很多。 2.我是先讲给自己的,因为我本人也有太多疑问而不问。 3.答案是我自己做出来的,仅供参考。 1.路由器因目的不可达而丢弃的普通IP分组,会向源主机发送(C)报文来报告…

【每日挠头算法(4)】字符串相加|字符串相乘

欢迎~ 一、字符串相加思路:模拟竖式加法具体代码如下: 二、字符串相乘思路:模拟竖式乘法具体代码如下: 总结 一、字符串相加 点我直达~ 思路:模拟竖式加法 1.将两个字符串从右往左开始进行相加,使用一个变量ans表示进…

关于枚举常量手误带来的错误

前言 记录2020年5月30日,肯哥在群里面分享的一个因为手误带来的bug。 问题描述 肯哥原话: 又到了每天的open话题讨论时刻,一起在摸鱼中学点东西,今天我们来聊一个话题:一不小心的手误,代码有时能跑&#xf…

Python集合学习笔记

列表、字典、集合都是可变类型的序列. 集合是没有value的字典s {2, 3, 4, 5, 5, 5, 5, 6, 7, 7} print(s) # {2, 3, 4, 5, 6, 7} 集合中没有相同的元素,元素不能重复print() s1 set(range(6)) print(s1) # {0, 1, 2, 3, 4, 5} lis [2, 5, 8, 5, 8, 4, 9] s2 s…

搜索与图论(acwing算法基础)

文章目录 DFS排列数字n皇后 BFS走迷宫 拓扑序列单链表树与图的深度优先搜索模拟队列有向图的拓扑序列 bellman-ford有边数限制的最短路 spfaspfa求最短路spfa判断负环 FloydFloyd求最短路 PrimPrim算法求最小生成树 KruskalKruskal算法求最小生成树 染色法判定二分图染色法判定…

rabbitmq记录(服务器重启后,RabbitMQ用户丢失)

1.docker运行rabbitmq docker run -d --hostname my-rabbit --name myrabbit -p 15672:15672 -p 5672:5672 rabbitmq 2.进入rabbitmq容器 docker exec -it 3776394dd2b3 /bin/bash 3.开启rabbitmq可视化界面管理 rabbitmq-plugins enable rabbitmq_management 4.添加新用户…

RabbitMq-高级

参考:https://blog.csdn.net/dingd1234/article/details/125032383 1 TTL TTL QUEUE 声明args TTL MESSAGE postmessage中设置 区别:过期消息会直接删除消息,过期队列若配置死信队列会移到死信队列 ps:同时配置两个已小的为准 2…

2. Redis持久化、主从哨兵架构详解

分布式缓存技术Redis 1. Redis持久化1.1 RDB快照(snapshot)1.1.1 bgsave的写时复制(COW)机制 本文是按照自己的理解进行笔记总结,如有不正确的地方,还望大佬多多指点纠正,勿喷。 课程内容: 1、RDB、AOF及混合持久化详解 2、并行…

css基础一:说说你对CSS盒子模型的理解?

一、是什么 当对一个文档进行布局(layout)的时候,浏览器的渲染引擎会根据标准之一的 CSS 基础框盒模型(CSS basic box model),将所有元素表示为一个个矩形的盒子(box) 一个盒子由四…

认识HttpServletRequest和HttpServletResponse

hi,大家好,上一期我们认识了HttpServlet,这一期我们来认识一下HttpServletRequest和HttpServletResponse 🚀HttpServletRequest 💚1.核心方法介绍 💚2.代码举例展示 🚀HttpServletResponse 💚1.核心方法展示 &a…

STC12读取内部ID方法介绍

STC12读取内部ID方法介绍 🔖这里以STC12LE5A60S2为例,从STC12手册的第一章,1.10小结可以找到相关的ID相关的信息。这个信息主要是用于程序加密或产品销售管理等方面。🌿STC12LE5A60S2系统板: https://oshwhub.com/pers…

javaScript蓝桥杯----阅读吧

目录 一、介绍二、准备三、目标四、代码五、完成 一、介绍 “读万卷书,行万里路”,无论你现在贫穷或富有,身和心一定要有一个在路上。那么,在快节奏的今天,人们是如何利用碎片化的时间去阅读的呢?没错&…

【MySQL高级篇笔记-事务基础知识(中) 】

此笔记为尚硅谷MySQL高级篇部分内容 目录 一、数据库事务概述 1、存储引擎支持情况 2、基本概念 3、事务的ACID特性 1.原子性(atomicity) 2.一致性(consistency) 3.隔离型(isolation) 4.持久性&a…

卷积编码和维特比译码

文章目录 卷积编码维特比译码 卷积编码 卷积码是一种非分组码,通常适用于前向纠错。在分组码中,编码器产生的 n 个码元的一个码组,完全决定于这段时间中 k 比特输入信息。这个码组中的监督位仅监督本码组中 k 个信息位。卷积码在编码时虽然也…

Calico介绍

Calico 是一个基于 BGP 的纯三层的网络方案,与 OpenStack 、Kubernetes 、AWS 、GCE 等云平台都能够良好地集成 。 Calico 在每个计算节点都利用 Linux Kernel 实现了一个高效的 vRouter 来负责数据转发 。每个 vRouter 都通过 BGP 协议把在本节点上运行的容器的路由…

msf渗透练习-php后门反弹

说明: 本章内容,仅供学习,不要用于非法用途(做个好白帽) (一)后门反弹是什么 后门反弹是指攻击者在成功入侵一台计算机后,在目标计算机上安装一个“后门程序”,将该程序…

内网安全:横向传递攻击(SMB || WMI 明文或 hash 传递)

内网安全:横向传递攻击. 横向移动就是在拿下对方一台主机后,以拿下的那台主机作为跳板,对内网的其他主机再进行后面渗透,利用既有的资源尝试获取更多的凭据、更高的权限,一步一步拿下更多的主机,进而达到控…

解决语言障碍:如何将Axure变为中文版?

Axure 是一款备受称赞的原型设计工具,被誉为 "交互神器"。然而,在国内,一些设计师对于使用 Axure 有所犹豫,其中语言环境不适应是主要的顾虑之一。在本文中,我们将探讨一种更适合国内设计师的 Axure 中文版即…