热传导方程的差分格式原理与matlab实现









function [  ] = ParabolicEquation( h,k )
%求解抛物型方程中的一种:热传导方程
%h:x轴步长
%k:t轴步长r=k/(h*h);%网格比
Mx=floor(1.0/h)+1;%网格在x轴上的节点个数(算上0)
Nt=floor(1.0/k)+1;%网格在t轴上的节点个数(算上0)
N=(Mx-2)*(Nt-1); %U的维数%%
%********************************古典显格式*********************************
%直接递推的方法求古典显格式UxianM=zeros(Mx,Nt);
Uxian=[];
%先赋初值和边界值
for x=1:MxUxianM(x,1)=InitialConditions((x-1)*h);
end
for t=1:NtUxianM(1,t)=BoundaryConditions(0,(t-1)*k);UxianM(Mx,t)=BoundaryConditions(1,(t-1)*k);
end
%利用显格式公式逐行递推
for t=2:Ntfor x=2:Mx-1UxianM(x,t)=r*UxianM(x-1,t-1)+(1-2*r)*UxianM(x,t-1)+r*UxianM(x+1,t-1);end
end
%将结果按Ku=f方法的u的结构重排
for t=2:NtUxian= [Uxian;UxianM(2:Mx-1,t)];
end%%
%************************古典隐格式*****************************************%求K,将K看出三对角块矩阵,形如:
% C 0           ...
% D C 0         ...
% 0 D C 0       ...
% 0 0 D C 0     ...
%       ...     ... 
% ...          D C%先计算C(C是三对角矩阵)
C=eye(Mx-2)*(1+2*r);
C=C+diag(ones(1,Mx-3)*(-r),1);  %上次对角
C=C+diag(ones(1,Mx-3)*(-r),-1); %下次对角%计算D
D=eye(Mx-2)*-1;%计算K
temp={}; 
for t=1:Nt-1temp{t}=C;
end
mid = repmat({C},Nt-1,Nt-1);%对角块
for x=1:Nt-1for t=1:Nt-1if x~=tmid{x,t}=zeros(Mx-2,Mx-2); %非主对角线置0endif x==t+1mid{x,t}=D; %下次对角线上的块为Dendend
end
Kyin=cell2mat(mid);%求f
%将f分块
% f1
% f2
% ...
% fNt-1%f中大多数值为0,非0值用初边值条件添加
fyin=zeros(N,1);%先计算f1
f1=zeros(Mx-2,1);
%计算f(1,1),中心点为U11
f1=zeros(Mx-2,1);
f1(1)=r*BoundaryConditions(0,k)+InitialConditions(h);
%计算f(Mx-2,1),中心点为U(Mx-2,1)
f1(Mx-2)=r*BoundaryConditions(1,(Mx-1)*k)+InitialConditions(h*(Mx-2));
%计算f(x,1) (x!=1且x!=Mx-2)
for x=2:Mx-3f1(x)=InitialConditions(h*x);
end
fyin(1:Mx-2)=f1;%计算边值条件计算f2~fNt-1
for t=2:Nt-1fyin((Mx-2)*(t-1)+1)=r* BoundaryConditions(0,k*(t));fyin((Mx-2)*t)=r* BoundaryConditions(1,k*(t));
end%求u
Uyin=inv(Kyin)*fyin;%%
%********************Crank-Nicolson格式*************************************
%追赶法求解
%An*Un+1=Bn*Un+en%求An
An=eye(Mx-2)*(1+r);
An=An+diag(ones(1,Mx-3)*(-0.5*r),1);  %上次对角
An=An+diag(ones(1,Mx-3)*(-0.5*r),-1); %下次对角
InvA=inv(An);%求Bn
Bn=eye(Mx-2)*(1-r);
Bn=Bn+diag(ones(1,Mx-3)*(0.5*r),1);  %上次对角
Bn=Bn+diag(ones(1,Mx-3)*(0.5*r),-1); %下次对角Cn=InvA*Bn;%追赶法
U0=[];%初值
for x=1:MxU0(x)=InitialConditions((x-1)*h);
endUcnM=zeros(Mx-2,Nt-1);
Ucn=[];%求U1  An*Un+1=Bn*Un+en,e1恰好是0向量
UcnM(:,1)=Cn*U0(2:Mx-1)'+zeros(Mx-2,1);%利用显格式公式逐行递推
for t=2:Nt-1n=t-1;en=zeros(Mx-2,1);en(1)=0.5*r*BoundaryConditions(0,n*k)+0.5*r*BoundaryConditions(0,(n+1)*k);en(Mx-2)=0.5*r*BoundaryConditions(1,n*k)+0.5*r*BoundaryConditions(1,(n+1)*k);UcnM(:,n+1)=Cn*UcnM(:,n)+en;
end%将结果按Ku=f方法的u的结构重排
for t=1:Nt-1Ucn= [Ucn;UcnM(:,t)];
end%%
%计算精确解,用于误差分析****************************************************
U_M=zeros(Mx-2,Nt-1);
U=[];
for x=1:Mx-2for t=1:Nt-1 U_M(x,t)=ExactSolution(x*h,t*k);end
end
%将结果按Ku=f方法的u的结构重排
for t=1:Nt-1U=[U;U_M(1:Mx-2,t)];
end%%
%结果比较******************************************************************
%比较标准误差(均方根误差)temp=(U-Uxian).^2;
temp=sum(sum(temp));
temp=temp/(Mx*Nt);
Exian=sqrt(temp);temp=(U-Uyin).^2;
temp=sum(sum(temp));
temp=temp/(Mx*Nt);
Eyin=sqrt(temp);temp=(U-Ucn).^2;
temp=sum(sum(temp));
temp=temp/(Mx*Nt);
Ecn=sqrt(temp);fprintf('h: %d;k= %d\n',h,k);  
fprintf('古典显格式标准误差:%d\n',Exian); 
fprintf('古典隐格式标准误差:%d\n',Eyin); 
fprintf('CN格式标准误差:%d\n',Ecn); end

