【Matlab】抛物方程Crank-Nicolson格式

1 题目

(1) 编制用Crank-Nicolson格式求抛物方程数值解的通用程序。
{ ∂ u ∂ t − a ∂ 2 u ∂ x 2 = f ( x , t ) ( 0 < x < 1 , 0 ≤ t ≤   T ) u ( x , 0 ) = φ ( x ) ( 0 ≤ x ≤ 1 ) u ( 0 , t ) = α ( t ) , u ( 1 , t ) = β ( t ) ( 0 < t ≤ T ) \left\{\begin{array}{ll} \frac{\partial u}{\partial t}-a \frac{\partial^{2} u}{\partial x^{2}}=f(x, t) & (0<x<1,0 \leq t \leq \mathrm{~T}) \\ u(x, 0)=\varphi(x) & (0 \leq x \leq 1) \\ u(0, t)=\alpha(t), \quad u(1, t)=\beta(t) & (0<t \leq T) \end{array}\right. tuax22u=f(x,t)u(x,0)=φ(x)u(0,t)=α(t),u(1,t)=β(t)(0<x<1,0t T)(0x1)(0<tT)

(2) 就 a = 1 a=1 a=1, f ( x , t ) = 0 f(x,t)=0 f(x,t)=0, ϕ ( x ) = e x p ( x ) \phi(x)=exp(x) ϕ(x)=exp(x), α ( t ) = e x p ( t ) \alpha(t)=exp(t) α(t)=exp(t), β ( t ) = e x p ( t ) \beta(t)=exp(t) β(t)=exp(t), M = 40 M=40 M=40, N = 40 N=40 N=40,输出点 ( 0.2 , 1.0 ) (0.2,1.0) (0.2,1.0), ( 0.4 , 1.0 ) (0.4,1.0) (0.4,1.0), ( 0.6 , 1.0 ) (0.6,1.0) (0.6,1.0), ( 0.8 , 1.0 ) (0.8,1.0) (0.8,1.0)这四点处 u ( x , t ) u(x,t) u(x,t)的数值解。

(3) 已知所给方程的精确解为 u ( x , t ) = e x p ( x + t ) u(x,t)=exp(x+t) u(x,t)=exp(x+t),将步长反复二分,从点 ( 0.2 , 1.0 ) (0.2,1.0) (0.2,1.0), ( 0.4 , 1.0 ) (0.4,1.0) (0.4,1.0), ( 0.6 , 1.0 ) (0.6,1.0) (0.6,1.0), ( 0.8 , 1.0 ) (0.8,1.0) (0.8,1.0)四点处精确解与数值解的误差观察当步长缩小一半时误差以什么规律缩小。

2 程序

1 通用程序

function U = CrankNicolson(a,M,N,phi,alpha,beta)
    h = 1 / M;
    tau = 1 / N;
    r = a * tau / h / h;

    M1 = zeros(M-1, M-1);
    M2 = zeros(M-1, M-1);
    M3 = zeros(M-1, 1);
    U = zeros(N+1, M-1);

    for i=1:M-1
        M1(i,i) = 1 + r;
        M2(i,i) = 1 - r;
        U(1,i) = phi(tau*i);
        if i-1 >= 1
            M1(i, i-1) = - r / 2;
            M2(i, i-1) = r / 2;
        end
        if i+1 <= M-1
            M1(i, i+1) = -r / 2;
            M2(i, i+1) = r / 2;
        end
    end

    for k = 1:N
        M3(1) = r /2 * ( alpha(tau*(k-1)) + alpha(tau*k) );
        M3(end) = r /2 * ( beta(tau*(k-1)) + beta(tau*k) );
        temp = inv(M1) *  M2 * U(k,:)' + inv(M1) * M3 ;
        U(k+1,:) = temp';
    end
end

2 题目二主函数

clc;clear all

%% 初始数据
a = 1;
M = 40;
N = 40; 

syms x t
phi(x) = exp(x);
alpha(t) = exp(t);
beta(t) = exp(1+t);

U = CrankNicolson(a,M,N,phi,alpha,beta);

for j = 0.2:0.2:0.8
    temp = U(end, round(j * M));
    fprintf("输出点(%0.1f,1.0)的数值解为:%f\n",j, temp)
end

3 题目三主函数

clc;clear all

%% 初始数据
a = 1;

syms x t
phi(x) = exp(x);
alpha(t) = exp(t);
beta(t) = exp(1+t);

k = 5;
step = 5;

y = zeros(1,4);
e = zeros(k,4);
for j = 1:4
    y(1,j) = exp(0.2 * j + 1);
end

for i=1:k
    M = step * 2 ^(i-1);
    N = step * 2 ^(i-1); 
    U = CrankNicolson(a,M,N,phi,alpha,beta);
    fprintf("当空间步长为%0.3f时:\n",1 / M)
    for j = 1:4
        temp = U(end, round(j * M / 5));
        e(i,j) = abs(temp - y(1,j));
        fprintf("输出点(%0.1f,1.0) = %f,误差为:%0.8f\n",j, temp,e(i,j))
    end
    fprintf("\n")
    
end

3 运行结果

题目2结果
在这里插入图片描述
题目3结果
在这里插入图片描述

  • 14
    点赞
  • 113
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
好的,以下是利用 Crank-Nicolson 格式抛物方程Matlab 代码: ```matlab % 定义参数 L = 1; % 区间长度 T = 0.5; % 时间长度 n = 100; % 空间步数 m = 100; % 时间步数 h = L/n; % 空间步长 k = T/m; % 时间步长 r = k/(h^2); % 稳定性参数 x = linspace(0, L, n+1); % 空间网格点 t = linspace(0, T, m+1); % 时间网格点 % 定义初始条件和边界条件 u0 = sin(pi*x); u0(1) = 0; u0(n+1) = 0; % 使用 Crank-Nicolson 格式抛物方程 A = zeros(n-1,n-1); for i = 1:n-2 A(i,i) = 1+2*r; A(i,i+1) = -r; A(i+1,i) = -r; end A(n-1,n-1) = 1+2*r; u = u0(2:n); for j = 1:m b = u + r*(u([2:n-1])-2*u+[1:n-2]+u([3:n])); b(1) = b(1) + r*u0(1); b(n-1) = b(n-1) + r*u0(n+1); u = A\b; end % 绘制图像 u = [0 u 0]; plot(x,u); xlabel('x'); ylabel('u'); title('Solution of Parabolic Equation using Crank-Nicolson Method'); ``` 以上代码中,我们先定义了一些参数,包括区间长度 L、时间长度 T、空间步数 n、时间步数 m、空间步长 h、时间步长 k、空间网格点 x 和时间网格点 t。然后我们定义了初始条件和边界条件,即初值条件为 $u(x,0)=\sin(\pi x)$,边界条件为 $u(0,t)=u(1,t)=0$。 接下来我们使用 Crank-Nicolson 格式抛物方程。先定义系数矩阵 A,然后在每个时间步中计算右端项 b,并解出线性方程组 $Au=b$,得到下一个时间步的解 u。最后我们将边界点加回去,并绘制出解的图像。 需要注意的是,这里我们使用了向量 u 去存储网格点上的函数值,因此在计算右端项 b 和边界条件时需要注意索引的偏移。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

望天边星宿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值