PINN解偏微分方程-tensorflow 2.0

2023-11-11

本文基于CSDN博主** _刘文凯_ **的两篇文章,将其中的pytorch代码改写为了tensorflow2.0代码,供参考。
PINN学习与实验(一)
PINN学习与实验(二)

1. 用PINN求解简单的PDE1

已知:
{ f ′ ( x ) = f ( x ) f ( 0 ) = 1 \begin{cases} f^{'}(x)=f(x) \\ f(0)=1 \end{cases} {f(x)=f(x)f(0)=1

f ( x ) f(x) f(x)


tensorflow 2.0代码如下:

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
%matplotlib auto # jupyter notebook中魔法方法

# 模型定义
class Net(tf.keras.Model):  
    def __init__(self, NN):  
        super(Net, self).__init__()
        self.input_layer = tf.keras.layers.Dense(NN, input_dim= 1)      
        self.hidden_layer = tf.keras.layers.Dense(NN) 
        self.output_layer = tf.keras.layers.Dense(1)
        
    def call(self, x):
        out = tf.tanh(self.input_layer(x))
        out = tf.tanh(self.hidden_layer(out))  
        out = self.output_layer(out)
        return out
net=Net(20) # 4层 20个

# 损失函数
mse = tf.keras.losses.MeanSquaredError()
# 优化器
optimizer = tf.keras.optimizers.Adam(learning_rate=1e-4)
# 打包
net.compile(optimizer, loss=mse)

plt.ion()  # 动态图
fig = plt.figure(figsize=(6,5))

iterations=20000
for epoch in range(iterations):
    
    with tf.GradientTape() as tape:
        # Boundary Loss
        x_0 = tf.zeros((2000, 1))
        y_0 = net(x_0)
        mse_i = mse(y_0, tf.ones((2000, 1)))

        # ODE Loss
        x_in = tf.Variable(tf.random.uniform((2000, 1), dtype=tf.float32, minval=0.0, maxval=2.0))
        
        with tf.GradientTape() as t:
            y_hat = net(x_in)
        
        dy_dx = t.gradient(y_hat, x_in)
        mse_f = mse(y_hat, dy_dx)
        loss = mse_i + mse_f        

    gradients = tape.gradient(loss, net.trainable_variables)
    optimizer.apply_gradients(zip(gradients, net.trainable_variables))
    
    if (epoch+1)%100==0:
        fig.clf()  # 清空当前Figure对象
        fig.suptitle("epoch: %d" % (epoch+1))
        ax = fig.add_subplot(111)
        y_real = tf.exp(x_in)  # y 真实值
        y_pred = net(x_in) # y 预测值
        ax.scatter(x_in.numpy(), y_real.numpy(), label="true")
        ax.scatter(x_in.numpy(), y_pred.numpy(),c='red', label="pred")
        ax.legend()
        plt.pause(0.1)
plt.show()

迭代3000次后结果如下图:
PINN解简单PDE-3000步
迭代10000次后结果如下图,可见已基本接近于真实解。
注:PINN最终是会求得真实解的,这里图片没放出来,因为两条线重合了。
在这里插入图片描述

2. 用PINN求解复杂的PDE2

已知:
{ u t + u ∗ u x − w ∗ u x x = 0 , ( 1 ) u ( 0 , x ) = − s i n ( π x ) , ( 2 ) u ( t , 1 ) = 0 , ( 3 ) u ( t , − 1 ) = 0 , ( 4 ) w = 0.01 π , x ∈ ( − 1 , 1 ) , t ∈ ( 0 , 1 ) \begin{cases} u_t+u*u_x-w*u_{xx}=0, & (1) \\ u(0,x)=-sin({\pi}x), & (2) \\ u(t,1)=0, & (3) \\ u(t,-1)=0, & (4) \\ w=\frac{0.01}{\pi},x{\in}(-1,1),t{\in}(0,1) \end{cases} ut+uuxwuxx=0,u(0,x)=sin(πx),u(t,1)=0,u(t,1)=0,w=π0.01,x(1,1),t(0,1)(1)(2)(3)(4)

u = u ( t , x ) u=u(t,x) u=u(t,x)


tensorflow 2.0代码如下:

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
%matplotlib auto

# 模型定义
class Net(tf.keras.Model):  
    def __init__(self, NN):  
        super(Net, self).__init__()
        self.input_layer = tf.keras.layers.Dense(NN, input_dim= 2)      
        self.hidden_layer = tf.keras.layers.Dense(NN)
        self.hidden_layer_2 = tf.keras.layers.Dense(NN) 
        self.output_layer = tf.keras.layers.Dense(1)
        
    def call(self, x):
        out = tf.tanh(self.input_layer(x))
        out = tf.tanh(self.hidden_layer(out))
        out = tf.tanh(self.hidden_layer_2(out))
        out = self.output_layer(out)
        return out
net=Net(256) # 4层 20个

# 损失函数
mse = tf.keras.losses.MeanSquaredError()
# 优化器
optimizer = tf.keras.optimizers.Adam(learning_rate=1e-4)
# 打包
net.compile(optimizer, loss=mse)

plt.ion()  # 动态图
fig = plt.figure(figsize=(6,5))

iterations=20000

# 初始化常量
w = 0.01 / 3.1415926
t_bc_zeros = tf.constant(np.zeros((2000, 1)), dtype=tf.float32)
x_in_pos_one = tf.constant(np.ones((2000, 1)), dtype=tf.float32)
x_in_neg_one = tf.constant(-np.ones((2000, 1)), dtype=tf.float32)
u_in_zeros = tf.constant(np.zeros((2000, 1)), dtype=tf.float32)

for epoch in range(iterations):

    with tf.GradientTape() as tape:
        # 初始化变量
        t_var = tf.Variable(tf.random.uniform((2000, 1), dtype=tf.float32, minval=0.0, maxval=1.0))
        x_var = tf.Variable(tf.random.uniform((2000, 1), dtype=tf.float32, minval=-1.0, maxval=1.0))

        # 求一阶、二阶偏导
        with tf.GradientTape(persistent=True) as tape_xx:
            with tf.GradientTape(persistent=True) as tape_x:
                u_hat = net(tf.concat([t_var, x_var], axis=1))
            du_dt = tape_x.gradient(u_hat, t_var)
            du_dx = tape_x.gradient(u_hat, x_var)
        du_dxx = tape_xx.gradient(du_dx, x_var)

        # eq(1)
        eq1_1 = du_dt + u_hat * du_dx - w * du_dxx
        mse_1 = mse(eq1_1, u_in_zeros)

        # eq(2)
        eq2_1 = net(tf.concat([t_bc_zeros, x_var], axis=1))
        eq2_2 = -tf.sin(3.1415926 * x_var)
        mse_2 = mse(eq2_1, eq2_2)

        # eq(3)
        eq3_1 = net(tf.concat([t_var, x_in_pos_one], axis=1))
        mse_3 = mse(eq3_1, u_in_zeros)

        # eq(4)
        eq4_1 = net(tf.concat([t_var, x_in_neg_one], axis=1))
        mse_4 = mse(eq4_1, u_in_zeros)

        loss = mse_1 + mse_2 + mse_3 + mse_4

    gradients = tape.gradient(loss, net.trainable_variables)
    optimizer.apply_gradients(zip(gradients, net.trainable_variables))

    if (epoch+1) % 100 == 0:
        t = np.linspace(0, 1, 100)
        x = np.linspace(-1, 1, 256)
        ms_t, ms_x = np.meshgrid(t, x)
        x = np.ravel(ms_x).reshape(-1, 1)
        t = np.ravel(ms_t).reshape(-1, 1)
        pt_u = net(tf.concat([t, x], axis=1))
        u = pt_u.numpy().reshape(ms_t.shape)

        fig.clf()  # 清空当前Figure对象
        ax = fig.add_subplot(111, projection='3d')
        ax.set_zlim([-1, 1])
        # 在图中添加文字
        ax.text(0, 0, 1, "epoch:%d" %(epoch+1), color='black')
        ax.plot_surface(ms_t, ms_x, u, cmap=cm.RdYlBu_r, edgecolor='blue', linewidth=0.0003, antialiased=True)
        ax.set_xlabel('t')
        ax.set_ylabel('x')
        ax.set_zlabel('u')
        plt.pause(0.1)
plt.show()

迭代20000次后结果如下图(实际并不充分需要迭代这么多步):
在这里插入图片描述


  1. PINN学习与实验(一) ↩︎

  2. PINN学习与实验(二) ↩︎

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PINN解偏微分方程-tensorflow 2.0 的相关文章

随机推荐

  • 用Double-DQN方法解决简单迷宫寻路问题

    环境描述 25 25离散的栅格图 起点左上角 终点右下角 障碍物1 1随机分布 动作空间维度2 向右 向下 每次移动奖励 1 遇到障碍物或移动出环境奖励 100 到终点奖励20 注 针对这个任务期望SARSA Q learning等方法能够
  • Android中控件AutoCompleteTextView的使用方法和一些属性

    版权声明 本文为博主原创文章 未经博主允许不得转载 AutoCompleteTextView一些属性
  • “数据压缩实验之LZW 编解码算法实现与分析”实验报告_201810413045_陈诚

    文章目录 1 实验项目名称 2 实验目的 3 什么是LZW编解码算法与它的原理 3 1 LZW编解码算法介绍 3 2 LZW编解码算法原理 3 2 1 编码流程图及为了便于理解和期末复习举实例说明 3 2 2 解码流程图及举实例说明 重点说
  • 并发无锁队列学习之一

    Anker 工作学习笔记 关注云计算 网络安全 软件定义网络 博客园 新随笔 管理 随笔 169 文章 2 评论 403 并发无锁队列学习之一 开篇 1 前言 队列在计算机中非常重要的一种数据结构 尤其在操作系统中 队列典型的特征是先进先出
  • SDUc++课结课大作业:基于qt类库c++实现简单的音乐播放器

    2021年11月的项目 版本一 功能简单 UI界面难看 代码架构拉跨 没有核心内容 技术含量低 2022年6月21日准备重构一下代码 让架构清晰一点 加点多线程和网络通信的内容 然后这次打算在visual studio下开发了 因为之前把那
  • 【零基础学QT】第八章 文件操作,网络文件传输实验

    作者主页 凉开水白菜 作者简介 共同学习 互相监督 热于分享 多加讨论 一起进步 专栏目录 零基础学QT 文章导航篇 专栏资料 https pan baidu com s 192A28BTIYFHmixRcQwmaHw 提取码 qtqt 点
  • java通过ssh远程调用服务器

    1 在大数据时代 服务器使用的频率难免上升 工作中难免会出现频繁使用的时候 有些场景不方便切换到服务器去操作 比如调用一个服务器的命令 但是要在程序里执行 当然不能手动去执行啦 所以java调用ssh就尤为重要 首先 添加maven依赖
  • Visual Stdio调试IDAPython脚本

    1 安装VS插件PTVS 这一步与第2步中安装版本应该一致 否则最后调试时会连不上 https github com Microsoft PTVS 2 安装python模块PTVSD pip install ptvsd 3 写如下代码ptv
  • SQL注入绕waf(安全狗)

    SQL注入绕waf 前言 感觉自己注入绕waf有点拉跨 于是自己搭建了一个环境练习绕waf 环境 我是用phpstudy sql lib 安全狗最新版本 正常访问 恶意语句 被拦截 注入检测 首先进行注入检测 判断是否有注入 id 1 直接
  • MyBatis基础知识

    MyBatis 优点 支持自定义 Sql 存储过程以及高级映射 MyBatis免除了几乎所有的JDBC代码以及设置参数和获取结果集的工作 MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型 接 口和 Java POJO Pl
  • 分支循环语句练习和友尽模拟器的综合应用

    目录 一 循环语句练习 1 计算 n的阶乘 2 计算 1 2 3 10 二 分支循环综合练习 3 在一个有序数组中查找具体的某个数字n 4 编写代码 演示多个字符从两端移动 向中间汇聚 5 编写代码实现 模拟用户登录情景 并且只能登录三次
  • MATLAB符号变量的创建和简单运算

    声明 本文章中数据来自清风老师数学建模课程 文章目录 MATLAB符号变量的创建和简单运算 1 符号变量 1 1 符号变量的创建 1 2 符号方程的创建 3 符号矩阵的创建 2 符号运算 2 1 简单运算 2 2 表达式的整理 2 3 因式
  • 我只是不甘心-------Day51

    回老家一天 完全断网 天气也配合的很给力 水蓝色的天 有白色的云 仰起头 看不到刺目的光却仍然眼睛生疼 不得不眯起眼 我努力想睁 却像有泪要流出来 不是揉不进沙子 却是容不下更多 去看了自家弟弟的新房子 空间很大 方方正正的百十个平方 特别
  • linux ops_使用OPS在现有Linux应用程序中运行Unikernels

    linux ops Unikernels are an emerging deployment pattern that engineers are choosing over Linux and Docker because of the
  • Eclipse如何安装svn插件及使用

    Eclipse中使用SVN 此文章对Myeclipse同样适用 一 在Eclipse里下载Subclipse插件 方法一 从Eclipse Marketplace里面下载 具体操作 打开Eclipse gt Help gt Eclipse
  • centos6.4 常用文件指令

    本文转载自 http www 121ask com thread 5606 1 html centos彻底删除文件夹 文件命令 centos 新建 删除 移动 复制等命令 讲解 1 新建文件夹 mkdir 文件名 新建一个名为test的文件
  • ios内购报错status:21004

    1 本人java 不懂这段代码什么意思 和对接的ios同事解决问题时 说是加入了共享密码 然后传给我的data参数 到ios验证才通过的 返回了status 0
  • vue项目build打包时遇到 Cannot read property ‘compilation‘ of undefined 问题解决方法

    vue项目build打包时遇到 Cannot read property compilation of undefined 问题解决方法 参考文章 1 vue项目build打包时遇到 Cannot read property compila
  • android___android_log_print打印函数__源代码

    android端JNI的打印信息 include
  • PINN解偏微分方程-tensorflow 2.0

    PINN解偏微分方程 tensorflow 2 0 1 用PINN求解简单的PDE 1 2 用PINN求解复杂的PDE 2 本文基于CSDN博主 刘文凯 的两篇文章 将其中的pytorch代码改写为了tensorflow2 0代码 供参考