Matlab:显(隐)式Euler和Richardson外推法变步长求解刚性问题





一、显示Euler
函数文件:Euler.m
function f=Euler(h,Y)
f(1,1)=Y(1)+h*(0.01-(1+(Y(1)+1000)*(Y(1)+1))*(0.01+Y(1)+Y(2)));
f(2,1)=Y(2)+h*(0.01-(1+Y(2)^2)*(0.01+Y(1)+Y(2)));
脚本文件:
tic;
clear
clc
%%
%显示Euler方法求刚性微分方程,要求用Richardson外推法估计近似误差从而控制步长
y(1:2,1)=[0;0];%初值
e=1e-5;%误差过小
tol=1e-3;%指定的误差
N=10;%节点的步数
h=1/N;%初始步长
t(1)=0;
i=1;
while t(i)+h<=1
k=1;
%%自动变步长
while k==1
y(1:2,i+1)=Euler(h,y(1:2,i));%符合误差的数值解
y1_half=Euler(h/2,y(1:2,i));%半步长的中点数值解
y1_one=Euler(h/2,y1_half);%半步长的右端点的数值解
Estimate_error=2*norm(y(1:2,i+1)-y1_one);%中间估计误差
if Estimate_error<tol%指定误差
k=0;%步长相差不大,或者说正好在指定的误差范围内,则确定选择h作为步长。
elseif Estimate_error<e%误差过小
h=2*h;
else
h=h/2;
end
end
t(i+1)=t(i)+h;
i=i+1;
end
%%
%绘图
plot(t,y,'');
xlabel('t'),ylabel('y(t) and z(t)');
legend('y(t)','z(t)');
title('Implicit Euler method for numerical solution of image');
grid on;
toc;
效果图:

二、隐式Euler:Euler.m
function X=Euler(t_h,u)
%隐式Euler(Newton迭代法)
%%
Tol=1e-5;
U=u;
x1=U-Jacobian(U,t_h)\F(U,u,t_h);
while (norm(x1-U,2)>=Tol)
%数值解的2范数是否在误差范围内
U=x1;
x1=U-Jacobian(U,t_h)\F(U,u,t_h);
end
X=x1;%不动点
%雅可比矩阵
function f=Jacobian(U,t_h)
f(1,1)=-t_h*((2*U(1)+1001)*(0.01+U(1)+U(2))+1+(U(1)+1000)*(U(1)+1))-1;
f(1,2)=-t_h*(1+(U(1)+1000)*(U(1)+1));
f(2,1)=-t_h*(1+U(2)^2);
f(2,2)=-t_h*(2*U(2)*(0.01+U(1)+U(2))+(1+U(2)^2))-1; %方程组
%%
function fun=F(U,u,t_h)
fun(1,1)=u(1)+t_h*(0.01-(1+(U(1)+1000)*(U(1)+1))*(0.01+U(1)+U(2)))-U(1);
fun(2,1)=u(2)+t_h*(0.01-(1+U(2)^2)*(0.01+U(1)+U(2)))-U(2);
脚本文件:
tic;
clear
clc
%隐式Euler方法求刚性微分方程,要求用Richardson外推法估计近似误差从而控制步长
%%
y(1:2,1)=[0;0];%初值
e=1e-5;%误差过小
tol=1e-3;%指定的误差
N=100;%节点的步数
h=1/N;%初始步长
t(1)=0;%初始节点
i=1;
while t(i)+h<=1
k=1;
%自动变步长
while k==1
y(1:2,i+1)=Euler(h,y(1:2,i));%符合误差的数值解
% y1_half=Euler(h/2,y(1:2,i));%半步长的中点数值解
y1_half=Euler(h/2,y(1:2,i));%半步长的右端点的数值解
Estimate_error=2*norm(y(1:2,i+1)-y1_half);%中间估计误差
if Estimate_error<tol%指定误差
k=0;%步长相差不大,或者说正好在指定的误差范围内,则确定选择h作为步长。
elseif Estimate_error<e%误差过小
h=2*h;
else%近似估计误差大于指定误差
h=h/2;
end
end
t(i+1)=t(i)+h;
i=i+1;
end
%绘图
%%
plot(t,y);
xlabel('t'),ylabel('y(t) and z(t)');
legend('y(t)','z(t)');
title('Explicit Euler method for numerical solution of image');
grid on ;
toc;
效果图:

Matlab:显(隐)式Euler和Richardson外推法变步长求解刚性问题的更多相关文章
- C#中显/隐式实现接口及其访问方法
原贴地址: http://www.cnblogs.com/dudu837/archive/2009/12/07/1618663.html 在实现接口的时候,VS提供了两个菜单,一个是"实现接 ...
- Matlab:高阶常微分三种边界条件的特殊解法(隐式Euler)
函数文件1: function b=F(f,x0,u,h) b(1,1)=x0(1)-h*x0(2)-u(1); b(2,1)=x0(2)+h*x0(1)^2-u(2)-h*f; 函数文件2: fun ...
- 转】C#接口-显式接口和隐式接口的实现
[转]C#接口-显式接口和隐式接口的实现 C#中对于接口的实现方式有隐式接口和显式接口两种: 类和接口都能调用到,事实上这就是“隐式接口实现”. 那么“显示接口实现”是神马模样呢? interface ...
- 无废话Android之smartimageview使用、android多线程下载、显式意图激活另外一个activity,检查网络是否可用定位到网络的位置、隐式意图激活另外一个activity、隐式意图的配置,自定义隐式意图、在不同activity之间数据传递(5)
1.smartimageview使用 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&q ...
- 显式Intent和隐式Intent
http://blog.csdn.net/qs_csu/article/details/7995966 对于明确指出了目标组件名称的Intent,我们称之为“显式Intent”. 对于没有明确指出目标 ...
- SQL Server显式事务与隐式事务
事务是单个的工作单元.如果某一事务成功,则在该事务中进行的所有数据修改均会提交,成为数据库中的永久组成部分.如果事务遇到错误且必须取消或回滚,则所有数据库修改均被清除. SQL Server中有一下几 ...
- (转载)Android理解:显式和隐式Intent
Intent分两种:显式(Explicit intent)和隐式(Implicit intent). 一.显式(设置Component) 显式,即直接指定需要打开的activity对应的类. 以下多种 ...
- dll显式加载与隐式加载
使用动态DLL有两种方法,一种是隐式链接,一种是显式链接,如果用loadlibrary就是显示链接,用lib就属于隐式链接. 两种方法对于你的程序调用动态库时没有任何区别,只是你在编程时,步骤是不一样 ...
- c# implicit explicit关键字(隐式和显式数据类型转换)
implicit关键字用于声明隐式的用户定义类型转换运算符.(explicit反之)explicit则用于显示转换用户自定义类型.static implicit operator target_typ ...
随机推荐
- Fernflower 反编译.class文件
最近有些奇怪Intellij IDEA通过什么查看的源码,通过打开源码意外的发现如下注释 原来是通过Fernflower这个反编译工具w(゚Д゚)w. 使用Fernflower反编译出的代码相当友好, ...
- vs安装问题
1 首先windows update异常,导致vs2015的一个安装不上,先试着修一下: https://support.microsoft.com/zh-cn/help/2629484 如果提示:“ ...
- python数据结构-如何根据字典中值的大小对字典项排序
如何根据字典中值的大小对字典项排序 问题举例 某班英语成绩以字典形式存储,如何根据成绩高低,计算学生成绩排名 { “tom”:80, "lily":88, "marton ...
- 数据模型model设置、生成数据迁移文件、执行数据迁移文件
一.model的配置 1.创建数据库 2.安装pymysql 3.修改配置文件 数据库连接配置 DATABASES = {'default': {'ENGINE': 'django.db.backen ...
- python工具的选择
自己喜欢用pycharm,下载地址:https://www.jetbrains.com/products.html#lang=python 补丁地址:http://idea.lanyus.com/
- sublime开启vim模式
sublime自带vim模式Vintage,只是默认是ignore状态,因此如果按Esc键没有进入vim模式,只需要按ctrl+shift+P进入命令模式,键入Enable package,输入Vim ...
- CentOS 7 通过SQLmap进行SQL注入
安装SQLmap: IP:192.168.94.11 渗透测试演练系统DVWA: IP:192.168.94.111 通过SQLmap检测SQL注入漏洞 : 1.安装SQLmap漏洞查看工具 2.安装 ...
- 创建servlet程序知识点详解---servlet-day03
#1.表单包含有中文参数值,如何处理? ##(1)为什么会有乱码? 表单提交时,浏览器会对中文参数值进行编码/ 注:会按照表单所有的页面打开时所使用的字符集进行编码 比如,浏览器会使用utf-8对中文 ...
- 记账本微信小程序开发四
学习添加组件 集成日期组件 添加组件 需要在main.js文件中,声明一个data值date与wxml中的{{date}}绑定关联,然后在onLoad中初始化字符串格式的日期值, 处理日期组件点击确认 ...
- LinkedList 利用的是尾插法