PyTorch PINN實戰:用深度學習求解微分方程

在人工智能與計算數學的交匯點,物理信息神經網絡(Physics-Informed Neural Networks,PINN)正引領著一場求解微分方程的革命。傳統上,微分方程是描述自然現象和工程問題中各種關系的重要工具,但其求解往往依賴于復雜的數值方法或耗時的實驗驗證。然而,隨著深度學習技術的飛速發展,PINN為我們提供了一種全新的、高效的求解途徑。本文將深入探討PyTorch PINN的實戰應用,展示如何用深度學習求解微分方程,讓讀者在收獲知識的同時,感受到科技創新的魅力。

#### 一、引言:傳統方法的局限與PINN的崛起

微分方程,無論是常微分方程(ODE)還是偏微分方程(PDE),都是描述自然界中連續變化過程的基本工具。然而,傳統求解微分方程的方法,如有限差分法、有限元法等,往往面臨計算復雜度高、對高維問題處理困難等挑戰。此外,這些方法通常需要大量的計算資源和時間,且對于某些復雜問題,可能無法得到精確的解析解。

隨著深度學習的興起,神經網絡以其強大的非線性擬合能力和數據驅動的學習機制,為解決微分方程提供了新的思路。然而,傳統的神經網絡模型在求解微分方程時,往往依賴于大規模的標記數據集,這在許多實際應用中是不切實際的。因此,PINN應運而生,它將物理定律(即微分方程)直接整合到神經網絡的訓練過程中,從而顯著提高了數據利用效率,為求解微分方程開辟了一條新的道路。

#### 二、PINN的基本原理與優勢

PINN的核心思想是將微分方程的約束條件嵌入到神經網絡的損失函數中,使網絡在訓練過程中不僅能夠擬合給定的數據點,還能夠滿足微分方程的定義。具體來說,PINN的損失函數通常由兩部分組成:一部分是數據損失,用于衡量網絡輸出與真實數據之間的差異;另一部分是物理損失,用于衡量網絡輸出對微分方程約束的滿足程度。

PINN相比傳統方法具有顯著的優勢。首先,它不需要大量的標記數據集,而是通過物理定律的約束從相對小規模的數據集中有效學習。其次,PINN能夠處理傳統數值求解器難以應對的高維復雜偏微分方程。此外,訓練完成后,PINN模型具有良好的泛化能力,可預測不同初始條件或邊界條件下的解。在處理逆問題時,PINN對噪聲和稀疏數據也表現出較強的魯棒性。

#### 三、PyTorch PINN實戰:求解常微分方程

為了更具體地展示PINN的實戰應用,我們將以求解一個簡單的常微分方程為例,介紹如何使用PyTorch實現PINN。

**(一)問題定義**

考慮以下一階線性常微分方程:

$y'(x) = 2x + 5$

初始條件為:

$y(0) = 3$

**(二)數據準備**

在PINN中,我們不需要大量的標記數據集,但為了訓練和評估模型,我們仍然需要一些數據點。這里,我們可以使用解析解來生成一些訓練數據和測試數據。

**(三)模型搭建**

接下來,我們使用PyTorch定義一個簡單的全連接神經網絡作為PINN模型。模型的結構可以根據問題的復雜程度進行調整,但通常包括一個輸入層、若干個隱藏層和一個輸出層。在隱藏層中,我們可以使用ReLU、Tanh等激活函數來增加網絡的非線性擬合能力。

```python
import torch
import torch.nn as nn
import torch.optim as optim
import numpy as np
import matplotlib.pyplot as plt

class PINN(nn.Module):
? ? def __init__(self):
? ? ? ? super(PINN, self).__init__()
? ? ? ? self.net = nn.Sequential(
? ? ? ? ? ? nn.Linear(1, 20), nn.Tanh(),
? ? ? ? ? ? nn.Linear(20, 20), nn.Tanh(),
? ? ? ? ? ? nn.Linear(20, 1)
? ? ? ? )

? ? def forward(self, x):
? ? ? ? return self.net(x)
```

