Matlab:非线性高阶常微分方程的几种解法


一、隐式Euler:
函数文件1:
function b=F(t,x0,u,h)
b(,)=x0()-h*x0()-u();
b(,)=x0()+*h*x0()/t+*h*(*exp(x0())+exp(x0()/))-u();
函数文件2:
function g=Jacobian(x0,t,h)
g(,)=;
g(,)=-h;
g(,)=*h*(*exp(x0())+0.5*exp(x0()/));
g(,)=+*h/t;
函数文件3:
function x=newton_Iterative_method(t,u,h)
% u:上一节点的数值解或者初值
% x0 每次迭代的上一节点的数值
% x1 每次的迭代数值
% tol 允许误差
% f 右端函数
x0=u;
tol=1e-;
x1=x0-Jacobian(x0,t,h)\F(t,x0,u,h);
while (norm(x1-x0,inf)>tol)
%数值解的2范数是否在误差范围内
x0=x1;
x1=x0-Jacobian(x0,t,h)\F(t,x0,u,h);
end
x=x1;%不动点
脚本文件:
tic;
clear all
clc
N=[ ];
for j=:length(N)
h=/N(j);
x=:h:;
y=inline('-2*log(1+x.^2)','x');
Accurate=y(x);
Numerical=zeros(,N(j)+);
for i=:N(j)
Numerical(:,i+)=newton_Iterative_method(x(i+),Numerical(:,i),h);
end
error(:N(j)+,j)=Numerical(,:)-Accurate;
figure(j)
subplot(,,)
plot(x,Accurate);
xlabel('x');
ylabel('Accurate');
grid on
subplot(,,)
plot(x,Numerical(,:));
xlabel('x');
ylabel('Numerical');
grid on
subplot(,,)
plot(x,error(:N(j)+,j));
xlabel('x');
ylabel('error');
title(/N(j));
grid on
end
for k=:length(N)
X=norm(error(:,k),inf)/norm(error(:,),inf);
H=N()/N(k);
Y(k-)=log(X)/log(H);
end
figure(length(N)+)
plot(:length(N)-,Y,'-r v');
ylabel('误差阶数');
title('误差阶数');
toc;
效果图:


二、变步长的隐式Euler方法:
函数文件1:
function b=F(t,x0,u,h)
b(,)=x0()-h*x0()-u();
b(,)=t*x0()+*h*x0()+*h*t*(*exp(x0())+exp(x0()/))-t*u();
函数文件2:
function g=Jacobian(x0,t,h)
g(,)=;
g(,)=-h;
g(,)=*h*t*(*exp(x0())+0.5*exp(x0()/));
g(,)=t+*h;
函数文件3:
function x=Euler(t,u,h)
% u:上一节点的数值解或者初值
% x0 每次迭代的上一节点的数值
% x1 每次的迭代数值
% tol 允许误差
% f 右端函数
x0=u;
tol=1e-;
x1=x0-Jacobian(x0,t,h)\F(t,x0,u,h);
while (norm(x1-x0,inf)>tol)
%数值解的2范数是否在误差范围内
x0=x1;
x1=x0-Jacobian(x0,t,h)\F(t,x0,u,h);
end
x=x1;%不动点
脚本文件:
tic;
clear
clc
y(:,)=[;];%初值
e=1e-;%误差过小
tol=1e-;%指定的误差
N=;%节点的步数
h=/N;%初始步长
t=:h:;
i=;
while t(i)<=
k=;
while k==
y(:,i+)=Euler(t(i)+h,y(:,i),h);%符合误差的数值解
% y1_half=Euler(h/,y(:,i));%半步长的中点数值解
y1_half=Euler(t(i)+h,y(:,i),h/);%半步长的右端点的数值解
y1_one=Euler(t(i)+h,y1_half,h/);
Estimate_error=*norm(y(:,i+)-y1_one);%中间估计误差
if Estimate_error<tol%指定误差
k=;%步长相差不大,或者说正好在指定的误差范围内,则确定选择h作为步长。
elseif Estimate_error<e%误差过小
h=*h;
else%近似估计误差大于指定误差
h=h/;
end
end
t(i+)=t(i)+h;
i=i+;
end
f=inline('-2*log(1+x.^2)','x');
Accurate=f(t);
subplot(,,)
plot(t,y(,:));
xlabel('t');ylabel('numerical');
title('the image of numerical solution');
grid on ;
subplot(,,)
plot(t,Accurate);
xlabel('t');ylabel('Accurate');
title('the image of Accurate solution');
grid on ;
subplot(,,)
plot(t,y(,:)-Accurate);
xlabel('t');ylabel('error');
title('the image of error solution');
grid on ;
toc;
效果图:

