OpenTURNS中如何计算两独立正态随机变量的min(X,Y)并嵌入公式
在OpenTURNS中计算min(X,Y)的完整分布并嵌入复杂公式
步骤1:定义独立正态随机变量与联合分布
首先创建两个独立的正态分布,并组合成联合分布:
import openturns as ot # 定义X和Y的正态分布参数 mu_x, sigma_x = 0.0, 1.0 mu_y, sigma_y = 1.0, 2.0 dist_x = ot.Normal(mu_x, sigma_x) dist_y = ot.Normal(mu_y, sigma_y) # 构建独立变量的联合分布 joint_dist = ot.ComposedDistribution([dist_x, dist_y])
步骤2:生成min(X,Y)的随机向量与分布
通过符号函数定义min(X,Y)的计算逻辑,再基于联合分布的随机向量生成对应的复合随机向量,即可直接获取其分布:
# 定义计算min(X,Y)的符号函数 min_func = ot.SymbolicFunction(["x", "y"], ["min(x,y)"]) # 创建联合分布对应的随机向量 joint_rv = ot.RandomVector(joint_dist) # 生成min(X,Y)的复合随机向量 min_rv = ot.CompositeRandomVector(min_func, joint_rv) # 获取min(X,Y)的分布 min_dist = min_rv.getDistribution()
步骤3:将min(X,Y)嵌入复杂公式
直接在符号函数中写入包含min(X,Y)的复杂表达式,重复复合随机向量的生成逻辑即可得到最终结果的分布:
# 示例复杂公式:Z = 3*min(X,Y) + X² - Y complex_func = ot.SymbolicFunction(["x", "y"], ["3*min(x,y) + x^2 - y"]) # 生成复杂公式对应的随机向量 complex_rv = ot.CompositeRandomVector(complex_func, joint_rv) # 获取最终结果的分布 complex_dist = complex_rv.getDistribution()
步骤4:绘制PDF
利用OpenTURNS内置的drawPDF()方法直接绘制分布的概率密度函数;若需要更平滑的近似结果,可结合核平滑方法处理采样数据:
# 绘制min(X,Y)的PDF min_pdf_plot = min_dist.drawPDF() min_pdf_plot.setTitle("PDF of min(X,Y)") min_pdf_plot.draw("min_pdf.png") # 保存图像或直接显示 # 绘制复杂公式结果的PDF(基础版本) complex_pdf_plot = complex_dist.drawPDF() complex_pdf_plot.setTitle("PDF of Complex Formula Result") complex_pdf_plot.draw("complex_pdf.png") # 核平滑优化PDF(适用于复杂公式的近似分布) sample_size = 10000 complex_sample = complex_rv.getSample(sample_size) kernel_smoother = ot.KernelSmoothing() smoothed_complex_dist = kernel_smoother.build(complex_sample) smoothed_complex_dist.drawPDF().draw("complex_pdf_smoothed.png")
补充说明
对于独立连续随机变量,min(X,Y)的CDF具有解析形式:F_min(z) = 1 - (1 - F_X(z))(1 - F_Y(z))(其中F_X、F_Y分别为X、Y的CDF)。OpenTURNS的CompositeRandomVector会自动推导这类简单函数的解析分布;对于更复杂的组合公式,默认会通过蒙特卡洛采样生成近似分布,可通过调整采样数量提升精度。
内容的提问来源于stack exchange,提问作者Nika Tsereteli
相关产品推荐
相关产品推荐

