Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在类对象中嵌套用于循环和三维打印_Python_Class_For Loop_Matplotlib - Fatal编程技术网

Python 在类对象中嵌套用于循环和三维打印

Python 在类对象中嵌套用于循环和三维打印,python,class,for-loop,matplotlib,Python,Class,For Loop,Matplotlib,我确信这是一个容易处理的问题,但我想不出来。我创建了一个钻孔类,希望计算每个钻孔/油井周围的孔隙压力。沿着单个轴,我的代码如下所示: from scipy.special import * import matplotlib.pyplot as plt import numpy as np from math import * ## Globale Variablen ## rhof = 1000 # Dichte F

我确信这是一个容易处理的问题,但我想不出来。我创建了一个钻孔类,希望计算每个钻孔/油井周围的孔隙压力。沿着单个轴,我的代码如下所示:

from scipy.special import *
import matplotlib.pyplot as plt
import numpy as np
from math import *


## Globale Variablen ##

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 ##

kappa = k/eta                                                    
c = ((kappa*(lameu-lame)*(lame+2*G))/((alpha**2)*(lameu+2*G)))   

## Wertebereich ##

xmin = 0
xmax = 100
xsteps = 1.0
x = np.arange(xmin, xmax, xsteps)

## Class ##

class Bohrloch(object):
    loch_zaehler = 0

    def __init__(self, xlage, tstart, q):    # Funktion, um BL zu erzeugen
        self.xlage = xlage
        #self.ylage = ylage                  # Lage der Bohrung
        self.tstart = tstart                 # Start der Injektion/Produktion
        self.q = q                           # Fluidmenge


## Druck ##     

    def getPressure(self, t): # gibt nach Zeit t die zugehörigen Druckwerte aus
        if (t-self.tstart<0): # Fehlermeldung, falls Startpunkt nach t liegt
            return () 
            print "Startpunkt liegt außerhalb des Förderzeitraumes!"
        else:
            self.r = np.sqrt((x-self.xlage)**2)
            self.P = (self.q/(rhof*4*pi*kappa))*(expn(1,self.r**2/(4*c*(t-self.tstart))))
            #self.P[self.xlage] = 0         # gibt Bohrlochlage wieder
            self.z = self.P/1e6
            return self.z                   # Druckwerte in [MPa]


    def pressureTable (self, t, xschritt):       # erstellt Wertetabelle
        self.getPressure(t)
        for i in range (xmin, xmax, xschritt):
            print i, "  ", self.z[i]

t = 1000*24*3600
b1 = Bohrloch(50,0*24*3600,6.0/1000)
b1.pressureTable(t,1)
从scipy.special导入*
将matplotlib.pyplot作为plt导入
将numpy作为np导入
从数学导入*
##变异球蛋白##
rhof=1000#Dichte Flüssigkeit[kg/m³]
lameu=11.2*10**9#Lamé-参数,不排水[GPa]
lame=8.4*10**9#Lamé-参数,排水[GPa]
pi#durch Pythonmodul“数学”gegeben
阿尔法=0.65#比奥-威利斯-科菲森特
G=8.4*10**9#Schermodul[GPa]
k=1.0e-15#渗透性[m²]bzw。[达西]
eta=0.001#Viskosität des流体[Pa*s]
##贝氏参数##
kappa=k/eta
c=((kappa*(lameu-lame)*(lame+2*G))/((α**2)*(lameu+2*G)))
##韦特贝里奇##
xmin=0
xmax=100
xsteps=1.0
x=np.arange(xmin,xmax,xsteps)
##阶级##
Bohrloch类(对象):
扎勒湖=0
定义初始值(self、xlage、tstart、q):#函数,嗯BL zu erzeugen
self.xlage=xlage
#self.ylage=ylage#Lage der Bohrung
self.tstart=tstart#开始注射/生产
self.q=q#Fluidmenge
##德鲁克
压力的定义(自我,t):#没有压力

如果(t-self.tstart,问题在于
self.z
不是二维数组/列表。因此,尝试访问
self.z[k][l]
会导致
索引器:对标量变量的索引无效。


  • 我不太明白你想如何实现第二个维度。你引入了y位置,但是,你只是通过在中同时使用x和y位置来计算一维半径数组

    self.r = np.sqrt((x-self.xlage)**2+(y-self.ylage)**2)
    
  • 下一个问题是,你打算怎么做:

    self.P[self.xlage] = np.nan
    self.P[self.ylage] = np.nan
    
    如果将
    xsteps
    ysteps
    更改为
    10
    ,并调用:

    b1 = Bohrloch(2,3,0*24*3600,6.0/1000)
    print b1.getPressure(t)  
    
    您的输出将是:

    [ 5.44152501 4.40905986        nan        nan  2.87481753  2.64950827
      2.46756653 2.31503845 2.18379093 2.06866598]
    
    为什么要将第3和第4个元素替换为
    nan


这些问题也是绘图例行程序的基础。由于数组中现在有
np.nan
值,这些值不会显示在绘图中。因为
self.z
不是二维的,您可能无法获得预期的曲面:


下面是一个简单的2D实现方法。我对您尝试做的事情不太熟悉,但它能让您了解这个想法:

    def getPressure(self, t):                
        if (t-self.tstart<0):                
            return () 
            print "Startpunkt liegt außerhalb des Förderzeitraumes!"
        else:

            # you need to initialize r, P and z as list of lists
            # make this dependent on your x coordinates
            # the second dimension will grow dynamically

            self.r = [[] for ri in range(len(x))]
            self.P = [[] for ri in range(len(x))]
            self.z = [[] for ri in range(len(x))]

            # iterate through both x and y independently

            for ii in range(len(x)):
                for jj in range(len(y)):

            # append to the list that corresponds to the current x -value
            # also, use x[ii] and y[jj] to call one x-, y-value at a time  

                    self.r[ii].append(np.sqrt((x[ii]-self.xlage)**2+(y[jj]-self.ylage)**2))

            # calling r[ii][-1] ensures you are using the value that was last added to the list:

                    self.P[ii].append((self.q/(rhof*4*pi*kappa))*(expn(1,self.r[ii][-1]**2/(4*c*(t-self.tstart)))))

                    self.z[ii].append(self.P[ii][-1]/1e6)

            # now, you can use xlage and ylage to blank one value
            # do this for both P and z, because z is now calculated inside the loop

            self.P[self.xlage][self.ylage] = np.nan
            self.z[self.xlage][self.ylage] = np.nan

            return self.z
现在你将得到这个图:


你好,Schorsch,我还必须计算钻孔周围的应力。我会编辑我的问题,也许你能帮我。太棒了!@Alex:请问一个新问题。这会让问题更清晰。你可以链接回这个问题哦,不,太晚了。Sry!我应该继续问一个新问题吗?或者你想在这里试试吗?@Alex:是的,请问一个新问题我将回滚编辑。Thanks@Alex我确实看过了你的代码。你可能想考虑不要问这个问题,它可能会被否决。相反,请确保你使用<代码>自己。Futs2[I] <代码> >和代码> Sudio。Futs2[I] [-1 ] < /C>(而不是只是代码>
-它必须是所附加内容的一部分。
    def getPressure(self, t):                
        if (t-self.tstart<0):                
            return () 
            print "Startpunkt liegt außerhalb des Förderzeitraumes!"
        else:

            # you need to initialize r, P and z as list of lists
            # make this dependent on your x coordinates
            # the second dimension will grow dynamically

            self.r = [[] for ri in range(len(x))]
            self.P = [[] for ri in range(len(x))]
            self.z = [[] for ri in range(len(x))]

            # iterate through both x and y independently

            for ii in range(len(x)):
                for jj in range(len(y)):

            # append to the list that corresponds to the current x -value
            # also, use x[ii] and y[jj] to call one x-, y-value at a time  

                    self.r[ii].append(np.sqrt((x[ii]-self.xlage)**2+(y[jj]-self.ylage)**2))

            # calling r[ii][-1] ensures you are using the value that was last added to the list:

                    self.P[ii].append((self.q/(rhof*4*pi*kappa))*(expn(1,self.r[ii][-1]**2/(4*c*(t-self.tstart)))))

                    self.z[ii].append(self.P[ii][-1]/1e6)

            # now, you can use xlage and ylage to blank one value
            # do this for both P and z, because z is now calculated inside the loop

            self.P[self.xlage][self.ylage] = np.nan
            self.z[self.xlage][self.ylage] = np.nan

            return self.z
b1 = Bohrloch(50,50,0*24*3600,6.0/1000)  
b1.pressurePlot3D(t)