**(四)損失函數定義**

PINN的損失函數由數據損失和物理損失兩部分組成。數據損失用于衡量網絡輸出與真實數據之間的差異,而物理損失則用于衡量網絡輸出對微分方程約束的滿足程度。

```python
def pinn_loss(model, x):
? ? x.requires_grad = True
? ? y = model(x)
? ? dy_dx = torch.autograd.grad(y, x, torch.ones_like(y), create_graph=True)[0]
? ? ode_loss = torch.mean((dy_dx - (2 * x + 5)) ** 2)
? ? x0 = torch.tensor([[0.0]])
? ? y0_pred = model(x0)
? ? initial_loss = (y0_pred - 3) ** 2
? ? total_loss = ode_loss + initial_loss
? ? return total_loss, ode_loss, initial_loss
```

**(五)模型訓練**

在模型訓練過程中,我們使用優化器(如Adam)來迭代更新網絡的權重參數,以最小化損失函數。同時,我們可以使用訓練過程中的損失變化來評估模型的收斂情況。

```python
model = PINN()
optimizer = optim.Adam(model.parameters(), lr=1e-3)
epochs = 5000
loss_history = []
ode_loss_history = []
initial_loss_history = []

x_train = torch.linspace(-2, 2, 100).view(-1, 1)
for epoch in range(epochs):
? ? optimizer.zero_grad()
? ? total_loss, ode_loss, initial_loss = pinn_loss(model, x_train)
? ? total_loss.backward()
? ? optimizer.step()
? ? loss_history.append(total_loss.item())
? ? ode_loss_history.append(ode_loss.item())
? ? initial_loss_history.append(initial_loss.item())
? ? if epoch % 1000 == 0:
? ? ? ? print(f"Epoch {epoch}, Loss: {total_loss.item():.6f}")
```

**(六)結果展示**

訓練完成后,我們可以使用測試數據來評估模型的性能。同時,我們還可以繪制訓練過程中的損失變化曲線,以觀察模型的收斂情況。

```python
x_test = torch.linspace(-2, 2, 100).view(-1, 1)
y_true = x_test ** 2 + 5 * x_test + 3 ?# 真實解
y_pred = model(x_test)

plt.figure(figsize=(8, 5))
plt.plot(x_test.numpy(), y_true.numpy(), linestyle="dashed", linewidth=2, label="True Solution")
plt.plot(x_test.numpy(), y_pred.detach().numpy(), linewidth=2, label="PINN Prediction")
plt.xlabel("x")
plt.ylabel("y(x)")
plt.legend()
plt.title("PINN Solution of ODE")
plt.grid()
plt.show()

plt.figure(figsize=(8, 5))
epochs_list = np.arange(1, epochs + 1)
plt.semilogy(epochs_list, loss_history, 'k--', linewidth=3, label=r'Total Loss $(L_D + L_B)$')
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.legend()
plt.title('Training Loss Over Epochs')
plt.grid()
plt.show()
```

#### 四、PyTorch PINN實戰:求解偏微分方程

PINN不僅可以用于求解常微分方程,還可以擴展到求解偏微分方程。以二維熱傳導方程為例,我們將展示如何使用PyTorch PINN來求解這類問題。

**(一)問題定義**

考慮以下二維熱傳導方程:

$\frac{\partial u}{\partial t} = \alpha \left( \frac{\partial^2 u}{\partial x^2} + \frac{\partial^2 u}{\partial y^2} \right)$

其中,$u(x, y, t)$是溫度分布函數,$\alpha$是熱擴散系數。

**(二)數據準備與模型搭建**

與常微分方程類似,我們需要準備一些訓練數據和測試數據來訓練和評估模型。同時,我們還需要根據問題的復雜程度搭建一個合適的神經網絡模型。

**(三)損失函數定義與模型訓練**

對于偏微分方程,我們需要定義更加復雜的損失函數來同時考慮時間導數、空間導數和初始/邊界條件。在模型訓練過程中,我們仍然使用優化器來迭代更新網絡的權重參數,以最小化損失函數。

