首页 > 解决方案 > 绘制故障模式图

问题描述

我正在尝试创建一个代码来生成蜂窝梁结构的失效模式图,如下图所示:

示例图

(来自M. Sadighi 等人,2009 年

有不同的公式来计算发生故障的载荷,并且给定材料/梁参数,最小值是最有可能发生故障的值。

我有一个三重嵌套的循环运行范围的 t、L 和 rho 值。来自 numpy 的网格和来自 matplotlib 的等高线图似乎是合乎逻辑的,但是对于需要二维数组的 z 输入会抛出错误。

我认为也许每种故障类型都可以编码为一个值(即 1 表示核心挤压,2 表示压痕等),您可以扫描 x 和 y 值以存储故障类型发生变化的位置,但我仍然不不知道怎么把它变成情节。

到目前为止我发现的最接近的东西可以在这里看到Jupyter 环境中的卫星数据集和决策表面图形,其中绘图被分成不同的颜色区域。

这怎么能画出来?

PS我知道您应该附加代码,但是在这种情况下,需要大量变量来进行计算并且很难传递。

标签: pythonnumpymatplotlibgraph

解决方案


我试图重新表述这个问题。假设我们有两个坐标的函数:f1(x, y), f2(x, y)... 例如,它们对应于每种失效模式的临界应力。变量 x、y 是其中的两个参数。

对于给定的 (x, y),通过使用argmin( f1(x, y), f2(x, y), ... )ie 临界应力最小的失效模式来获得失效模式

这是我能想到的获取故障模式图的简单解决方案:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap

# Mesh the parameters space
x = np.linspace(0, 2, 35)
y = np.linspace(0, 1, 24)

x_grid, y_grid = np.meshgrid(x, y)

# Compute the functions for each point on the mesh
f1 = x_grid + y_grid
f2 = 0.5 + x_grid**2
f3 = 1 + y_grid**2

# Identify which function is minimal for each point
failure_mode = np.argmin([f1, f2, f3], axis=0)

# Graph
discrete_colormap = ListedColormap(['gold', 'darkorange', 'mediumseagreen'])

plt.pcolormesh(x, y, failure_mode, cmap=discrete_colormap);
cbar = plt.colorbar();
cbar.set_label('failure mode');
cbar.set_ticks(np.arange(np.max(failure_mode)+1));
plt.xlabel('x'); plt.ylabel('y');

这使:

失效模式图

例如,参见离散颜色图的这个答案。


这是绘制每个区域的轮廓的解决方案:

区域的轮廓i定义为点 (x, y),使得 f_i(x, y) 等于所有剩余函数的最小值,即 min( f_j(x, y) for i != j)。我们可以使用几个曲面等于 的等高线图f_i(x, y) - min( f_j(x, y) for i!=j )。区域边界的级别为零。

import numpy as np
import matplotlib.pyplot as plt

# Mesh the parameters space
x = np.linspace(0, 2, 35)
y = np.linspace(0, 1, 24)

x_grid, y_grid = np.meshgrid(x, y)

# List of functions evaluated for each point of the mesh
f_grid = [x_grid + y_grid,
          0.5 + x_grid**2,
          1 + y_grid**2]

# Identify which function is minimal for each point
failure_mode = np.argmin(f_grid, axis=0)

# this part is for the background
critical_stress = np.min(f_grid, axis=0)
plt.pcolormesh(x, y, critical_stress, shading='Gouraud')
cbar = plt.colorbar();
cbar.set_label('critical stress');

# Plot the contour of each zone
for i in range(len(f_grid)):
    other_functions = [f_j for j, f_j in enumerate(f_grid) if i != j]
    level_surface = f_grid[i] - np.min(other_functions, axis=0)
    plt.contour(x, y, level_surface,
                levels=[0, ],
                linewidths=2, colors='black');
    # label
    barycentre_x = np.mean(x_grid[failure_mode==i])
    barycentre_y = np.mean(y_grid[failure_mode==i])
    plt.text(barycentre_x, barycentre_y, 'mode %i' % i)

plt.xlabel('x'); plt.ylabel('y');

图表是:

带区域的地图


推荐阅读