一、隐式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. vue 之组件递归;

    在开发一个 PC 端的项目时,需要开发一个树状结构,直接上效果图如下:点击 "+" 号的时候则展开下一级,点击 "-" 号的时候则收起: 之所以写这篇博客,因为 ...

  2. gitlab备份、恢复、升级

    1.备份 gitlab的备份很简单,只要使用命令: gitlab-rake gitlab:backup:create 即可将当前的数据库.代码全部备份到/var/opt/gitlab/backups ...

  3. pycharm新建py文件时,自动补充文件头注释信息

    步骤: 1.File -->Settings 2.选择 File and Code Templates -> Files -> Python Script 文件头注释信息代码样式: ...

  4. [js]es6语法: 字符串和数组的方法

    s的方法 根据index取value: 取首尾项,arr[0], arr[arr.length-1] 根据value取index(判断是否包含子字符串): s.indexOf 栗子: 'maotai' ...

  5. ShoppingCart类图

    1,组合关系,实心的棱形画在整体上面,发现很多人把它画错了 2,1..*或*代表的意义说明: 完整格式为:最小数量..最大数量 约束:前者必须小于后者,如1..*表示1个或多个,不会包含1..0这种情 ...

  6. 更多more 123123循环

  7. Address already in use: AH00072: make_sock: could not bind to address 0.0.0.0:443

    (1)端口被占用,找到对应的进行并结束.(2)Linux下查看,无进程占用443端口,确认/etc/httpd/conf.d下只有一个ssl.conf,无其他SSL配置.备份文件,如果有,apache ...

  8. 51.webpack vue-cli创建项目

    在上两篇博文中已经安装了node.js.webpack.vue-cli,安装的版本为: 今天通过这篇博文创建项目. 1.选择路径 首先通过命令行进入想要创建项目的路径,例如: 通过e:命令进入盘幅,再 ...

  9. Hibernate查询操作

    操作前需要创建好Hibernate项目,创建项目,可参考:http://www.cnblogs.com/zhaojinyan/p/9336174.html 一下的例子是从其他贴子粘过来的(知识无国界! ...

  10. Android-Gradle(一)

    理解基本的Gradle 如果你想创建一个Android project基于gradle,那么你必须写一个构建脚本,这个文件通常称之为build.grade,你可能已经觉察到了,当我们查看这一脚本,gr ...