精华内容
下载资源
问答
  • 一维热传导问题
    万次阅读
    2019-01-18 18:43:04

    Matlab 求解一维热传导方程

    %%传热模型
    clear ;
    g = ‘squareg’; %定义以为正方形
    b = ‘squareb1’; %定义边界条件为零
    c = 1; a = 0; f = 0; d = 1;
    %产生初始三角网格
    [p,e,t]=initmesh(g);
    %定义初始条件
    u0 = zeros(size(p,2),1);
    ix=find(sqrt(p(1,:).^2+p(2,:). ^2)<0.4);
    u0(ix)=1;
    %在时间段0~0.1 的20个点上求解
    nframe = 20;
    tlist = linspace(0,0.1,nframe);
    u1 = parabolic(u0,tlist,b,p,e,t,c,c,f,d);
    %动画效果
    for j = 1:nframe
    pdesurf(p,t,u1(:,j));
    mv(j) = getframe;
    end
    movie(mv,10);

    更多相关内容
  • 偏微分一维热传导问题.pdf偏微分一维热传导问题.pdf偏微分一维热传导问题.pdf偏微分一维热传导问题.pdf偏微分一维热传导问题.pdf偏微分一维热传导问题.pdf偏微分一维热传导问题.pdf偏微分一维热传导问题.pdf
  • 求解一维热传导问题/给定边界条件/纯手打代码/参考书籍为数值计算方法
  • 使用差分法求解一维热传导偏微分方程,也可以求解类似热传导的偏微分方程。分别推导了显式和隐式的差分离散格式,并使用matlab编写了显式和隐式的求解代码。压缩包中包含了详细的推导文档和带有注释的代码,可供...
  • 一维热传导方程的前向Euler和紧差分格式
  • 一维热传导问题与C++描述

    千次阅读 2016-08-14 16:20:41
    1一维热传导问题与C++描述1.1理论推导扩散问题的通用方程可以写为: ∇∇Γ+S=0(1)\begin{equation} \nabla\nabla\Gamma +S = 0\tag{1} \end{equation} 一维热传导问题可以讲上式子简化为来: ddx(Γdϕdx)+S=0...

    1一维热传导问题与C++描述

    1.1理论推导

    扩散问题的通用方程可以写为:

    Γ+S=0(1)

    一维热传导问题可以讲上式子简化为来:

    ddx(Γdϕdx)+S=0(2)

    将其在网格上离散可以得到下图的控制体单元表示:


    一维热传导问题的控制体单元

    将1.2式在网格上积分并利用Gauss定理就可以得到:

    ΔVddx(Γdϕdx)dV+ΔVSdV=(ΓAdϕdx)e(ΓAdϕdx)w+S¯ΔV=0(3)

    Γw Γe 可以用线性插值的方法得到。1.3再在w,e面上的值即可以写为
    (ΓAdϕdx)e=ΓeAeϕEϕPδEP(4)

    (ΓAdϕdx)w=ΓwAwϕPϕWδPW(5)

    源项可以用 S¯ΔV=Su+Spϕp 代替,则式3可以写为:
    ΓeAeϕEϕPδEPΓwAwϕPϕWδPW+Su+Spϕp=0(6)

    整理就得到:
    aPϕP=aWϕW+aEϕE+Su(7)

    其中:

    aW aE aP
    ΓWδxWPAW ΓEδxPEAE aW+aE+Su

    1.2一维传热的小case


    传热的算例

    其中 δx 0.1m k=1000w/ms ,截面积 A=0.01m2
    根据公式7我们可以直接得到2、3、4节点处的方程组的系数。而对于边界1点处,可以类比公式6:

    ΓAT2T1δ21ΓATPTAδ1A=0(8)

    同理对于5点我们也有:

    ΓATBT5δ5BΓAT5T4δ54=0(8)

    对于这个case我们所需的全部都已经得到,可以用C++编程语言进行具体的求解。

    1.3 C++描述

    1.3.1一个有用的数据结构

    观察公式7、8、9我们发现实际上对于结构化网格,实际上网格任意一点所需求解的值都仅与相邻网格或者边界上的值相关,我们也就可以用

    aPϕP=aWϕW+aEϕE+aNϕN+aSϕS+aTϕT+aBϕB+Su(7)

    来表示任意一个网格节点处的离散化的控制方程。在这里就可以定义一个非常哟用的类或者结构体来储存这些系数。

    #ifndef _LinearCofs_
    #define _LinearCofs_
    
    using namespace std;
    
    class LinearCofs
    {
    public:
        double ap_, ae_, aw_, an_, as_, at_, ab_;
        double b_;
    
        LinearCofs()
            :ap_(0), ae_(0), aw_(0), an_(0), as_(0), at_(0), ab_(0), b_(0)
        {}
        {
    
        }
    
        LinearCofs(double ap, double ae, double aw, double an, double as, double at, double ab, double b)
            :ap_(ap), ae_(ae), aw_(aw), an_(an), as_(as), at_(at), ab_(ab), b_(b)
        {}
    
    };
    
    #endif

    即使在后面的三维问题的求解中我们也可以利用上述类。

    1.3.2 求解过程

    
    #include <iostream>
    #include <vector>
    
    #include "LinearCofs.h"
    
    #include "Matrix.h"
    
    const double  N = 5;
    const double k_ = 0.5;
    const double A_ = 1;
    const double L_ = 0.02;
    const double TA_ = 100;
    const double TB_ = 500;
    
    double deltx = L_ / N;
    
    using namespace std;
    
    
    void InerField(vector<LinearCofs>&  lcDiffusion1D)
    {
    
        for( int i = 1; i < N - 1; i++)
        {
            lcDiffusion1D[i].ae_ = -k_ / deltx * A_;
            lcDiffusion1D[i].aw_ = -k_ / deltx * A_;
            lcDiffusion1D[i].ap_ = -(lcDiffusion1D[i].ae_ + lcDiffusion1D[i].aw_);
        }
    
    
    }
    
    void BoundaryCondition(vector<LinearCofs>&  lcDiffusion1D)
    {
        double deltx = L_ / N;
    
        lcDiffusion1D[0].ae_ = -k_ / deltx * A_;
        lcDiffusion1D[0].aw_ = 0.0;
        lcDiffusion1D[0].ap_ = -(lcDiffusion1D[0].ae_ + lcDiffusion1D[0].aw_)+2 * k_ / deltx * A_;
    
        lcDiffusion1D[N - 1].ae_ = 0.0;
        lcDiffusion1D[N - 1].aw_ = -k_ / deltx * A_;
        lcDiffusion1D[N - 1].ap_ = -(lcDiffusion1D[N - 1].ae_ + lcDiffusion1D[N - 1].aw_)+2 * k_ / deltx * A_;
    }
    
    void CofsToMatrix(Matrix&   mDiffusion1D, vector<LinearCofs>&   lcDiffusion1D)
    {
    
        for(int i = 0; i < N; i++)
        {
            for(int j = 0; j < N; j++)
            {
                mDiffusion1D(i,j) = 0.0;
            }
        }
    
        mDiffusion1D(0,0) = lcDiffusion1D[0].ap_;
        mDiffusion1D(0,1) = lcDiffusion1D[0].ae_;
    
    
        for (int i = 1; i < N-1 ; i++)
        {       
    
                mDiffusion1D(i,i-1) = lcDiffusion1D[i].aw_;
                mDiffusion1D(i,i) = lcDiffusion1D[i].ap_;
                mDiffusion1D(i,i+1) = lcDiffusion1D[i].ae_;
        }
    
        mDiffusion1D(N-1,N-2) = lcDiffusion1D[N-1].aw_;
        mDiffusion1D(N-1,N-1) = lcDiffusion1D[N-1].ap_;
    
    }
    
    void CofsToB_(vector<LinearCofs>&   lcDiffusion1D)
    {
        lcDiffusion1D[0].b_ = 2 * k_ / deltx*A_ * TA_;
        lcDiffusion1D[N-1].b_ = 2 * k_/ deltx*A_ * TB_;
    
    }
    
    
    
    int main()
    {
    
    
        Matrix  mDiffusion1D(N,N);
    
        vector<LinearCofs>  lcDiffusion1D;
        AllocateDim(lcDiffusion1D, N);
    
        InerField(lcDiffusion1D);
    
        BoundaryCondition( lcDiffusion1D );
    
        CofsToMatrix(mDiffusion1D, lcDiffusion1D);
    
        CofsToB_( lcDiffusion1D );
    
    
        cout << "Matrix A is: " << endl;
    
        cout << mDiffusion1D;
    
        vector<double> x(N),b(N);
        for(int i = 0; i < N; i++)
        {
            b[i] = lcDiffusion1D[i].b_; 
        }
    
        mDiffusion1D.GaussElimination(x, b);
    
        cout << endl;
        cout << " The solution is " << endl;
        for(int i = 0; i < N; i++)
        {
    
            cout <<"x["<<i<<"]="<< x[i] <<" ";
    
        }
    
        cout << endl;
    
    
    
        system("pause");
    
        return 0;
    }
    

    这里第一个函数InerField()是对内部的3\4\5节点赋值,BoundaryCondition()函数则是对两端的1\5点赋值,CofsToMatrix()是将得到的方程组放到矩阵中求解,矩阵求解器可以再我前面的文章中得到,大家可以直接复制,然后include 到头文件中。我们的矩阵求解器有两款线性方程组求解的算法,当然后面我们对于二维问题,因为比较复杂,会有一个gauss-seidel的求解器,会在后面给出那种直接求解不需要赋值到矩阵中的方法。
    利用上述算法我们可以得到每个节点处的值了。

    展开全文
  • MATLAB代码 clear a = 1; dx = 0.01;%dx要大 x = 0:dx:1;... % 温度随时间传导的动画 plot(x,u(:,n+1)) axis([x(1) x(end) 0 1]) getframe; end % [T,X] = meshgrid(t,x); % surf(X,T,u); % shading interp

    请添加图片描述
    请添加图片描述
    MATLAB代码

    clear
    a = 1;
    dx = 0.01;%dx要大
    x = 0:dx:1;
    dt = 0.00005;%dt要小
    t = 0:dt:1;
    u = zeros(length(x),length(t));
    % 初始条件,x的函数
    u(:,1) = sin(pi*x);
    % 边界条件,t的函数
    m1 = 1 + 0.0*sin(t);
    m2 = 1 - 0.2*sin(10*t);
    % 构造A矩阵
    A = -2*eye(length(x)) + diag(ones(1,length(x)-1),1) + diag(ones(1,length(x)-1),-1);
    for n = 1:length(t) - 1
        u(:,n+1) = u(:,n) + a^2*dt/dx^2*A*u(:,n);
        u(1,n+1) = m1(n+1);
        u(end,n+1) = m2(n+1);
        
        % 温度随时间传导的动画
        plot(x,u(:,n+1))
        axis([x(1) x(end) 0 1])
        getframe;
    end
    % [T,X] = meshgrid(t,x);
    % surf(X,T,u);
    % shading interp
    
    
    展开全文
  • 含matlab程序,个人感觉很有帮助,在研究传热学的可以下来看看 含matlab程序,个人感觉很有帮助,在研究传热学的可以下来看看
  • 解决一维热传递的简单 FEM 代码。 易于阅读,可以直接翻译成书中的公式。 问题:单位棒中的瞬态热传导。 解与 Carslaw 和 Jaeger (1959) 的精确解进行比较。 警告:已“全部清除”(在脚本顶部) 参考: W. 刘易斯等...
  • 求解一维热传导方程,是简单的显式差分格式,尽量使用了矩阵运算,没有符号运算。
  • 1、问题热传导方程混合问题: 的数值解,取N=10,h=0.1,计算到K=36为止. 2、程序 3、结果运行结果如Fig1.Fig1. Position(0~5)表示空间位置,y-axis 表示热量/焦耳,x-axis表示时间/秒 4、实验总结(1)本次...

    1、问题

         求一维热传导方程混合问题:

         求解其的数值解,取N=10,h=0.1,计算到K=36为止.

     2、程序

    #python
    import numpy as np
    import matplotlib.pyplot as plt
    def f(a,x1,x2,x3):
        y=a*x3+(1-2*a)*x2+a*x1
        return y
    h=0.1;a=1/6;p=1/600
    x=np.zeros((37,6));
    for i in range(6):
        x[0,i]=4*i*h*(1-i*h)
    for j in range(1,37):
        for n in range(1,6):
            if n+1!=6:
                x[j,n]=f(a,x[j-1,n-1],x[j-1,n],x[j-1,n+1])
            else:
                x[j,n]=f(a,x[j-1,n-1],x[j-1,n],x[j-1,n-1])
    y1=[0,1,2,3,4,5]
    t=np.array([])
    for o in range(37):
        t1=[p*o,p*o,p*o,p*o,p*o,p*o]
        t=np.r_[t,t1]
    t=np.array(t.reshape(37,-1))
    po=['position:0','position:1','position:2','position:3','position:4','position:5']
    for by in range(6):
        x2=x[:,by]
        y2=t[:,by]
        plt.plot(y2,x2,label=po[by])
    plt.xlabel('Time')
    plt.ylabel('Heat')
    plt.title('Heat changes over time')
    plt.legend()
    plt.show()
    

    3、结果

    运行结果如Fig1.

    Fig1. Position(0~5)表示空间位置,y-axis 表示热量/焦耳,x-axis表示时间/秒

     

    4、实验总结

    (1)本次实验解决偏微分方程所用到的方法是差分法,核心思想就是将一阶差商和二阶差商代替一阶偏分和二阶偏分;

    (2)本次实验程序的实现并不困难,掌握核心方法,利用边值条件,对不同空间位置的点进行迭代就可以较为容易的出现结果;

    (3)从设计的程序运行结果来看,随着时间的增大,热量在不断的减少,这种规律是符号我们经验的,具有一定的可信性。

    展开全文
  • 维热传导方程求解

    2020-03-01 12:52:58
    求解二维热传导方程,文档中有过程和matlab程序。 本文利用有限差分法来求二维热传导方程的数值解,通过Matlab编程求解并作图,进而与解析 解做出的图进行比较,画出误差图。
  • matlab求解一维热传导方程 采用有限差分方法
  • 给出一种求解一维非齐次热传导方程反边界值问题的无网格方法,即广义基本解方法。该方法将问题的解分成特解和相应齐次问题的解两个部分:齐次解用基本解方法求解,而特解则是利用相应的特征方程的基本解近似得到。鉴于...
  • 一维非稳态导热热传导Matlab程序,通过此可以解决偏微方程
  • 分层的一维热传导方程的有限差分法MATLAB程序,是简单的显式差分格式,尽量使用了矩阵运算,没有符号运算。 文件chafen1.m以路面为例,假设有多层建筑材料,热传导系数已经在代码中给出。用户使用时请按自己需要修改...
  • 抛物型方程的差分解法(如一维热传导方程)。本人在做建模比赛2020年A题时遇到热传导方程,然后我学习并总结了用有限差分法求解此类偏微分方程(抛物型方程)的解法。
  • MATLAB编辑一维热传导方程的模拟程序
  • 利用偏微分理论求解一维热传导过程解的问题的一组程序。
  • 人工智能-神经网络在一维热传导方程反问题中的应用.pdf
  • 采用有限控制体积法解一维热传导方程,程序简洁明了
  • 热传导方程 还很实用。给了我很大的帮助。
  • 求解下列热传导问题: 2T 1 T 门 c , 2 0 0 z L z t T乙0 1 z2 T 0,t 1, T L,t 0 L 1, 1 程序 fun ctio n heat_c on ductio n) % 一维齐次热传导方程 稳定条options={'空间杆长L'空间点数N'时间点数M'扩散系数alfa' ...
  • 用有限差分方法求解一维非定常热传导方程

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,093
精华内容 1,237
关键字:

一维热传导问题