PINN ipynb
时间: 2025-01-02 14:33:57 浏览: 23
### PINN 物理信息神经网络 Jupyter Notebook 示例
PINN(Physics-Informed Neural Networks)是一种能够将物理定律嵌入到机器学习模型中的技术,特别适用于求解偏微分方程(PDE)[^1]。下面展示了一个简单的PINN实现案例,该案例使用Python编写,并利用PyTorch框架完成。
#### 谐振子问题的PINN解决方案
为了更好地理解如何构建和训练一个PINN,在此提供一段针对一维线性谐振子系统的代码片段作为实例:
```python
import torch
from torch import nn, optim
import numpy as np
import matplotlib.pyplot as plt
class HarmonicOscillator(nn.Module):
def __init__(self):
super(HarmonicOscillator, self).__init__()
self.fc = nn.Sequential(
nn.Linear(1, 20),
nn.Tanh(),
nn.Linear(20, 20),
nn.Tanh(),
nn.Linear(20, 1)
)
def forward(self, t):
u = self.fc(t)
return u
def compute_loss(model, k=1., m=1.):
model.train()
optimizer.zero_grad()
# 定义时间区间内的采样点数
Nt = 50
ts = torch.linspace(-torch.pi/2, torch.pi/2, steps=Nt).reshape((-1, 1))
us = model(ts)
# 计算导数 dudt 和 d2udt2 使用自动微分工具 autograd.grad
du_dt = torch.autograd.grad(us.sum(), ts, create_graph=True)[0]
d2u_dt2 = torch.autograd.grad(du_dt.sum(), ts, create_graph=True)[0]
# 构建损失函数 L = (m*d2u/dt2 + k*u)^2 的均值
loss = ((m * d2u_dt2 + k * us)**2).mean()
loss.backward()
optimizer.step()
return float(loss)
if __name__ == '__main__':
epochs = 2000
learning_rate = 0.01
net = HarmonicOscillator().double() # 创建模型对象
optimizer = optim.Adam(net.parameters(), lr=learning_rate)
losses = []
for epoch in range(epochs):
l = compute_loss(net)
if epoch % 100 == 99:
print(f'Epoch {epoch}, Loss: {l:.8f}')
losses.append(l)
with torch.no_grad():
test_ts = torch.linspace(-np.pi / 2, np.pi / 2, 100).view(-1, 1)
pred_us = net(test_ts).numpy()
fig, ax = plt.subplots(figsize=(7, 4))
ax.plot(test_ts.numpy(), pred_us, label='Predicted')
exact_solution = lambda t: np.cos(t) # 此处假设k=m=ω²=1的情况下的解析解cos(t)
ax.plot(test_ts.numpy(), exact_solution(test_ts), '--', c='red', lw=3, alpha=.6, label='Exact Solution')
ax.legend(loc="best")
plt.show()
```
上述代码展示了怎样定义一个用于模拟简单谐振子运动规律的PINN结构,并对其进行参数优化的过程[^3]。通过这种方式可以得到近似于真实情况的结果曲线图。
阅读全文