PINN解PDE完整代码赏鉴(pytorch)

目录

文献阅读-物理融合深度学习综述-PINN-有代码_哔哩哔哩_bilibili

 定义MLP(nn子类)

定义求导/梯度gradients(u,x,order=1) 

关于另一种写法(批量求导在提取) 

关于unsqueeze

​编辑 

损失函数的定义

 第一个物理损失loss1:

 第二个物理损失loss2:

训练train

 overlook(糊但可以看个大概)

 Q


鸣谢大佬

文献阅读-物理融合深度学习综述-PINN-有代码_哔哩哔哩_bilibili

 定义MLP(nn子类)

代码简介:

定义MLP(继承torch的nn)

        定义 self的net属性:利用sq序列构建全连接层+激活(tanh)

定义forward(x)

        return net(x)

定义求导/梯度gradients(u,x,order=1) 

 嵌入torch的autograd的grad,把它改造成可以求多次导数的形式(利用递归写)

 注意create graph要是true,才好算

关于另一种写法(批量求导在提取) 

关于unsqueeze

接受的参数是第个维度 

-1当然就是倒数第一维的意思啦。

预计输出u_x的形状从(a,)变成(a,1)

 

损失函数的定义

 第一个物理损失loss1:

说是物理知识,其实就是自己造的待求解的PDE(ux+uut-uxx)与0的mse误差

 第二个物理损失loss2:

说是物理知识,其实就是自己的初值和自己设置的pde初值(sinπx)的mse误差

loss是他俩和,可加权

注意点:

1.x&t保留梯度require grad=true

2.输出与u保持一致

训练train

代码简介:

类.train()(继承torchNN的train方法)

优化器:torch自带adam

                优化对象应该是loss

1000轮循环:

        opt零梯度

        计算loss

        取出loss。depatch

        反向传播(loss。backward())

        优化器。step()

 overlook(糊但可以看个大概)

跟刚才对应

定义类

 上接forward

loss1 

loss1和loss 2

 

train() 上接train及收尾if__name

 Q

いつ把loss放进opt了?还是说把loss。backward自动默认梯度取他的梯度【按优化器指示】下降? 

### 关于PINN代码实例 对于希望了和实践PINN(物理信息神经网络)的人来说,有多个开源项目提供了丰富的代码示例。 #### 使用`pinn`库实现PINN 在`pinn`项目的GitHub页面上提供了一个简单的例子来展示如何设置并运行一个基本的PINN模型[^1]。此项目不仅包含了详细的文档说明,还附带了一些实用的例子帮助初学者快速入门: ```python from pinn import PhysicsInformedNN, DataGenerator import numpy as np # 定义数据集生成器 data_gen = DataGenerator() # 初始化PINN模型 model = PhysicsInformedNN(layer_sizes=[2, 20, 20, 20, 1], lb=np.array([0.0]), ub=np.array([1.0])) # 训练模型 model.train(data=data_gen.generate_data(), epochs=1000) # 预测新样本的结果 prediction = model.predict(np.random.rand(10).reshape(-1, 1)) print(prediction) ``` 这段代码展示了如何创建一个基于两层输入的数据集,并定义一个四隐藏层每层含20个节点的神经网络结构用于逼近未知函数;接着通过调用`.train()`方法来进行训练过程,在完成之后可以通过`.predict()`接口获取预测值。 #### 波动方程求-PINN_Wave案例研究 另一个具体的实施案例可以在[PINN_Wave](https://gitcode.com/gh_mirrors/pi/pinn_wave)找到,这里专注于利用PINNs决波动方程问题[^2]。该项目同样给出了完整Python脚本作为指导材料供开发者参考学习。 #### 更广泛的科学计算工具包-DeepXDE 除了上述特定应用场景外,如果寻求更通用且功能强大的框架,则可以考虑[DeepXDE](https://github.com/lululxvi/deepxde),它是一个专为科学研究设计的支持多领域建模的强大平台[^3]。下面是一段来自官方仓库内的简单演示片段: ```python import deepxde as dde dde.config.set_default_float("float64") def pde(x, y): dy_t = dde.grad.jacobian(y, x, i=0, j=1) dy_xx = dde.grad.hessian(y, x, component=0, i=0, j=0) return dy_t - 0.01 / np.pi * dy_xx + u * dy_x geom = dde.geometry.Interval(-1, 1) timedomain = dde.geometry.TimeDomain(0, 1) geomtime = geom * timedomain bc = dde.DirichletBC(geomtime, lambda _: 0, lambda _, on_boundary: on_boundary) ic = InitialCondition(geomtime, func=lambda x: -np.sin(np.pi * x[:, 0:1])) data = dde.data.PDE( geomtime, pde, [bc, ic], num_domain=2540, num_boundary=80, num_initial=160, train_distribution="pseudo", ) net = dde.nn.FNN([2] + [20] * 3 + [1], "tanh", "Glorot normal") model = dde.Model(data, net) model.compile("adam", lr=1e-3, metrics=["l2 relative error"]) losshistory, train_state = model.train(iterations=15000) ``` 以上代码实现了对一维Burgers' 方程的时间依赖型偏微分方程(PDE) 的数值近似决方案,其中涉及到边界条件设定、初始状态指定以及损失函数的选择等多个方面的工作流程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值