一、隐式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. IntelliJ IDEA 下的svn配置及使用

    首先,使用的时候,自己得先在电脑上安装个小乌龟.也就是svn啦. 第一步安装小乌龟. 如下: 具体安装好像没什么具体要求,一路next,就好. 如上图箭头所示,在安装 TortoiseSVN 的时候, ...

  2. 建立请求号 request

    1:获取TR号(一般由团队的负责人创建,发出) 2:进入 i7p系统 3:点击process 4:输入tr号 5:选中 正确的请求号,右键> process item> add task ...

  3. git----------如何创建develop分支和工作流,以及如何将develop上的代码合并到master分支上

    1.点击sourceTree 右上角的git工作流,或弹出一个弹出框,无需修改任何东西直接点击确认就可以创建develop. . 2.这里有两个分支了,当前高亮的就是你当前处在的分支.此时develo ...

  4. Python之模块导入

    import sys #import module (.py)import functools #名词空间 functoolsprint(functools) print("-------- ...

  5. 【Checkio Exercise】Robot Sort

    Robot Sort All of the refined ingots should be sorted by size in each lot while passing by on a conv ...

  6. GCD(IV)

    死锁:2个任务相互等待造成的. - (void) GCD { NSLog(@"begin"); dispatch_queue_t queue = dispatch_queue_cr ...

  7. py-faster-rcnn

    踩坑: 1. 服务器上训练: sh ./experiments/scripts/faster_rcnn_end2end.sh 会各种报错 有说是因为#!/bin/bash的问题,改过,不行. 改成如下 ...

  8. js与jQuery的区别——每日一记录

    js是一种脚本语言,jQuery是在他基础上的一种框架

  9. 转:C#中Undo/Redo的一个简易实现

    一个比较常见的改进用户体验的方案是用Redo/Undo来取代确认对话框,由于这个功能比较常用,本文简单的给了一个在C#中通过Command模式实现Redo/Undo方案的例子,以供后续查询. clas ...

  10. C++引用和const引用、常量指针、指针常量

    1.引用.常量引用 引用主要被用做函数的形式参数--通常将类对象传递给一个函数. 引用在内部存放的是一个对象的地址,它是该对象的别名.引用不占用内存,因为取地址引用的值和被引用变量的地址相同.但是ob ...