二维TE波CNDG-FDTD方法引入高斯源,求数值解误差,显示收敛阶并画图matlab实现
时间: 2023-09-06 12:04:35 浏览: 123
用matlab编写的2维FDTD算法程序
4星 · 用户满意度95%
### 回答1:
二维TE波CNDG-FDTD方法引入高斯源的数值解误差可以通过与解析解的比较来得到。然后,我们可以根据误差随时间步长或网格尺寸的变化情况来确定收敛阶。下面是一个简单的matlab实现过程:
1. 定义二维网格和时间步长
```matlab
nx = 100; % 网格点数
ny = 100;
dx = 0.01; % 网格尺寸
dy = 0.01;
c = 3e8; % 速度
dt = dx/c/sqrt(2); % 时间步长
tmax = 1e-10; % 模拟时间
nsteps = ceil(tmax/dt); % 总步数
```
2. 初始化电场和磁场
```matlab
ez = zeros(nx,ny); % 电场
hx = zeros(nx,ny); % 磁场
hy = zeros(nx,ny);
```
3. 定义高斯源
```matlab
fc = 1e9; % 高斯波包中心频率
tau = 1/fc/4; % 高斯波包宽度
x0 = nx/2*dx; % 高斯波包中心位置
y0 = ny/2*dy;
amp = 1; % 高斯波包幅值
t0 = 3*tau; % 高斯波包起始时间
source = @(t) amp*exp(-((t-t0)/tau)^2)*sin(2*pi*fc*t); % 高斯源函数
```
4. CNDG-FDTD方法求解
```matlab
for n = 1:nsteps
% 更新磁场
hx(:,1:ny-1) = hx(:,1:ny-1) + dt/2/dy*(ez(:,2:ny)-ez(:,1:ny-1));
hy(1:nx-1,:) = hy(1:nx-1,:) - dt/2/dx*(ez(2:nx,:)-ez(1:nx-1,:));
% 更新电场
ez(2:nx-1,2:ny-1) = ez(2:nx-1,2:ny-1) + dt/eps0/uxx(2:nx-1,2:ny-1).*...
(hy(2:nx-1,2:ny-1)-hy(1:nx-2,2:ny-1)-hx(2:nx-1,2:ny-1)+hx(2:nx-1,1:ny-2));
% 添加高斯源
ez(round(nx/2),round(ny/2)) = ez(round(nx/2),round(ny/2)) + source(n*dt);
% 更新时间
if mod(n,100) == 0 % 每100步显示一次
imagesc(ez');
colorbar;
title(sprintf('CNDG-FDTD at t = %.2e s',n*dt));
xlabel('x');
ylabel('y');
drawnow;
end
end
```
5. 计算误差和收敛阶,画图
```matlab
% 计算误差
exact = sin(2*pi*fc*(0:nsteps*dt)/2)*amp*exp(-((0:nsteps*dt)-t0).^2/tau^2); % 解析解
error = ez(round(nx/2),round(ny/2))-exact; % 数值解误差
% 画误差随时间步长的变化图
figure;
loglog(dt*(1:nsteps),abs(error));
hold on;
loglog(dt*(1:nsteps),dt*(1:nsteps).^2,'--');
title('Error vs. Time Step');
xlabel('Time Step');
ylabel('Error');
legend('Error','2nd order');
% 画误差随网格尺寸的变化图
figure;
loglog(dx*(1:nx),abs(error));
hold on;
loglog(dx*(1:nx),(dx*(1:nx)).^2,'--');
title('Error vs. Grid Size');
xlabel('Grid Size');
ylabel('Error');
legend('Error','2nd order');
```
### 回答2:
二维TE波CNDG-FDTD方法是一种数值解法,用于求解二维波动方程中的TE模式。这种方法结合了Crank-Nicolson差分格式和FDTD方法,具有较高的精度和稳定性。
在该方法中引入高斯源,可以通过在计算区域中心位置设置一个高斯函数,作为激励波源。高斯函数的形式是指数函数的平方,具有正态分布的特点。
为了计算数值解误差,需要事先知道解析解。可以通过定义一个已知的解析解函数,然后将其与数值解进行比较,计算二者之间的差异。常用的误差计算方法包括均方根误差(RMSE)和最大误差等。
要显示收敛阶,可以通过计算不同网格精度下的数值解误差,然后将误差值与步长(即网格的大小)进行关联。通过对数坐标变换,可以得到一个线性关系,从而确定该方法的收敛阶。
为了画图实现,可以使用Matlab编程软件。可以先使用FDTD方法求解二维TE波动方程,然后在计算区域中心位置添加高斯源。将计算结果进行可视化,可以得到波动情况的图像。通过改变网格精度并计算数值解误差,可以绘制误差与步长的关系曲线,从而展示收敛阶的图像。
最后,通过对比数值解与解析解的差异,并观察误差与步长的关系,可以评估二维TE波CNDG-FDTD方法在引入高斯源时的精度和收敛性能。
阅读全文