PINN方程残差以及损失函数的理解
一、计算方程残差
def net_f(self, x, t):
u = self.net_u(x, t)
u_t = torch.autograd.grad(u, t, grad_outputs=torch.ones_like(u), create_graph=True)[0]
u_x = torch.autograd.grad(u, x, grad_outputs=torch.ones_like(u), create_graph=True)[0]
u_xx = torch.autograd.grad(u_x, x, grad_outputs=torch.ones_like(u_x), create_graph=True)[0]
f = u_t + u * u_x - self.nu * u_xx
return f # 方程的残差
理解:net_f是计算方程的残差
① 计算u_t:对u关于t的梯度
② 计算u_x:对u关于x的梯度
③ 计算u_xx:对u_x关于x的梯度
④ 残差计算:f = u_t + u * u_x - self.nu * u_xx
二、损失函数
def loss_func(self):
u_pred = self.net_u(self.x_u, self.t_u)
f_pred = self.net_f(self.x_f, self.t_f)
loss_u = torch.mean((self.u - u_pred) ** 2)
loss_f = torch.mean(f_pred ** 2)
return loss_u + loss_f
理解:
x_f与t_f:它们是X_f_train的两列,而X_f_train是在x,t范围内随机生成的数据点
loss_u:是初始边界条件的损失(通过前馈神经网络捕获的差异项)
loss_f:是为了让模型学习把loss_f降到最小,使参数能够学习到物理方程的规律
两者相加loss_f+loss_u构成了PINN