我到目前为止编码:
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
from scipy.special import *
import matplotlib.pyplot as plt
import numpy as np
from math import *
import csv
## Globale Variablen ##
# kommen später ins main file, MÜSSEN vor dem import von diesem Modul definiert werden!)
rhof = 1000 # Dichte Flüssigkeit [kg/m³]
lameu = 11.2*10**9 # Lamé-Parameter, undrained [GPa]
lame = 8.4*10**9 # Lamé-Parameter, drained [GPa]
pi # durch Pythonmodul "math" gegeben
alpha = 0.65 # Biot-Willis-Koeffizient
G = 8.4*10**9 # Schermodul [GPa]
k = 1.0e-15 # Permeabilität [m²] bzw. [Darcy]
eta = 0.001 # Viskosität des Fluids [Pa*s]
## Berechnung der Parameter ##
# Berechnung der Diffusivität
kappa = k/eta
# Berechnung der Diffusivität
c = ((kappa*(lameu-lame)*(lame+2*G))/((alpha**2)*(lameu+2*G)))
## Wertebereich ##
xmin = 0
xmax = 50
xsteps = 1
x = np.arange(xmin,xmax,xsteps)
ymin = 0
ymax = 50
ysteps = 1
y = np.arange(ymin,ymax,ysteps)
#X, Y = np.meshgrid(x,y)
## Klassendefinition ##
# hier wird eine Bohrloch-Klasse definiert
class Bohrloch(object):
# __init__ erzeugt das eigentliche Objekt mit seinen Parametern
def __init__(self, xlage, ylage, tstart, q):
self.xlage = xlage # x-Lage der Bohrung
self.ylage = ylage # y-Lage der Bohrung
self.tstart = tstart # Start der Injektion/Produktion
self.q = q # Fluidmenge
#==============================================================================
# Drücke
#==============================================================================
# getPressure erzeugt einen Array mit allen Werten für x,y im Zeitraum t
def getPressure(self, t):
if (t-self.tstart<0): # Förderzeit muss in Förderzeitraum liegen
print "Startpunkt liegt außerhalb des Förderzeitraumes!"
return ()
else:
# erzeugen des Abstandsvektors
self.r = np.sqrt((x-self.xlage)**2+(y-self.ylage)**2)
# Druckformel nach Rudnicki (1986)
self.P = (self.q/(rhof*4*pi*kappa))*(expn(1,self.r**2/(4*c*(t-self.tstart))))
# Druck wird direkt bei der Bohrung als "not a number" definiert
self.P[self.xlage] = np.nan
self.P[self.ylage] = np.nan
# Umrechnung des Druckes in [MPa]
self.z = self.P/1e6
# return gibt die Druckwerte aus (und speichert sie zwischen)
return self.z
我遇到的问题是我找回了self.z
的一维数组。代码背后的想法如下:
我有一个x轴和y轴,例如以上范围。我尝试获得这些1d阵列的每种可能组合的压力值(取决于x,y),例如, x,y = 1,1的值; 1,2; 1,3等在每个轴上直到50。如果我使用ndim
测试我的数组self.z的维度,我看到我只覆盖了一个维度。所需的输出应该是50x50(或49x49)的二维数组,或者我错了?我真的坚持这个问题,我认为应该很容易解决,但我无法正确解决。后来我想用这些值绘制3D图,我知道我必须使用np.meshgrid
来解决这个问题。我还必须在这里使用吗?
我希望你们能得到我的想法,并能提供帮助!
答案 0 :(得分:1)
根据你的解释,问题在于你对'self.r'的定义 对于x和y的所有组合,即矩阵,您需要(x,y)和(xlage,ylage)之间的距离r的列表。但是,你有一个向量,其中包含属于(x1,y1),(x2,y2),(x3,y3)...的r,即你缺少组合(x1,y2),......等等。 / p>
解决方案是
# put this into section 'Wertebereich'
xx,yy = np.meshgrid(x,y)
# and change the function to
def getPressure(self, t):
if (t-self.tstart<0): # Förderzeit muss in Förderzeitraum liegen
print "Startpunkt liegt außerhalb des Förderzeitraumes!"
return ()
else:
# erzeugen des Abstandsvektors
self.r = np.sqrt((xx-self.xlage)**2+(yy-self.ylage)**2)
# Druckformel nach Rudnicki (1986)
self.P = (self.q/(rhof*4*pi*kappa))*(expn(1,self.r**2/(4*c*(t-self.tstart))))
# Druck wird direkt bei der Bohrung als "not a number" definiert
self.P = np.where((xx==self.xlage) & (yy==self.ylage),self.P,NaN)
# Umrechnung des Druckes in [MPa]
self.z = self.P/1e6
# return gibt die Druckwerte aus (und speichert sie zwischen)
return self.z
我现在无法检查代码,但它应该完成这项工作。
然后您可以使用xx,yy和输出z绘制它,如上所述here