查看原文
其他

FEALPy 算例:微分、变分到有限元求解非线性方程

蔻享代码 2023-03-06

以下文章来源于算海扬帆 ,作者陈春雨

简介

  • 核心开发者:魏华祎
  • 开发单位:湘潭大学
  • 编程语言:Python
  • 开源类型:GNU General Public License
  • 邮箱:weihuayi@xtu.edu.cn
  • 托管网址
    • https://github.com/weihuayi/fealpy
    • https://gitlab.com/weihuayi/fealpy
    • https://github.com/deepmodeling/fealpy
    • https://gitee.com/whymath/fealpy
  • 帮助文档
    https://www.weihuayi.cn/fealpy/docs/zh/quick-start
  • 下载页面:
    https://code.koushare.com/#/code/codeDetail?codeId=217
    (请复制链接至浏览器打开,或点击左下方“阅读原文”跳转)

变分是一个非常强大的数学工具, 在计算数学理论和算法设计中有很多应用.冯康院士借助变分原理奠定了有限元计算方法的严格数学理论, 为后世有限元计算方法的实际应用提供了理论保证, 是近代中国数学的巨大创新.

在笔者学习的过程中发现很多资料中只讲了变分的计算, 没有说明计算出来的变分是什么?但是事实上变分就是无穷维Hilbert空间上的微分. 所以本文从微分出发,讲一讲微分与变分之间的联系, 最后使用 FEALPy, 基于变分求解一个非线性抛物方程.

一、微分

定义: 设函数  为在  邻域有定义的函数, 若存在 , 使得

则称  在  处可微, 微分为

在梅加强版的数学分析中, 将  的线性映射称为  在  处的微分. 对于  上的函数  可以类似定义:

定义: 设函数  为在  周围有定义的函数, 若存在  , 使得

则称  在  处可微, 微分为

在梅加强版的数学分析中, 将  的线性映射称为  在  处的微分.

: 为什么要说微分  是一个线性映射呢? 这里引用[1]中的解释: 首先看微分  是做什么用的,   告诉你: “我是一个无穷小增量, 你要问增量是多大, 你得给我一个方向 (向量) , 我告诉你在这个方向上的增量是多少 (实数) ”, 所以本身微分就是向量到实数的映射. 更多关于这个的讨论见[1]

二、变分

对于变分, 常见的定义是这样: 令  , 定义如下泛函:

,   关于  的变分为:

这样的定义其实并不好, 因为它只告诉了我们变分如何计算, 但是计算出来的 “变分”是什么? 这个定义就无法回答. 要回答这个问题, 我们还是要回到微分的定义, 从微分出发看变分应该是个什么.

正如前面所说: 我们希望  上的函数  的微分存在, 就要存在一个  , 使得

类似的, 对于一个空间  上的泛函  , 我们可以这样写:

那么问题来了,   是什么? 是通常的函数么? 很显然不是, 因为  是实数, 那么  也应该是实数, 所以  只能是一个泛函!而且与前面微分的对比,   还要是一个线性泛函, 定义在  上. 所以变分应该如下定义.

定义: 设  为 Banach 空间  上的一个泛函, 若能找到  上的一个线性泛函 , 使得:

对于任意的  成立, 则称  是  在  处的变分, 记为  .

可以证明变分有以下性质:

上的泛函是  到  上的映射, 更进一步, 对于  到任意其他 Banach 空间  上的的映射也可以有类似的定义[2].

定义: 设  是两个 Banach 空间, 对于一个算子  若存在一个线性算子  满足:  使得

对于任意的  成立, 则称  是  在  处的 Fr'echet  微分, 记为 

同样, Fr'echet 微分也有以下性质:

为了方便叙述, 将 Fr'echet 微分与变分不加以区分, 将 Fr'echet 微分也当作变分.

三、牛顿迭代算法

变分应用非常广泛, 像求最速下降曲线方程, 测地线方程等, 很多资料中都有讲, 本文主要讲变分在计算数学中的一个应用: 非线性问题的线性化.

考虑非线性问题:

任选初值  , 记  在  处的变分为  , 令  , 则有

舍去高阶项后得到一个以  为未知量的线性问题:

令  , 就得到一个  的逼近,   代替 重复上面的过程就可以得到一个  ,以此类推就能得到一个函数列  , 当  满足某些性质 (本文不再展开) 时就有  , 这就是通过牛顿迭代求解非线性方程的过程.

四、有限元求解非线性抛物方程

现在我们使用上述的牛顿迭代法求解一个非线性抛物方程, 考虑问题:

其中  是空间区域,   是时间区域,   是一个  的算子,   ,   是一个常整数, 

(1) 时间离散

首先时间区域离散, 将  分成  , 记  , 得到离散方程:

记  , 将时间项使用向后欧拉离散, 得到离散格式的方程:

则  是  的算子, 问题重写为求解  使其满足:

(2) 迭代求解

假设已知第  层的函数  , 要求解

这时有一个困难:   是非线性的, 这里使用上一节讲的牛顿迭代算法, 构造一个函数列  来逼近  . 令迭代初值为  , 牛顿迭代  进行的关键是求解  , 使其满足

这是一个线性方程, 已经可以使用有限元方法求解了, 但是在此之前我们得先计算  的变分  :

其中  是  在  处的变分作用于  , 即  :

所以: .

(3) 空间离散

令等式  两边乘以测试函数  :

使用分部积分上式转化为:

那么线性问题  转化为: 求解 ,   , 满足上式.

令  是  的一个网格剖分,  是  上的 Lagrange 有限元空间, 那么对应的有限元问题为: 求解  满足:

(4) 有限元求解

记  是  的基函数, 设

则有限元问题  转换为了代数方程:

其中:  

(5) 程序实现

程序实现见https://github.com/weihuayi/fealpy/tree/master/example/NonLinearParabolic_example.py

(6) 数值结果:

五、总结

空间上函数的微分, 与函数空间上算子的变分, 不同的概念却有着深刻的联系, 以至于原本应用于  上的牛顿迭代也可以处理函数空间上的非线性问题, 这就是数学的魅力, 这种和谐统一, 这种一步步抽象后俯瞰问题本质的感觉正是数学最吸引我们的地方.

六、参考文献

[1]梁灿彬, 周彬. 微分几何入门与广义相对论.上册.第2版[M]. 科学出版社, 2009. [2]Fr'echet derivative: https://en.wikipedia.org/wiki/Fr%C3%A9chet_derivative




推荐阅读

【科学代码】EAPOTs:单元素原子间作用势软件>>

【科学代码】SPaMD: 材料原子级建模、模拟、分析和表征>>

【科学代码】KPROJ:一款能带反折叠程序>>

【科学代码】VaspCZ:一个提高效率的VASP计算辅助程序>>

【科学代码】计算全同玻色体系的格林函数、密度分布和相变等热力学和基态性质的C++代码>>

编辑:黄琦

蔻享学术 平台


蔻享学术平台,国内领先的一站式科学资源共享平台,依托国内外一流科研院所、高等院校和企业的科研力量,聚焦前沿科学,以优化科研创新环境、传播和服务科学、促进学科交叉融合为宗旨,打造优质学术资源的共享数据平台。

识别二维码,

下载 蔻享APP  查看最新资源数据。

点击阅读原文,查看更多精彩!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存