用于二维和三维声学设计灵敏度分析的奇异边界法(Matlab代码实现)

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 用于二维和三维声学设计灵敏度分析的奇异边界法(Matlab代码实现)

💥1 概述

奇异边界法是一类半解析边界无网格配点技术,是用于计算科学与工程问题的新型数值算法之一。类似于边界元法,奇异边界法采用波传播方程的基本解作为插值基函数;不同之处在于,奇异边界法引入源点强度因子的概念来代替基本解的源点奇异性,避免处理边界元法中数学复杂的奇异与近奇异数值积分。奇异边界法的关键在于选取合适的计算方法确定源点强度因子。为提高声学灵敏度分析数值计算的速度和准确性,充分利用Burton-Miller公式和奇异边界法的优势,采用MATLAB软件对声学灵敏度分析进行程序设计与实现,生成基于MATLAB的Burton-Miller奇异边界法图形用户界面(graphical user interface, GUI)。使用该程序对典型声学灵敏度分析算例进行计算,结果表明该程序具有简洁易懂、操作方便、计算结果精确可靠等优点,是一种简洁、高效、实用的模拟工具。本文章将介绍使用该方法对二维和三维声学设计灵敏度进行分析。


📚2 运行结果

二维:

三维:

部分代码(三维主函数):

%=========================================================================
% Essay topic:
%              Singular boundary method for 2D and 3D acoustic design 
%                             sensitivity analysis
%
%                                                      Date:    2022/05/30     
%=========================================================================
% benchmark example:
%                    3D acoustic sensitivity analysis for 
%                          Oscillating sphere
%                    ---Neumann boundary condition
%                    ---Acoustic sensitivity with respect 
%                            to the wave number k
%  %% Attention:
%               The results of the paper are the results obtained by 
%                    running the code in the software Matlab2019a.
%               ---Computations are implemented on a laptop with 
%                  an AMD Ryzen 7 4800H CPU at 2.90 GHz 
%                  on a 64-bit Windows 10 with 16G RAM.
%
%=========================================================================
clear all;
clc;
format long
%% Parameter settings
t0 = clock;              % Time Start 
n = 100;                 % Total number of soource points
m = 100;                 % The number of equal parts for design variable
a = 0.1;                 % Radius of pulsating cylinder
SS = 4*pi*a^2;
Lj = SS/n;               % The influence ranges of source point.
rho = 1.2;               % the air density
c = 341;                 % The speed of sound in air
v0=1;                    % the radial velocity
k = linspace(0.01,6,m);  % The value range of the wave number
dk = (k(end)-k(1))/(m-1);
xi = 5 ; yi = 0; zi = 0; % test point
i = sqrt(-1); 
%% Analytical solution of the acoustic sensitivity with respect to the wave number 
pt_exact = @(ro,k,a) i*rho*c*v0*a^2*exp(i*k.*(ro-a))./(ro.*(1-i*k*a).^2).*((1-i*k*a).^2+i*k*ro.*(1-i*k*a)+i*k*a);
%% Arrangement of Boundary Points
[nodes] = Creat_Sources(n);
xp = a.*nodes(:, 1);
yp = a.*nodes(:, 2);
zp = a.*nodes(:, 3);
n_x = -xp/a; n_y = -yp/a; n_z = -zp/a;
r=sqrt((xp-xp').^2+(yp-yp').^2+(zp-zp').^2);
%% Unknown coefficient solving process 
alpha = zeros(n,m);
for j=1:m
    lamda=i/(k(j)+1);
    b = i*rho*k(j)*c*v0*ones(n,1) ; % boundary condition (Nuemann)
    [~,F,~,H] = GFEH(k(j),r,xp,yp,zp,xp',yp',zp',n_x,n_y,n_z,n_x',n_y',n_z');
    A=F+lamda*H;
    [~,H0] = FH0(r,xp,yp,zp,xp',yp',zp',n_x,n_y,n_z,n_x',n_y',n_z');
    [~,E0] = GE0(r,xp,yp,zp,xp',yp',zp',n_x',n_y',n_z');
    E0(logical(eye(n)))=0; 
    Asum1 = sum(E0,2);
    H0(logical(eye(n)))=0; 
    Asum2 = sum(H0,2);
    H(logical(eye(n)))=0; 
    Asum3 = sum(H,2);
    %Source intensity factors (SIFs) 
    uii=1/(4*pi)*(i*k(j)+pi^4./(25*sqrt(Lj))+(log(pi))^2/SS);
    qii=1/Lj-Asum1;
    qii_BM=-Asum2+k(j)^2/2*uii;
    A(logical(eye(n))) = qii+lamda*qii_BM;  % Source intensity factors (SIFs) 
    alpha(:,j)=A\b;  
end
%% Central difference method
alpha_k(:,1) = (alpha(:,2)-alpha(:,1))/dk; %(-alpha(:,3)+4*alpha(:,2)-3*alpha(:,1))/(2*dk);
alpha_k(:,2:m-1) = (alpha(:,3:m)-alpha(:,1:m-2))/(2*dk);
alpha_k(:,m) = (alpha(:,m)-alpha(:,m-1))/dk;  %(3*alpha(:,m)-4*alpha(:,m-1)+alpha(:,m-2))/(2*dk);
%% Numerical solution and exact solution
Pe=zeros(m,1);
for j = 1:m
    lamda=i/(k(j)+1);
    lamda_dk=-i/(k(j)+1).^2;
    r=sqrt((xi-xp').^2+(yi-yp').^2+(zi-zp').^2);
    [G,E] = GE(k(j),r,xi,yi,zi,xp',yp',zp',n_x',n_y',n_z');
    [G_dk,~,E_dk,~] = GFEHk(k(j),r,xi,yi,zi,xp',yp',zp',n_x,n_y,n_z,n_x',n_y',n_z');
    Pe(j)=(G_dk+lamda_dk*E+lamda*E_dk)*alpha(:,j)+(G+lamda*E)*alpha_k(:,j);  %Numerical solution
end
ri=sqrt(xi.^2+yi.^2+zi.^2);
Exact = pt_exact(ri,k',a);  % Exact solution
%% Global erroe
Ge1 = sqrt(sum( (real(Pe -Exact)).^2 ))/sqrt(sum((real(Exact)).^2));
Ge2 = sqrt(sum( (imag(Pe -Exact)).^2 ))/sqrt(sum((imag(Exact)).^2));
fprintf('Numerical solutions(real part): %12.8e\n',real(Pe)) 
fprintf('Exact solutions(real part): %12.8e\n',real(Exact)) 
fprintf('Numerical solutions(imaginary part): %12.8e\n',imag(Pe)) 
fprintf('Exact solutions(imaginary part): %12.8e\n',imag(Exact)) 
fprintf('Global erroe(real part): %10.4e\n',Ge1) 
fprintf('Global erroe(imaginary part): %10.4e\n',Ge2) 
%% Comparision of numerical and analytical solutions by figures
figure(1)
plot(k,real(Exact),'bo--',k,real(Pe),'r*');
legend('Exact','BM-SBM');
xlabel('k'); 
ylabel('\partial\it{p}/\partial\it{k} (real part)');
figure(2)
plot(k,imag(Exact),'bo--',k,imag(Pe),'r*');
legend('Exact','BM-SBM');
xlabel('k');
ylabel('\partial\it{p}/\partial\it{k} (imaginary part)');
%% 
function [F0,H0] = FH0(r,x1,x2,x3,s1,s2,s3,n_x1,n_x2,n_x3,n_s1,n_s2,n_s3)
% G0 =1/(4*pi*r);
G0_dx1 = -1/(4*pi)*(x1-s1)./r.^3;
G0_dx2 = -1/(4*pi)*(x2-s2)./r.^3;
G0_dx3 = -1/(4*pi)*(x3-s3)./r.^3;
G0_ds1_dx1 = (r.^2-3*(x1-s1).^2)./(4*pi*r.^5);
G0_ds2_dx2 = (r.^2-3*(x2-s2).^2)./(4*pi*r.^5);
G0_ds3_dx3 = (r.^2-3*(x3-s3).^2)./(4*pi*r.^5);
G0_ds2_dx1 = -3*(x1-s1).*(x2-s2)./(4*pi*r.^5);
G0_ds1_dx2 = G0_ds2_dx1;
G0_ds3_dx1 = -3*(x1-s1).*(x3-s3)./(4*pi*r.^5);
G0_ds1_dx3 = G0_ds3_dx1;
G0_ds2_dx3 = -3*(x2-s2).*(x3-s3)./(4*pi*r.^5);
G0_ds3_dx2 = G0_ds2_dx3;
G0_dns_dx1 = G0_ds1_dx1.*n_s1 + G0_ds2_dx1.*n_s2 + G0_ds3_dx1.*n_s3;
G0_dns_dx2 = G0_ds1_dx2.*n_s1 + G0_ds2_dx2.*n_s2 + G0_ds3_dx2.*n_s3;
G0_dns_dx3 = G0_ds1_dx3.*n_s1 + G0_ds2_dx3.*n_s2 + G0_ds3_dx3.*n_s3;
F0 = G0_dx1.*n_x1+G0_dx2.*n_x2+G0_dx3.*n_x3;
H0 = G0_dns_dx1.*n_x1+G0_dns_dx2.*n_x2+G0_dns_dx3.*n_x3;
end
%% 
function [G,E] = GE(k,r,x1,x2,x3,s1,s2,s3,n_s1,n_s2,n_s3)
i = sqrt(-1);
G = exp(i*k*r)./(4*pi.*r);
G_ds1 = -exp(i*k*r).*(x1-s1).*(i*k*r-1)./(4*pi.*r.^3);
G_ds2 = -exp(i*k*r).*(x2-s2).*(i*k*r-1)./(4*pi.*r.^3);
G_ds3 = -exp(i*k*r).*(x3-s3).*(i*k*r-1)./(4*pi.*r.^3);
E = G_ds1.*n_s1+G_ds2.*n_s2+G_ds3.*n_s3;   %G_ns
end
%%  
function [G0,E0] = GE0(r,x1,x2,x3,s1,s2,s3,n_s1,n_s2,n_s3)
G0 =1./(4*pi*r);
G0_ds1 = 1/(4*pi)*(x1-s1)./r.^3;
G0_ds2 = 1/(4*pi)*(x2-s2)./r.^3;
G0_ds3 = 1/(4*pi)*(x3-s3)./r.^3;
E0 = G0_ds1.*n_s1+G0_ds2.*n_s2+G0_ds3.*n_s3;  %G0_ns
end
%%
function [G,F,E,H] = GFEH(k,r,x1,x2,x3,s1,s2,s3,n_x1,n_x2,n_x3,n_s1,n_s2,n_s3)
i = sqrt(-1);
G_ds1 = -exp(i*k*r).*(x1-s1).*(i*k*r-1)./(4*pi.*r.^3);
G_ds2 = -exp(i*k*r).*(x2-s2).*(i*k*r-1)./(4*pi.*r.^3);
G_ds3 = -exp(i*k*r).*(x3-s3).*(i*k*r-1)./(4*pi.*r.^3);
G_dx1 = -G_ds1;  
G_dx2 = -G_ds2;   
G_dx3 = -G_ds3;   
G_ds1_dx1 = -exp(i*k*r)./(4*pi.*r.^5).*((i*k*r-1).*((i*k*r-3).*(x1-s1).^2+r.^2)+i*k*r.*(x1-s1).^2);
G_ds2_dx2 = -exp(i*k*r)./(4*pi.*r.^5).*((i*k*r-1).*((i*k*r-3).*(x2-s2).^2+r.^2)+i*k*r.*(x2-s2).^2);
G_ds3_dx3 = -exp(i*k*r)./(4*pi.*r.^5).*((i*k*r-1).*((i*k*r-3).*(x3-s3).^2+r.^2)+i*k*r.*(x3-s3).^2);
G_ds2_dx1 = -exp(i*k*r).*(x1-s1).*(x2-s2)./(4*pi.*r.^5).*((i*k*r-1).*(i*k*r-3)+i*k*r);
G_ds1_dx2 = G_ds2_dx1;
G_ds3_dx1 = -exp(i*k*r).*(x1-s1).*(x3-s3)./(4*pi.*r.^5).*((i*k*r-1).*(i*k*r-3)+i*k*r);
G_ds1_dx3 = G_ds3_dx1;
G_ds2_dx3 = -exp(i*k*r).*(x2-s2).*(x3-s3)./(4*pi.*r.^5).*((i*k*r-1).*(i*k*r-3)+i*k*r);
G_ds3_dx2 = G_ds2_dx3;
G_dns_dx1 = G_ds1_dx1.*n_s1 + G_ds2_dx1.*n_s2 + G_ds3_dx1.*n_s3;
G_dns_dx2 = G_ds1_dx2.*n_s1 + G_ds2_dx2.*n_s2 + G_ds3_dx2.*n_s3;
G_dns_dx3 = G_ds1_dx3.*n_s1 + G_ds2_dx3.*n_s2 + G_ds3_dx3.*n_s3;
G = exp(i*k*r)./(4*pi.*r);
F = G_dx1.*n_x1+G_dx2.*n_x2+G_dx3.*n_x3;
E = G_ds1.*n_s1+G_ds2.*n_s2+G_ds3.*n_s3;
H = G_dns_dx1.*n_x1+G_dns_dx2.*n_x2+G_dns_dx3.*n_x3;
end
%%  
function [G_dk,F_dk,E_dk,H_dk] = GFEHk(k,r,x1,x2,x3,s1,s2,s3,n_x1,n_x2,n_x3,n_s1,n_s2,n_s3)
i = sqrt(-1);
G_dx1_dk = -k*(x1-s1).*exp(i*k*r)./(4*pi*r);
G_dx2_dk = -k*(x2-s2).*exp(i*k*r)./(4*pi*r);
G_dx3_dk = -k*(x3-s3).*exp(i*k*r)./(4*pi*r);
G_ds1_dk = -G_dx1_dk;  
G_ds2_dk = -G_dx2_dk;  
G_ds3_dk = -G_dx3_dk;  
G_ds1_dx1_dk = k.*exp(i*k*r)./(4*pi*r.^3).*((i*k*r-1).*(x1-s1).^2+r.^2);
G_ds2_dx2_dk = k.*exp(i*k*r)./(4*pi*r.^3).*((i*k*r-1).*(x2-s2).^2+r.^2);
G_ds3_dx3_dk = k.*exp(i*k*r)./(4*pi*r.^3).*((i*k*r-1).*(x3-s3).^2+r.^2);
G_ds1_dx2_dk = k.*exp(i*k*r)./(4*pi*r.^3).*(i*k*r-1).*(x1-s1).*(x2-s2);
G_ds1_dx3_dk = k.*exp(i*k*r)./(4*pi*r.^3).*(i*k*r-1).*(x1-s1).*(x3-s3);
G_ds2_dx3_dk = k.*exp(i*k*r)./(4*pi*r.^3).*(i*k*r-1).*(x2-s2).*(x3-s3);
G_ds2_dx1_dk = G_ds1_dx2_dk;
G_ds3_dx1_dk = G_ds1_dx3_dk;
G_ds3_dx2_dk = G_ds2_dx3_dk;
G_dns_dx1_dk = G_ds1_dx1_dk.*n_s1+G_ds2_dx1_dk.*n_s2+G_ds3_dx1_dk.*n_s3;
G_dns_dx2_dk = G_ds1_dx2_dk.*n_s1+G_ds2_dx2_dk.*n_s2+G_ds3_dx2_dk.*n_s3;
G_dns_dx3_dk = G_ds1_dx3_dk.*n_s1+G_ds2_dx3_dk.*n_s2+G_ds3_dx3_dk.*n_s3;
G_dk = i*r.*exp(i*k*r)./(4*pi*r);
F_dk = G_dx1_dk.*n_x1+G_dx2_dk.*n_x2+G_dx3_dk.*n_x3;
E_dk = G_ds1_dk.*n_s1+G_ds2_dk.*n_s2+G_ds3_dk.*n_s3;
H_dk = G_dns_dx1_dk.*n_x1+G_dns_dx2_dk.*n_x2+G_dns_dx3_dk.*n_x3;
end
%%  
function [rn, vn]=countnext(r,v,G)     
num=size(r,1);
dd=zeros(3,num,num); 
dd(1, :, :) = r(:, 1) - r(:, 1)';
dd(2, :, :) = r(:, 2) - r(:, 2)';
dd(3, :, :) = r(:, 3) - r(:, 3)';
L=sqrt(sum(dd.^2,1));     
L(L < G) = G;              
F=sum(dd./repmat(L.^3,[3 1 1]),3)';    
Fr=r.*repmat(dot(F,r,2),[1 3]);              
Fv=F-Fr; 
rn=r+v;  
rn=rn./repmat(sqrt(sum(rn.^2,2)),[1 3]);
vn=v+G*Fv;   
end
%%  
function [rn] = Creat_Sources(N)
a = linspace(0, 2*pi, N+1); a = a(1:N)';
b = linspace(-1, 1, N+1); b = b(1:N)';
b=asin(b);
r0=[cos(a).*cos(b), sin(a).*cos(b), sin(b)];
v0=zeros(size(r0));
G=1e-2;      
for ii=1:600      
    [rn,vn]=countnext(r0,v0,G);
    r0=rn; v0=vn;
end
end

🎉3 参考文献

部分理论来源于网络,如有侵权请联系删除。


[1]Suifu Cheng (2022) Singular boundary method for 2D and 3D acoustic design sensitivity analysis.


[2]张汝毅,王发杰,程隋福,刘建政.振动体声学灵敏度分析的Burton-Miller奇异边界法及其MATLAB工具箱开发[J].计算机辅助工程,2022,31(04):1-6.DOI:10.13340/j.cae.2022.04.001.


🌈4 Matlab代码实现


相关文章
|
2月前
|
算法 图形学
三维球体空间中光线反射模拟与三维点云提取matlab仿真
本项目使用MATLAB2022A模拟三维椭球体内光线反射并提取三维点云。通过设置椭球模型作为墙壁,根据几何光学原理计算光线在曲面上的反射路径,记录每次反射点坐标,生成三维点云图。核心代码实现多次反射的循环计算与绘图,并展示反射点的位置变化及其平滑处理结果。最终,通过光线追踪技术模拟真实场景中的光线行为,生成精确的三维点云数据,适用于计算机图形学和光学仿真领域。
132 27
|
1月前
|
算法 人机交互 数据安全/隐私保护
基于图像形态学处理和凸包分析法的指尖检测matlab仿真
本项目基于Matlab2022a实现手势识别中的指尖检测算法。测试样本展示无水印运行效果,完整代码含中文注释及操作视频。算法通过图像形态学处理和凸包检测(如Graham扫描法)来确定指尖位置,但对背景复杂度敏感,需调整参数PARA1和PARA2以优化不同手型的检测精度。
空心电抗器的matlab建模与性能仿真分析
空心电抗器是一种无铁芯的电感元件,通过多层并联导线绕制而成。其主要作用是限制电流、滤波、吸收谐波和提高功率因数。电抗器的损耗包括涡流损耗、电阻损耗和环流损耗。涡流损耗由交变磁场引起,电阻损耗与电抗器半径有关,环流损耗与各层电流相关。系统仿真使用MATLAB2022a进行。
|
2月前
|
编解码 算法 数据安全/隐私保护
基于BP译码的LDPC误码率matlab仿真,分析不同码长,码率,迭代次数以及信道类型对译码性能的影响
本内容介绍基于MATLAB 2022a的低密度奇偶校验码(LDPC)仿真,展示了完整的无水印仿真结果。LDPC是一种逼近香农限的信道编码技术,广泛应用于现代通信系统。BP译码算法通过Tanner图上的消息传递实现高效译码。仿真程序涵盖了不同Eb/N0下的误码率计算,并分析了码长、码率、迭代次数和信道类型对译码性能的影响。核心代码实现了LDPC编码、BPSK调制、高斯信道传输及BP译码过程,最终绘制误码率曲线并保存数据。 字符数:239
82 5
|
2月前
|
算法 数据安全/隐私保护
数字通信中不同信道类型对通信系统性能影响matlab仿真分析,对比AWGN,BEC,BSC以及多径信道
本项目展示了数字通信系统中几种典型信道模型(AWGN、BEC、BSC及多径信道)的算法实现与分析。使用Matlab2022a开发,提供无水印运行效果预览图、部分核心代码及完整版带中文注释的源码和操作视频。通过数学公式深入解析各信道特性及其对系统性能的影响。
|
4月前
|
存储 数据可视化 数据挖掘
使用Matlab绘制简单的二维与三维图形
【10月更文挑战第3天】本文详细介绍了如何在 Matlab 中绘制简单的二维和三维图形,包括曲线图、柱状图、散点图、网格图、表面图、等高线图、多边形填充图、切片图及矢量场等。文章提供了丰富的代码示例,如使用 `plot`、`bar`、`scatter`、`plot3`、`mesh`、`surf`、`contour` 等函数绘制不同类型图形的方法,并介绍了 `rotate3d`、`comet3` 和 `movie` 等工具实现图形的交互和动画效果。通过这些示例,读者可以轻松掌握 Matlab 的绘图技巧,并应用于数据可视化和分析中。
182 6
|
4月前
|
编解码 算法 数据安全/隐私保护
基于BP译码的LDPC误码率matlab仿真,分析码长,码率,信道对译码性能的影响,对比卷积码,turbo码以及BCH码
本程序系统基于BP译码的LDPC误码率MATLAB仿真,分析不同码长、码率、信道对译码性能的影响,并与卷积码、Turbo码及BCH编译码进行对比。升级版增加了更多码长、码率和信道的测试,展示了LDPC码的优越性能。LDPC码由Gallager在1963年提出,具有低复杂度、可并行译码等优点,近年来成为信道编码研究的热点。程序在MATLAB 2022a上运行,仿真结果无水印。
77 0
|
5月前
|
算法 数据可视化
基于SSA奇异谱分析算法的时间序列趋势线提取matlab仿真
奇异谱分析(SSA)是一种基于奇异值分解(SVD)和轨迹矩阵的非线性、非参数时间序列分析方法,适用于提取趋势、周期性和噪声成分。本项目使用MATLAB 2022a版本实现从强干扰序列中提取趋势线,并通过可视化展示了原时间序列与提取的趋势分量。代码实现了滑动窗口下的奇异值分解和分组重构,适用于非线性和非平稳时间序列分析。此方法在气候变化、金融市场和生物医学信号处理等领域有广泛应用。
319 19
|
5月前
|
算法 数据挖掘 vr&ar
基于ESTAR指数平滑转换自回归模型的CPI数据统计分析matlab仿真
该程序基于ESTAR指数平滑转换自回归模型,对CPI数据进行统计分析与MATLAB仿真,主要利用M-ESTAR模型计算WNL值、P值、Q值及12阶ARCH值。ESTAR模型结合指数平滑与状态转换自回归,适用于处理经济数据中的非线性趋势变化。在MATLAB 2022a版本中运行并通过ADF检验验证模型的平稳性,适用于复杂的高阶自回归模型。
|
6月前
|
算法
蜂窝网络下行链路的覆盖率和速率性能matlab仿真分析
此程序在MATLAB2022a环境下运行,基于随机几何模型评估蜂窝网络的下行链路覆盖率和速率性能。通过模拟不同场景下的基站(BS)配置与噪声情况,计算并绘制了各种条件下的信号干扰加噪声比(SINR)阈值与覆盖率概率的关系图。结果显示,在考虑噪声和不同基站分布模型时,覆盖率有显著差异,提出的随机模型相较于传统网格模型更为保守但也更加贴合实际基站的分布情况。