Ordinary Differential Equations

Slides:



Advertisements
Similar presentations
数值分析 第五节 数值微分 在实际问题中,往往会遇到某函数 f(x) 是用表格 表示的, 用通常的导数定义无法求导, 因此要寻求其他 方法近似求导。常用的数值微分方法有 : 一. 运用差商求数值微分 二.运用插值函数求数值微分 三. 运用样条插值函数求数值微分 四. 运用数值积分求数值微分.
Advertisements

数 学 系 University of Science and Technology of China DEPARTMENT OF MATHEMATICS 第 8 章 常微分方程 实际中,很多问题的数学模型都是微分方程。我们可以研究它们的一些 性质。但是,只有极少数特殊的方程有解析解。对于绝大部分的微分方程是.
一、 一阶线性微分方程及其解法 二、 一阶线性微分方程的简单应用 三、 小结及作业 §6.2 一阶线性微分方程.
新疆医科大学 主讲人:张利萍 计 算 方 法. zlp 第五章 常微分方程数值解 5.1 引言 ( 基本求解公式 ) 5.2 Runge-Kutta 法 5.3 微分方程组和高阶方程解法简介.
第五节 函数的微分 一、微分的定义 二、微分的几何意义 三、基本初等函数的微分公式与微分运算 法则 四、微分形式不变性 五、微分在近似计算中的应用 六、小结.
第 14 章 常微分方程的 MATLAB 求 解 编者. Outline 14.1 微分方程的基本概念 14.2 几种常用微分方程类型 14.3 高阶线性微分方程 14.4 一阶微分方程初值问题的数值解 14.5 一阶微分方程组和高阶微分方程的数值解 14.6 边值问题的数值解.
第九章 常微分方程数值解法 §1 、引言. 微分方程的数值解:设方程问题的解 y(x) 的存在区间是 [a,b] ,令 a= x 0 < x 1
1 第八章 常微分方程数值解法. 2 1 .微分方程的数值解法 3 在这些节点上把常微分方程的初值问题离散化为差 分方程的相应问题,再求出这些点上的差分方程的解 作为相应的微分方程的近似值(满足精度要求)。
1 第八章常微分方程初值问题的数值解法. 2 第八章 常微分方程数值解法 8.1 引言 ( 基本求解公式 )8.1 引言 ( 基本求解公式 ) 8.2 Runge-Kutta 法8.2 Runge-Kutta 法 8.3 微分方程组和高阶方程解法简介8.3 微分方程组和高阶方程解法简介.
第 4 章 数值微积分. 4.1 内插求积 Newton-Cotes 公式 第 4 章 数值微积分 4.1 内插求积 Newton-Cotes 公式.
计算机数学基础(下) --数值分析 教师:孙继荣 电话: 028 -
楊學成 老師 Chapter 1 First-order Differential Equation.
( Numerical Methods for Ordinary Differential Equations )
While 迴圈 - 不知重複執行次數
第六章 6.1 常微分方程及其求解概述 6.2 初值问题解法 6.3 边值问题解法
指導老師:邱敏慧老師 姓名:徐鈺琁 班級:114 座號:33
C语言程序设计 主讲教师 :张群燕 电话:
—— matlab 具有出色的数值计算能力,占据世界上数值计算软件的主导地位
第九章 常微分方程的数值解法 主 要 内 容 §1、引言 §2、初值问题的数值解法--单步法 §3、龙格-库塔方法 §4、收敛性与稳定性
親愛的老師您好 感謝您選用本書作為授課教材,博碩文化準備本書精選簡報檔,特別摘錄重點提供給您授課專用。 說明: 博碩文化:
一、二阶行列式的引入 用消元法解二元线性方程组. 一、二阶行列式的引入 用消元法解二元线性方程组.
“八皇后”问题 崔萌萌 吕金华.
Loops.
第九章 常微分方程数值解  考虑一阶常微分方程的初值问题
计算机数学基础(下) 第5编 数值分析 第14章 常微分方程的数值解法.
第四节 一阶线性微分方程 线性微分方程 伯努利方程 小结、作业 1/17.
§5 微分及其应用 一、微分的概念 实例:正方形金属薄片受热后面积的改变量..
第三章 数值积分法在系统仿真中的应用 3.1 连续系统仿真中常用的数值积分法……………. 3.2 刚性系统的特点及算法………………………….
非线性物理——混沌 向前 胡冰清
第三章 导数与微分 习 题 课 主要内容 典型例题.
§5 微分及其应用 一、微分的概念 实例:正方形金属薄片受热后面积的改变量..
第8章 回归分析 本章教学目标: 了解回归分析在经济与管理中的广泛应用; 掌握回归分析的基本概念、基本原理及其分析应用的基本步骤;
数值计算方法 第八章 常微分方程初值问题数值解法  重庆邮电大学.
Chap 10 函数与程序结构 10.1 函数的组织 10.2 递归函数 10.3 宏定义 10.4 编译预处理.
If … else 選擇結構 P27.
C 程式設計— 語言簡介 台大資訊工程學系 資訊系統訓練班.
Chap 2 用C语言编写程序 2.1 在屏幕上显示 Hello World! 2.2 求华氏温度 100°F 对应的摄氏温度
C++ 程式設計— 語言簡介 台大資訊工程學系 資訊系統訓練班.
/* Numerical Methods for Ordinary Differential Equations */
第四章 数值积分与数值微分 — 复合求积公式 — Romberg 算法.
Introduction to the C Programming Language
数学软件 Matlab —— Matlab 符号运算.
本章中將會更詳細地考慮有關重複的概念,並且會 介紹for和do…while等兩種用來控制重複的敘述 式。 也將會介紹switch多重選擇敘述式。 我們會討論直接和迅速離開某種控制敘述式的 break敘述式,以及用來跳過重複敘述式本體剩餘 部份的continue敘述式。 本章會討論用來組合控制條件的邏輯運算子,最後.
計數式重複敘述 for 迴圈 P
第七章 函数及变量存贮类型 7.1 函数基础与C程序结构 7.2 函数的定义和声明 7.3 函数的调用 7.4 函数的嵌套与递归
MATLAB在常微分方程上的應用 楊惠如 老師:王天楷教授 2005/8/30.
Partial Differential Equations §2 Separation of variables
C语言概述 第一章.
一、问题的背景和目的 二、问题分析 三、例题
C 语言程序设计 程序的循环结构 电大崇信县工作站 梁海亮.
Introduction to the C Programming Language
C语言程序设计 教案 崔武子制作
Chap 5 函数 5.1 计算圆柱体积 5.2 使用函数编写程序 5.3 变量与函数.
Chap 5 函数 5.1 计算圆柱体积 5.2 数字金字塔 5.3 复数运算.
(七)不可压缩流的数值方法 7.1 MAC方法 7.2 投影法 7.3 人工压缩性方法 7.4 SIMPLE方法 7.5 其他方法:
C语言程序设计 李祥 QQ:
第2章 认识C语言 教学要点 2. 1 项目二C语言程序识读 2 .2 项目三班级成绩排名 2 .3 知识链接 返回.
C++程式設計入門 變數與運算子 作者:黃建庭.
第二章 类型、对象、运算符和表达式.
Introduction to the C Programming Language
第 四 章 迴歸分析應注意之事項.
两个变量的线性相关 琼海市嘉积中学 梅小青.
 隐式欧拉法 /* implicit Euler method */
