龙格库塔法是解ode的利器,最近有个project是用龙格库塔法解pde,做的时候网上这方面能搜到的资料还不多,传一下自己的解法。

核心思路

  1. 直线法(method of line)把pde化为ode,离散化为空间n个格点上的一元函数,用向量表示
    u(x,ti)→{u1(t),u2(t)...,un(t)}iT=u⃗iu(x,t_i)→\{u_1(t),u_2(t)...,u_n(t)\}_i^T=\vec{u}_i u(x,ti​)→{u1​(t),u2​(t)...,un​(t)}iT​=ui​
  2. 空间的二阶导用中心差分格式处理,写成矩阵形式
    ∂u2∂2x=1Δx2(−2100⋯01−210⋯⋮01−21⋯⋮⋮⋮⋮⋮⋯1000⋯1−2)⋅{u1(t)u2(t)⋮⋮un(t)}=∂u∂t=C⋅u⃗i\frac{\partial u^2}{\partial^2 x}=\frac{1}{\Delta x^2} \begin{pmatrix} -2 & 1 & 0 & 0 &\cdots & 0 \\ 1 & -2 & 1 & 0 &\cdots & \vdots \\ 0 & 1 & -2 & 1 & \cdots & \vdots \\ \vdots & \vdots & \vdots & \vdots & \cdots & 1 \\ 0 & 0 & 0 & \cdots & 1 & -2 \end{pmatrix}·\left \{ \begin{matrix} u_1(t)\\u_2(t)\\\vdots \\\vdots \\u_n(t) \end{matrix} \right\} =\frac{\partial u}{\partial t} =C·\vec{u}_i ∂2x∂u2​=Δx21​⎝⎜⎜⎜⎜⎜⎜⎜⎛​−210⋮0​1−21⋮0​01−2⋮0​001⋮⋯​⋯⋯⋯⋯1​0⋮⋮1−2​⎠⎟⎟⎟⎟⎟⎟⎟⎞​⋅⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧​u1​(t)u2​(t)⋮⋮un​(t)​⎭⎪⎪⎪⎪⎪⎪⎬⎪⎪⎪⎪⎪⎪⎫​=∂t∂u​=C⋅ui​
  3. 扩散方程的时间一阶偏导用4阶龙格库塔方法转化为线性方程
    四阶龙格库塔常用格式

    ∂u∂t=∂2u∂x2→ui+1−uih=16(k1+k2+k3+k4)=C⋅ui⃗\frac{\partial u}{\partial t} = \frac{\partial^2u}{\partial x^2}\to \frac{u_{i+1}-u_{i}}{h}=\frac{1}{6}(k_1+k_2+k_3+k_4) =C·\vec{u_i} ∂t∂u​=∂x2∂2u​→hui+1​−ui​​=61​(k1​+k2​+k3​+k4​)=C⋅ui​​
    4.中间量取值
    这是最关键的一步。龙格库塔解ode之所以方便,因为f是表达式已知的显函数,直接代入完事。但pde里面偏导表达式如果有还好办,没有的话像扩散方程得换条思路。注意到k是时间偏导的函数值,取决于x和y。在扩散方程中k其实是空间二阶偏导的在某一点的函数值。虽然定义上某一点y的二阶偏导由x,y共同决定,但实际上把二阶偏导视为微分算符的话,偏导的值由y便可确定。换言之,扩散方程中u是一个隐函数,不同的k对应不同的u。\begin{matrix} {\color{Red} 这是最关键的一步。}\\ {\color{Red} 龙格库塔解ode之所以方便,因为f是表达式已知的显函数,直接代入完事。}\\ {\color{Red}但pde里面偏导表达式如果有还好办,没有的话像扩散方程得换条思路。} \\ {\color{Red}注意到k是时间偏导的函数值,取决于x和y。} \\ {\color{Red}在扩散方程中k其实是空间二阶偏导的在某一点的函数值。} \\ {\color{Red}虽然定义上某一点y的二阶偏导由x,y共同决定,}\\ {\color{Red}但实际上把二阶偏导视为微分算符的话,偏导的值由y便可确定。}\\ {\color{Red}换言之,扩散方程中u是一个隐函数,不同的k对应不同的u。}\\ \end{matrix} 这是最关键的一步。龙格库塔解ode之所以方便,因为f是表达式已知的显函数,直接代入完事。但pde里面偏导表达式如果有还好办,没有的话像扩散方程得换条思路。注意到k是时间偏导的函数值,取决于x和y。在扩散方程中k其实是空间二阶偏导的在某一点的函数值。虽然定义上某一点y的二阶偏导由x,y共同决定,但实际上把二阶偏导视为微分算符的话,偏导的值由y便可确定。换言之,扩散方程中u是一个隐函数,不同的k对应不同的u。​