**(四)結果展示與分析**

訓練完成后,我們可以使用測試數據來評估模型的性能,并繪制溫度分布圖來直觀展示結果。同時,我們還可以分析不同參數對模型性能的影響,以進一步優化模型。

#### 五、創新性探討與未來展望

PINN作為一種新興的求解微分方程的方法,具有許多創新性和潛力。首先,它將物理定律直接整合到神經網絡的訓練過程中,實現了數據驅動與物理約束的有機結合。其次,PINN能夠處理傳統數值求解器難以應對的高維復雜問題,為科學計算和工程應用提供了新的解決方案。

然而,PINN仍然面臨一些挑戰和限制。例如,訓練過程計算密集且耗時較長,尤其對于高維偏微分方程;模型對超參數選擇較為敏感,需要精細調整以平衡不同損失項。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/72453.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/72453.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/72453.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【WiFi 7核心技術及未來挑戰】

作為剛剛開始從事這一領域的人,淺淺學習了一下WiFi 7(IEEE 802.11be)。Wi-Fi 7發展迅速,提供前所未有的速度、更低的延遲和更高的可靠性。但從頻譜政策到能效挑戰,再到成本,仍有許多問題亟待解決。 Wi-Fi 7…

Oracle Linux Server 7.9安裝fail2ban

yum search oracle-epel-release yum install oracle-epel-release-el7 search fail2ban yum install fail2ban nano /etc/fail2ban/jail.d/00-firewalld.conf # defalut這里是設定全局設置,如果下面的監控沒有設置就以全局設置的值設置。 [DEFAULT] # 用于指定哪…

目標在哪里?——尋找人生的意義與方向

在職場中,許多人都會經歷這樣的困惑:工作看似順利,卻逐漸失去了成就感和成長感。一位在500強企業工作的學員就遇到了這樣的問題。她曾考慮過轉型做培訓,但苦于找不到明確的切入點,對未來的目標感到迷茫。她不禁問自己&…

C++類與對象——拷貝構造與運算符重載

拷貝構造函數和賦值運算符重載就是C類默認六個函數之二。 拷貝構造函數: 如果?個構造函數的第?個參數是自身類類型的引用,且任何額外的參數都有默認值,則此構造函數 也叫做拷貝構造函數,也就是說拷貝構造是?個特殊的構造函數…

破碎的誓言

破碎的誓言 在秋風的呢喃中,落葉輕嘆, 昔日的誓言,如煙消散。 你的眼眸,曾是我星辰的指引, 如今,卻成了最深的迷惘。 欺騙的利刃,刺穿了信任的堡壘, 我的心,如裂開…

AD畫板學習

AD畫板 01 課程簡介及學習目標 (1)能熟練的新建項目文件、原理圖文件、PCB文件且修改文件名,并知道文件保存的位置; (2)會設置原理圖編輯器的工作環境,會自底向上繪制層次原理圖; …

Linux:進程程序替換

目錄 前言 一 進程程序替換的概念 二 進程程序替換的原理 三 為什么需要進行進程程序替換 四 如何進行進程程序替換 1. 進程替換函數 ? execl()函數 ?execv()函數 ?execlp()函數 ?execle()函數 ?execve()* 前言 一般情況下,對應的語言寫的程序只…

基于變分推理與 Best?of?N 策略的元 Prompt 自動生成與優化框架

摘要 本文提出了一種融合變分推理與 Best?of?N 策略的元 Prompt 自動生成與優化框架,通過高度參數化的模板、隨機擾動采樣及多指標評分機制,實現從初始提示生成到最終輸出的動態優化。同時,針對實際應用中對自適應參數調整、深層語義理解、…

Umi-OCR 全家桶

介紹: 下載 訪問官網地址 https://github.com/hiroi-sora/umi-ocrhttps://github.com/hiroi-sora/umi-ocr 點擊下載(.exe 文件 安裝即可) 桌面使用 安裝完畢后去安裝路徑下點擊 Umi-OCR.exe (默認不會生成桌面的快捷方式&…