第1章 数据结构基础概论 本章主要介绍以下内容 数据结构研究的主要内容 数据结构中涉及的基本概念 算法的概念、描述方法以及评价标准.
线性回归.
第三节 函数的微分 3.1 微分的概念 3.2 微分的计算 3.3 微分的应用.
教学大纲(甲型,54学时 ) 教学大纲(乙型, 36学时 )
Chap 10 函数与程序结构 10.1 圆形体积计算器 10.2 汉诺塔问题 10.3 长度单位转换 10.4 大程序构成.
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
函式庫補充資料 1.
Presentation transcript:

Ordinary Differential Equations ODE Ordinary Differential Equations

一阶常微分方程的初值问题: 节点:x1<x2< … <xn 步长 为常数

一 欧拉方法(折线法) yi+1=yi+h f(xi,yi) (i =0,1, …, n-1) 优点:计算简单。 缺点:一阶精度。 二 改进的欧拉方法

改进的欧拉公式可改写为 它每一步计算f(x,y)两次,截断误差为O(h3)

精确解: function [t,y] = Heun(ode,tspan,h,y0) t = (tspan(1):h:tspan(end))'; n = length(t); y = y0*ones(n,1); for i=2:n k1 = feval(ode,t(i-1),y(i-1)); k2 = feval(ode,t(i),y(i-1)+h*k1); y(i) = y(i-1)+h*(k1+k2)/2; end

三 龙格—库塔法(Runge-Kutta) 欧拉公式可改写为 它每一步计算 f (xi,yi) 一次,截断误差为O(h2)

