【来自理工科的独有浪漫-给crush一朵夏天的雪花】--对于有限差分法的理解

news2024/11/24 23:33:30

目录

    • 有限差分法相关参考资料
    • 先上手看代码,然后理解数理概念
    • 有限差分法的理解
      • Q: 什么是有限差分法?
    • 代码中涉及的知识点
      • 1. 划分网格对于求解二维偏微分方程的作用
      • 2. 临近点对于求解偏微分方程的作用
      • 3. 有限差分方法中的中心差分公式
    • 总结

写在前面:炎炎夏日,用代码给你的crush送上一朵雪花吧。一起感受一下偏微分方程的浪漫。
在这里插入图片描述

有限差分法相关参考资料

以下资料为我学习的来源:
链接1: 中科院的有限差分法的详细解释课程
链接2: 论文:Modeling and numerical simulations of dendritic crystal growth
链接3: 知乎 对应上文解释 代码来源!

先上手看代码,然后理解数理概念

要注释

from numpy import *

# 定义参数

# 本模块对应的知识点1【划分网格对于求解二维偏微分方程的作用】
# 网格的行数,列数以及时间迭代的总步数
M,  N,  K   = 300,  300,  4000 
# 空间时长步长
Dx, Dy, Dt  = 0.01, 0.01, 1e-5


# 材料参数
# 包含物理和材料属性参数,包括相场动力学时间常数、各向异性能量强度、相场方向依赖的强度、晶格取向因子、参考取向、界面宽度参数、温度敏感度、平衡温度和热耦合系数。
# 为求解数学物理方程中的控制物理生成物形态的参数
tau = 3e-4
eps_bar = 0.01
sigma = 0.02
J = 4.
theta_0 = 0.2
alpha = 0.9
gamma = 10.
T_eq = 1.
kappa = 1.8


# 初始条件设置
p = zeros((M, N))
T = zeros((M, N))

# 半径为sqrt(5.0)的圆内,被视为初始固化区域的一部分,这部分我们认为相变已经完成,即雪花已经开始产生
for i in range(M):
    for j in range(N):
        if (i - M/2)**2 + (j - N/2)**2 < 5.0:  
            p[i, j] = 1.0 # 已经开始产生相变,设为1

# 定义二维拉普拉斯算子(扩散、波动等现象的偏微分方程时非常重要的算子)
# 知识点2【临近点对于求解偏微分方程的作用】
# 知识点3【有限差分方法中的中心差分公式】
def Lap(p):
    # 提取内部和邻近点的值
    p_i_j  = delete(delete(p, [0, -1], axis=0), [0, -1], axis=1)
    p_im_j = delete(delete(p, [0, -1], axis=0), [-1,-2], axis=1)
    p_ip_j = delete(delete(p, [0, -1], axis=0), [0,  1], axis=1)
    p_i_jm = delete(delete(p, [0, -1], axis=1), [0,  1], axis=0)
    p_i_jp = delete(delete(p, [0, -1], axis=1), [-1,-2], axis=0)
    # 计算拉普拉斯算子,使用限差分方法中的中心差分公式
    Lap_p  = (p_im_j + p_ip_j + p_i_jm + p_i_jp - 4*p_i_j)/Dx**2
    # 处理边界条件
    Lap_pj = vstack((Lap_p[0,:], Lap_p, Lap_p[-1,:]))
    return hstack((Lap_pj[:,0].reshape(N,1), Lap_pj, Lap_pj[:,-1].reshape(N,1)))

