Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

solving pinn #59

Open
AAB28 opened this issue Jul 18, 2024 · 0 comments
Open

solving pinn #59

AAB28 opened this issue Jul 18, 2024 · 0 comments

Comments

@AAB28
Copy link

AAB28 commented Jul 18, 2024

in this given code set for the particular pinn of the second order differential wave equation,with every training i am getting a different solutions instead of a particular solution and my model is not following the ic annd bc,moreover i took the codes from github and tried to incorporate it with mine,
import torch
import torch.nn as nn
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

Check device

device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")

Define the neural network

class Net(nn.Module):
def init(self):
super(Net, self).init()
self.hidden_layer1 = nn.Linear(2, 50) # Increased number of neurons
self.hidden_layer2 = nn.Linear(50, 50)
self.hidden_layer3 = nn.Linear(50, 50)
self.hidden_layer4 = nn.Linear(50, 50)
self.hidden_layer5 = nn.Linear(50, 50)
self.output_layer = nn.Linear(50, 1)

def forward(self, x, t):
    inputs = torch.cat([x, t], axis=1)
    layer1_out = torch.tanh(self.hidden_layer1(inputs))  # Changed activation function
    layer2_out = torch.tanh(self.hidden_layer2(layer1_out))
    layer3_out = torch.tanh(self.hidden_layer3(layer2_out))
    layer4_out = torch.tanh(self.hidden_layer4(layer3_out))
    layer5_out = torch.tanh(self.hidden_layer5(layer4_out))
    output = self.output_layer(layer5_out)
    return output

Initialize the neural network

net = Net().to(device)
mse_cost_function = nn.MSELoss()
optimizer = torch.optim.Adam(net.parameters(), lr=0.001)

Parameters for the wave equation

Nx = 100 # Number of spatial points
Nt = 100 # Number of time points
L = 1.0 # Length of spatial domain
T = 1.0 # Total time
c = 1.0 # Speed of wave propagation

Calculate spatial and time steps

hx = L / (Nx - 1)
ht = T / (Nt - 1)

Generate training data

x = np.linspace(0, L, Nx)
t = np.linspace(0, T, Nt)
x, t = np.meshgrid(x, t)
x = x.reshape(-1, 1)
t = t.reshape(-1, 1)

Initial Conditions

u_init = np.zeros((Nx, Nt))
u_init[10:30, 0] = 0.5
u_init[10:30, 1] = 0.5

Boundary Conditions

def boundary_conditions(t):
return np.zeros_like(t)

Collocation Points for PDE Residual

x_collocation = np.random.uniform(low=0.0, high=L, size=(10000, 1))
t_collocation = np.random.uniform(low=0.0, high=T, size=(10000, 1))
all_zeros = np.zeros((10000, 1))

PDE loss function

def f(x, t, net):
x.requires_grad_(True)
t.requires_grad_(True)

u = net(x, t)
u_x = torch.autograd.grad(u.sum(), x, create_graph=True)[0]
u_xx = torch.autograd.grad(u_x.sum(), x, create_graph=True)[0]
u_t = torch.autograd.grad(u.sum(), t, create_graph=True)[0]
u_tt = torch.autograd.grad(u_t.sum(), t, create_graph=True)[0]
pde = u_tt - c**2 * u_xx
return pde

Training parameters

iterations = 5000

Training the PINN

for epoch in range(iterations):
optimizer.zero_grad()

# Initial Conditions Loss
x_ic = np.linspace(0, L, Nx).reshape(-1, 1)
t_ic = np.zeros((Nx, 1))
t_ic_sec = np.ones((Nx, 1)) * ht
u_ic_first = u_init[:, 0].reshape(-1, 1)
u_ic_sec = u_init[:, 1].reshape(-1, 1)

pt_x_ic = torch.from_numpy(x_ic).float().to(device)
pt_t_ic_first = torch.from_numpy(t_ic).float().to(device)
pt_t_ic_sec = torch.from_numpy(t_ic_sec).float().to(device)
pt_u_ic_first = torch.from_numpy(u_ic_first).float().to(device)
pt_u_ic_sec = torch.from_numpy(u_ic_sec).float().to(device)

net_ic_out_first = net(pt_x_ic, pt_t_ic_first)
net_ic_out_sec = net(pt_x_ic, pt_t_ic_sec)
mse_ic_first = mse_cost_function(net_ic_out_first, pt_u_ic_first)
mse_ic_sec = mse_cost_function(net_ic_out_sec, pt_u_ic_sec)

# Boundary Conditions Loss
t_bc = np.linspace(0, T, Nt).reshape(-1, 1)
x_bc_first = np.zeros((Nt, 1))
x_bc_sec = np.ones((Nt, 1)) * L

pt_x_bc_first = torch.from_numpy(x_bc_first).float().to(device)
pt_x_bc_sec = torch.from_numpy(x_bc_sec).float().to(device)
pt_t_bc = torch.from_numpy(t_bc).float().to(device)

pt_u_bc_first = torch.from_numpy(boundary_conditions(t_bc)).float().to(device)
pt_u_bc_sec = torch.from_numpy(boundary_conditions(t_bc)).float().to(device)

net_bc_out_first = net(pt_x_bc_first, pt_t_bc)
net_bc_out_sec = net(pt_x_bc_sec, pt_t_bc)

mse_bc_first = mse_cost_function(net_bc_out_first, pt_u_bc_first)
mse_bc_sec = mse_cost_function(net_bc_out_sec, pt_u_bc_sec)

# PDE Loss
pt_x_collocation = torch.from_numpy(x_collocation).float().to(device)
pt_t_collocation = torch.from_numpy(t_collocation).float().to(device)
pt_all_zeros = torch.from_numpy(all_zeros).float().to(device)

f_out = f(pt_x_collocation, pt_t_collocation, net)
mse_f = mse_cost_function(f_out, pt_all_zeros)

# Combine the loss functions
loss = mse_ic_first + mse_ic_sec + mse_bc_first + mse_bc_sec + mse_f

loss.backward()
optimizer.step()

# Print and monitor training progress
if epoch % 100 == 0:
    with torch.autograd.no_grad():
        print(f'Epoch {epoch}, Training Loss: {loss.item()}')

Visualization

with torch.no_grad():
x_vis = np.linspace(0, L, Nx)
t_vis = np.linspace(0, T, Nt)
ms_x, ms_t = np.meshgrid(x_vis, t_vis)
x_flat = ms_x.ravel().reshape(-1, 1)
t_flat = ms_t.ravel().reshape(-1, 1)

pt_x_vis = torch.from_numpy(x_flat).float().to(device)
pt_t_vis = torch.from_numpy(t_flat).float().to(device)
pt_u_vis = net(pt_x_vis, pt_t_vis).cpu().numpy().reshape(ms_x.shape)

# Plot 3D surface plot
fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(ms_x, ms_t, pt_u_vis, cmap='viridis')

ax.set_xlabel('x')
ax.set_ylabel('t')
ax.set_zlabel('u')
ax.set_title('3D Surface Plot of Wave Equation Solution')
plt.show()

Save Model

torch.save(net.state_dict(), "model_wave.pt")
I am unable to find the error.Someone pplease suggest some help as this is very new to me and i am a noob in it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant