欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    偏微分方程数值解法的MATLAB源码.docx

    • 资源ID:13543261       资源大小:113.91KB        全文页数:6页
    • 资源格式: DOCX        下载积分:20金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要20金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    偏微分方程数值解法的MATLAB源码.docx

    精选优质文档-倾情为你奉上原创偏微分方程数值解法的MATLAB源码【更新完毕】说明:由于偏微分的程序都比较长,比其他的算法稍复杂一些,所以另开一贴,专门上传偏微分的程序谢谢大家的支持!其他的数值算法见:1、古典显式格式求解抛物型偏微分方程(一维热传导方程)function U x t=PDEParabolicClassicalExplicit(uX,uT,phi,psi1,psi2,M,N,C)%古典显式格式求解抛物型偏微分方程%U x t=PDEParabolicClassicalExplicit(uX,uT,phi,psi1,psi2,M,N,C)%方程:u_t=C*u_xx 0 <= x <= uX,0 <= t <= uT%初值条件:u(x,0)=phi(x)%边值条件:u(0,t)=psi1(t), u(uX,t)=psi2(t)%输出参数:U -解矩阵,第一行表示初值,第一列和最后一列表示边值,第二行表示第2层%         x -空间变量%         t -时间变量%输入参数:uX -空间变量x的取值上限%         uT -时间变量t的取值上限%         phi -初值条件,定义为内联函数%         psi1 -边值条件,定义为内联函数%         psi2 -边值条件,定义为内联函数%         M -沿x轴的等分区间数%         N -沿t轴的等分区间数%         C -系数,默认情况下C=1%应用举例:%uX=1;uT=0.2;M=15;N=100;C=1;%phi=inline('sin(pi*x)');psi1=inline('0');psi2=inline('0');%U x t=PDEParabolicClassicalExplicit(uX,uT,phi,psi1,psi2,M,N,C);%设置参数C的默认值if nargin=7    C=1;end%计算步长dx=uX/M;%x的步长dt=uT/N;%t的步长x=(0:M)*dx;t=(0:N)*dt;r=C*dt/dx/dx;%步长比r1=1-2*r;if r > 0.5    disp('r > 0.5,不稳定')end%计算初值和边值U=zeros(M+1,N+1);for i=1:M+1    U(i,1)=phi(x(i);endfor j=1:N+1    U(1,j)=psi1(t(j);    U(M+1,j)=psi2(t(j);end%逐层求解for j=1:N    for i=2:M        U(i,j+1)=r*U(i-1,j)+r1*U(i,j)+r*U(i+1,j);    endendU=U'%作出图形mesh(x,t,U);title('古典显式格式,一维热传导方程的解的图像')xlabel('空间变量 x')ylabel('时间变量 t')zlabel('一维热传导方程的解 U')return;古典显式格式不稳定情况古典显式格式稳定情况2、古典隐式格式求解抛物型偏微分方程(一维热传导方程)function U x t=PDEParabolicClassicalImplicit(uX,uT,phi,psi1,psi2,M,N,C)%古典隐式格式求解抛物型偏微分方程%U x t=PDEParabolicClassicalImplicit(uX,uT,phi,psi1,psi2,M,N,C)%方程:u_t=C*u_xx 0 <= x <= uX,0 <= t <= uT%初值条件:u(x,0)=phi(x)%边值条件:u(0,t)=psi1(t), u(uX,t)=psi2(t)%输出参数:U -解矩阵,第一行表示初值,第一列和最后一列表示边值,第二行表示第2层%         x -空间变量%         t -时间变量%输入参数:uX -空间变量x的取值上限%         uT -时间变量t的取值上限%         phi -初值条件,定义为内联函数%         psi1 -边值条件,定义为内联函数%         psi2 -边值条件,定义为内联函数%         M -沿x轴的等分区间数%         N -沿t轴的等分区间数%         C -系数,默认情况下C=1%应用举例:%uX=1;uT=0.2;M=50;N=50;C=1;%phi=inline('sin(pi*x)');psi1=inline('0');psi2=inline('0');%U x t=PDEParabolicClassicalImplicit(uX,uT,phi,psi1,psi2,M,N,C);%设置参数C的默认值if nargin=7    C=1;end%计算步长dx=uX/M;%x的步长dt=uT/N;%t的步长x=(0:M)*dx;t=(0:N)*dt;r=C*dt/dx/dx;%步长比Diag=zeros(1,M-1);%矩阵的对角线元素Low=zeros(1,M-2);%矩阵的下对角线元素Up=zeros(1,M-2);%矩阵的上对角线元素for i=1:M-2    Diag(i)=1+2*r;    Low(i)=-r;    Up(i)=-r;endDiag(M-1)=1+2*r;%计算初值和边值U=zeros(M+1,N+1);for i=1:M+1    U(i,1)=phi(x(i);endfor j=1:N+1    U(1,j)=psi1(t(j);    U(M+1,j)=psi2(t(j);end%逐层求解,需要使用追赶法(调用函数EqtsForwardAndBackward)for j=1:N    b1=zeros(M-1,1);    b1(1)=r*U(1,j+1);    b1(M-1)=r*U(M+1,j+1);    b=U(2:M,j)+b1;    U(2:M,j+1)=EqtsForwardAndBackward(Low,Diag,Up,b);endU=U'%作出图形mesh(x,t,U);title('古典隐式格式,一维热传导方程的解的图像')xlabel('空间变量 x')ylabel('时间变量 t')zlabel('一维热传导方程的解 U')return;此算法需要使用追赶法求解三对角线性方程组,这个算法在上一篇帖子中已经给出,为了方便,再给出来追赶法解三对角线性方程组function x=EqtsForwardAndBackward(L,D,U,b)%追赶法求解三对角线性方程组Ax=b%x=EqtsForwardAndBackward(L,D,U,b)%x:三对角线性方程组的解%L:三对角矩阵的下对角线,行向量%D:三对角矩阵的对角线,行向量%U:三对角矩阵的上对角线,行向量%b:线性方程组Ax=b中的b,列向量%应用举例:%L=-1 -2 -3;D=2 3 4 5;U=-1 -2 -3;b=6 1 -2 1'%x=EqtsForwardAndBackward(L,D,U,b)%检查参数的输入是否正确n=length(D);m=length(b);n1=length(L);n2=length(U);if n-n1 = 1 | n-n2 = 1 | n = m    disp('输入参数有误!')    x=' '    return;end%追的过程for i=2:n    L(i-1)=L(i-1)/D(i-1);    D(i)=D(i)-L(i-1)*U(i-1);endx=zeros(n,1);x(1)=b(1);for i=2:n    x(i)=b(i)-L(i-1)*x(i-1);end%赶的过程x(n)=x(n)/D(n);for i=n-1:-1:1    x(i)=(x(i)-U(i)*x(i+1)/D(i);endreturn;古典隐式格式在以后的程序中,我们都取C=1,不再作为一个输入参数处理3、Crank-Nicolson隐式格式求解抛物型偏微分方程需要调用追赶法的程序function U x t=PDEParabolicCN(uX,uT,phi,psi1,psi2,M,N)%Crank-Nicolson隐式格式求解抛物型偏微分方程%U x t=PDEParabolicCN(uX,uT,phi,psi1,psi2,M,N)%方程:u_t=u_xx 0 <= x <= uX,0 <= t <= uT%初值条件:u(x,0)=phi(x)%边值条件:u(0,t)=psi1(t), u(uX,t)=psi2(t)%输出参数:U -解矩阵,第一行表示初值,第一列和最后一列表示边值,第二行表示第2层%         x -空间变量%         t -时间变量%输入参数:uX -空间变量x的取值上限%         uT -时间变量t的取值上限%         phi -初值条件,定义为内联函数%         psi1 -边值条件,定义为内联函数%         psi2 -边值条件,定义为内联函数%         M -沿x轴的等分区间数%         N -沿t轴的等分区间数%应用举例:%uX=1;uT=0.2;M=50;N=50;%phi=inline('sin(pi*x)');psi1=inline('0');psi2=inline('0');%U x t=PDEParabolicCN(uX,uT,phi,psi1,psi2,M,N);%计算步长dx=uX/M;%x的步长dt=uT/N;%t的步长x=(0:M)*dx;t=(0:N)*dt;r=dt/dx/dx;%步长比Diag=zeros(1,M-1);%矩阵的对角线元素Low=zeros(1,M-2);%矩阵的下对角线元素Up=zeros(1,M-2);%矩阵的上对角线元素for i=1:M-2    Diag(i)=1+r;    Low(i)=-r/2;    Up(i)=-r/2;endDiag(M-1)=1+r;%计算初值和边值U=zeros(M+1,N+1);for i=1:M+1    U(i,1)=phi(x(i);endfor j=1:N+1    U(1,j)=psi1(t(j);    U(M+1,j)=psi2(t(j);endB=zeros(M-1,M-1);for i=1:M-2    B(i,i)=1-r;    B(i,i+1)=r/2;    B(i+1,i)=r/2;endB(M-1,M-1)=1-r;%逐层求解,需要使用追赶法(调用函数EqtsForwardAndBackward)for j=1:N    b1=zeros(M-1,1);    b1(1)=r*(U(1,j+1)+U(1,j)/2;    b1(M-1)=r*(U(M+1,j+1)+U(M+1,j)/2;    b=B*U(2:M,j)+b1;    U(2:M,j+1)=EqtsForwardAndBackward(Low,Diag,Up,b);endU=U'%作出图形mesh(x,t,U);title('Crank-Nicolson隐式格式,一维热传导方程的解的图像')xlabel('空间变量 x')ylabel('时间变量 t')zlabel('一维热传导方程的解 U')return;Crank-Nicolson隐式格式4、正方形区域Laplace方程Diriclet问题的求解需要调用Jacobi迭代法和Guass-Seidel迭代法求解线性方程组function U x y=PDEEllipseSquareLaplaceDirichlet(ub,phi1,phi2,psi1,psi2,M,type)%正方形区域Laplace方程的Diriclet边值问题的差分求解%此程序需要调用Jacobi迭代法或者Guass-Seidel迭代法求解线性方程组%U x y=PDEEllipseSquareLaplaceDirichlet(ub,phi1,phi2,psi1,psi2,M,type)%方程:u_xx+u_yy=0  0<=x,y<=ub%边值条件:u(0,y)=phi1(y)%         u(ub,y)=phi2(y)%         u(x,0)=psi1(x)%         u(x,ub)=psi2(x)%输出参数:U -解矩阵,第一行表示y=0时的值,第二行表示第y=h时的值%         x -横坐标%         y -纵坐标%输入参数:ub -变量边界值的上限%         phi1,phi2,psi1,psi2 -边界函数,定义为内联函数%         M -横纵坐标的等分区间数%         type -求解差分方程的迭代格式,若type='Jacobi',采用Jacobi迭代格式%               若type='GS',采用Guass-Seidel迭代格式。默认情况下,type='GS'%应用举例:%ub=4;M=20;%phi1=inline('y*(4-y)');phi2=inline('0');psi1=inline('sin(pi*x/4)');psi2=inline('0');%U x y=PDEEllipseSquareLaplaceDirichlet(ub,phi1,phi2,psi1,psi2,M,'GS');if nargin=6    type='GS'end%步长h=ub/M;%横纵坐标x=(0:M)*h;y=(0:M)*h;%差分格式的矩阵形式AU=K%构造矩阵AM2=(M-1)2;A=zeros(M2);for i=1:M2    A(i,i)=4;endfor i=1:M2-1    if mod(i,M-1)=0        A(i,i+1)=-1;        A(i+1,i)=-1;    endendfor i=1:M2-M+1    A(i,i+M-1)=-1;    A(i+M-1,i)=-1;endU=zeros(M+1);%边值条件for i=1:M+1    U(i,1)=psi1(i-1)*h);    U(i,M+1)=psi2(i-1)*h);    U(1,i)=phi1(i-1)*h);    U(M+1,i)=phi2(i-1)*h);end%构造KK=zeros(M2,1);for i=1:M-1    K(i)=U(i+1,1);    K(M2-i+1)=U(i+1,M+1);endK(1)=K(1)+U(1,2);K(M-1)=K(M-1)+U(M+1,2);K(M2-M+2)=K(M2-M+2)+U(1,M);K(M2)=K(M2)+U(M+1,M);for i=2:M-2    K(M-1)*(i-1)+1)=U(1,i+1);    K(M-1)*i)=U(M+1,i+1);endx0=ones(M2,1);switch type    %调用Guass-Seidel迭代法求解线性方程组AU=K    case 'Jacobi'        X=EqtsJacobi(A,K,x0);    %调用Guass-Seidel迭代法求解线性方程组AU=K    case 'GS'        X=EqtsGS(A,K,x0);    otherwise        disp('差分格式类型输入错误')        return;end%把求解结果化成矩阵型式for i=2:M    for j=2:M        U(j,i)=X(j-1+(M-1)*(i-2);    endendU=U'%作出图形mesh(x,y,U);title('五点差分格式Laplace方程Diriclet问题的解的图像')xlabel('x')ylabel('y')zlabel('Laplace方程Diriclet问题的解 U')return;正方形区域Laplace方程五点差分格式5、一阶双曲型方程的差分方法function U x t=PDEHyperbolic(uX,uT,M,N,C,phi,psi1,psi2,type)%一阶双曲型方程的差分格式%U x t=PDEHyperbolic(uX,uT,M,N,C,phi,psi1,psi2,type)%方程:u_t+C*u_x=0  0 <= t <= uT, 0 <= x <= uX%初值条件:u(x,0)=phi(x)%输出参数:U -解矩阵,第一行表示初值,第二行表示第2个时间层%        x -横坐标%        t -纵坐标,时间%输入参数:uX -变量x的上界%        uT -变量t的上界%        M -变量x的等分区间数%        N -变量t的等分区间数%        C -系数%        phi -初值条件函数,定义为内联函数%        psi1,psi2 -边值条件函数,定义为内联函数%        type -差分格式,从下列值中选取%             -type='LaxFriedrichs',采用Lax-Friedrichs差分格式求解%             -type='CourantIsaacsonRees',采用Courant-Isaacson-Rees差分格式求解%             -type='LeapFrog',采用Leap-Frog(蛙跳)差分格式求解%             -type='LaxWendroff',采用Lax-Wendroff差分格式求解%             -type='CrankNicolson',采用Crank-Nicolson差分格式求解,此格式需调用追赶法%              求解三对角线性方程组%h=uX/M;%变量x的步长k=uT/N;%变量t的步长r=k/h;%步长比x=(0:M)*h;t=(0:N)*k;U=zeros(M+1,N+1);%初值条件for i=1:M+1    U(i,1)=phi(x(i);end%边值条件for j=1:N+1    U(1,j)=psi1(t(j);    U(M+1,j)=psi2(t(j);    %U(1,j)=NaN;    %U(M+1,j)=NaN;endswitch type    %Lax-Friedrichs差分格式    case 'LaxFriedrichs'        if abs(C*r)>1            disp('|C*r|>1,Lax-Friedrichs差分格式不稳定!')        end        %逐层求解        for j=1:N            for i=2:M                U(i,j+1)=(U(i+1,j)+U(i-1,j)/2-C*r*(U(i+1,j)-U(i-1,j)/2;            end        end        %Courant-Isaacson-Rees差分格式    case 'CourantIsaacsonRees'        if C<0            disp('C<0,采用前差公式')            if C*r<-1                disp('Courant-Isaacson-Lees差分格式不稳定!')            end            %逐层求解            for j=1:N                for i=2:M                    U(i,j+1)=(1+C*r)*U(i,j)-C*r*U(i+1,j);                end            end        else            disp('C>0,采用后差公式')            if C*r>1                disp('Courant-Isaacson-Lees差分格式不稳定!')            end            %逐层求解            for j=1:N                for i=2:M                    U(i,j+1)=C*r*U(i-1,j)+(1-C*r)*U(i,j);                end            end        end            %Leap-Frog(蛙跳)差分格式    case 'LeapFrog'        phi2=input('请输入第二层初值条件函数:psi2=');        if abs(C*r)>1            disp('|C*r|>1,Leap-Frog差分格式不稳定!')        end        %第二层初值条件        for i=1:M+1            U(i,2)=phi2(x(i);        end        %逐层求解        for j=2:N            for i=2:M                U(i,j+1)=U(i,j-1)-C*r*(U(i+1,j)-U(i-1,j);            end        end            %Lax-Wendroff差分格式    case 'LaxWendroff'        if abs(C*r)>1            disp('|C*r|>1,Lax-Wendroff差分格式不稳定!')        end        %逐层求解        for j=1:N            for i=2:M                U(i,j+1)=U(i,j)-C*r*(U(i+1,j)-U(i-1,j)/2+C2*r2*(U(i+1,j)-2*U(i,j)+U(i-1,j)/2;            end        end            %Crank-Nicolson隐式差分格式,需调用追赶法求解三对角线性方程组的算法    case 'CrankNicolson'        Diag=zeros(1,M-1);%矩阵的对角线元素        Low=zeros(1,M-2);%矩阵的下对角线元素        Up=zeros(1,M-2);%矩阵的上对角线元素        for i=1:M-2            Diag(i)=4;            Low(i)=-r*C;            Up(i)=r*C;        end        Diag(M-1)=4;        B=zeros(M-1,M-1);        for i=1:M-2            B(i,i)=4;            B(i,i+1)=-r*C;            B(i+1,i)=r*C;        end        B(M-1,M-1)=4;        %逐层求解,需要使用追赶法(调用函数EqtsForwardAndBackward)        for j=1:N            b1=zeros(M-1,1);            b1(1)=r*C*(U(1,j+1)+U(1,j)/2;            b1(M-1)=-r*C*(U(M+1,j+1)+U(M+1,j)/2;            b=B*U(2:M,j)+b1;            U(2:M,j+1)=EqtsForwardAndBackward(Low,Diag,Up,b);        end            otherwise        disp('差分格式类型输入有误!')        return;endU=U'%作出图形mesh(x,t,U);title(type '格式求解一阶双曲型方程的解的图像');xlabel('空间变量 x');ylabel('时间变量 t');zlabel('一阶双曲型方程的解 U');return;专心-专注-专业

    注意事项

    本文(偏微分方程数值解法的MATLAB源码.docx)为本站会员(飞****2)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开