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等)中 ...
随机推荐
- centos6多实例安装mysql
基本环境:setenforce 0service iptables stop yum install cmake libaio-devel ncurses-devel -yyum install gc ...
- PHP----------file_get_content获取不到页面信息
1.将网址在页面上打开可以正常访问,但是用file_get_content请求则访问不到.这个是因为对方挡住了非浏览器访问导致的.需要改下php配置,模拟浏览器访问. user_agent=" ...
- Oracle 25用户的权限管理
理解什么是权限 权限指的是执行特定命令或访问数据库对象的权利. 理解权限的作用 (保证)数据库安全性:系统安全性,数据安全性 了解权限的分类 系统权限: 允许用户执行特定的数据库操作,如创建表.创建索 ...
- HTML 鼠标坐标和元素坐标
在这一篇文章中,将会介绍鼠标坐标.元素坐标以及鼠标在指定元素内的坐标. 1. 鼠标坐标 在触发鼠标相关事件时(如:click.mousemove),可以通过事件对象获取当前鼠标的坐标. 获取的坐标可分 ...
- 发布WebApi项目时包含XML文档文件
Open your publishprofile (*.pubxml) and include this code into "Project" element: <Item ...
- 小程序canvas生成海报保存至手机相册
小程序canvas画图保存至手机相册 (1)可直接展示生成的海报 .因手机分辨率不同可能导致生成的海报会有细微差别,这里隐藏canvas海报,页面正常设置海报样式保存时保存隐藏的canvas海报 (2 ...
- RAMPS1.4 3d打印控制板接线与测试
“工欲善其事,必先利其器”,在开始工作之前,你应该准备下面所说的工具(包括软件和硬件). 1.需要下载的软件 1.1 固件上传工具——Arduino IDE 这是上传固件的必备工具,有了这个软件让上传 ...
- JavaScript 作用域链其实很简单
概念 作用域链的用途,是保证对执行环境有权访问的所有变量和函数的有序访问.其本质就是一个指向变量对象的指针列表.在js中,当某个函数被调用时,会创建一个执行环境(execution context)及 ...
- 【awk】提取文件第一列
生信数据文件一般是按列分开的,如果我们只想简单的提取一列而不是费尽周折写个程序提取哪一列的话,awk作为一个非常好用的文档处理工具,我们现在来简单看一下他的一些功能: awk '{print $1}' ...
- Filter中request对象强转问题
以下为过滤器doFIlter方法的源代码: public void doFilter(ServletRequest request, ServletResponse response, FilterC ...