一、隐式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:非线性高阶常微分方程的几种解法的更多相关文章

  1. 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 ...

  2. 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 ...

  3. 聊聊React高阶组件(Higher-Order Components)

    使用 react已经有不短的时间了,最近看到关于 react高阶组件的一篇文章,看了之后顿时眼前一亮,对于我这种还在新手村晃荡.一切朝着打怪升级看齐的小喽啰来说,像这种难度不是太高同时门槛也不是那么低 ...

  4. react 高阶组件的 理解和应用

    高阶组件是什么东西 简单的理解是:一个包装了另一个基础组件的组件.(相对高阶组件来说,我习惯把被包装的组件称为基础组件) 注意:这里说的是包装,可以理解成包裹和组装: 具体的是高阶组件的两种形式吧: ...

  5. React 精要面试题讲解(五) 高阶组件真解

    说明与目录 在学习本章内容之前,最好是具备react中'插槽(children)'及'组合与继承' 这两点的知识积累. 详情请参照React 精要面试题讲解(四) 组合与继承不得不说的秘密. 哦不好意 ...

  6. 当初要是看了这篇,React高阶组件早会了

    当初要是看了这篇,React高阶组件早会了. 概况: 什么是高阶组件? 高阶部件是一种用于复用组件逻辑的高级技术,它并不是 React API的一部分,而是从React 演化而来的一种模式. 具体地说 ...

  7. React高阶组件总结

    在多个不同的组件中需要用到相同的功能,这个解决方法,通常有Mixin和高阶组件. Mixin方法例如: //给所有组件添加一个name属性 var defaultMixin = { getDefaul ...

  8. react:高阶组件wrappedComponent

    什么是高阶组件? 高阶部件是一种用于复用组件逻辑的高级技术,它并不是 React API的一部分,而是从React 演化而来的一种模式. 具体地说,高阶组件就是一个接收一个组件并返回另外一个新组件的函 ...

  9. React躬行记(10)——高阶组件

    高阶组件(High Order Component,简称HOC)不是一个真的组件,而是一个没有副作用的纯函数,以组件作为参数,返回一个功能增强的新组件,在很多第三方库(例如Redux.Relay等)中 ...

随机推荐

  1. springmvc.xml 中 <url-pattern></url-pattern>节点详解

    1.  先来上段常见的代码 <!-- MVC Servlet --> <servlet> <servlet-name>springServlet</servl ...

  2. python常用函数及模块

    原文来源于博客园和CSDN 1.计算函数 abs()--取绝对值 max()--取序列最大值,包括列表.元组 min()--取序列最小值 len()--取长度 divmod(a,b)---取a//b除 ...

  3. MySQL变量的使用

    在mysql文档中,mysql变量可分为两大类,即系统变量和用户变量. 但根据实际应用又被细化为四种类型,即局部变量.用户变量.会话变量和全局变量. 一.局部变量 mysql局部变量,只能用在begi ...

  4. git之概念图

    1.git四大区. . 2. 3. 4.

  5. sourcetree 免注册

    http://www.cnblogs.com/xiofee/p/sourcetree_pass_initialization_setup.htmlSourceTree 安装之后需要使用账号登陆以授权, ...

  6. Godot必须明确掌握的概念与知识

    本文对godot必须掌握的概念进行罗列,以便于浏览学习: (随时补充) 1.场景 2.节点 X:场景与节点 3.脚本(建议直接学习GDscript,当然掌握C#也可以) 4.类

  7. Java代码走查具体考察点

    代码走查具体考察点 一.参数检验 公共方法都要做参数的校验,参数校验不通过,需要明确抛出异常或对应响应码. 在接口中也明确使用验证注解修饰参数和返回值,作为一种协议要求调用方按注解约束传参,返回值验证 ...

  8. 深入浅出JAVA线程池使用原理1

    前言: Java中的线程池是并发框架中运用最多的,几乎所有需要异步或并发执行任务的程序都可以使用线程池,线程池主要有三个好处: 1.降低资源消耗:可以重复使用已经创建的线程降低线程创建和销毁带来的消耗 ...

  9. EasyUI中使用textbox赋值,setValue和setText顺序问题

    注意两点: 当text和value的值不同时,一定要先赋值Value,然后赋值Text,否则text和value全部为Value的值. 如果只setValue,则使用getText和getValue得 ...

  10. springMVC学习路线3-整合spring(annotion方式)

    个人认为使用框架并不是很难,关键要理解其思想,这对于我们提高编程水平很有帮助.不过,如果用都不会,谈思想就变成纸上谈兵了!!!先技术,再思想.实践出真知. 1.基本概念 1.1 Spring   Sp ...