function [ Uxt ] = InitialConditions ( x )
%在此函数中定义初值条件Uxt=sin(pi*x);end

function [ Uxt ] = ExactSolution( x,t)
%在此函数中定义待求函数的精确解u(x,t),用于比较数值解Uxt=exp(-1*pi*pi*t)*sin(pi*x);end

function [ Uxt ] = BoundaryConditions( LeftOrRight,t )
%在此函数中定义边值条件
%LeftOrRight标识左边界条件还是右边界条件 0代表左,1代表右Uxt=-1;
if LeftOrRight==0Uxt=0;
elseif LeftOrRight==1Uxt=0;
else%不应该出现此情况,抛异常error('错误使用边界条件!');
endend






本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/499537.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在emIDE中创建STM32项目

emIDE是一个开源的嵌入式集成开发环境,基于Code::Blocks开发,能够支持多个平台和多个厂家的嵌入式硬件,继承了Code::Blocks的优点。 下载emIDE并安装,也可选择绿色版。若需要调试则需安装J-Link GDB Server。 1、打…

“Hello,Github!——如何配置并上传一个已有项目到Git上

“Hello,Github!"——如何配置并上传一个已有项目到Git上注意!前言十分简短!如今,Github已经成为了管理软件开发以及发现别人优秀代码的首选方法。所以还在等什么!快点跟上脚步!今天初次注册了Github账…

使用EmBitz开发STM32项目开发环境配置

 一、EmBitz软件获取与安装 1、EmBitz软件的获取 EmBitz原名Em::Blocks,是基于Code::Blocks开发的,面向嵌入式的C/C集成开发环境。支持J-Link和ST-Link调试器。使用J-Link仿真器时需安装J-Link GDB Server。 EmBitz下载地址&…

Python格式化输出方法

