《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 ...
随机推荐
- 4gcc编译器
gcc编译器(GNU C Compiler) 现在我们所说的 gcc 是 GUN Compiler Collection的缩写,可以支持多种语言编译,比如 C,C++,Java, pascal 等 g ...
- 结合grabcut和inpaint,实现人像去除
在OpenCV提供更多函数中,grabcut能够实现抠图,inpaint能够实现修补.那么把两者结合起来,就能够实现简单的“人像去除”功能,也就是框选一个人后,使用周围的景象对人像进行修补.虽然效果比 ...
- leetcode刷题吧
排列 从排序的数组中删除重复项 /** * @param {number[]} nums * @return {number} */ var removeDuplicates = function(n ...
- 彻底搞懂DOM事件处理(零)引子
通过合理使用JavaScript,可以为网站用户提供更好的交互体验.这主要是因为JavaScript能够让网站对用户的各种操作及时做出"反馈".这种"反馈"使网 ...
- nginx限制蜘蛛的频繁抓取
蜘蛛抓取量骤增,导致服务器负载很高.最终用nginx的ngx_http_limit_req_module模块限制了百度蜘蛛的抓取频率.每分钟允许百度蜘蛛抓取200次,多余的抓取请求返回503. ngi ...
- Codeforces Round #394 (Div. 2) E. Dasha and Puzzle(dfs)
http://codeforces.com/contest/761/problem/E 题意:给出一棵树,现在要把这棵树上的结点放置在笛卡尔坐标上,使得每一条边与x轴平行或者与y轴平行.输出可行解,即 ...
- hadoop经典案例
hadoop经典案例http://blog.csdn.net/column/details/sparkhadoopdemo.html
- 线程池ThreadPoolExecutor里面4种拒绝策略
ThreadPoolExecutor类实现了ExecutorService接口和Executor接口,可以设置线程池corePoolSize,最大线程池大小,AliveTime,拒绝策略等.常用构造方 ...
- redis高可用 - Master&Slave
Master&Slave也就是我们所说的主从复制,即主机数据更新后根据配置和策略,自动同步到备机的机制.其中Master以写为主,Slave以读为主. Master&Slave的作用主 ...
- 史上最强大的40多个纯CSS绘制的图形[转]
今天在国外的网站上看到了很多看似简单却又非常强大的纯CSS绘制的图形,里面有最简单的矩形.圆形和三角形,也有各种常见的多边形,甚至是阴阳太极和网站小图标,真的非常强大,分享给大家. Square(正方 ...