每一步计算 f (x, y) 四次,截断误差为O(h5) 标准四阶龙格—库塔公式 每一步计算 f (x, y) 四次,截断误差为O(h5) 1/2 1 1/6 2/6

对于两个分量的一阶常微分方程组 用经典4阶 Runge-Kutta 法求解的格式为

n 级显式Runge-Kutta 方法的一般计算格式: 其中 Adams 外插公式(Adams-Bashforth 公式)是一类 k+1 步 k+1 阶显式方法 三步法(k=2), 四步法(k=3), Adams 内插公式(Adams-Moulton 公式)是一类 k+1 步 k+2 阶隐式方法 三步法(k=2), Adams 预估-校正方法(Adams-Bashforth-Moulton 公式) 一般取四步外插法与三步内插法结合。

#include <stdio.h> #include <stdlib.h> #include <math.h> #define TRUE 1 main() { int nstep_pr, j, k; float h, hh, k1, k2, k3, k4, t_old, t_limit, t_mid, t_new, t_pr, y, ya, yn; double fun(); printf( "\n Fourth-Order Runge-Kutta Scheme \n" ); while(TRUE){ printf( "Interval of t for printing ?\n" ); scanf( "%f", &t_pr ); printf( "Number of steps in one printing interval?\n" ); scanf( "%d", &nstep_pr ); printf( "Maximum t?\n" ); scanf( "%f", &t_limit ); y = 1.0; /* Setting the initial value of the solution */ h = t_pr/nstep_pr; printf( "h=%g \n", h ); t_new = 0; /* Time is initialized. */ hh = h/2; printf( "--------------------------------------\n" ); printf( " t y\n" ); printf( " %12.5f %15.6e \n", t_new, y );

do{ for( j = 1; j <= nstep_pr; j++ ){ t_old = t_new; t_new = t_new + h; yn = y; t_mid = t_old + hh; yn = y; k1 = h*fun( yn, t_old ); ya = yn + k1/2; k2 = h*fun( ya, t_mid ); ya = yn + k2/2; k3 = h*fun( ya, t_mid ); ya = yn + k3 ; k4 = h*fun( ya, t_new ); y = yn + (k1 + k2*2 + k3*2 + k4)/6; } printf( " %12.5f %15.6e \n", t_new, y ); } while( t_new <= t_limit ); printf( "--------------------------------------\n" ); printf( " Maximum t limit exceeded \n" ); printf( "Type 1 to continue, or 0 to stop.\n" ); scanf( "%d", &k ); if( k != 1 ) exit(0); double fun(y, t) float y, t; { float fun_v; fun_v = -y; return( fun_v ); }

四 误差的控制 我们常用事后估计法来估计误差,即从xi出发,用两种办法计算y(xi+1)的近似值。 记 为从xi出发以h为步长得到的y(xi+1)的 近似值,记 为从xi出发以 h/2 为步长跨 两步得到的y(xi+1)的近似值。设给定精度为ε。如果不等式 成立,则 即为y(xi+1)的满足精度要求的近似值。

自适应: 使用2个不同的h。如果一个大的h和一个小的h得到的解相同,那么减小h就没有意义了;相反如果两个解差别大,可以假设大h值得到的解是不精确的。 使用相同的h值,2种不同的算法。如果低精度算法与高精度算法的结果相同,则没有必要减小h。

Matlab 函数 Ode23 非刚性, 单步法, 二三阶Runge-Kutta,精度低 Ode113非刚性, 多步法, 采用可变阶(1-13)Adams PECE 算法, 精度可高可低 Ode15s 刚性, 多步法,采用Gear’s (或BDF)算法, 精度中等. 如果ode45很慢, 系统可能是刚性的,可试此法 Ode23s 刚性, 单步法, 采用2阶Rosenbrock法, 精度较低, 可解决ode15s 效果不好的刚性方程. Ode23t 适度刚性, 采用梯形法则,适用于轻微刚性系统,给出的解无数值衰减. Ode23tb 刚性, TR-BDF2, 即R-K的第一级用梯形法则,第二级用Gear 法. 精度较低, 对于误差允许范围比较差的情况,比ode15s好.

Matlab’s ode23 (Bogacki, Shampine)

Matlab’s ode45 is a variation of RKF45 Runge-Kutta-Fehlberg方法(RKF45) 4阶Runge-Kutta近似 5阶Runge-Kutta近似 局部误差估计 Matlab’s ode45 is a variation of RKF45

