| | | | |

4.3 PINN com Parâmetro a Determinar

Ajude a manter o site livre, gratuito e sem propagandas. Colabore!

Em construção

Vamos considerar uma equação diferencial

L(u;λ)=f,𝒙Dn, (4.13)

onde L é um operador em funções u=u(𝒙), λ é um parâmetro a determinar e f uma dada função fonte. Assumimos conhecidas condições inicial e de contorno, bem como um conjunto de amostras

𝒟:={(𝒙(s),u(s))}s=1ns, (4.14)

com 𝒙(s)D e u(s)=u(𝒙(s)).

Uma rede informada pela física (PINN, do inglês, Physics-informed neural network) com parâmetro a determinar é uma rede neural

u~=𝒩(𝒙;λ), (4.15)

em que u~ é a solução estimada do modelo dado pela equação diferencial (4.13) com dadas condições inicial e de contorno, em que o parâmetro λ é estimado tal que

u~(s)u(s),(𝒙(s),u(s))𝒟. (4.16)
Refer to caption
Figura 4.2: Esquema de uma PINN u~=𝒩(𝒙;λ).

Considerando uma rede do tipo perceptron multicamadas (MLP, do inglês, multilayer perceptron, consulte Fig. 4.2), seus pesos e biases são treinados em conjunto com parâmetro λ de forma a minimizar a função de perda

ελ:=1nins=1nin|λ(𝒙in(s))|2pts. internos (4.17)
+1nccs=1ncc|u~ccucc|2c.i. & c.c.
+pnss=1ns|u~(s)u(s)|2amostras,

onde p0 é uma penalidade e

λ(𝒙):=fL(u;λ) (4.18)

é o resíduo de (4.13).

Exemplo 4.3.1.

Consideramos a equação de Fisher1212endnote: 12Ronald Aylmer Fisher, 1890-1962, biólogo inglês. Fonte: Wikipédia: Ronald Fisher.

ut=uxx+λu(1u),(t,x)(0,tf)×(0,1), (4.19)

com o parâmetro λ>0 a determinar. Assumimos dadas condição inicial

u(0,x)=1(1+eλ6x)2,x[0,1], (4.20)

e condições de contorno

ux(t,0)=1(1+e56λt)2, (4.21)
ux(t,0)=1(1+eλ656λt)2. (4.22)

Este problema tem solução analítica [1]

ua(t,x)=1(1+eλ6x56λt)2. (4.23)

Como exemplo de aplicação de uma PINN com parâmetro a determinar, vamos assumir o seguinte conjunto de amostras

𝒟={((t(s),x(s)),u(s))}s=1ns, (4.24)

com (t(s),x(s)){0.1,0.2,0.3}×{0.25,0.5,0.75} e u(s)=ua(t(s),x(s)).