k1=C⋅ui⃗,k2=C⋅(ui⃗+hk12),k3=C⋅(ui⃗+hk22),k4=C⋅(ui⃗+hk32)k_1=C·\vec{u_i},k_2=C·(\vec{u_i}+\frac{hk_1}{2} ),k_3=C·(\vec{u_i}+\frac{hk_2}{2} ),k_4=C·(\vec{u_i}+\frac{hk_3}{2} ) k1​=C⋅ui​​,k2​=C⋅(ui​​+2hk1​​),k3​=C⋅(ui​​+2hk2​​),k4​=C⋅(ui​​+2hk3​​)

  1. 迭代
    至此,我们得到一个在时间方向上迭代的前向差分格式
    ui+1=ui+h6(k1+k2+k3+k4){u_{i+1}=u_{i}}+\frac{h}{6}(k_1+k_2+k_3+k_4) ui+1​=ui​+6h​(k1​+k2​+k3​+k4​)
    C++用一个循环实现,调用eigen线代库进行矩阵运算,vector容器定义循环的列向量,ofstream把每次循环结果列向量的值装进excel表。

计算结果

边界与初始条件,以及计算范围与步长
D=0.1u(0,t)=1013,u(x>0,0)=0t∈[0,5],tsteps=10000;x∈[0,1],xsteps=50D=0.1\\ u(0,t)=10^{13},u(x>0,0)=0 \\ t∈[0,5],tsteps=10000;x∈[0,1],xsteps=50 D=0.1u(0,t)=1013,u(x>0,0)=0t∈[0,5],tsteps=10000;x∈[0,1],xsteps=50
小步长多步计算,基本等于恒定源扩散的解析解——余误差函数

缩小范围,减少步数,计算误差
D=0.01t∈[0,3],tsteps=300;x∈[0,1],xsteps=30D=0.01\\ t∈[0,3],tsteps=300;x∈[0,1],xsteps=30 D=0.01t∈[0,3],tsteps=300;x∈[0,1],xsteps=30
龙格库塔算出来的误差随函数值增大而增大,空间越往后误差越大,时间越往后误差越小

对比与欧拉法的误差

误差龙格库塔-欧拉<0,说明确实比欧拉法精确。