function xdot = vdpol(t,x) xdot(1) = x(2); Van der Pol: function xdot = vdpol(t,x) xdot(1) = x(2); xdot(2) = -(x(1)^2 -1)*x(2) -x(1); xdot = xdot'; % VDPOL must return a column vector. % xdot = [x(2); -(x(1)^2 -1)*x(2) -x(1)]; % xdot = [0 , 1; -1 ,-(x(1)^2 -1)] *x; t0 = 0; tf = 20; x0 = [0; 0.25]; [t,x] = ode45(@vdpol,[t0,tf],x0); plot(t,x); figure(101) plot(x(:,1),x(:,2));

Lorenz吸引子 function xdot = lorenz(t,x) xdot = [ -8/3, 0, x(2); 0, -10, 10; -x(2), 28, -1]*x; x0 = [0,0,eps]'; [t,x] = ode23('lorenz',[0,100],x0); plot3(x(:,1),x(:,2),x(:,3)); plot(x(:,1),x(:,2));

刚性方程 向后差分方法(Gear’s method) 隐式Runge-Kutta法 function yp = examstiff(t,y) yp = [-2, 1; 998, -998]*y + [2*sin(t);999*(cos(t)-sin(t))]; y0 = [2;3]; tic,[t,y] = ode113('examstiff',[0,10],y0);toc tic,[t,y] = ode45('examstiff',[0,10],y0);toc tic,[t,y] = ode23('examstiff',[0,10],y0);toc tic,[t,y] = ode23s('examstiff',[0,10],y0);toc tic,[t,y] = ode15s('examstiff',[0,10],y0);toc tic,[t,y] = ode23t('examstiff',[0,10],y0);toc tic,[t,y] = ode23tb('examstiff',[0,10],y0);toc

线性隐式ODE: 完全隐式ODE(Matlab7): Weissinger方程: 初值为 时, 解析解为 function f = weissinger(t,y,yp) f = t*y^2*yp^3 - y^3*yp^2 + t*(t^2+1)*yp - t^2*y; t0 = 1; y0 = sqrt(3/2); yp0= 0; % guess [y0,yp0] = decic(@weissinger,t0,y0,1,yp0,0); % 求出自洽初值。保持y0不变 [t,y] = ode15i(@weissinger,[1,10],y0,yp0); ytrue = sqrt(t.^2+0.5); plot(t,ytrue,t,y,'o')

延迟微分方程 初值 : function yp = ddefun(t,y,Z) yp = zeros(2,1); % define lags=[1,3] yp(1) = Z(1,2)^2 + Z(2,1)^2; yp(2) = y(1) + Z(2,1); function y = ddehist(t) y = zeros(2,1); y(1) = 1; y(2) = t-2; 延迟微分方程 Sol = dde23(ddefun,lags,ddehist,tspan) lags = [1,3]; sol = dde23(@ddefun,lags,@ddehist,[0,1]); hold on; plot(sol.x,sol.y(1,:),'b-'); plot(sol.x,sol.y(2,:),'r-'); 初值 :

有限差分法 二阶线性边值问题 差分离散: bvp4c

二阶线性边值问题(11)的可以通过求解下面两个初值问题获得。 线性边值问题的打靶法: 二阶线性边值问题(11)的可以通过求解下面两个初值问题获得。 (IVP1) (IVP2) 原来边值问题的解可以表示为: 非线性边值问题的打靶法

求解区域,定义边界,网格划分,计算,画图,保存文件求解 符号计算 y = dsolve('D2y = -a^2*y','x') %求通解 y = dsolve('D2y = -a^2*y','y(0)=1','Dy(pi/a)=0','x') [x,y] = dsolve('Dx=4x-2y','Dy=2x-y','t') Pdetool 求解区域,定义边界,网格划分,计算,画图,保存文件求解 边条 解析解 演示求解过程

Stokes 问题 Q1-P0有限元离散

Navier-Stokes 问题

MAC差分离散

物理问题的控制方程: 前台阶流(A Mach 3 Wind Tunnel with a Step) 模拟放置在风洞中的前台阶流动。风洞尺寸:宽1.0,长3.0,台阶高0.2,放置在距风洞左边界0.6个单位长度处。 物理问题的控制方程:

Sod问题 Sod问题是在激波管中充以两种介质,维持一定的压力差,用隔膜分开;当隔膜突然破裂后,形成间断面,研究其时间发展情况。 Euler方程组:

A picture is worth a thousand words. - Anonymous Make it right before you make it faster. - Brain W. Kernighan, P. J. Plauger, The Elements of Programming Style(1978)