# 计算相场p的演化,这里可以看知乎的那篇推导原文,十分详细
def Phase_field(p, T):
    theta = arctan2(gradient(p, Dy, axis=1), gradient(p, Dx, axis=0))
    eps = eps_bar * (1. + sigma * cos(J * (theta - theta_0)))
    g = -eps * eps_bar * sigma * J * sin(J * (theta - theta_0)) * gradient(p, Dy, axis=1)
    h = -eps * eps_bar * sigma * J * sin(J * (theta - theta_0)) * gradient(p, Dx, axis=0)
    m = alpha/pi * arctan(gamma * (T_eq - T))
    # 结合界面能、界面动力学以及热效应等因素,形成相场的演化方程。
    term_1 = - p*(p - 1.)*(p - 0.5 + m)
    term_2 = - gradient(g, Dx, axis=0)
    term_3 = gradient(h, Dy, axis=1)
    term_4 = eps**2 * Lap(p)
    p_ev = Dt / tau * (term_1 + term_2 + term_3 + term_4)
    return p + p_ev

# 计算温度场T的演化
def Temp(T, p_new, p_old):
    T_ev = Dt*Lap(T) + kappa*(p_new - p_old)
    return T + T_ev

# 相场更新
p_hist = []
T_hist = []
p_old = p; T_old = T
for t_step in range(K):
    p_new = Phase_field(p_old, T_old)
    T_new = Temp(T_old, p_new, p_old)
    p_old = p_new
    T_old = T_new
    if t_step % 50 == 0:
        p_hist.append(p_new)
        T_hist.append(T_new)
        print('step finished:', t_step,'/',str(K))

有限差分法的理解

Q: 什么是有限差分法?

在我的理解里,有限差分法就是对于微分方程/偏微分方程求解的一种数理方法,本质就是把对于微分的求解转化为求解大量代数方程组。转化的过程本质上是一种近似。

举一个最简单的例子,假设我们有一个连续的函数,我们想要计算它在某个特定点的导数。为了使用有限差分法,我们将函数在该点附近进行离散化处理。首先,我们选择一个很小的步长,称为差分间距(finite difference interval)或网格间距(grid spacing)。然后,在该点的左右两侧选择一些离散点。我们根据这些离散点的函数值来估计函数在该点的导数。具体来说,我们可以使用中心差分(central difference)或前向差分(forward difference)等方法来计算导数。

代码中涉及的知识点

1. 划分网格对于求解二维偏微分方程的作用

网格划分是数值方法中处理偏微分方程的基础,它将连续的物理空间离散化成有限的点集,使得连续问题可以在计算机上用离散方式处理。
在这段代码中,M和N定义了在两个空间维度上的网格点数,这决定了模型的空间分辨率。网格点越多,空间分辨率越高,模拟结果越精确,但计算量也越大。

2. 临近点对于求解偏微分方程的作用

将求解域进行离散化是偏微分方程的关键。如果是一维条件下进行计算求解,我们可以在脑子里想象一条线,知道后一个点,就可以根据初始值迭代。如果是二维条件下进行计算求解,那么每个点周围的临近点应该会有四个,在脑子里把他们连起来,那么会形成一个矩形,使用任何四个结点的值就可以算出最后一个。这就是为什么二维中心差分公式会使用如下表达式迭代:
在这里插入图片描述
此外,代码中的空间步长(Dx, Dy)和时间步长(Dt)决定了数值模拟的精度和稳定性。步长越小,理论上数值解越接近真实解,但计算时间也更长。时间步长还与数值方法的稳定性有关。特别是对于显式方法,如果步长过大,可能导致数值解的不稳定或发散。

3. 有限差分方法中的中心差分公式

中心差分因为相比前向差分/后向差分多一重精度,因此,经常被用来作为差分公式的公式。
Lap§函数计算二维拉普拉斯算子,这是通过有限差分的中心差分公式实现的。拉普拉斯算子在物理中描述了某个量(如温度、压力等)的空间扩散。在边界处采用简单的延伸处理,这相当于假设边界外的值等于边界上的值(Neumann边界条件)。

总结

通过学习使用代码产生雪花,我对于有限差分法有了进一步的理解。
另外标题是吸引大家一起学习有限差分法的,不建议给crush发雪花代码,带他/她去哈尔滨看雪效果更好。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1617784.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

喜报 | 一致认可!擎创科技连续6年获“鑫智奖”专家推荐TOP10优秀解决方案

