PINN求解固体力学问题——论文加代码

PINN求解固体力学问题——论文加代码

论文:Physics-Informed Deep Learning and its Application in Computational Solid and Fluid Mechanics
随着深度学习的快速发展,利用神经网络(Neural Network, NN)求解各类科学计算问题受到了越来越多的关注,包括流场、应力场、热场等问题[1-2]。在固体力学领域,深度学习主要用于材料建模,通过NN取代传统的本构模型[3-5]。在这些应用中,基于大量训练样本的神经网络通过最小化损失来学习输入到输出的映射关系。然而,在实际应用中,获取大量的训练样本通常非常困难。为了有效减少对训练样本量的依赖,Raissi等[6-7]提出物理信息神经网络(Physics-Informed Neural Network, PINN)的方法。PINN可以在少量数据甚至没有数据下通过物理方程辅助学习实现对问题解的推断。该方法核心是通过惩罚的方式将物理约束(如偏微分方程,边界条件等)编码到损失函数中,从而将微分方程求解转化为最小化损失函数的优化问题,最后基于梯度的反向传播优化算法最小化损失,实现对问题解的预测推断。

在固体力学领域,弹性方程是描述材料在受力下变形行为的重要数学模型,理解和应用弹性方程对于设计和分析结构的性能和行为至关重要。线弹性,或弹性理论,是研究材料在外力作用下的形变和应力的学科,是连续介质力学的一个分支。这个理论在建筑、机械、航空航天和许多其他工程领域都有广泛的应用。近年来,PINN已成功地被应用于各种弹性方程的求解。Rao等[8]提出了基于PINN的线弹性方程求解方法,他们将偏微分方程(Partial Differential Equation,PDE)编码到损失函数中而边界(Boundary Condition,BC)通过强制约束方式编码到网络输出中,从而实现了线弹性方程的求解。Haghighat等[9]基于PINN,通过将动量平衡方程和本构方程编码到损失函数中,成功地求解了线弹性方程的正、逆问题。此外,W. Abueidda等[10]提出了一种基于PINN的超弹性方程求解方法,通过将PDE和BC以积分形式编码到损失函数进行约束求解。在此基础上,W. Abueidda等[11]利用PINN进一步研究了涉及不同材料形变的新胡克超弹性和冯·米塞斯塑性问题的求解。为了实现更高效的求解,Qin等[12]提出了基于元学习和PINN的超弹问题求解方法,通过相关超弹任务分布中学习后,实现新任务下超弹问题的求解。然而,与数值方法相比,PINN求解效率仍较低[13]。因此,如何结合PINN物理驱动优势来实现弹性方程地高效求解仍然是一个重要的挑战。

基本问题:

在这里插入图片描述

PINN的主要思想为先构建一个输出结果为 u u u 的神经网络,将其作为PDE解的代理模型,将PDE信息作为约束,编码到神经网络损失函数中进行训练。损失函数主要包括4部分:偏微分结构损失(PDE loss),边值条件损失(BC loss)、初值条件损失(IC loss)以及真实数据条件损失(Data loss)。

网格:
在这里插入图片描述

1. 训练

# %load Plane_Stress_W-PINNs.py
"""
Forward Problem for Plane Stress Linear Elasticity Boundary Value Problem
Weighted-Physics-Informed Neural Networks (W-PINNs)
Author: Alexandros D.L Papados

In this code we solve for the deformation of a material with Young's Modulus
of E = 1.0 GPA and Poisson Ratio of nu = 0.3. The deformation are represented
by u and v in the x and y directions respectively. We solve the following PDE using
W-PINNs:

                    G[u_xx + u_yy] + G((1+nu)/(1-nu))[u_xx + v_yx] = sin(2pi*x)sin(2pi*y)
                    G[v_xx + v_yy] + G((1+nu)/(1-nu))[v_yy + u_xy] = sin(pi*x)+ sin(2pi*y)

with Dirichlet boundary conditions.

The Neural Network is constructed as follows:
                                                         ( sigma(x,y,theta) )
                                                                                                       (  u(x,y)  )
                       ( x )                             ( sigma(x,y,theta) )                          (          )
             Input:            ----> Activation Layers:          .               ----> Output Layer:   (          )
                       ( y )                                     .                                     (          )
                                                                 .                                     (  v(x,y)  )
                                                         ( sigma(x,y,theta) )

The final output will be [x,y,u,v,e_x,e_y], where e_x and e_y are the strains in the x and y directions
respectively.

Default example is Domain I (Square Domain, [0,1]^2)
"""
import torch
import torch.nn as nn
import numpy as np
import time
import scipy.io

torch.manual_seed(123456)
np.random.seed(123456)

E = 1                                       # Young's Modulus
nu = 0.3                                    # Poisson Ratio
G = ((E/(2*(1+nu))))                        # LEBVP coefficient

class Model(nn.Module):
    def __init__(self):
        super(Model, self).__init__()
        self.net = nn.Sequential()                                                  # Define neural network
        self.net.add_module('Linear_layer_1', nn.Linear(2, 30))                     # First linear layer
        self.net.add_module('Tanh_layer_1', nn.Tanh())                              # First activation Layer
        for num in range(2, 7):                                                     # Number of layers (2 through 7)
            self.net.add_module('Linear_layer_%d' % (num), nn.Linear(30, 30))       # Linear layer
            self.net.add_module('Tanh_layer_%d' % (num), nn.Tanh())                 # Activation Layer
        self.net.add_module('Linear_layer_final', nn.Linear(30, 3))                 # Output Layer

    # Forward Feed
    def forward(self, x):
        return self.net(x)

    # Loss of PDE and BCs
    def loss(self, x, x_b, b_u,b_v,epoch
内容概要:本文主要介绍了鸿蒙原生应用开发过程中可能遇到的内存问题以及相应的解决方案。针对这些问题,华为提供的 DevEco Studio 包含了性能分析工具 DevEco Profiler,提供两种场景化的分析模板——Snapshot Insight 和 Allocation Insight,支持实时监控、ArkTS 和 Native 内存的深度分析。这使得开发者能够有效识别、定界定位并优化内存问题,大幅提升应用的稳定性和性能。此外,文章还介绍了 DevEco Studio 强大的模拟器功能,该模拟器能仿真各类设备及场景,包括GPS定位、导航和低电量管理,极大提高了开发效率和测试灵活性。最后,文中详细列出了常见的快捷键,并给出了保持 DevEco Studio 与 Android Studio 快捷键同步的方法。 适合人群:专注于鸿蒙生态系统内的应用开发的技术人员,特别是有一定经验的中级至高级程序员。 使用场景及目标:本文旨在帮助开发者更好地理解和掌握 DevEco Studio 的强大工具链,尤其是解决开发过程中经常遇见的内存管理和多设备兼容问题,目标是优化开发流程,减少调测时间,增强产品的质量和用户体验。 阅读建议:开发者可通过鸿蒙官方提供的资源链接下载最新版本的 DevEco Studio 并探索相关技术博客,以获得最新的技术和使用技巧。建议在实践中逐步熟悉各个功能模块,并积极利用性能分析工具和模拟器来解决现实中的问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小孟的CDN

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

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

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

打赏作者

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

抵扣说明:

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

余额充值