《FDTD electromagnetic field using MATLAB》读书笔记 Figure 1.2

函数f(x)用采样间隔Δx=π/5进行采样,使用向前差商、向后差商和中心差商三种公式来近似一阶导数。
书中代码:
%% ------------------------------------------------------------------------------
%% Output Info about this m-file
fprintf('\n****************************************************************\n');
fprintf('\n <FDTD 4 ElectroMagnetics with MATLAB Simulations> \n');
fprintf('\n Figure 1.2 \n\n'); time_stamp = datestr(now, 31);
[wkd1, wkd2] = weekday(today, 'long');
fprintf(' Now is %20s, and it is %7s \n\n', time_stamp, wkd2);
%% ------------------------------------------------------------------------------ % Create exact function and its derivative
N_exact = 301; % number of sample points for exact function
x_exact = linspace(0, 6*pi, N_exact);
f_exact = sin(x_exact) .* exp(-0.3*x_exact);
f_derivative_exact = cos(x_exact) .* exp(-0.3*x_exact) - 0.3*sin(x_exact).*exp(-0.3*x_exact); % plot exact function
figure('NumberTitle', 'off', 'Name', 'Figure 1.2.a');
set(gcf,'Color','white'); plot(x_exact, f_exact, 'k-', 'linewidth', 1.5);
set(gca, 'fontsize', 12, 'fontweight', 'demi');
axis([0 6*pi -1 1]); grid on;
xlabel('$x$', 'interpreter', 'latex', 'fontsize', 16);
ylabel('$f(x)$', 'interpreter', 'latex', 'fontsize', 16);
title('Exact function'); % create exact function for pi/5 sampleing peroid and
% its finite difference derivatives
N_a = 31; % number of points for pi/5 sampling period
x_a = linspace(0, 6*pi, N_a); % [0, 6pi], row vector with 31 points
f_a = sin(x_a) .* exp(-0.3*x_a);
f_derivative_a = cos(x_a) .* exp(-0.3*x_a) - 0.3*sin(x_a) .* exp(-0.3*x_a); dx_a = pi/5;
f_derivative_forward_a = zeros(1, N_a); % 1×31 zero matrix
f_derivative_backward_a = zeros(1, N_a);
f_derivative_central_a = zeros(1, N_a); f_derivative_forward_a(1:N_a-1) = (f_a(2:N_a)-f_a(1:N_a-1))/dx_a;
f_derivative_backward_a(2:N_a) = (f_a(2:N_a)-f_a(1:N_a-1))/dx_a;
f_derivative_central_a(2:N_a-1) = (f_a(3:N_a)-f_a(1:N_a-2))/(2*dx_a); % create exact function for pi/10 sampleing peroid and
% its finite difference derivatives
N_b = 61; % number of points for pi/10 sampling period
x_b = linspace(0, 6*pi, N_b);
f_b = sin(x_b) .* exp(-0.3*x_b);
f_derivative_b = cos(x_b) .* exp(-0.3*x_b) - 0.3*sin(x_b) .* exp(-0.3*x_b); dx_b = pi/10;
f_derivative_forward_b = zeros(1, N_b);
f_derivative_backward_b = zeros(1, N_b);
f_derivative_central_b = zeros(1, N_b);
f_derivative_forward_b(1:N_b-1) = (f_b(2:N_b)-f_b(1:N_b-1))/dx_b;
f_derivative_backward_b(2:N_b) = (f_b(2:N_b)-f_b(1:N_b-1))/dx_b;
f_derivative_central_b(2:N_b-1) = (f_b(3:N_b)-f_b(1:N_b-2))/(2*dx_b); % plot exact derivative of the function and its finite difference
% derivatives using pi/5 sampling period
figure('NumberTitle', 'off', 'Name', 'Figure 1.2.b');
set(gcf,'Color','white'); plot(x_exact, f_derivative_exact, 'k', ...
x_a(1:N_a-1), f_derivative_forward_a(1:N_a-1), 'b--', ...
x_a(2:N_a), f_derivative_backward_a(2:N_a), 'r-.', ...
x_a(2:N_a-1), f_derivative_central_a(2:N_a-1), ':ms', ...
'markersize', 4, 'linewidth', 1.5);
set(gca, 'fontsize', 12, 'fontweight', 'demi');
axis([0 6*pi -1 1]); grid on;
legend('exact', 'forward difference', 'backward difference', 'central difference');
xlabel('$x$', 'interpreter', 'latex', 'fontsize', 16);
ylabel('$f''(x)$', 'interpreter', 'latex', 'fontsize', 16);
text(pi, 0.6, '$\Delta x = \pi/5$', 'interpreter', 'latex', 'fontsize', 16, 'backgroundcolor', ...
'w', 'edgecolor', 'k'); % plot error for finite difference derivatives
% using pi/5 sampling period
error_forward_a = f_derivative_a - f_derivative_forward_a;
error_backward_a = f_derivative_a - f_derivative_backward_a;
error_central_a = f_derivative_a - f_derivative_central_a; figure('NumberTitle', 'off', 'Name', 'Figure 1.2.c');
set(gcf,'Color','white');
plot(x_a(1:N_a-1), error_forward_a(1:N_a-1), 'b--', ...
x_a(2:N_a), error_backward_a(2:N_a), 'r--', ...
x_a(2:N_a-1), error_central_a(2:N_a-1), ':ms', ...
'markersize', 4, 'linewidth', 1.5);
set(gca, 'fontsize', 12, 'fontweight', 'demi');
axis([0 6*pi -0.2 0.2]); grid on;
legend('forward difference', 'backward difference', 'central difference');
xlabel('$x$', 'interpreter', 'latex', 'fontsize', 16);
ylabel('error $[f''(x)]$' , 'interpreter', 'latex', 'fontsize', 16);
text(pi, 0.15, '$\Delta x = \pi/5$', 'interpreter', 'latex', 'fontsize', 16, ...
'backgroundcolor', 'w', 'edgecolor', 'k'); % plot error for finite difference derivatives
% using pi/10 sampling period
error_forward_b = f_derivative_b - f_derivative_forward_b;
error_backward_b = f_derivative_b - f_derivative_backward_b;
error_central_b = f_derivative_b - f_derivative_central_b; figure('NumberTitle', 'off', 'Name', 'Figure 1.2.d');
set(gcf,'Color','white');
plot(x_b(1:N_b-1), error_forward_b(1:N_b-1), 'b--', ...
x_b(2:N_b), error_backward_b(2:N_b), 'r-.', ...
x_b(2:N_b-1), error_central_b(2:N_b-1), ':ms', ...
'markersize', 4, 'linewidth', 1.5);
set(gca, 'fontsize', 12, 'fontweight', 'demi');
axis([0 6*pi -0.2 0.2]); grid on;
legend('forward difference', 'backward difference', 'central difference');
xlabel('$x$', 'interpreter', 'latex', 'fontsize', 16);
ylabel('error $[f''(x)]$' , 'interpreter', 'latex', 'fontsize', 16);
text(pi, 0.15, '$\Delta x = \pi/10$' , 'interpreter', ...
'latex', 'fontsize', 16, 'backgroundcolor', 'w', 'edgecolor', 'k' );
运行结果:

