简单体会数值求解一维扩散方程

借用这个题目在这里插入图片描述
然后用比较简单的matlab代码来求解

%空间0到1,切了5份,时间0到1,切了十份。
clc,clear
v = 1;
dx = 0.2;
x = 0:dx:1;
dt = 0.1;
nx = 6;
nt = 11;
t = 0:dt:1;
b = v/(2*dx*dx);
c = b;
a = 1/dt+b+c;

Uold = exp(x);
Unew = ones(1,nx);    
Unew(1) = exp(t(2));
Unew(nx) = exp(1+t(2));

%其实最关键的就是得到A E F这些矩阵,本案例用的是crank-nicolson差分格式,不同格式得到的A等矩阵不同,在openfoam中有特定的设定方法
A = [a -b 0 0;-c a -b 0;0 -c a -b;0 0 -c a];
E = [c (1/dt-b-c) b 0 0 0;0 c (1/dt-b-c) b 0 0;0 0 c (1/dt-b-c) b 0;0 0 0 c (1/dt-b-c) b];
F = [c 0 0 0 0 0;0 0 0 0 0 0;0 0 0 0 0 0;0 0 0 0 0 b];

%时间推进,大规模矩阵的话就不能简单地用A\D来求了,需要其他迭代法,比如gauss-seidel之类的,还有更高效的算法,注意一个点就是对于第一类边界条件的情况,U1和Unx其实不用解矩阵求解,边界条件就已经设定了,第二第三类边界条件暂时还不清楚,后续再补充。 
for k = 2:nt
    D = E*Uold' + F*Unew';
    Uin = A\D;
    Unew(2:nx-1) = Uin';
    Unew(1) = exp(t(k));
    Unew(nx) = exp(1+t(k));
    Uold = Unew;
end

plot(x,Unew)
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值