2024.8.18周报

news2024/9/23 17:15:42

摘要

本周利用阳朔水站的数据对1D浅水方程进行了求解,通过将1D浅水方程的物理约束纳入到神经网络,将时空坐标x,t作为输入到神经网络中,得到预测解水深和流量的数据,然后利用真实的数据进行比较,计算损失。

ABSTRACT

This week, the data of Yangshuo water station was used to solve the 1D shallow water equation, and the physical constraints of the 1D shallow water equation were incorporated into the neural network, and the spatiotemporal coordinates x,t were used as inputs to the neural network to obtain the data that predicted the water depth and flow rate of the solution, and then the real data were used to compare and calculate the loss.

具体实现

一、数据处理

数据被从Excel文件加载、预处理(例如清除缺失值、转换日期时间格式、创建假设的空间坐标、标准化或归一化等),然后被分割为训练集和测试集。

import pandas as pd
from sklearn.preprocessing import StandardScaler, MinMaxScaler
from sklearn.model_selection import train_test_split

def preprocess_data(filepath):
    data = pd.read_excel(filepath)
    data.dropna(inplace=True)  # 删除缺失值
    data['DateTime'] = data['DateTime'].astype('int64') // 10**9

    # 假设空间坐标
    data['Space'] = range(len(data))

    # 特征和标签
    X = data[['Space', 'DateTime']]
    y = data[['WaterLevel', '流量']]

    # 数据标准化
    x_scaler = MinMaxScaler()
    y_scaler = StandardScaler()
    X_scaled = x_scaler.fit_transform(X)
    y_scaled = y_scaler.fit_transform(y)

    # 分割数据为训练集和测试集
    X_train, X_test, y_train, y_test = train_test_split(X_scaled, y_scaled, test_size=0.2, random_state=42)

    return X_train, X_test, y_train, y_test, x_scaler, y_scaler

二、model

import torch
import torch.nn as nn
import torch.autograd as autograd

class PINN(nn.Module):
    def __init__(self, gravity=9.81):
        super(PINN, self).__init__()
        self.gravity = gravity
        self.dense1 = nn.Linear(2, 50)  # 假设输入是位置和时间
        self.dense2 = nn.Linear(50, 50)
        self.dense3 = nn.Linear(50, 50)
        self.out = nn.Linear(50, 2)  # 输出水位h和速度u

        self.activation = nn.Tanh()

    def forward(self, inputs):
        x = self.activation(self.dense1(inputs))
        x = self.activation(self.dense2(x))
        x = self.activation(self.dense3(x))
        return self.out(x)

    def physics(self, inputs):
        inputs.requires_grad_(True)
        h_u = self(inputs)
        h = h_u[:, 0]
        u = h_u[:, 1]

        h_t = autograd.grad(h.sum(), inputs, create_graph=True)[0][:, 1]
        h_x = autograd.grad(h.sum(), inputs, create_graph=True)[0][:, 0]
        u_t = autograd.grad(u.sum(), inputs, create_graph=True)[0][:, 1]
        u_x = autograd.grad(u.sum(), inputs, create_graph=True)[0][:, 0]

        continuity = h_t + (h * u_x + u * h_x)
        momentum = (h * u).t() + autograd.grad((h * u**2 + 0.5 * self.gravity * h**2).sum(), inputs, create_graph=True)[0][:, 0]

        return continuity, momentum

    def loss(self, inputs, outputs, targets):
        prediction_loss = nn.MSELoss()(outputs, targets)
        continuity_res, momentum_res = self.physics(inputs)
        physics_loss = torch.mean(continuity_res**2 + momentum_res**2)

        total_loss = prediction_loss + physics_loss
        return total_loss

三、train

import torch
from torch.optim import Adam
from model import PINN
from data_preprocess import preprocess_data
from config import learning_rate, epochs, batch_size

def train_model(X_train, y_train):
    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
    model = PINN().to(device)
    optimizer = Adam(model.parameters(), lr=learning_rate)

    model.train()
    for epoch in range(epochs):
        optimizer.zero_grad()
        inputs = torch.tensor(X_train).float().to(device)
        targets = torch.tensor(y_train).float().to(device)
        outputs = model(inputs)
        loss = model.loss(inputs, outputs, targets)
        loss.backward()
        optimizer.step()

        if epoch % 100 == 0:
            print(f"Epoch {epoch}, Loss: {loss.item()}")

    return model

