You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 13:50:24