我正在尝试创建代码以生成蜂窝梁结构的失效模式图,如下图所示:
有不同的公式可以计算发生故障的载荷,在给定材料/梁参数的情况下,最小值是最可能发生的故障。
我为t,L和rho的值的循环运行范围嵌套了一个三元组。来自numpy的网格网格和来自matplotlib的轮廓图看起来很合理,但是对于需要2D数组的z输入,则会引发错误。
我认为也许每个故障类型都可以编码为一个值(即1个用于压碎核芯,2个用于压痕等),并且您可以扫描x和y值以存储故障类型发生改变的位置,但是我仍然不知道如何将其纳入情节。
在The moons dataset and decision surface graphics in a Jupyter environment处可以看到我到目前为止发现的最接近的东西,在该图中将图分成不同的彩色区域。
如何绘制?
P.S。我知道您应该附加代码,但是在这种情况下,需要大量变量来进行计算,并且很难传递。
答案 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');
给出:
例如,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');
图形为: