Мой вопрос довольно прост, но для тех, кому нужно больше контекста, см. Страницу Википедии о методах конечных элементов .
Я ищу наиболее эффективный способ построения сетки с использованием matplotlib, учитывая следующую информацию, координаты каждого узла, какие узлы принадлежат каждому элементу и значение, которое имеет каждый узел. Ниже у меня есть несколько примеров данных и изображений, показывающих, как выглядит сетка
nodeinfo=[[0.000,0.000],[1.000,0.000],[2.000,0.500],[0.000,1.000],
[1.000,1.000],[1.750,1.300],[1.000,1.700]]
elementInfo=[[1,2,5],[5,4,1],[2,3,6],[6,5,2],[4,5,7],[5,6,7]]
nodevalues=[1,2,1,2,7,4,5]

nodeinfo - это координаты каждого узла (например, узел 7 имеет координаты (1,1.7)), elementInfo показывает, из каких узлов состоит каждый элемент (например, элемент 3 имеет узлы 2,3,6), значения узлов дают значение каждый узел (например, узел 5 имеет значение 7).
Используя эту информацию, как я могу построить сетки с помощью matplotlib с цветным градиентом, показывающим различные значения узлов (если это возможно, было бы здорово, если бы был градиент цвета между узлами, поскольку каждый элемент линейный).
Примечание
Если вы хотите использовать его, создали небольшой код, который организует информацию в объекты узла.
class node:
# Initializer / Instance Attributes
def __init__(self, number, xCord, yCord):
self.number=number
self.value=1
self.isOnBoundary=False
self.xCord=xCord
self.yCord=yCord
self.boundaryType=None
self.element=[]
#makes all class variables callable
def __call__(self):
return self
def checkIfOnBoundary(self,boundarylist):
# Checks if the node is on the boundary when it is invoked
# If the node is not on the boundary then it is set to false
if self.number in boundarylist:
self.isOnBoundary=True
self.boundaryType=boundarylist[self.number][0]
if self.boundaryType == "Dirchlet":
self.value=boundarylist[self.number][1]
else:
self.isOnBoundary=False
def setElement(self,elementInfo):
#given a list in the form [element1,element2,...,elementn]
#where element1 is a list that contains all the nodes that are on that element
for element in elementInfo:
if self.number in element:
self.element.append(elementInfo.index(element)+1)
def setValue(self,value):
# changes the value of the node
self.value=value
def description(self):
return "Node Number: {}, Node Value: {}, Element Node Belongs to: {}, Is Node On the Boundary: {}".format(self.number, self.value, self.element, self.isOnBoundary)
nodeinfo=[[0.000,0.000],[1.000,0.000],[2.000,0.500],[0.000,1.000],
[1.000,1.000],[1.750,1.300],[1.000,1.700]]
elementInfo=[[1,2,5],[5,4,1],[2,3,6],[6,5,2],[4,5,7],[5,6,7]]
nodevalues=[1,2,1,2,7,4,5]
#create list of node objects which we will call on often
nodes=[]
for i in range(len(nodeinfo)):
print(i)
nodes.append(node(i+1,nodeinfo[i][0],nodeinfo[i][1]))
nodes[i].setElement(elementInfo)
#print information related to each object
for phi in nodes:
print(vars(phi))