如何用Julia的IntervalArithmetic包绘制区间值函数的3D图
可视化区间输入下函数P的分布
函数特性分析
先简化你的函数表达式,方便理解其区间行为:P = √(a² + b² + a*c + b*c)
内部表达式可变形为:
a² + b² + a c + b c = a(a + c) + b(b + c)
因为a∈(20,30)、b∈(3,4)、c∈(100,200)都是正区间,对P求各变量的偏导:
- ∂P/∂a = (2a + c)/(2P) > 0
- ∂P/∂b = (2b + c)/(2P) > 0
- ∂P/∂c = (a + b)/(2P) > 0
显然P对a、b、c均单调递增,所以输入区间对应的P取值范围是:
- 最小值:
P_min = f(20, 3, 100) = √(20²+3²+20×100+3×100) ≈ 52.05 - 最大值:
P_max = f(30, 4, 200) = √(30²+4²+30×200+4×200) ≈ 87.84
可视化实现方案
方案1:3D散点+边界长方体(Matplotlib)
生成输入区间内的采样点,用颜色映射表示P值,同时绘制输入区间的边界长方体,直观展示P随a、b、c的变化:
import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D # 定义函数P def calc_P(a, b, c): return np.sqrt(a**2 + b**2 + a*c + b*c) # 生成采样点(可调整数量控制精度/速度) a_samples = np.linspace(20, 30, 50) b_samples = np.linspace(3, 4, 20) c_samples = np.linspace(100, 200, 50) # 创建三维网格并计算P值 A, B, C = np.meshgrid(a_samples, b_samples, c_samples) P_values = calc_P(A, B, C) # 初始化3D画布 fig = plt.figure(figsize=(12, 8)) ax = fig.add_subplot(111, projection='3d') # 绘制采样点,颜色映射对应P值 scatter = ax.scatter(A, B, C, c=P_values.flatten(), cmap='viridis', alpha=0.6) # 绘制输入区间的边界长方体 vertices = np.array([ [20, 3, 100], [30, 3, 100], [30, 4, 100], [20, 4, 100], [20, 3, 200], [30, 3, 200], [30, 4, 200], [20, 4, 200] ]) edges = [ [0,1], [1,2], [2,3], [3,0], [4,5], [5,6], [6,7], [7,4], [0,4], [1,5], [2,6], [3,7] ] for edge in edges: ax.plot3D(*zip(vertices[edge[0]], vertices[edge[1]]), color='black', linewidth=2) # 设置坐标轴与标题 ax.set_xlabel('a (20-30)') ax.set_ylabel('b (3-4)') ax.set_zlabel('c (100-200)') ax.set_title('P值随输入区间的分布') # 添加颜色条标注 plt.colorbar(scatter, label='P值') plt.show()
方案2:体积渲染(Plotly)
用体积渲染可以更直观地展示P在整个输入区间内的连续分布:
import numpy as np import plotly.graph_objects as go def calc_P(a, b, c): return np.sqrt(a**2 + b**2 + a*c + b*c) # 生成采样网格 a = np.linspace(20, 30, 30) b = np.linspace(3, 4, 10) c = np.linspace(100, 200, 30) A, B, C = np.meshgrid(a, b, c) P_values = calc_P(A, B, C) # 创建体积渲染图 fig = go.Figure(data=go.Volume( x=A.flatten(), y=B.flatten(), z=C.flatten(), value=P_values.flatten(), isomin=52, isomax=88, opacity=0.3, surface_count=20, colorscale='Viridis' )) # 配置布局 fig.update_layout( scene=dict( xaxis_title='a (20-30)', yaxis_title='b (3-4)', zaxis_title='c (100-200)' ), title='P值在输入区间内的体积分布' ) fig.show()
注意事项
- 因为P是单调递增的,你会看到颜色从长方体的(20,3,100)顶点(深蓝色,P最小)逐渐过渡到(30,4,200)顶点(亮黄色,P最大)。
- 采样点数量越多,细节越清晰,但计算和渲染速度会下降,可根据需求调整
linspace的第三个参数。
内容的提问来源于stack exchange,提问作者Kanishk Sharma
相关产品推荐
相关产品推荐