Python格式化输出 本文转自:Python格式化输出 今天写程序又记不清格式化输出细节了…… 索性整理一下。 python print格式化输出。 1. 打印字符串 print ("His name is %s"%("Aviad")) 效果: 2.打印整数 print ("He is %d yea…

基于STM32和W5500的Modbus TCP通讯

 在最近的一个项目中需要实现Modbus TCP通讯,而选用的硬件平台则是STM32F103和W5500,软件平台则选用IAR EWAR6.4来实现。 1、移植前的准备工作 为了实现Modbus TCP通讯首先需要下载W5500的驱动源码,可以到WIZnet的…

Python小练习1:.txt文件常用读写操作

.txt文件常用读写操作 本文通过一个实例来介绍读写txt文件的各种常用操作,问题修改自coursera上南京大学的课程:用Python玩转数据。 直接进入正题,考虑下面为练习读写txt文件的各种操作而设计的一个具体问题 问题如下: (1) 在任意…

STM32F103使用内部Flash保存参数

 在我们应用开发时,经常会有一些程序运行参数需要保存,如一些修正系数。这些数据的特点是:数量少而且不需要经常修改,但又不能定义为常量,因为每台设备可能不一样而且在以后还有修改的可能。…

FreeRTOS学习及移植笔记之一:开始FreeRTOS之旅

 1、必要的准备工作 工欲善其事,必先利其器,在开始学习和移植之前,相应的准备工作必不可少。所以在开始我们写要准备如下: 测试环境:我准备在STM32F103平台上移植和测试FreeRTOS系统 准备FreeRTOS系统…

FreeRTOS学习及移植笔记之二:在IAR和STM32F103VET上移植FreeRTOS

上一次,我们简单的测试了FreeRTOS的基于IAR EWARMv6.4和STM32F103VET6平台的Demo,对其有了一个基本认识。接下来我们开始自己移植FreeRTOS的过程。 1、创建一个“FreeRTOSTestProject”项目文件夹,并在其下创建FreeR…

如何创建一个最简单的Windows桌面应用程序 (C++)

如何创建一个最简单的Windows桌面应用程序 (C) 最近刚开始学习C/C开发Windows应用程序,这里将会以零基础的视角把学习过程完全记录下来。如果你也刚刚起步,那本文一定非常适合你。 进入正题,本文讨论如何使用Visual Studio生成一个最简单的C窗…

Win32窗体应用程序如何添加资源文件?

Win32窗体应用程序如何添加资源文件? 上一篇文章介绍了:如何创建一个最简单的Windows窗体应用程序。 按照上一篇文章的介绍,我们的HelloApp项目对应如下的窗体应用程序: 这一篇文章中,我们将在这个程序的基础上&#x…

【论文党福利】如何提取图像中的数据

【论文党福利】如何提取图像中的数据 从事科研的老师和同学们在撰写论文时,经常需要将文献中的曲线与自己的结果进行对比,为获取原始数据,最靠谱的方法当然是找原作者要。如果没有要到呢?本文将成为论文党的福利,为你…

添加串口和虚拟终端输出帮助调试

在使用IAR开发STM32项目时,使用串口或者是虚拟终端来输出我们想看的信息是一个非常好而且简便的方式。 首先来看看串口怎么实现信息输出。简单来说串口输出信息就是将标准输出重定向到串口,在上位机的超级终端或者串口助手等工…

1.1股票数据预处理练习

第一阶段、一个简单策略入门量化投资 1.1股票数据预处理练习 无论我们要对股票市场进行何种探索,在开始前,研究如何获取数据,并进行对应的预处理都是必要的。 本节以美股为例,进行股票数据预处理的练习。正文如下: …

1-2 移动均线交叉策略1

第一阶段、一个简单策略入门量化投资 1-2 移动均线交叉策略1 第一阶段一个简单策略入门量化投资1-2 移动均线交叉策略1前言获取数据移动均线交叉策略数据可视化绘制折线图绘制K线图绘制移动均线 移动均线交叉策略回测什么是回测回溯买卖信号计算收益 未完待续完整代码 前言 …

STM32F412应用开发笔记之一:初识NUCLEO-F412ZG

今天终于收到了期待已久的NUCLEO-F412ZG,感谢电子发烧友论坛! 近几年来基本都是在STM32平台上做一些设计开发工作。STM32F103、STM32F107、STM32F429等都应用过,但却从没有申请过试用。没想到这次申请居然能被选中&a…

STM32F412应用开发笔记之二:基本GPIO控制

NUCLEO-F412ZG板子上的元器件并没有完全焊接,除去ST-LINK部分和电源部分后,还有用一个USB主机接口,三个LED灯和两个按钮,不过很多功能引脚都已经引到了插针。查看原理图可发现,由原理图模块的…

1-3移动均线交叉策略2

第一阶段、一个简单策略入门量化投资 1-3移动均线交叉策略2 上一篇文章1-2 移动均线交叉策略1中我们最后提到: 如果我们从第一天买入股票,一直持有股票,最后一天卖出,获得的收益是每股124.02美元,收益率为412% 如果…

1-4移动均线交叉策略3

第一阶段、一个简单策略入门量化投资 1-4移动均线交叉策略3 上一文1-3移动均线交叉策略2中,我们得到的结果是令人失望的。但我们的探索还要继续。 我们知道,使用投资组合的方式进行分散投资是降低风险的好办法。尽管移动均线交叉策略的表现并不理想&a…

STM32学习及应用笔记一:SysTick定时器学习及应用

 这几年一直使用STM32的MCU,对ARM内核的SysTick计时器也经常使用,但几乎没有仔细了解过。最近正好要在移植一个新的操作系统时接触到了这块,据比较深入的了解了一下。 1、SysTick究竟是什么? 关于SysT…