四阶龙格库塔法解一维扩散方程相关推荐

  1. 二阶偏微分方程组 龙格库塔法_1、经典四阶龙格库塔法解一阶微分方程组

    1.经典四阶龙格库塔法解一阶微分方程组 陕 西 科 技 大 学 数值计算课程设计任务书 理学院信息与计算科学/应用数学专业信息08/数学08 班级 学生: 题目:典型数值算法的C++语言程序设计 课程 ...

  2. 四阶龙格库塔法的基本思想_经典四阶龙格库塔法解一阶微分方程组讲义.doc

    1.经典四阶龙格库塔法解一阶微分方程组 1.1运用四阶龙格库塔法解一阶微分方程组算法分析 , 经过循环计算由 推得 -- 每个龙格-库塔方法都是由一个合适的泰勒方法推导而来,使得其最终全局误差为,一种 ...

  3. 四阶龙格库塔法的基本思想_请问用四阶龙格库塔法解二阶微分方程的思想是什么?...

    默认y的单位是弧度 k=1000; t=0:0.001:1; Y=[]; err=1 K=[]; Ymax=[]; xishu=1.01; while err X=[0 0]; k=xishu*k; ...

  4. python解常微分方程龙格库_excel实现四阶龙格库塔法runge-kutta解二阶常微分方程范例.xls...

    excel实现四阶龙格库塔法runge-kutta解二阶常微分方程范例,rungekutta,四阶rungekutta法,rungekuttamatlab,四阶rungekutta,rungekutt ...

  5. 欧拉法、预估校正法(改进的欧拉法)与四阶龙格库塔法求解常微分方程的数值解C++程序

    以y'=x+y,0<x<1,y(0)=1为例,取步长h=0.1,已知精确值为y=-x-1+2e^x,用来进行精度比较 #include<stdio.h> using names ...

  6. 四阶龙格库塔法的基本思想_利用龙格库塔法求解郎之万方程.doc

    利用龙格库塔法求解郎之万方程.doc 利用龙格-库塔法求解朗之万方程1. 待解问题布朗颗粒是非常微小的宏观颗粒,其直径的典型大小为10-710-6m.颗粒不断受到液体介质分子的碰撞,在任一瞬间,一个颗 ...

  7. 有限元方法求解一维扩散方程(FEALPy)

    有限元方法求解一维扩散方程 文章目录 有限元方法求解一维扩散方程 有限元方法推导 差分格式的介入 数值算例 之前完成了 FEALPy 有限元求解 Poisson 方程 的数值算例, 通过 湘潭大学王唯 ...

  8. 有限差分法的一维扩散MATLAB,一维扩散方程的有限差分法matlab

    用matlab编程实现一维扩散方程的有限差分法 1 一维扩散方程的有限差分法 --计算物理实验作业七 陈万 物理学2013级 130******** ● 题目: 编程求解一维扩散方程的解 ⎪⎪⎪⎪⎩ ...

  9. 四阶龙格库塔法的基本思想_Runge-Kutta法求四元数微分方程

    Runge-Kutta法求四元数微分方程 Runge-Kutta法求四元数微分方程 文章目录一.背景知识1. 坐标系 2. 四元数四元数的矩阵形式 四元数与旋转的关系 二.数学模型1. 四元数微分方程 ...

  10. 四阶龙格库塔法的基本思想_四阶龙格库塔实验报告.docx

    四阶龙格库塔实验报告 三.四阶Runge-Kutta法求解常微分方程一.龙格库塔法的思想根据第九章的知识可知道,Euler方法的局部截断误差是,而当用Euler方法估计出再用梯形公式进行校正,即采用改 ...

最新文章

  1. J - One-Dimensional HYSBZ - 4688
  2. 华人博士拿下ACM SIGSOFT杰出博士论文奖,师从北大谢涛教授
  3. vs2017中报无法打开包括文件: corecrt.h: No such file or directory
  4. ElasticSearch之Centos7下安装
  5. python自定义colorbar_python可视化 matplotlib画图使用colorbar工具自定义颜色
  6. spring aop组件_安全性中的Spring AOP –通过方面控制UI组件的创建
  7. php,Allowed memory size of 8388608 bytes exhausted (tried to allocate 1298358 bytes)
  8. Vue 学习笔记 — css属性计算的问题
  9. PB中实现备份数据库/还原数据库
  10. Spring MVC学习总结(18)——SpringMVC事务Transactional注解使用总结
  11. 力扣——315. 计算右侧小于当前元素的个数
  12. verilog中signed的使用
  13. Ubuntu16.04+CUDA9.0+CUDNN7.1+Tensorflow-gpu-1.11.0详细安装教程
  14. 阶段5 3.微服务项目【学成在线】_day01 搭建环境 CMS服务端开发_05-CMS需求分析-什么是CMS...
  15. 开通博客,记录一下。
  16. 高德地图与百度地图的经纬度偏差纠正
  17. 详细解析十大排序算法(js实现)
  18. 网易公开课中英字幕文件合并代码
  19. visio导出pdf只保存绘图区域以及插入符号为灰色、插入异或符号
  20. 大一高级计算机考试内容,大一计算机考试内容

热门文章

  1. sql插入多条记录_如何在SQL中插入多条记录
  2. Python —— 修改桌面壁纸
  3. Android 用代码Ping网络
  4. 个人介绍网页代码 html静态网页设计制作 dw静态网页成品模板素材网页 web前端网页设计与制作 div静态网页设计
  5. html svg 在线编辑器,用于矢量图形的SVG在线编辑器
  6. php 处理raw数据,PHP用HTTP_RAW_POST_DATA来接收post过来的数据
  7. python模块安装位置_查看python模块的安装路径
  8. python下载docx模块_怎么下载python-docx模块
  9. c语言答辩ppt案例,c语言ppt例子课题答辩ppt成品中南民族大.ppt
  10. 阿里云的这群疯子(转载)