中心差分法:

函数文件1:
function b=F(t,x0,h,N)
b(,)=*x0()-x0();
b(,)=-*x0()+*h^*(*exp(x0())+exp(x0()/))+(+h/t())*x0();
for i=:N-
b(i+,)=(-h/t(i+))*x0(i-)-*x0(i)+*h^*(*exp(x0(i))+exp(x0(i)/))+(+h/t(i+))*x0(i+);
end
函数文件2:
function g=Jacobian(t,x0,h,N)
g(,)=;
g(,)=-;
g(,)=-+*h^*(*exp(x0())+/*exp(x0()/));
g(,)=+h/t();
for i=:N-
g(i+,i-)=-h/t(i+);
g(i+,i)=-+*h^*(*exp(x0(i))+/*exp(x0(i)/));
g(i+,i+)=+h/t(i+);
end
函数文件3:
function x=newton_Iterative_method(t,u,h,N)
% u:上一节点的数值解或者初值
% x0 每次迭代的上一节点的数值
% x1 每次的迭代数值
% tol 允许误差
% f 右端函数
x0=u;
tol=1e-;
x1=x0-Jacobian(t,x0,h,N)\F(t,x0,h,N);
while (norm(x1-x0,inf)>tol)
%数值解的2范数是否在误差范围内
x0=x1;
x1=x0-Jacobian(t,x0,h,N)\F(t,x0,h,N);
end
x=x1;%不动点
脚本文件:
tic;
clear
clc
N=[,,,,,,];
for k=:length(N)
h=/N(k);
x=:h:;
fun1=inline('-2*log(1+x.^2)');
for i=:length(x)
Accurate(i,)=fun1(x(i));
end
Numerical=zeros(N(k)+,);
Numerical(:end,)=newton_Iterative_method(x,Numerical(:end,),h,N(k));
error=Numerical-Accurate;
error_inf(k)=norm(error,inf);
figure(k)
subplot(,,)
plot(x,Accurate);
xlabel('x');
ylabel('Accurate');
grid on
subplot(,,)
plot(x,Numerical);
xlabel('x');
ylabel('Numerical');
grid on
subplot(,,)
plot(x,error);
xlabel('x');
ylabel('error');
grid on
end
for i=:length(N)
INF(i-)=log2(error_inf(i-)/error_inf(i));
end
figure(length(N)+)
plot(:length(N)-,INF,'-rh');
xlabel('x');
ylabel('误差阶数');
title('非线性高阶常微分差分格式误差阶');
grid on
toc;
效果图:

Matlab:非线性高阶常微分方程的几种解法的更多相关文章
- Matlab:高阶常微分三种边界条件的特殊解法(中心差分法,高精度导数边界处理)
函数文件1: function b=F(f,x0,h,N) % b(1,1)=x0(1)-h*x0(2)-u(1); % b(2,1)=x0(2)+h*x0(1)^2-u(2)-h*f; b=zero ...
- 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 ...
- 聊聊React高阶组件(Higher-Order Components)
使用 react已经有不短的时间了,最近看到关于 react高阶组件的一篇文章,看了之后顿时眼前一亮,对于我这种还在新手村晃荡.一切朝着打怪升级看齐的小喽啰来说,像这种难度不是太高同时门槛也不是那么低 ...
- react 高阶组件的 理解和应用
高阶组件是什么东西 简单的理解是:一个包装了另一个基础组件的组件.(相对高阶组件来说,我习惯把被包装的组件称为基础组件) 注意:这里说的是包装,可以理解成包裹和组装: 具体的是高阶组件的两种形式吧: ...
- React 精要面试题讲解(五) 高阶组件真解
说明与目录 在学习本章内容之前,最好是具备react中'插槽(children)'及'组合与继承' 这两点的知识积累. 详情请参照React 精要面试题讲解(四) 组合与继承不得不说的秘密. 哦不好意 ...
- 当初要是看了这篇,React高阶组件早会了
当初要是看了这篇,React高阶组件早会了. 概况: 什么是高阶组件? 高阶部件是一种用于复用组件逻辑的高级技术,它并不是 React API的一部分,而是从React 演化而来的一种模式. 具体地说 ...
- React高阶组件总结
在多个不同的组件中需要用到相同的功能,这个解决方法,通常有Mixin和高阶组件. Mixin方法例如: //给所有组件添加一个name属性 var defaultMixin = { getDefaul ...
- react:高阶组件wrappedComponent
什么是高阶组件? 高阶部件是一种用于复用组件逻辑的高级技术,它并不是 React API的一部分,而是从React 演化而来的一种模式. 具体地说,高阶组件就是一个接收一个组件并返回另外一个新组件的函 ...
- React躬行记(10)——高阶组件
高阶组件(High Order Component,简称HOC)不是一个真的组件,而是一个没有副作用的纯函数,以组件作为参数,返回一个功能增强的新组件,在很多第三方库(例如Redux.Relay等)中 ...
随机推荐
- 图像分类(三)GoogLenet Inception_v3:Rethinking the Inception Architecture for Computer Vision
Inception V3网络(注意,不是module了,而是network,包含多种Inception modules)主要是在V2基础上进行的改进,特点如下: 将滤波器尺寸(Filter Size) ...
- Spring Boot 2.0 新特性和发展方向
以Java 8 为基准 Spring Boot 2.0 要求Java 版本必须8以上, Java 6 和 7 不再支持. 内嵌容器包结构调整 为了支持reactive使用场景,内嵌的容器包结构被重构了 ...
- Ethzasl MSF源码阅读(1):程序入口和主题订阅
关于IMU融合知乎上的一篇问答:有哪些开源项目是关于单目+imu做slam的? Ethz的Stephen Weiss的工作,是一个IMU松耦合的方法. 1.程序入口:ethzasl_msf\msf_u ...
- Reservoir sampling
在看蚂蚁***的时候看到这道题,真心觉得有趣,所以啊,一定要投入其中,知识的美妙啊~ 小明在天猫上开了一个网店,某天要开展一个抽奖活动,奖品数量100个.为了保证活动的公平,小明希望保证每个顾客中奖概 ...
- MongoDB 知识点
左边是mongodb查询语句,右边是sql语句.对照着用,挺方便. db.users.find() select * from users db.users.find({"age" ...
- spring boot + vue + element-ui全栈开发入门——主页面开发
目的 开发一个后台管理的前端,顶部是标题,左侧是菜单导航栏,中间是要显示的内容.而内容可以是各种图表,也可以是数据列表. 一.准备工作 1..修改App.vue文件 代码如下: <templat ...
- Angular4的依赖注入
- python 回调函数,最简单的例子
回调的英文定义: A callback is a function that is passed as an argument to another function and is executed ...
- jmeter对自身性能的优化
测试环境 apache-jmeter-2.13 1. 问题描述 单台机器的下JMeter启动较大线程数时可能会出现运行报错的情况,或者在运行一段时间后,JMeter每秒生成的请求数会逐步下降, ...
- win的使用
1.net use 挂在远端文件系统,方便本机软件操作! 添加挂载文件 net use h: //192.168.1.1/file 删除挂载文件 net use /delete h: ...