针对波动计算复杂性的吸收边界条件(PML 用于一般波动方程)(Matlab代码实现)

张开发
2026/4/6 12:07:52 15 分钟阅读

分享文章

针对波动计算复杂性的吸收边界条件(PML 用于一般波动方程)(Matlab代码实现)
欢迎来到本博客❤️❤️博主优势博客内容尽量做到思维缜密逻辑清晰为了方便读者。⛳️座右铭行百里者半于九十。1 概述针对波动计算复杂性的吸收边界条件摘要在之前的一些工作的基础上我们研究了如何向计算域添加吸收边界条件以便我们可以假装我们的波从中间某处传播到无穷远。我们讨论了几种不同的方法来增强我们的模拟以实现这一目标其中一种特定的方法是完美匹配层PML。作为一名电气工程师以下观点可能会让你感到震惊所有有趣的微分方程都来自量子力学。哦是的麦克斯韦方程无穷有用但拜托就算是一桶激光也永远不会像需要一个波动方程是复值那样有趣。认真地读一下[1]的前九十页特别是第四章和第五节我相信你会同意的。现在当面对一个偏微分方程时当然首先要做的事情是把它输入计算机看看事情是如何反弹的。我说的反弹是真的反弹。当量子波函数——实际上是任何波状物——在一个边界条件被默认设置为零的计算域中移动时它们会从侧面反射出来这是不连续性和二阶导数的有趣结果。由于量子力学的基本方程中没有任何源或汇概率和能量在这种情况下往往是守恒的这是一件好事。然而即使在存在电势的情况下如果你的初始波函数足够扩展它最终会演变成由计算域本身的模式通常是一个正方形主导的一堆振荡模式。也就是说如果你试图探索特定标量电势的模式——而不是你的计算机的模式——你需要找到一种方法在波函数到达计算域边缘之前衰减它。对于一些电势比如谐振子这通常是不必要的但对于其他电势来说是必要的。虽然不一定显而易见但为了做到这一点如果我们盯着薛定谔方程看。这个程序是为标准波动方程设计的完美匹配层它使用吸收边界条件。这些条件不是用来解决麦克斯韦方程而是用于标准波动方程比如用于电势的波动方程。如何添加良好的吸收边界条件使得你可以假装在计算机内部模拟真实的电磁现象当你不是在解决麦克斯韦方程而是在解决电势的波动方程时你该如何做别担心下面就是解决这个问题的方法详细文章见第4部分。1. 使用辅助微分方程的一阶方程的完全显式有限差分法。2. 使用二阶方程的完全显式有限差分法。3. 使用辅助微分方程的一阶方程的半隐式有限差分法。2 运行结果部分代码clear; close all; showpotential true;%% Initialize computational domain:n 256; c 1; tmax 2^12;xmin -50; xmax 50; x linspace(xmin, xmax, n); dx x(2) - x(1);[x, y] meshgrid(x, x);phi exp(-(x.^2y.^2)/2)/(2*pi);%% Initialize perfectly matched layer simulation variables:[sigmax, sigmay] setupPML(x, dx);dt 0.25 * dx / c;s_xplusy 1/c^2*(sigmax sigmay);s_xtimesy 1/c^2*(sigmax.*sigmay);psi zeros(size(x));u_now zeros(size(x));vx zeros(size(x));vy zeros(size(x));s c^2 * dt^2;%% Run the simulation:if showpotentialfig mesh(x, y, u_now);axis([xmin xmax xmin xmax -0.2 0.2]);xlabel(x); ylabel(y);zlabel(Wave Amplituide);title(Generic Wave with PML at Boundary);end3参考文献文章中一些内容引自网络会注明出处或引用为参考文献难免有未尽之处如有不妥请随时联系删除。4 Matlab代码、文章下载

更多文章