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

热传导方程的差分格式原理与matlab实现本博客介绍抛物型方程中一种最基本形式 热传导方程的差分格式 分别介绍了热传导方程的古典显格式 古典隐格式 Crank Nicolson 格式及其数值求解方法以及 matlab 代码

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

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


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


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


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


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


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


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


热传导方程的差分格式原理与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:Mx UxianM(x,1)=InitialConditions((x-1)*h); end for t=1:Nt UxianM(1,t)=BoundaryConditions(0,(t-1)*k); UxianM(Mx,t)=BoundaryConditions(1,(t-1)*k); end %利用显格式公式逐行递推 for t=2:Nt for x=2:Mx-1 UxianM(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:Nt Uxian= [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-1 temp{t}=C; end mid = repmat({C},Nt-1,Nt-1);%对角块 for x=1:Nt-1 for t=1:Nt-1 if x~=t mid{x,t}=zeros(Mx-2,Mx-2); %非主对角线置0 end if x==t+1 mid{x,t}=D; %下次对角线上的块为D end end 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-3 f1(x)=InitialConditions(h*x); end fyin(1:Mx-2)=f1; %计算边值条件计算f2~fNt-1 for t=2:Nt-1 fyin((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:Mx U0(x)=InitialConditions((x-1)*h); end UcnM=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-1 n=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-1 Ucn= [Ucn;UcnM(:,t)]; end %% %计算精确解,用于误差分析 U_M=zeros(Mx-2,Nt-1); U=[]; for x=1:Mx-2 for t=1:Nt-1 U_M(x,t)=ExactSolution(x*h,t*k); end end %将结果按Ku=f方法的u的结构重排 for t=1:Nt-1 U=[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==0 Uxt=0; elseif LeftOrRight==1 Uxt=0; else %不应该出现此情况,抛异常 error('错误使用边界条件!'); end end










版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/198926.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午2:13
下一篇 2026年3月26日 下午2:13


相关推荐

  • Nano Banana Pro的真正极限,藏在Lovart里

    Nano Banana Pro的真正极限,藏在Lovart里

    2026年3月15日
    1
  • 字符串指针赋值小结

    字符串指针赋值小结字符指针赋值探究小结1,字符指针有初始值时,不能修改其中字符的值#include<iostream>usingnamespacestd;intmain(){ char*p1=”nihao”;//字符指针赋值给字符指针只能读不能修改字符的值 …

    2022年7月27日
    7
  • 图像去色算法_matlab去雾算法

    图像去色算法_matlab去雾算法先上图看一些算法效果                                           上图中从左到右依次是原图、photoshop去色结果、Matlab的rgb2gray函数处理效果、取rgb均值的效果、使用香港中文大学论文(见下)的结果、Glundland论文(见下)的结果。还有

    2022年10月4日
    7
  • scala 隐式转换

    scala 隐式转换文章目录作用解决什么问题使用implicits的一些规则3.1.1标记规则3.1.2范围规则3.1.3一次规则3.1.4优先规则3.1.5命名规则3.1.6编译器使用implicit的几种情况3.2隐含类型转换3.3转换被方法调用的对象3.3.1支持新的类型3.3.2模拟新的语法结构实验总结implicit基本含义隐式转换隐式转换的另一个优点是它们支持目标类型转换.隐式转换操作规则隐式参数和spring的依赖注入之前关系与区别隐式转换类(ImplicitClasses)隐式类

    2022年10月11日
    5
  • 深度学习中Dropout原理解析「建议收藏」

    深度学习中Dropout原理解析「建议收藏」1.Dropout简介1.1Dropout出现的原因在机器学习的模型中,如果模型的参数太多,而训练样本又太少,训练出来的模型很容易产生过拟合的现象。在训练神经网络的时候经常会遇到过拟合的问题,过拟合具体表现在:模型在训练数据上损失函数较小,预测准确率较高;但是在测试数据上损失函数比较大,预测准确率较低。过拟合是很多机器学习的通病。如果模型过拟合,那么得到的模型几乎不能用。为了解决过拟合问题,一…

    2022年6月14日
    43
  • Chatbox + Deepseek + Gemini: 打造你的高性价比、多模型 AI 聊天助手 (详细教程)

    Chatbox + Deepseek + Gemini: 打造你的高性价比、多模型 AI 聊天助手 (详细教程)

    2026年3月15日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号