Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 5 additions & 4 deletions docs/zh/examples/nlsmb.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,8 @@

| 预训练模型 | 指标 |
|:--| :--|
| [NLS-MB_soliton_pretrained.pdparams](https://paddle-org.bj.bcebos.com/paddlescience/models/NLS-MB/NLS-MB_soliton_pretrained.pdparams) | loss(Residual): 0.00007<br>MSE.Schrodinger_1(Residual): 0.00002<br>MSE.Schrodinger_2(Residual): 0.00002<br>MSE.Maxwell_1(Residual): 0.00001<br>MSE.Maxwell_2(Residual): 0.00001<br>MSE.Bloch(Residual): 0.00001 |
| [NLS-MB_soliton_pretrained.pdparams](https://paddle-org.bj.bcebos.com/paddlescience/models/NLS-MB/NLS-MB_soliton_pretrained.pdparams) | Residual/loss: 0.00000<br>Residual/MSE.Schrodinger_1: 0.00000<br>Residual/MSE.Schrodinger_2: 0.00000<br>Residual/MSE.Maxwell_1: 0.00000<br>Residual/MSE.Maxwell_2: 0.00000<br>Residual/MSE.Bloch: 0.00000 |
| [NLS-MB_optical_rogue_wave.pdparams](https://paddle-org.bj.bcebos.com/paddlescience/models/NLS-MB/NLS-MB_optical_rogue_wave.pdparams) | Residual/loss: 0.00001<br>Residual/MSE.Schrodinger_1: 0.00000<br>Residual/MSE.Schrodinger_2: 0.00000<br>Residual/MSE.Maxwell_1: 0.00000<br>Residual/MSE.Maxwell_2: 0.00000<br>Residual/MSE.Bloch: 0.00000 |

## 1. 背景简介

Expand Down Expand Up @@ -238,18 +239,18 @@ examples/NLS-MB/NLS-MB_optical_soliton.py

<figure markdown>
![optical_soliton](https://paddle-org.bj.bcebos.com/paddlescience/docs/NLS-MB/pred_optical_soliton.png){ loading=lazy}
<figcaption>解析解结果与 PINN 预测结果对比,从上到下分别为:慢变电场(E),共振偏量(p)以及粒子数反转程度($\eta$)</figcaption>
<figcaption>解析解结果与 PINN 预测结果对比,从上到下分别为:慢变电场(E),共振偏量(p)以及粒子数反转程度(eta)</figcaption>
</figure>

### 5.2 optical_rogue_wave

<figure markdown>
![optical_rogue_wave](https://paddle-org.bj.bcebos.com/paddlescience/docs/NLS-MB/pred_optical_rogue_wave.png){ loading=lazy}
<figcaption>解析解结果与 PINN 预测结果对比,从上到下分别为:慢变电场(E),共振偏量(p)以及粒子数反转程度($\eta$)</figcaption>
<figcaption>解析解结果与 PINN 预测结果对比,从上到下分别为:慢变电场(E),共振偏量(p)以及粒子数反转程度(eta)</figcaption>
</figure>

可以看到PINN预测与解析解的结果基本一致。

## 6. 参考资料

[1] [S.-Y. Xu, Q. Zhou, and W. Liu, Prediction of Soliton Evolution and Equation Parameters for NLS–MB Equation Based on the phPINN Algorithm, Nonlinear Dyn (2023)](https://doi.org/10.1007/s11071-023-08824-w).
[1] [S.-Y. Xu, Q. Zhou, and W. Liu, Prediction of Soliton Evolution and Equation Parameters for NLS–MB Equation Based on the phPINN Algorithm, Nonlinear Dyn (2023)](https://doi.org/10.1007/s11071-023-08824-w).
26 changes: 20 additions & 6 deletions examples/NLS-MB/NLS-MB_optical_rogue_wave.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,8 @@

def analytic_solution(out):
I = 1j
x = out["x"]
t = out["t"]
x = out["x"]
EExact = (
(-1565 * x**2 + (648 * I + 76 * t) * x - 68 * t**2 + 51)
* np.exp(-I / 8 * (-12 * t + 65 * x))
Expand Down Expand Up @@ -149,14 +149,14 @@ def train(cfg: DictConfig):
idx_ub = np.random.choice(np.where(ub)[0], 200, replace=False)
icbc_idx = np.hstack((idx_lb, idx_ic, idx_ub))
X_u_train = X_star[icbc_idx].astype("float32")
X_u_train = {"x": X_u_train[:, 0:1], "t": X_u_train[:, 1:2]}
X_u_train = {"t": X_u_train[:, 1:2], "x": X_u_train[:, 0:1]}

Eu_train, Ev_train, pu_train, pv_train, eta_train = analytic_solution(X_u_train)

train_dataloader_cfg = {
"dataset": {
"name": "NamedArrayDataset",
"input": {"x": X_u_train["x"], "t": X_u_train["t"]},
"input": {"t": X_u_train["t"], "x": X_u_train["x"]},
"label": {
"Eu": Eu_train,
"Ev": Ev_train,
Expand Down Expand Up @@ -278,8 +278,8 @@ def train(cfg: DictConfig):
vis_points = geom["time_interval"].sample_interior(20000, evenly=True)
Eu_true, Ev_true, pu_true, pv_true, eta_true = analytic_solution(vis_points)
pred = solver.predict(vis_points, return_numpy=True)
x = vis_points["x"][:, 0]
t = vis_points["t"][:, 0]
x = vis_points["x"][:, 0]
E_ref = np.sqrt(Eu_true**2 + Ev_true**2)[:, 0]
E_pred = np.sqrt(pred["Eu"] ** 2 + pred["Ev"] ** 2)[:, 0]
p_ref = np.sqrt(pu_true**2 + pv_true**2)[:, 0]
Expand Down Expand Up @@ -354,8 +354,8 @@ def evaluate(cfg: DictConfig):
vis_points = geom["time_interval"].sample_interior(20000, evenly=True)
Eu_true, Ev_true, pu_true, pv_true, eta_true = analytic_solution(vis_points)
pred = solver.predict(vis_points, return_numpy=True)
x = vis_points["x"][:, 0]
t = vis_points["t"][:, 0]
x = vis_points["x"][:, 0]
E_ref = np.sqrt(Eu_true**2 + Ev_true**2)[:, 0]
E_pred = np.sqrt(pred["Eu"] ** 2 + pred["Ev"] ** 2)[:, 0]
p_ref = np.sqrt(pu_true**2 + pv_true**2)[:, 0]
Expand Down Expand Up @@ -417,11 +417,25 @@ def inference(cfg: DictConfig):
store_key: output_dict[infer_key]
for store_key, infer_key in zip(cfg.MODEL.output_keys, output_dict.keys())
}
# TODO: Fix this mapping diff in dy2st
(
output_dict["Eu"],
output_dict["Ev"],
output_dict["eta"],
output_dict["pu"],
output_dict["pv"],
) = (
output_dict["Eu"],
output_dict["Ev"],
output_dict["pu"],
output_dict["pv"],
output_dict["eta"],
)

# visualize prediction
Eu_true, Ev_true, pu_true, pv_true, eta_true = analytic_solution(input_dict)
x = input_dict["x"][:, 0]
t = input_dict["t"][:, 0]
x = input_dict["x"][:, 0]
E_ref = np.sqrt(Eu_true**2 + Ev_true**2)[:, 0]
E_pred = np.sqrt(output_dict["Eu"] ** 2 + output_dict["Ev"] ** 2)[:, 0]
p_ref = np.sqrt(pu_true**2 + pv_true**2)[:, 0]
Expand Down
27 changes: 20 additions & 7 deletions examples/NLS-MB/NLS-MB_optical_soliton.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@


def analytic_solution(out):
x, t = out["x"], out["t"]
t, x = out["t"], out["x"]
Eu_true = 2 * np.cos(2 * t) / np.cosh(2 * t + 6 * x)

Ev_true = -2 * np.sin(2 * t) / np.cosh(2 * t + 6 * x)
Expand Down Expand Up @@ -83,7 +83,6 @@ def plot(
plt.subplot(3, 3, 9)
plt.title("eta_diff")
plt.tricontourf(x, t, np.abs(eta_ref - eta_pred), levels=256, cmap="jet")

fig_path = osp.join(output_dir, "pred_optical_soliton.png")
print(f"Saving figure to {fig_path}")
fig.savefig(fig_path, bbox_inches="tight", dpi=400)
Expand Down Expand Up @@ -127,14 +126,14 @@ def train(cfg: DictConfig):
idx_ub = np.random.choice(np.where(ub)[0], 200, replace=False)
icbc_idx = np.hstack((idx_lb, idx_ic, idx_ub))
X_u_train = X_star[icbc_idx].astype("float32")
X_u_train = {"x": X_u_train[:, 0:1], "t": X_u_train[:, 1:2]}
X_u_train = {"t": X_u_train[:, 1:2], "x": X_u_train[:, 0:1]}

Eu_train, Ev_train, pu_train, pv_train, eta_train = analytic_solution(X_u_train)

train_dataloader_cfg = {
"dataset": {
"name": "NamedArrayDataset",
"input": {"x": X_u_train["x"], "t": X_u_train["t"]},
"input": {"t": X_u_train["t"], "x": X_u_train["x"]},
"label": {
"Eu": Eu_train,
"Ev": Ev_train,
Expand Down Expand Up @@ -256,8 +255,8 @@ def train(cfg: DictConfig):
vis_points = geom["time_interval"].sample_interior(20000, evenly=True)
Eu_true, Ev_true, pu_true, pv_true, eta_true = analytic_solution(vis_points)
pred = solver.predict(vis_points, return_numpy=True)
x = vis_points["x"][:, 0]
t = vis_points["t"][:, 0]
x = vis_points["x"][:, 0]
E_ref = np.sqrt(Eu_true**2 + Ev_true**2)[:, 0]
E_pred = np.sqrt(pred["Eu"] ** 2 + pred["Ev"] ** 2)[:, 0]
p_ref = np.sqrt(pu_true**2 + pv_true**2)[:, 0]
Expand Down Expand Up @@ -332,8 +331,8 @@ def evaluate(cfg: DictConfig):
vis_points = geom["time_interval"].sample_interior(20000, evenly=True)
Eu_true, Ev_true, pu_true, pv_true, eta_true = analytic_solution(vis_points)
pred = solver.predict(vis_points, return_numpy=True)
x = vis_points["x"][:, 0]
t = vis_points["t"][:, 0]
x = vis_points["x"][:, 0]
E_ref = np.sqrt(Eu_true**2 + Ev_true**2)[:, 0]
E_pred = np.sqrt(pred["Eu"] ** 2 + pred["Ev"] ** 2)[:, 0]
p_ref = np.sqrt(pu_true**2 + pv_true**2)[:, 0]
Expand Down Expand Up @@ -395,11 +394,25 @@ def inference(cfg: DictConfig):
store_key: output_dict[infer_key]
for store_key, infer_key in zip(cfg.MODEL.output_keys, output_dict.keys())
}
# TODO: Fix this mapping diff in dy2st
(
output_dict["Eu"],
output_dict["Ev"],
output_dict["eta"],
output_dict["pu"],
output_dict["pv"],
) = (
output_dict["Eu"],
output_dict["Ev"],
output_dict["pu"],
output_dict["pv"],
output_dict["eta"],
)

# visualize prediction
Eu_true, Ev_true, pu_true, pv_true, eta_true = analytic_solution(input_dict)
x = input_dict["x"][:, 0]
t = input_dict["t"][:, 0]
x = input_dict["x"][:, 0]
E_ref = np.sqrt(Eu_true**2 + Ev_true**2)[:, 0]
E_pred = np.sqrt(output_dict["Eu"] ** 2 + output_dict["Ev"] ** 2)[:, 0]
p_ref = np.sqrt(pu_true**2 + pv_true**2)[:, 0]
Expand Down
7 changes: 3 additions & 4 deletions examples/NLS-MB/conf/NLS-MB_rogue_wave.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -25,16 +25,15 @@ hydra:
# general settings
mode: train # running mode: train/eval
seed: 42
log_freq: 20
log_freq: 100
output_dir: ${hydra:run.dir}
NPOINT_INTERIOR: 20000
NPOINT_BC: 600
NTIME_ALL: 200


# model settings
MODEL:
input_keys: ["x", "t"]
input_keys: ["t", "x"]
output_keys: ["Eu", "Ev", "pu", "pv", "eta"]
num_layers: 5
hidden_size: 64
Expand All @@ -57,7 +56,7 @@ TRAIN:
# evaluation settings
EVAL:
pretrained_model_path: null
eval_with_no_grad: true
eval_with_no_grad: false

INFER:
pretrained_model_path: https://paddle-org.bj.bcebos.com/paddlescience/models/NLS-MB/NLS-MB_rogue_wave_pretrained.pdparams
Expand Down
6 changes: 3 additions & 3 deletions examples/NLS-MB/conf/NLS-MB_soliton.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -25,15 +25,15 @@ hydra:
# general settings
mode: train # running mode: train/eval
seed: 42
log_freq: 20
log_freq: 100
output_dir: ${hydra:run.dir}
NPOINT_INTERIOR: 20000
NPOINT_BC: 600
NTIME_ALL: 200

# model settings
MODEL:
input_keys: ["x", "t"]
input_keys: ["t", "x"]
output_keys: ["Eu", "Ev", "pu", "pv", "eta"]
num_layers: 5
hidden_size: 64
Expand All @@ -56,7 +56,7 @@ TRAIN:
# evaluation settings
EVAL:
pretrained_model_path: null
eval_with_no_grad: true
eval_with_no_grad: false

INFER:
pretrained_model_path: https://paddle-org.bj.bcebos.com/paddlescience/models/NLS-MB/NLS-MB_soliton_pretrained.pdparams
Expand Down