2023南京理工大學計算機復試上機真題

2023南京理工大學計算機復試上機真題 2023南京理工大學計算機復試機試真題 歷年南京理工大學計算機復試上機真題 在線評測:傳送門:pgcode.cn 括號匹配二 題目描述 苗苗今天剛剛學會使用括號,不過他分不清小括號,中括號&#…

Conda 常規用法指南

Conda 常規用法指南 1. Conda 簡介 Conda 是一個開源的包管理和環境管理系統,主要用于 Python 和其他編程語言的開發環境。它能夠方便地安裝、更新和管理依賴項,使得不同項目可以使用不同的 Python 版本和庫。 2. Conda 環境管理 2.1 創建新的環境 conda…

非零初始條件系統的傳遞函數分析

非零初始條件系統的傳遞函數分析 在傳遞函數的定義中,通常假設系統滿足零初始條件。然而在實際應用中,很多系統需要處理非零初始狀態。為了探討這一問題,我們以一個一階微分方程為例進行分析。 一、一階系統的分析 考慮以下一階微分方程&a…

centos7安裝時采用的默認分區(比如:/dev/sda3的對應掛載點是/),如何對系統擴容?

?非LVM分區擴容方案? 若 /dev/sda3 是?非LVM分區?且存儲重要數據,可通過 ?直接擴展分區容量? ?調整文件系統? 實現擴容,無需重建LVM或格式化分區?。以下是具體步驟: ?1. 擴展物理磁盤(虛擬機場景)? ?關…

Axios簡單說明,快速上手

Ajax:異步的JavaScript和XML 作用: 數據交換異步交互 Axios:就是對原生Ajax進行封裝,簡化書寫,快速開發 使用邏輯: 首先要安裝Axios,可以通過npm在項目中安裝: 打開命令行工具…

模型評估——acc、P、R、F值、交叉驗證、K折交叉驗證

模型評估:對預測函數地預測精度的評估。 多重回歸:涉及三個及其以上的變量的回歸問題。 評估模型的方法: 交叉驗證:將數據集分成測試集和訓練集,可以采用3:7或者2:8的比例方式進行劃分&#xff…

【Godot】Window類

(參考自deepseek回答) 在 Godot 引擎中,Window 是一個用于管理應用程序窗口的類。它是 Godot 4.0 引入的新特性,取代了舊版本中的 OS 類對窗口的管理功能。Window 提供了對窗口大小、位置、標題、模式等屬性的控制,使開…

JVM 2015/3/15

定義:Java Virtual Machine -java程序的運行環境(java二進制字節碼的運行環境) 好處: 一次編寫,到處運行 自動內存管理,垃圾回收 數組下標越界檢測 多態 比較:jvm/jre/jdk 常見的JVM&…

git submodule

git submodule git submodule 的作用是將一個 git 倉庫,最為另一個 git 倉庫的子模塊 比如 A 倉庫地址:gitgithub.com:xxxxxxx/A.git B 倉庫地址:gitgithub.com:xxxxxxx/B.git 一、克隆 A 倉庫 打開拉取的 A 項目根目錄 在 A 項目中添加 …

Compose 實踐與探索九 —— DrawModifier 解析

本篇講解 DrawModifier 的基本用法與代碼原理,介紹原理的目的在于可以判斷繪制與繪制的關系,繪制與布局的關系。知道達成某種繪制效果應該怎么寫,面對復雜的 Modifier 鏈時對效果有大致預判。 DrawModifier 管理繪制,需要以負責管…

華為手機助手輸入連接碼時光標亂跳

問題復現:輸入12345678,光標自動跳轉導致連接碼出現亂序情況。 千萬別試著找出規律,已試動態規律非大牛誤輕試 問題原因: 想啥呢?華哥的軟件又不是我開發我要Know Why干啥 我只需關心解決方案 (可能時輸入…