Refer to caption
Figura 4.3: Solução PINN versus analítica para λ=6.
Código 15: ex_pinn_fisher.py
1import torch
2
3# modelo
4nh = 4
5nn = 50
6fun = torch.nn.Tanh()
7model = torch.nn.Sequential()
8model.add_module('layer_1', torch.nn.Linear(2, nn))
9model.add_module('fun_1', fun)
10for l in range(2, nh+1):
11    model.add_module(f'layer_{l}', torch.nn.Linear(nn, nn))
12    model.add_module(f'fun_{l}', fun)
13model.add_module(f'layer_{nh+1}', torch.nn.Linear(nn, 1))
14
15# parâmetro
16rgn = [5., 7]
17model.lmbda = torch.nn.Parameter(
18    data=(rgn[1]-rgn[0])*torch.rand(1)+rgn[0])
19
20# otimizador
21optim = torch.optim.Adam(model.parameters(), lr=0.001)
22
23# parâmetros do problema
24tf = 1.
25
26# solução analítica
27lmbda = torch.tensor([6.])
28def ua(t,x, lmbda=lmbda):
29    return 1./(1.+torch.exp(torch.sqrt(lmbda/6.)*x-5./6*lmbda*t))**2
30
31# condição inicial
32def u0(x, lmbda=lmbda):
33    return 1./(1.+torch.exp(torch.sqrt(lmbda/6)*x))**2
34
35# amostras
36ts = torch.tensor([0.1, 0.2, 0.3])
37xs = torch.tensor([0.25, 0.5, 0.75])
38T, X = torch.meshgrid(ts, xs, indexing='ij')
39Ss = torch.hstack((T.reshape(-1,1), X.reshape(-1,1)))
40Us_exp = ua(T, X).reshape(-1,1)
41
42# treinamento
43nepochs = 50000
44tol = 1e-5
45
46eout = 100
47
48sin = 50
49penalty = 1e1
50
51for epoch in range(nepochs):
52
53    # forward
54
55    ## pts internos
56    tsin = tf*torch.rand(sin, 1)
57    xsin = torch.rand(sin, 1)
58    Sin = torch.hstack((tsin, xsin))
59    Sin.requires_grad = True
60
61    Uin = model(Sin)
62
63    ## loss pts internos
64    DUin = torch.autograd.grad(
65        Uin, Sin,
66        torch.ones_like(Uin),
67        create_graph=True,
68        retain_graph=True)[0]
69    Uin_t = DUin[:,0:1]
70    Uin_x = DUin[:,1:2]
71
72    Uin_xx = torch.autograd.grad(
73        Uin_x, Sin,
74        torch.ones_like(Uin_x),
75        create_graph=True,
76        retain_graph=True)[0][:,1:2]
77
78
79    lin = torch.mean((Uin_t - Uin_xx \
80                      - model.lmbda*Uin*(1-Uin))**2)
81
82    ## cond. inicial
83    S0 = torch.hstack((torch.zeros_like(xsin), xsin))
84
85    U0 = model(S0)
86
87    ## loss cond. inicial
88    l0 = torch.mean((U0 - u0(xsin))**2)
89
90    ## cond. de contorno
91    Sbc0 = torch.hstack((tsin, torch.zeros_like(xsin)))
92    Sbc1 = torch.hstack((tsin, torch.ones_like(xsin)))
93    Sbc = torch.vstack((Sbc0, Sbc1))
94
95    Ubc_exp = ua(Sbc[:,0:1],Sbc[:,1:2])
96    Ubc_est = model(Sbc)
97
98    ## loss cond. de contorno
99    lbc = torch.mean((Ubc_est - Ubc_exp)**2)
100
101    ## amostras
102    Us_est = model(Ss)
103
104    ## loss amostras
105    ls = torch.mean((Us_est - Us_exp)**2)
106
107    ## loss total
108    loss = lin + l0 + lbc + penalty*ls
109
110    if ((epoch % eout == 0) or (loss.item() < tol)):
111        print(f'epoch: {epoch}, '\
112              + f'loss={loss.item():.4e}, '\
113              + f'lmbda={model.lmbda.item():.3f}')
114
115    if (loss.item() < tol):
116        break
117
118    optim.zero_grad()
119    loss.backward()
120    optim.step()

4.3.1 Exercícios

Em construção

Exemplo 4.3.2.

Considere o seguinte problema de valor inicial

u′′=λsen(πx), 0<x<1, (4.25a)
u(0)=u(1)=0, (4.25b)

onde λ>0 é um parâmetro a determinar. Dadas as amostras

𝒟={(16,12),(14,22),(13,33)}, (4.26)

crie uma PINN

u~=𝒩(x;λ) (4.27)

para estimar o parâmetro λ e a solução em todo o domínio 0x1.

Resposta.

λ=π2

Exemplo 4.3.3.

Considere o problema de Poisson1313endnote: 13Siméon Denis Poisson, 1781 - 1840, matemático francês. Fonte: Wikipédia:Siméon Denis Poisson.

u=λ,(x,y)D=(1,1)2, (4.28a)
u=0,(x,y)D, (4.28b)

onde λ>0 é um parâmetro a determinar. Dado que u(1/2,1/2)=1/8, crie uma PINN

u~=𝒩(x,y;λ) (4.29)

para estimar o parâmetro λ e a solução em todo o domínio D.

Resposta.

λ=1

Exemplo 4.3.4.

Considere o problema de calor

ut=λuxx+(π21)etsen(πx),(t,x)(0,1)2, (4.30a)
u(0,x)=sen(πx),x[0,1], (4.30b)
u(t,0)=u(t,1)=0,t[0,1], (4.30c)

onde o coeficiente de difusão λ>0 é um parâmetro a determinar. Sabendo que o problema tem solução analítica

u(t,x)=etsen(πx), (4.31)

escolha um conjunto de amostras 𝒟={((t(s),x(s)),u(s))}s=1ns tal que seja possível estimar λ com uma PINN

u~=𝒩(t,x;λ). (4.32)
Resposta.

λ=1


Envie seu comentário

As informações preenchidas são enviadas por e-mail para o desenvolvedor do site e tratadas de forma privada. Consulte a Política de Uso de Dados para mais informações. Aproveito para agradecer a todas/os que de forma assídua ou esporádica contribuem enviando correções, sugestões e críticas!