if __name__ == "__main__":
    X_train, _, y_train, _, _, _ = preprocess_data('./阳朔水站流量流速数据.xlsx')
    trained_model = train_model(X_train, y_train)
    torch.save(trained_model.state_dict(), 'trained_pinn_model.pth')

训练结果:

2d7b9b943f064849b8d3770443862173.png

四、test

import torch
from model import PINN
from data_preprocess import preprocess_data

def test_model(model_path, X_test, y_test):
    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
    model = PINN().to(device)
    model.load_state_dict(torch.load(model_path))
    # 保留模型在训练模式以保持梯度计算,或者确保模型中的物理损失计算适当处理
    model.train()

    # 确保输入启用梯度计算
    inputs = torch.tensor(X_test, requires_grad=True).float().to(device)
    targets = torch.tensor(y_test).float().to(device)

    predictions = model(inputs)
    test_loss = model.loss(inputs, predictions, targets)  # 这里计算包括物理损失在内的总损失
    print(f"Test Loss: {test_loss.item()}")

if __name__ == "__main__":
    _, X_test, _, y_test, _, _ = preprocess_data('./阳朔水站流量流速数据.xlsx')
    model_path = 'trained_pinn_model.pth'
    test_model(model_path, X_test, y_test)

测试结果:9b86bd5553e8468c8a8f0cf1daab7cb8.png                                                                  可视化结果:

80a703bb9bb4491c9d67885e6f29a9db.png

 

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

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

相关文章

【鸿蒙学习】HarmonyOS应用开发者基础 - 白皮书V3.0的关键知识点