上图是函数图形,看出振幅是指数衰减的。下图是一阶导数的精确值(公式计算)和三种差商近似结果。中心差商近似结果接近
精确值。

下图是在Δx=π/5采样间隔下,三种差商近似与精确值之间的误差对比。可以看出中心差商近似的误差最小。

下图是Δx=π/10采样间隔下,三种差商近似与精确值之间的误差对比。可以看出中心差商近似的误差最小。另外由于向前差商和
向后差商近似是1阶精度,中心差商近似是2阶精度,所以采样间隔由π/5变成π/10后,向前差商和向后差商近似误差变为原来的二分之一,
而中心差商近似误差变为原来的四分之一。

《FDTD electromagnetic field using MATLAB》读书笔记 Figure 1.2的更多相关文章
- 《FDTD electromagnetic field using MATLAB》读书笔记之 Figure 1.14
背景: 基于公式1.42(Ez分量).1.43(Hy分量)的1D FDTD实现. 计算电场和磁场分量,该分量由z方向的电流片Jz产生,Jz位于两个理想导体极板中间,两个极板平行且向y和z方向无限延伸. ...
- 《FDTD electromagnetic field using MATLAB》读书笔记之一阶、二阶偏导数差商近似
- 《FDTD electromagnetic field using MATLAB 》读书笔记001-差商种类
有限差分就是用差商代替微商,有3钟: 1.向前差商 2.向后差商 3.中心差商 上面三张途中虚线就是函数在x的精确微商(偏导数),直线就是用来代替精确 微商的差商格式.
- Matlab学习笔记 figure函数
Matlab学习笔记 figure函数 matlab中的 figure 命令,能够创建一个用来显示图形输出的一个窗口对象.每一个这样的窗口都有一些属性,例如窗口的尺寸.位置,等等.下面一一介绍它们. ...
- TJI读书笔记17-字符串
TJI读书笔记17-字符串 不可变的String 重载”+”和StringBuilder toString()方法的一个坑 String上的操作 格式化输出 Formatter类 字符串操作可能是计算 ...
- WPF,Silverlight与XAML读书笔记第四十三 - 多媒体支持之文本与文档
说明:本系列基本上是<WPF揭秘>的读书笔记.在结构安排与文章内容上参照<WPF揭秘>的编排,对内容进行了总结并加入一些个人理解. Glyphs对象(WPF,Silverlig ...
- 《Linux内核设计与实现》 Chapter4 读书笔记
<Linux内核设计与实现> Chapter4 读书笔记 调度程序负责决定将哪个进程投入运行,何时运行以及运行多长时间,进程调度程序可看做在可运行态进程之间分配有限的处理器时间资源的内核子 ...
- ANTLR3完全参考指南读书笔记[06]
前言 这段时间在公司忙的跟狗似的,但忙的是没多少技术含量的活儿. 终于将AST IR和tree grammar过了一遍,计划明天写完这部分的读书笔记. 内容 1 内部表示AST构建 2 树文法 ...
- 认识CLR [《CLR via C#》读书笔记]
认识CLR [<CLR via C#>读书笔记] <CLR via C#>读书笔记 什么是CLR CLR的基本概念 通用语言运行平台(Common Language Runti ...
随机推荐
- .net core 2.2 & Mongodb
.net core 2.2 API项目中使用Mongodb 简单的CRUD封装 创建FoodPlan.Core 项目 创建IEntityBase.cs 接口约束 创建Single.cs 实体 IEnt ...
- fileupload上传文件时带参数
var userID = ""; $('#picture').fileupload({ url: "http://localhost:35708/Handler/File ...
- c++第二十六天
p131~p135: 1.除非必要否则不使用后缀加加(减减),会有额外的性能开销. 2.混用解引用和递增运算符.*pointer++,后缀运算符优先于解引用运算符. 3.运算对象可按任意顺序求值,即使 ...
- 20145221 《Java程序设计》实验报告一:Java开发环境的熟悉(Windows+IDEA)
20145221 <Java程序设计>实验报告一:Java开发环境的熟悉(Windows+IDEA) 实验要求 使用JDK编译.运行简单的Java程序: 使用IDEA 编辑.编译.运行.调 ...
- mfc制作ActiveX
转:https://blog.csdn.net/hkcsdn/article/details/52908748 前言 ActiveX是Microsoft对于一系列策略性面向对象程序技术和工 ...
- 从0开始学习 GITHUB 系列之「GIT 进阶」【转】
本文转载自:http://stormzhang.com/github/2016/06/16/learn-github-from-zero5/ 版权声明:本文为 stormzhang 原创文章,可以随意 ...
- POJ 1797 Heavy Transportation(最短路&Dijkstra变体)题解
题意:给你所有道路的载重,找出从1走到n的所有路径中载重最大的,即路径最小值的最大值. 思路:和之前的POJ3268很像.我们用Dijkstra,在每次查找时,我们把最大的先拿出来,因为最大的不影响最 ...
- 一起动手打造个人娱乐级linux
我们使用电脑,一直以来用的都是windows,但是对于像我这种爱折腾的人来说,尝试使用linux系统应该是一种不错的体验.说到linux,许多人可能都没听过,或者知道的人对它印象是这样的: 然而,li ...
- hdu KiKi's K-Number 主席树
KiKi's K-Number Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- 最好的移动触摸滑动插件:Swiper
最近在使用的一个移动触摸滑动插件Swiper,功能很强大,跟之前的那个swipe.JS相比,同时支持在PC端滑动,支持上下方向滑动,支持多张图片滑动,支持多屏滑动,凡是你想得到的几乎都可以实现.最近作 ...