为展示金融企业数据管理和数据平台智能化转型成果&#xff0c;分享大数据和人工智能在风控、营销、产品、运营等场景的落地实践&#xff0c;探讨“金融科技数据智能”的创新应用和未来发展&#xff0c;在全球金融专业人士协会的支持下&#xff0c;金科创新社主办了“鑫智奖第六…

Apple II首席设计师为中国家庭设计,鹿客指脉锁S6 Max引领科技美学

智能门锁设计正在步入一个科技与艺术交织的美学时代。鹿客科技认为&#xff0c;智能门锁的设计理念是将锁视为人类与仿生形状之间的接口&#xff0c;将门视为几何建筑的一部分&#xff0c;产品设计应该通过提供诱人且用户友好的“触摸和感觉”来传达这种转变。 鹿客近日发布的最…

(C语言入门)数组

目录 什么是数组&#xff1f; 数组&#xff1a; 数组的使用&#xff1a; 数组的初始化&#xff1a; 数组名&#xff1a; 数组案例&#xff1a; 一维数组的最大值&#xff1a; 一维数组的逆置&#xff1a; 数组和指针&#xff1a; 通过指针操作数组元素&#xff1a; …

springCloud集成activiti5.22.0流程引擎

springCloud集成activiti5.22.0流程引擎 点关注不迷路&#xff0c;欢迎再访&#xff01; 精简博客内容&#xff0c;尽量已行业术语来分享。 努力做到对每一位认可自己的读者负责。 帮助别人的同时更是丰富自己的良机。 小编最近工作需要涉及到流程&#xff0c;由于网络上5.22版…

AD--SSL卸载--单向认证和双向认证

一.SSL卸载单向认证 1.添加SSL证书 2.添加SSL卸载策略 由于是测试模拟环境&#xff0c;有些效果表现不出来&#xff0c;配置不了卸载策略 3.起虚拟服务&#xff0c;服务类型选择https或者ssl ,选择SSL卸载策略 实验效果&#xff1a;打开网页进入AD抓包发现&#xff0c;客户端和…

MySQL及SQL语句

SQL语句 数据库相关概念数据查询语言&#xff08;DQL&#xff09;基本查询数据类型条件查询多表查询子查询 数据操作语言&#xff08;DML&#xff09;数据定义语言&#xff08;DDL&#xff09;数据控制语言&#xff08;DCL&#xff09;MySQL数据库约束视图练习题 数据库相关概念…

8【PS作图】画一个“像素云朵”

选择64*128像素大小&#xff0c;横向画布 选择“油漆桶”工具&#xff0c;“容差”调整为0&#xff0c;取消“锯齿”&#xff0c;勾选“连续的”&#xff0c;这样方便后续上色&#xff0c;并且边缘都是像素风格的锯齿状 点击画布&#xff0c;变成蓝色天空 画云朵&#xff0c;首…

win10环境中设置java开机自启动

1 、jdk环境确认 在开始设置Java开机启动之前&#xff0c;确保你的计算机已经安装了Java开发环境&#xff08;JDK&#xff09;。如果没有安装&#xff0c;你可以从Oracle官方网站下载并安装最新的Java开发工具包。 2、准备好jar程序 确认jar程序可以正常运行。 3、编写批处…

【InternLM】大模型的评测——OpenCompass

1. OpenCompass简介 1.1 基本介绍 大模型开源开放评测体系 “司南” (OpenCompass2.0)由上海人工智能实验室科学家团队发布&#xff0c;用于为大语言模型、多模态模型等提供一站式评测服务。其主要特点如下&#xff1a; 开源可复现&#xff1a;提供公平、公开、可复现的大模型…

聊聊实际工作中设计模式的使用

一直想在CSDN上写一篇关于软件设计模式的文章&#xff0c;草稿打了好久&#xff0c;但很长时间都没有想好该如何写&#xff0c;主要有几点考虑&#xff1a; 1、市面上同类的介绍实在太多了。正所谓第一个能够把美女比喻成鲜花的人是天才&#xff0c;第二个还这么说的是庸才&…