本文内容由智谱清言的长文章解读生成。 智谱AI(https://zhipuai.cn/) 白皮书V3.0这份文档详细介绍了鸿蒙生态应用开发的各个方面,涵盖了从核心概念到开发流程、测试和运维分析的各个环节。由于这本书有128页,读完时间较长&#xf…

Java数组02:数组内存分析、三种初始化方式及特点

本节内容视频链接:Java数组03:三种初始化及内存分析_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV12J41137hu?p53&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 1.数组内存分析 堆:存放new的对象和数组;可以被所有线…

【精选】基于Python大型购物商城系统(京东购物商城,淘宝购物商城,拼多多购物商城爬虫系统)

目录: 目录: 系统介绍: 系统开发技术 Python语言 Django框架简介 MySQL数据库技术 B/S架构 系统设计 系统总体设计 系统详细界面实现: 系统测试 测试目的 测试用例 本章小结 参考代码: 为什么选择我&…

【C语言可变参数函数的使用与原理分析】

文章目录 1 前言2 实例2.1实例程序2.2程序执行结果2.3 程序分析 3 补充4 总结 1 前言 在编程过程中,有时会遇到需要定义参数数量不固定的函数的情况。 C语言提供了一种灵活的解决方案:变参函数。这种函数能够根据实际调用时的需求,接受任意…

yum 源更新

本人使用Centos7系统; 系统自带的Yum源地址,下载速度又慢,而且有些包还是没有的,于是考虑将yum进行更换,可以更换为国内其他厂商的yum源,比如:阿里、腾讯、163、清华的,尽可能汇总&…

如何有效利用渗压计来避免溃坝风险

有效利用渗压计来避免溃坝风险是一个综合性的过程,涉及渗压计的安装、监测、数据分析以及应急响应等多个方面。以下是一些关键步骤和建议: 选择合适的渗压计: 根据具体工程需求和环境条件,选择合适的渗压计类型确保渗压计的质量可…

嘀嗒出行拼车系统源码

嘀嗒出行APP的开发需求与功能架构主要围绕提升用户出行体验、提高匹配效率、保障行程安全以及满足多样化的出行需求来构建。以下是对嘀嗒出行APP开发需求与功能架构的详细解析 一、开发需求 市场需求:随着出行市场的竞争加剧,嘀嗒出行需要不断提高自身服…

Codigger 视频会议(Meeting):医疗行业的创新协作利器

在当今数字化快速发展的时代,医疗行业也在不断拥抱信息技术带来的变革。远程医疗协作作为提升医疗服务效率和质量的重要手段,正日益受到关注。而 Codigger 视频会议(Meeting)则成为了医疗领域中一颗璀璨的明星,为医疗行…

Cacti SQL注入漏洞分析(CVE-2023-51448)

Cacti 为全球用户提供强大且可扩展的运营监控和故障管理框架。它还是一个完整的网络绘图解决方案,旨在利用RRDTool的数据存储和绘图功能。Cacti 包括一个完全分布式和容错的数据收集框架、用于设备、图表和树的高级基于模板的自动化功能、多种数据采集方法、通过插件…

自然语言处理系列三十三》 语义相似度》同义词词林》算法原理

注:此文章内容均节选自充电了么创始人,CEO兼CTO陈敬雷老师的新书《自然语言处理原理与实战》(人工智能科学与技术丛书)【陈敬雷编著】【清华大学出版社】 文章目录 自然语言处理系列三十三同义词词林算法原理代码实战 总结 自然语…

软件测试面试题整理(一)之自动化测试题大合集

1 什么是POM,为什么要使用它? POM是Page Object Model的简称,它是一种设计思想,而不是框架。大概的意思是,把一个一个页面,当做一个对象,页面的元素和元素之间操作方法就是页面对象的属性和行为…

甘肃旅游服务平台代码--论文pf

TOC springboot422甘肃旅游服务平台代码--论文pf 绪论 1.1 研究背景 现在大家正处于互联网加的时代,这个时代它就是一个信息内容无比丰富,信息处理与管理变得越加高效的网络化的时代,这个时代让大家的生活不仅变得更加地便利化&#xff0…

基于java的养老服务系统/基于web的养老院管理系统

摘要 随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,养老服务当然也不能排除在外,从健康体检、体检预约的统计和分析,在过程中会产生大量的、各种各样的…

WLAN射频调优

射频调优的基本原则 信道优化的基本原则 2.4G射频在非高密部署场景中推荐采用1、6、11这种3个不重叠的信道进行规划,同理也可以选用2、7、12或3、8、13的组合方式;在高密部署场景中则推荐采用1、5、9、13共4个信道组合进行规划。5G射频推荐采用36、40、…

【二分查找】--- 进阶题目赏析

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏: 算法Journey 本篇博客我们继续来了解一些有关二分查找算法的进阶题目。 🏠 寻找峰值 📌 题目内容 162. 寻找峰值 - 力扣&#…

使用QGraphicsView思想做一个简单图片查看器

使用QGraphicsView思想做一个简单图片查看器 如果要做一个图片查看器,支持放大、滚动操作,比较直接的方法是,使用QWidget来显示完整图片,将QWidget放入QScrollArea。缩放时调整QWidget的尺寸,QScrollArea会自动调整滚…

C++_基本语法笔记_仿函数和算法接口

函数对象 概念和使用 切记:仿函数,本质是一个类因为是一个类,所以要把operator() 放在一个类里面 像普通函数(需要通过某个类使用)一样使用,并且有返回值: 内置当前函数对象的状态&#xff1…

基于Springboot的多功能智能点餐小程序/基于微信小程序的点餐系统

摘要 计算机网络如果结合使用信息管理系统,能够提高管理员管理的效率,改善服务质量。优秀的智能点餐系统能够更有效管理用户智能点餐业务规范,帮助管理者更加有效管理用户智能点餐,可以帮助提高克服人工管理带来的错误等不利因素。…

牛客网SQL进阶135 :每个6/7级用户活跃情况

每个67级用户活跃情况_牛客题霸_牛客网 0 问题描述 基于用户信息表user_info、、试卷作答记录表exam_record、题目练习记录表practice_record,统计 每个6/7级用户总活跃月份数、2021年活跃天数、2021年试卷作答活跃天数、2021年答题活跃天数,结果 按照总…

C语言典型例题41

《C程序设计教程(第四版)——谭浩强》 习题3.1 写出下列各个表达式的值。设a3,b4,c5。 (1) ab>c && bc (2) a||bc && b-c (3) !(a>b) && !c || 1 (4) …