绘制故障模式图

时间:2019-09-18 00:09:22

标签: python numpy matplotlib graph

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

example graph

(来自M. Sadighi et al. 2009

有不同的公式可以计算发生故障的载荷,在给定材料/梁参数的情况下,最小值是最可能发生的故障。

我为t,L和rho的值的循环运行范围嵌套了一个三元组。来自numpy的网格网格和来自matplotlib的轮廓图看起来很合理,但是对于需要2D数组的z输入,则会引发错误。

我认为也许每个故障类型都可以编码为一个值(即1个用于压碎核芯,2个用于压痕等),并且您可以扫描x和y值以存储故障类型发生改变的位置,但是我仍然不知道如何将其纳入情节。

The moons dataset and decision surface graphics in a Jupyter environment处可以看到我到目前为止发现的最接近的东西,在该图中将图分成不同的彩色区域。

如何绘制?

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

1 个答案:

答案 0 :(得分:0)

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

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

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

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');

给出:

map of the failure mode

例如,this answer参见离散色图。


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

区域i的轮廓定义为点(x,y),使得f_i(x,y)等于所有其余函数的最小值,即min(f_j(x,y)因为我!= j)。我们可以使用几个contour plots且表面等于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');

图形为:

map with zones