Kotlin语法入门-类与对象(6)

Kotlin语法入门-类与对象(6) 文章目录 Kotlin语法入门-类与对象(6)六、类与对象1、声明和调用2、get和set3、init函数初始化4、constructor构造函数4.1、主构造函数4.2、二级构造函数4.3、多个构造函数4.4、省略主构造函数并写了次构造函数 5、类的继承与重写5.1、继承5.2、继承…

【Tello无人机】无人机编队操作面板实现

为了方便进行无人机的编队演示&#xff0c;以及在各种场景下实现队形的灵活切换&#xff0c;开发了一套专门的上位机控制平台。本文将重点介绍应用于tello无人机的编队操作面板及其核心功能。 操作面板页面 下图展示了操作面板&#xff0c;其中包含5种编队动作和3个可选位置设…

2024深圳杯(东北三省)数学建模选题建议及各题思路来啦!

大家好呀&#xff0c;2024深圳杯数学建模&#xff08;东北三省数学建模联赛&#xff09;开始了&#xff0c;来说一下初步的选题建议吧&#xff1a; 首先定下主基调&#xff0c; 本次深圳杯&#xff08;东北三省&#xff09;建议选A。难度上D&#xff1e;B&#xff1e;C&#…

开源模型应用落地-chatglm3-6b-集成langchain(十)

一、前言 langchain框架调用本地模型&#xff0c;使得用户可以直接提出问题或发送指令&#xff0c;而无需担心具体的步骤或流程。通过LangChain和chatglm3-6b模型的整合&#xff0c;可以更好地处理对话&#xff0c;提供更智能、更准确的响应&#xff0c;从而提高对话系统的性能…

Linux中进程和计划任务管理(2)

一.进程命令 1.lsof lsof 命令&#xff0c;“list opened files”的缩写&#xff0c;直译过来&#xff0c;就是列举系统中已经被打开的文件。通过 lsof 命令&#xff0c;我们就可以根据文件找到对应的进程信息&#xff0c;也可以根据进程信息找到进程打开的文件。 格式&…

【详细实现】v1.0 随机点名应用

1.引言 前面对这个应用的功能做了详细的分析&#xff08;长什么样、能干什么&#xff09;&#xff0c;以先这样对一个项目最开始的分析成为需求分析&#xff0c;需求分析之后就是设计阶段。 那么一般的项目&#xff0c;在设计阶段都需要干什么呢&#xff1f;在需求分析阶段确定…

Linux系统中安装MySQL

1、在电脑中安装虚拟机 2、df -h查看光盘是否挂载&#xff0c;没挂载用mount -o ro /dev/sr0 /media命令挂载 3、进入etc/yum.repos.d目录查看仓是否配置&#xff0c;若配置进行下一一步&#xff0c;未配置则进行配置 配置软件仓库 [rootlocalhost yum.repos.d]# vim rhle.r…

423 世界读书日 和京东零售技术人一起读好书

我们正处于一个复杂、变化的世界&#xff0c;想要更好地理解、适应它&#xff0c;读书可能是最方便的方式之一。 4 月 23 日世界读书日&#xff0c;我们整理了 10 位零售技术人的书籍推荐给大家&#xff0c;欢迎大家一起来共读好书。愿大家在忙碌工作之余&#xff0c;都能够持…

Kubectl常见排查pod问题命令

一.查看命名空间pod及其日志 #查看命名空间pod kubectl get pods -n <命名空间名称> #该命令不加-n命名空间名称&#xff0c;默认是查看default命名空间的pod#查看对应pod的日志kubectl logs -f <pod-name> -n <namespace>#同样的如果查看的是default命名空…

在 vue3 中使用高德地图

前言&#xff1a;定位地图位置所需要的经纬度&#xff0c;可以通过 拾取坐标 获取。 一&#xff1a;快速上手 1. 安装依赖 npm install amap/amap-jsapi-loader # or pnpm add amap/amap-jsapi-loader # or yarn add amap/amap-jsapi-loader 2. 创建组件 src/components/Ma…