第七十九篇:电磁场不确定性量化与可靠性分析
摘要
电磁场不确定性量化与可靠性分析是评估电磁器件在不确定因素影响下性能波动和失效风险的重要方法。本主题系统介绍不确定性量化的基本理论、概率统计方法、不确定性传播技术以及可靠性评估方法。重点阐述蒙特卡洛模拟、多项式混沌展开、随机配点法等不确定性传播方法,探讨电磁场仿真中材料参数、几何尺寸、边界条件等不确定性来源的建模方法。通过Python实现微波器件、天线系统、电磁兼容等典型应用的不确定性量化和可靠性分析,展示从输入不确定性到输出响应统计特性的完整传播过程,为电磁器件的稳健设计和风险评估提供理论指导和工程实践方法。
关键词
不确定性量化,可靠性分析,蒙特卡洛模拟,多项式混沌展开,随机配点法,敏感性分析,失效概率,稳健设计










1. 不确定性量化基础理论
1.1 不确定性来源与分类
电磁场仿真中的不确定性来源:
材料参数不确定性:
- 介电常数 ε\\varepsilonε 的制造公差
- 磁导率 μ\\muμ 的频率依赖性
- 电导率 σ\\sigmaσ 的温度敏感性
几何尺寸不确定性:
- 加工精度限制导致的尺寸偏差
- 装配误差引起的间隙变化
- 热膨胀导致的形变
边界条件不确定性:
- 端口阻抗的容差
- 激励源的幅度和相位波动
- 环境电磁干扰
模型不确定性:
- 数值模型的近似误差
- 物理模型的简化假设
- 网格离散化误差
不确定性分类:
不确定性={偶然不确定性(Aleatory)固有的随机性认知不确定性(Epistemic)知识缺乏导致的\\text{不确定性} = \\begin{cases}
\\text{偶然不确定性(Aleatory)} & \\text{固有的随机性} \\\\
\\text{认知不确定性(Epistemic)} & \\text{知识缺乏导致的}
\\end{cases}不确定性={偶然不确定性(Aleatory)认知不确定性(Epistemic)固有的随机性知识缺乏导致的
1.2 概率建模基础
随机变量表示:
电磁参数表示为随机变量:
ε(ξ)=εˉ+σεξ\\varepsilon(\\xi) = \\bar{\\varepsilon} + \\sigma_\\varepsilon \\xiε(ξ)=εˉ+σεξ
其中 ξ\\xiξ 为标准随机变量,εˉ\\bar{\\varepsilon}εˉ 为均值,σε\\sigma_\\varepsilonσε 为标准差。
常用概率分布:
正态分布:
f(x)=12πσexp(−(x−μ)22σ2)f(x) = \\frac{1}{\\sqrt{2\\pi}\\sigma} \\exp\\left(-\\frac{(x-\\mu)^2}{2\\sigma^2}\\right)f(x)=2πσ1exp(−2σ2(x−μ)2)
均匀分布:
f(x)={1b−aa≤x≤b0otherwisef(x) = \\begin{cases} \\frac{1}{b-a} & a \\leq x \\leq b \\\\ 0 & \\text{otherwise} \\end{cases}f(x)={b−a10a≤x≤botherwise
对数正态分布:
f(x)=1xσ2πexp(−(lnx−μ)22σ2)f(x) = \\frac{1}{x\\sigma\\sqrt{2\\pi}} \\exp\\left(-\\frac{(\\ln x – \\mu)^2}{2\\sigma^2}\\right)f(x)=xσ2π1exp(−2σ2(lnx−μ)2)
威布尔分布:
f(x)=kλ(xλ)k−1exp(−(xλ)k)f(x) = \\frac{k}{\\lambda}\\left(\\frac{x}{\\lambda}\\right)^{k-1} \\exp\\left(-\\left(\\frac{x}{\\lambda}\\right)^k\\right)f(x)=λk(λx)k−1exp(−(λx)k)
1.3 不确定性传播问题
数学描述:
给定输入随机向量 X=(X1,X2,…,Xn)\\mathbf{X} = (X_1, X_2, …, X_n)X=(X1,X2,…,Xn),输出响应:
Y=f(X)Y = f(\\mathbf{X})Y=f(X)
不确定性传播的目标是确定输出 YYY 的统计特性:
- 均值 μY=E[Y]\\mu_Y = E[Y]μY=E[Y]
- 方差 σY2=E[(Y−μY)2]\\sigma_Y^2 = E[(Y – \\mu_Y)^2]σY2=E[(Y−μY)2]
- 概率密度函数 fY(y)f_Y(y)fY(y)
- 累积分布函数 FY(y)F_Y(y)FY(y)
2. 蒙特卡洛模拟方法
2.1 基本蒙特卡洛方法
算法流程:
μ^Y=1N∑i=1NY(i)\\hat{\\mu}_Y = \\frac{1}{N} \\sum_{i=1}^{N} Y^{(i)}μ^Y=N1i=1∑NY(i)
σ^Y2=1N−1∑i=1N(Y(i)−μ^Y)2\\hat{\\sigma}_Y^2 = \\frac{1}{N-1} \\sum_{i=1}^{N} (Y^{(i)} – \\hat{\\mu}_Y)^2σ^Y2=N−11i=1∑N(Y(i)−μ^Y)2
收敛性分析:
蒙特卡洛估计的误差:
RMSE=σYN\\text{RMSE} = \\frac{\\sigma_Y}{\\sqrt{N}}RMSE=NσY
误差以 O(N−1/2)O(N^{-1/2})O(N−1/2) 的速度收敛,与维度无关。
2.2 方差缩减技术
重要性采样:
E[Y]=∫f(x)fX(x)g(x)g(x)dxE[Y] = \\int f(\\mathbf{x}) \\frac{f_\\mathbf{X}(\\mathbf{x})}{g(\\mathbf{x})} g(\\mathbf{x}) d\\mathbf{x}E[Y]=∫f(x)g(x)fX(x)g(x)dx
其中 g(x)g(\\mathbf{x})g(x) 为重要性密度函数。
拉丁超立方采样(LHS):
将每个维度分成 NNN 个等概率区间,在每个区间中随机采样一个点,保证样本的均匀分布。
拟蒙特卡洛方法:
使用低差异序列(如Sobol序列)代替伪随机数:
DN∗=O((logN)dN)D_N^* = O\\left(\\frac{(\\log N)^d}{N}\\right)DN∗=O(N(logN)d)
2.3 分层采样
分层蒙特卡洛:
将样本空间划分为 KKK 层,每层独立采样:
μ^Y=∑k=1Kwkμ^k\\hat{\\mu}_Y = \\sum_{k=1}^{K} w_k \\hat{\\mu}_kμ^Y=k=1∑Kwkμ^k
其中 wkw_kwk 为第 kkk 层的权重。
3. 谱不确定性量化方法
3.1 多项式混沌展开(PCE)
基本理论:
将随机输出展开为随机变量的多项式级数:
Y(ξ)=∑α∈AyαΨα(ξ)Y(\\xi) = \\sum_{\\alpha \\in \\mathcal{A}} y_\\alpha \\Psi_\\alpha(\\xi)Y(ξ)=α∈A∑yαΨα(ξ)
其中 Ψα(ξ)\\Psi_\\alpha(\\xi)Ψα(ξ) 为正交多项式,α\\alphaα 为多指标。
正交多项式选择:
| 正态分布 | Hermite | e−ξ2/2e^{-\\xi^2/2}e−ξ2/2 |
| 均匀分布 | Legendre | 1 |
| Gamma分布 | Laguerre | e−ξe^{-\\xi}e−ξ |
| Beta分布 | Jacobi | (1−ξ)α(1+ξ)β(1-\\xi)^\\alpha(1+\\xi)^\\beta(1−ξ)α(1+ξ)β |
统计矩计算:
均值:μY=y0\\mu_Y = y_0μY=y0
方差:σY2=∑α≠0yα2⟨Ψα2⟩\\sigma_Y^2 = \\sum_{\\alpha \\neq 0} y_\\alpha^2 \\langle \\Psi_\\alpha^2 \\rangleσY2=∑α=0yα2⟨Ψα2⟩
3.2 随机配点法
基本思想:
在精心选择的配点上求解确定性问题,通过插值获得统计特性。
配点选择:
- 张量积配点:ξi⊗ξj\\xi_i \\otimes \\xi_jξi⊗ξj
- 稀疏网格配点:Smolyak算法
- 高斯积分点:与正交多项式对应
插值方法:
Y(ξ)≈∑i=1NY(ξ(i))Li(ξ)Y(\\xi) \\approx \\sum_{i=1}^{N} Y(\\xi^{(i)}) L_i(\\xi)Y(ξ)≈i=1∑NY(ξ(i))Li(ξ)
其中 Li(ξ)L_i(\\xi)Li(ξ) 为Lagrange插值基函数。
3.3 降维技术
主成分分析(PCA):
X=μ+Wξ\\mathbf{X} = \\boldsymbol{\\mu} + \\mathbf{W} \\boldsymbol{\\xi}X=μ+Wξ
其中 W\\mathbf{W}W 为特征向量矩阵,ξ\\boldsymbol{\\xi}ξ 为降维后的随机变量。
Karhunen-Loève展开:
对于随机场:
X(r,ω)=Xˉ(r)+∑i=1∞λiϕi(r)ξi(ω)X(\\mathbf{r}, \\omega) = \\bar{X}(\\mathbf{r}) + \\sum_{i=1}^{\\infty} \\sqrt{\\lambda_i} \\phi_i(\\mathbf{r}) \\xi_i(\\omega)X(r,ω)=Xˉ(r)+i=1∑∞λiϕi(r)ξi(ω)
4. 敏感性分析方法
4.1 局部敏感性分析
偏导数法:
Si=∂Y∂Xi∣X=μS_i = \\frac{\\partial Y}{\\partial X_i}\\bigg|_{\\mathbf{X}=\\boldsymbol{\\mu}}Si=∂Xi∂YX=μ
标准化敏感性:
Sinorm=σXiσY∂Y∂XiS_i^{\\text{norm}} = \\frac{\\sigma_{X_i}}{\\sigma_Y} \\frac{\\partial Y}{\\partial X_i}Sinorm=σYσXi∂Xi∂Y
4.2 全局敏感性分析
Sobol指数:
一阶Sobol指数:
Si=VXi(EX∼i[Y∣Xi])V(Y)S_i = \\frac{V_{X_i}(E_{\\mathbf{X}_{\\sim i}}[Y|X_i])}{V(Y)}Si=V(Y)VXi(EX∼i[Y∣Xi])
总效应指数:
SiT=EX∼i[VXi(Y∣X∼i)]V(Y)S_i^T = \\frac{E_{\\mathbf{X}_{\\sim i}}[V_{X_i}(Y|\\mathbf{X}_{\\sim i})]}{V(Y)}SiT=V(Y)EX∼i[VXi(Y∣X∼i)]
Morris筛选法:
通过计算基本效应的统计量识别重要参数:
EEi=Y(x1,…,xi+Δ,…,xn)−Y(x)ΔEE_i = \\frac{Y(x_1, …, x_i + \\Delta, …, x_n) – Y(\\mathbf{x})}{\\Delta}EEi=ΔY(x1,…,xi+Δ,…,xn)−Y(x)
4.3 基于PCE的敏感性分析
主敏感性指数:
Si=∑α∈Aiyα2⟨Ψα2⟩σY2S_i = \\frac{\\sum_{\\alpha \\in \\mathcal{A}_i} y_\\alpha^2 \\langle \\Psi_\\alpha^2 \\rangle}{\\sigma_Y^2}Si=σY2∑α∈Aiyα2⟨Ψα2⟩
其中 Ai\\mathcal{A}_iAi 为仅依赖于 XiX_iXi 的多指标集合。
5. 可靠性分析方法
5.1 失效概率计算
定义:
失效概率:
Pf=P(g(X)≤0)=∫g(x)≤0fX(x)dxP_f = P(g(\\mathbf{X}) \\leq 0) = \\int_{g(\\mathbf{x}) \\leq 0} f_\\mathbf{X}(\\mathbf{x}) d\\mathbf{x}Pf=P(g(X)≤0)=∫g(x)≤0fX(x)dx
其中 g(X)g(\\mathbf{X})g(X) 为极限状态函数。
蒙特卡洛估计:
P^f=1N∑i=1NI(g(X(i))≤0)\\hat{P}_f = \\frac{1}{N} \\sum_{i=1}^{N} I(g(\\mathbf{X}^{(i)}) \\leq 0)P^f=N1i=1∑NI(g(X(i))≤0)
其中 I(⋅)I(\\cdot)I(⋅) 为指示函数。
5.2 一阶可靠性方法(FORM)
基本思想:
将随机变量变换到标准正态空间,寻找设计点(最可能失效点)。
Hasofer-Lind可靠性指标:
β=ming(u)=0∥u∥\\beta = \\min_{g(\\mathbf{u})=0} \\|\\mathbf{u}\\|β=g(u)=0min∥u∥
失效概率近似:
Pf≈Φ(−β)P_f \\approx \\Phi(-\\beta)Pf≈Φ(−β)
迭代算法:
5.3 二阶可靠性方法(SORM)
曲率修正:
Pf≈Φ(−β)∏i=1n−1(1+βκi)−1/2P_f \\approx \\Phi(-\\beta) \\prod_{i=1}^{n-1} (1 + \\beta \\kappa_i)^{-1/2}Pf≈Φ(−β)i=1∏n−1(1+βκi)−1/2
其中 κi\\kappa_iκi 为极限状态函数在设计点处的主曲率。
5.4 重要性抽样可靠性分析
最优重要性密度:
g∗(x)=I(g(x)≤0)fX(x)Pfg^*(\\mathbf{x}) = \\frac{I(g(\\mathbf{x}) \\leq 0) f_\\mathbf{X}(\\mathbf{x})}{P_f}g∗(x)=PfI(g(x)≤0)fX(x)
设计点中心法:
以FORM找到的设计点为中心构建重要性密度。
6. 稳健设计优化
6.1 稳健性指标
信噪比:
SN=10log10(μY2σY2)SN = 10 \\log_{10}\\left(\\frac{\\mu_Y^2}{\\sigma_Y^2}\\right)SN=10log10(σY2μY2)
性能指数:
PI=μY−TσYPI = \\frac{\\mu_Y – T}{\\sigma_Y}PI=σYμY−T
其中 TTT 为目标值。
6.2 双响应面法
均值和方差模型:
μ^Y=fμ(x)\\hat{\\mu}_Y = f_\\mu(\\mathbf{x})μ^Y=fμ(x)
σ^Y=fσ(x)\\hat{\\sigma}_Y = f_\\sigma(\\mathbf{x})σ^Y=fσ(x)
优化问题:
minxσ^Ys.t.μ^Y=T\\min_{\\mathbf{x}} \\hat{\\sigma}_Y \\quad \\text{s.t.} \\quad \\hat{\\mu}_Y = Txminσ^Ys.t.μ^Y=T
6.3 基于可靠性的设计优化(RBDO)
数学模型:
mindC(d)\\min_{\\mathbf{d}} C(\\mathbf{d})dminC(d)
s.t.P(gi(X)≤0)≤Pf,itarget,i=1,…,m\\text{s.t.} \\quad P(g_i(\\mathbf{X}) \\leq 0) \\leq P_{f,i}^{target}, \\quad i = 1, …, ms.t.P(gi(X)≤0)≤Pf,itarget,i=1,…,m
可靠性约束处理:
- 性能度量法(PMA)
- 可靠性指标法(RIA)
- 顺序优化与可靠性评估(SORA)
7. 工程应用
7.1 微波器件容差分析
应用场景:
- 滤波器频率响应的容差分析
- 功分器功率分配的波动评估
- 耦合器隔离度的可靠性验证
7.2 天线性能稳健性
应用场景:
- 天线增益的制造敏感性
- 辐射方向图的稳定性
- 阻抗带宽的可靠性
7.3 电磁兼容可靠性
应用场景:
- 屏蔽效能的置信区间
- 辐射发射的合规概率
- 敏感度阈值的不确定性
8. 案例研究
8.1 案例1:微带滤波器容差分析(含GIF动画)
分析基板介电常数和线宽公差对滤波器S参数的影响。
8.2 案例2:天线阵列方向图不确定性(含GIF动画)
评估阵元位置误差和激励相位误差对方向图的影响。
8.3 案例3:多项式混沌展开应用
使用PCE方法高效计算微波器件的统计特性。
8.4 案例4:可靠性分析与失效概率计算(含GIF动画)
计算电磁器件的失效概率和可靠性指标。
8.5 案例5:全局敏感性分析
使用Sobol指数识别影响电磁性能的关键参数。
8.6 案例6:稳健设计优化(含GIF动画)
优化设计参数以最小化性能波动。
9. 结果分析与讨论
9.1 方法对比
- 蒙特卡洛 vs PCE vs 随机配点法
- 计算效率与精度的权衡
- 不同维度问题的适用性
9.2 参数影响分析
- 样本数量对收敛性的影响
- 多项式阶数对PCE精度的影响
- 稀疏网格水平对计算成本的影响
9.3 工程实践建议
- 不确定性建模的最佳实践
- 计算资源与精度要求的平衡
- 验证与确认方法
10. 扩展应用
10.1 多物理场不确定性量化
考虑电磁-热-结构耦合的不确定性传播。
10.2 时域不确定性分析
瞬态电磁场问题的随机分析。
10.3 深度学习辅助UQ
使用神经网络替代传统仿真加速不确定性量化。
11. 总结与展望
本主题系统介绍了电磁场不确定性量化与可靠性分析的理论基础和方法体系:
核心理论:
- 不确定性来源识别与概率建模
- 蒙特卡洛模拟及其方差缩减技术
- 谱方法(PCE、随机配点法)
- 敏感性分析方法
可靠性方法:
- FORM/SORM方法
- 重要性抽样技术
- 基于可靠性的设计优化
工程应用:
- 微波器件、天线、电磁兼容
- 容差分析、稳健设计、风险评估
未来发展方向:
不确定性量化与可靠性分析为电磁器件的稳健设计和风险评估提供了科学方法,能够有效降低设计风险,提高产品可靠性。
参考文献
R. G. Ghanem, P. D. Spanos. Stochastic Finite Elements: A Spectral Approach. Dover, 2003.
D. Xiu. Numerical Methods for Stochastic Computations: A Spectral Method Approach. Princeton University Press, 2010.
T. J. Sullivan. Introduction to Uncertainty Quantification. Springer, 2015.
A. Der Kiureghian. First- and second-order reliability methods. Engineering Safety, 2000.
I. M. Sobol. Global sensitivity indices for nonlinear mathematical models. Mathematical Modeling and Computational Experiment, 1993.
B. Sudret. Global sensitivity analysis using polynomial chaos expansions. Reliability Engineering & System Safety, 2008.
S. K. Au, J. L. Beck. Estimation of small failure probabilities in high dimensions by subset simulation. Probabilistic Engineering Mechanics, 2001.
康顺, 等. 不确定性量化方法及其应用. 科学出版社, 2018.
附录:Python代码清单
# -*- coding: utf-8 -*-
"""
主题079:电磁场不确定性量化与可靠性分析仿真
包含6个案例:
1. 微带滤波器容差分析(含GIF动画)
2. 天线阵列方向图不确定性(含GIF动画)
3. 多项式混沌展开应用
4. 可靠性分析与失效概率计算(含GIF动画)
5. 全局敏感性分析
6. 稳健设计优化(含GIF动画)
"""
import matplotlib
matplotlib.use('Agg')
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation, PillowWriter
from matplotlib.patches import Rectangle, Circle, FancyBboxPatch
from scipy import stats, optimize
from scipy.special import erf, erfc
import warnings
warnings.filterwarnings('ignore')
import os
# 创建输出目录
output_dir = r'd:\\文档\\500仿真领域\\工程仿真\\电磁场耦合仿真\\主题079_电磁场不确定性量化与可靠性分析'
os.makedirs(output_dir, exist_ok=True)
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei', 'DejaVu Sans']
plt.rcParams['axes.unicode_minus'] = False
print("=" * 70)
print("主题079:电磁场不确定性量化与可靠性分析仿真")
print("=" * 70)
print("\\n开始运行不确定性量化与可靠性分析仿真案例…")
print("=" * 70)
# =============================================================================
# 案例1:微带滤波器容差分析(含GIF动画)
# =============================================================================
def case1_filter_tolerance():
"""案例1:微带滤波器容差分析"""
print("\\n案例1:微带滤波器容差分析")
print("-" * 60)
# 滤波器参数
f0 = 2.4e9 # 中心频率2.4GHz
BW = 0.1 # 相对带宽10%
# 不确定性参数
# 基板介电常数:标称值4.4,标准差0.1
eps_mean = 4.4
eps_std = 0.1
# 线宽:标称值1.0mm,标准差0.05mm
w_mean = 1.0
w_std = 0.05
# 线长:标称值30mm,标准差0.5mm
l_mean = 30.0
l_std = 0.5
# 蒙特卡洛采样
n_samples = 1000
np.random.seed(42)
eps_samples = np.random.normal(eps_mean, eps_std, n_samples)
w_samples = np.random.normal(w_mean, w_std, n_samples)
l_samples = np.random.normal(l_mean, l_std, n_samples)
print(f" 执行蒙特卡洛模拟 (N={n_samples})…")
# 计算S11参数(简化模型)
# S11与频率、介电常数、线宽、线长相关
freq = np.linspace(2.2e9, 2.6e9, 100)
S11_samples = np.zeros((n_samples, len(freq)))
for i in range(n_samples):
# 简化的滤波器响应模型
# 有效介电常数
eps_eff = (eps_samples[i] + 1) / 2 + (eps_samples[i] – 1) / (2 * np.sqrt(1 + 12 * w_samples[i]))
# 谐振频率偏移
f_res = f0 * np.sqrt(eps_mean / eps_eff) * (l_mean / l_samples[i])
# S11响应(简化模型)
Q = 50 # 品质因数
for j, f in enumerate(freq):
detuning = (f – f_res) / (f_res / (2 * Q))
S11_samples[i, j] = –20 * np.log10(np.sqrt(1 + 1/(detuning**2 + 1e-10)))
# 统计分析
S11_mean = np.mean(S11_samples, axis=0)
S11_std = np.std(S11_samples, axis=0)
S11_p5 = np.percentile(S11_samples, 5, axis=0)
S11_p95 = np.percentile(S11_samples, 95, axis=0)
# 创建可视化
fig = plt.figure(figsize=(16, 12))
# S11响应及置信区间
ax1 = fig.add_subplot(2, 3, 1)
ax1.fill_between(freq/1e9, S11_p5, S11_p95, alpha=0.3, color='blue', label='90% Confidence')
ax1.plot(freq/1e9, S11_mean, 'b-', linewidth=2, label='Mean')
for i in range(min(50, n_samples)):
ax1.plot(freq/1e9, S11_samples[i], 'gray', alpha=0.1, linewidth=0.5)
ax1.set_xlabel('Frequency (GHz)', fontsize=10)
ax1.set_ylabel('S11 (dB)', fontsize=10)
ax1.set_title('Filter Response with Tolerance', fontsize=11, fontweight='bold')
ax1.legend()
ax1.grid(True, alpha=0.3)
ax1.set_ylim(–40, 0)
# 中心频率分布
ax2 = fig.add_subplot(2, 3, 2)
f_center_samples = freq[np.argmin(S11_samples, axis=1)]
ax2.hist(f_center_samples/1e9, bins=30, color='steelblue', edgecolor='black', alpha=0.7)
ax2.axvline(f0/1e9, color='red', linestyle='–', linewidth=2, label=f'Target: {f0/1e9:.2f} GHz')
ax2.axvline(np.mean(f_center_samples)/1e9, color='green', linestyle='–', linewidth=2,
label=f'Mean: {np.mean(f_center_samples)/1e9:.3f} GHz')
ax2.set_xlabel('Center Frequency (GHz)', fontsize=10)
ax2.set_ylabel('Frequency', fontsize=10)
ax2.set_title('Center Frequency Distribution', fontsize=11, fontweight='bold')
ax2.legend()
ax2.grid(True, alpha=0.3)
# 最小S11分布
ax3 = fig.add_subplot(2, 3, 3)
S11_min_samples = np.min(S11_samples, axis=1)
ax3.hist(S11_min_samples, bins=30, color='coral', edgecolor='black', alpha=0.7)
ax3.axvline(np.mean(S11_min_samples), color='red', linestyle='–', linewidth=2,
label=f'Mean: {np.mean(S11_min_samples):.2f} dB')
ax3.set_xlabel('Minimum S11 (dB)', fontsize=10)
ax3.set_ylabel('Frequency', fontsize=10)
ax3.set_title('Minimum S11 Distribution', fontsize=11, fontweight='bold')
ax3.legend()
ax3.grid(True, alpha=0.3)
# 参数相关性分析
ax4 = fig.add_subplot(2, 3, 4)
correlation_matrix = np.corrcoef([eps_samples, w_samples, l_samples, f_center_samples/1e9])
im = ax4.imshow(correlation_matrix, cmap='RdBu_r', vmin=–1, vmax=1)
ax4.set_xticks(range(4))
ax4.set_yticks(range(4))
ax4.set_xticklabels(['εr', 'Width', 'Length', 'f0'], fontsize=9)
ax4.set_yticklabels(['εr', 'Width', 'Length', 'f0'], fontsize=9)
for i in range(4):
for j in range(4):
ax4.text(j, i, f'{correlation_matrix[i,j]:.2f}', ha='center', va='center', fontsize=9)
ax4.set_title('Parameter Correlation', fontsize=11, fontweight='bold')
plt.colorbar(im, ax=ax4)
# 带宽分布
ax5 = fig.add_subplot(2, 3, 5)
# 计算-10dB带宽
BW_samples = []
for i in range(n_samples):
idx = np.where(S11_samples[i] < –10)[0]
if len(idx) > 1:
BW_samples.append((freq[idx[–1]] – freq[idx[0]]) / 1e9)
else:
BW_samples.append(0)
BW_samples = np.array(BW_samples)
ax5.hist(BW_samples, bins=30, color='lightgreen', edgecolor='black', alpha=0.7)
ax5.axvline(np.mean(BW_samples), color='red', linestyle='–', linewidth=2,
label=f'Mean: {np.mean(BW_samples):.3f} GHz')
ax5.set_xlabel('Bandwidth (GHz)', fontsize=10)
ax5.set_ylabel('Frequency', fontsize=10)
ax5.set_title('-10dB Bandwidth Distribution', fontsize=11, fontweight='bold')
ax5.legend()
ax5.grid(True, alpha=0.3)
# 蒙特卡洛收敛分析
ax6 = fig.add_subplot(2, 3, 6)
sample_sizes = np.logspace(1, 3, 20).astype(int)
mean_convergence = []
std_convergence = []
for n in sample_sizes:
mean_convergence.append(np.mean(f_center_samples[:n])/1e9)
std_convergence.append(np.std(f_center_samples[:n])/1e9)
ax6.semilogx(sample_sizes, mean_convergence, 'b-o', markersize=4, label='Mean')
ax6.axhline(f0/1e9, color='r', linestyle='–', alpha=0.5, label='Target')
ax6.set_xlabel('Sample Size', fontsize=10)
ax6.set_ylabel('Center Frequency (GHz)', fontsize=10)
ax6.set_title('MC Convergence', fontsize=11, fontweight='bold')
ax6.legend()
ax6.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig(os.path.join(output_dir, 'case1_filter_tolerance.png'), dpi=150, bbox_inches='tight')
plt.close()
# 创建GIF动画
print(" 正在生成不确定性传播动画…")
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 6))
# 准备动画数据
n_frames = 20
sample_progression = np.logspace(1, np.log10(n_samples), n_frames).astype(int)
def init():
ax1.clear()
ax2.clear()
return []
def update(frame):
ax1.clear()
ax2.clear()
n_current = sample_progression[frame]
# 左图:累积S11响应
ax1.fill_between(freq/1e9, np.percentile(S11_samples[:n_current], 5, axis=0),
np.percentile(S11_samples[:n_current], 95, axis=0),
alpha=0.3, color='blue', label='90% CI')
ax1.plot(freq/1e9, np.mean(S11_samples[:n_current], axis=0), 'b-', linewidth=2, label='Mean')
ax1.set_xlabel('Frequency (GHz)', fontsize=10)
ax1.set_ylabel('S11 (dB)', fontsize=10)
ax1.set_title(f'Filter Response (N={n_current})', fontsize=11, fontweight='bold')
ax1.legend()
ax1.grid(True, alpha=0.3)
ax1.set_ylim(–40, 0)
# 右图:中心频率分布演化
f_current = freq[np.argmin(S11_samples[:n_current], axis=1)]
ax2.hist(f_current/1e9, bins=20, color='steelblue', edgecolor='black', alpha=0.7)
ax2.axvline(f0/1e9, color='red', linestyle='–', linewidth=2, label='Target')
ax2.axvline(np.mean(f_current)/1e9, color='green', linestyle='–', linewidth=2, label='Current Mean')
ax2.set_xlabel('Center Frequency (GHz)', fontsize=10)
ax2.set_ylabel('Frequency', fontsize=10)
ax2.set_title(f'Distribution Evolution', fontsize=11, fontweight='bold')
ax2.legend()
ax2.grid(True, alpha=0.3)
return []
anim = FuncAnimation(fig, update, init_func=init, frames=n_frames,
interval=300, blit=False, repeat=True)
anim.save(os.path.join(output_dir, 'case1_uncertainty_propagation.gif'),
writer=PillowWriter(fps=3), dpi=100)
plt.close()
print(" ✓ 案例1完成:微带滤波器容差分析")
return True
# =============================================================================
# 案例2:天线阵列方向图不确定性(含GIF动画)
# =============================================================================
def case2_array_uncertainty():
"""案例2:天线阵列方向图不确定性"""
print("\\n案例2:天线阵列方向图不确定性")
print("-" * 60)
# 阵列参数
N = 8 # 阵元数
d = 0.5 # 阵元间距(波长)
# 不确定性参数
# 阵元位置误差:标准差0.02波长
pos_std = 0.02
# 激励相位误差:标准差5度
phase_std = 5 * np.pi / 180
# 激励幅度误差:标准差5%
amp_std = 0.05
# 蒙特卡洛采样
n_samples = 500
np.random.seed(42)
print(f" 分析{n_samples}个随机阵列配置…")
# 角度范围
theta = np.linspace(–90, 90, 361) * np.pi / 180
theta_deg = theta * 180 / np.pi
# 计算方向图
AF_samples = np.zeros((n_samples, len(theta)), dtype=complex)
for i in range(n_samples):
# 随机阵元位置
pos_error = np.random.normal(0, pos_std, N)
positions = np.arange(N) * d + pos_error
# 随机激励
amp_error = np.random.normal(1, amp_std, N)
phase_error = np.random.normal(0, phase_std, N)
I = amp_error * np.exp(1j * phase_error)
# 阵列因子
for j, th in enumerate(theta):
AF_samples[i, j] = np.sum(I * np.exp(1j * 2 * np.pi * positions * np.sin(th)))
# 归一化
AF_samples = np.abs(AF_samples)
AF_samples = AF_samples / np.max(AF_samples, axis=1, keepdims=True)
AF_dB = 20 * np.log10(AF_samples + 1e-10)
# 统计分析
AF_mean = np.mean(AF_dB, axis=0)
AF_std = np.std(AF_dB, axis=0)
AF_p5 = np.percentile(AF_dB, 5, axis=0)
AF_p95 = np.percentile(AF_dB, 95, axis=0)
# 创建可视化
fig = plt.figure(figsize=(16, 12))
# 方向图不确定性
ax1 = fig.add_subplot(2, 3, 1)
ax1.fill_between(theta_deg, AF_p5, AF_p95, alpha=0.3, color='blue', label='90% Confidence')
ax1.plot(theta_deg, AF_mean, 'b-', linewidth=2, label='Mean')
for i in range(min(30, n_samples)):
ax1.plot(theta_deg, AF_dB[i], 'gray', alpha=0.1, linewidth=0.5)
ax1.set_xlabel('Angle (deg)', fontsize=10)
ax1.set_ylabel('Array Factor (dB)', fontsize=10)
ax1.set_title('Array Pattern Uncertainty', fontsize=11, fontweight='bold')
ax1.legend()
ax1.grid(True, alpha=0.3)
ax1.set_ylim(–40, 5)
# 主瓣增益分布
ax2 = fig.add_subplot(2, 3, 2)
main_lobe_gain = np.max(AF_dB, axis=1)
ax2.hist(main_lobe_gain, bins=30, color='steelblue', edgecolor='black', alpha=0.7)
ax2.axvline(np.mean(main_lobe_gain), color='red', linestyle='–', linewidth=2,
label=f'Mean: {np.mean(main_lobe_gain):.2f} dB')
ax2.set_xlabel('Main Lobe Gain (dB)', fontsize=10)
ax2.set_ylabel('Frequency', fontsize=10)
ax2.set_title('Main Lobe Gain Distribution', fontsize=11, fontweight='bold')
ax2.legend()
ax2.grid(True, alpha=0.3)
# 旁瓣电平分布
ax3 = fig.add_subplot(2, 3, 3)
# 简化计算旁瓣电平
SLL_samples = []
for i in range(n_samples):
peaks = AF_dB[i, ::10] # 简化采样
sorted_peaks = np.sort(peaks)[::–1]
if len(sorted_peaks) > 1:
SLL_samples.append(sorted_peaks[1])
else:
SLL_samples.append(–20)
SLL_samples = np.array(SLL_samples)
ax3.hist(SLL_samples, bins=30, color='coral', edgecolor='black', alpha=0.7)
ax3.axvline(np.mean(SLL_samples), color='red', linestyle='–', linewidth=2,
label=f'Mean: {np.mean(SLL_samples):.2f} dB')
ax3.set_xlabel('Sidelobe Level (dB)', fontsize=10)
ax3.set_ylabel('Frequency', fontsize=10)
ax3.set_title('Sidelobe Level Distribution', fontsize=11, fontweight='bold')
ax3.legend()
ax3.grid(True, alpha=0.3)
# 波束宽度分布
ax4 = fig.add_subplot(2, 3, 4)
BW_samples = []
for i in range(n_samples):
idx_3dB = np.where(AF_dB[i] > np.max(AF_dB[i]) – 3)[0]
if len(idx_3dB) > 1:
BW_samples.append((idx_3dB[–1] – idx_3dB[0]) * 0.5)
else:
BW_samples.append(10)
BW_samples = np.array(BW_samples)
ax4.hist(BW_samples, bins=30, color='lightgreen', edgecolor='black', alpha=0.7)
ax4.axvline(np.mean(BW_samples), color='red', linestyle='–', linewidth=2,
label=f'Mean: {np.mean(BW_samples):.1f}°')
ax4.set_xlabel('3dB Beamwidth (deg)', fontsize=10)
ax4.set_ylabel('Frequency', fontsize=10)
ax4.set_title('Beamwidth Distribution', fontsize=11, fontweight='bold')
ax4.legend()
ax4.grid(True, alpha=0.3)
# 指向误差分布
ax5 = fig.add_subplot(2, 3, 5)
pointing_errors = []
for i in range(n_samples):
max_idx = np.argmax(AF_dB[i])
pointing_errors.append(theta_deg[max_idx])
pointing_errors = np.array(pointing_errors)
ax5.hist(pointing_errors, bins=30, color='gold', edgecolor='black', alpha=0.7)
ax5.axvline(0, color='red', linestyle='–', linewidth=2, label='Target: 0°')
ax5.axvline(np.mean(pointing_errors), color='green', linestyle<s