在我的学士学位内论文我要研究流体注入井周围的孔隙压力和应力分布。我尝试使用Spyder来解决这个问题,这对我来说似乎是最好的界面,因为我几乎没有编码经验。
虽然我使用了最重要的Python和matplotlib文档,但我无法找到解决问题的方法。
首先,我的代码到目前为止:
# -*- coding: utf-8 -*-
"""
Created on Wed Oct 01 10:26:29 2014
@author: Alexander
"""
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
from math import *
from scipy.special import *
import matplotlib.pyplot as plt
import numpy as np
q = 6.0/1000
rhof = 1000
lameu = 11.2*10**9
lame = 8.4*10**9
pi
alpha = 0.8
G = 8.4*10**9
k = 4*10**(-14)
eta = 0.001
t = 10*365*24*3600
kappa = k/eta
print "kappa ist:",kappa
c = ((kappa*(lameu-lame)*(lame+2*G))/((alpha**2)*(lameu+2*G)))
print "c ist:",c
xmin = -10
xmax = 10
ymin = -10
ymax = 10
X = np.arange(xmin,xmax,0.5)
Y = np.arange(ymin,ymax,0.5)
x, y = np.meshgrid(X, Y)
r=np.sqrt(x**2+y**2)
P=(q/(rhof*4*pi*kappa))*(expn(1,(r**2)/(4*c*t)))
print x,y
print P
z = P/1000000
fig = plt.figure()
ax = fig.gca(projection='3d')
surf = ax.plot_surface(x, y, z, rstride=1, cstride=1, cmap=cm.jet, linewidth=0,
antialiased=True)
fig.colorbar(surf, shrink=0.5, aspect=5)
ax.set_xlim(xmin,xmax)
ax.set_ylim(ymin,ymax)
ax.set_title('Druckverteilung')
ax.set_xlabel('Distanz zu Well [m]')
ax.set_ylabel('Distanz zu Well [m]')
ax.set_zlabel('Druck in [MPa]')
plt.show()
我有两个主要问题:
绘图后,我的彩条只显示1种颜色(蓝色),我不知道为什么。我在这个网站上查找了类似的问题,但却无法找到合适的解决方案。我怎样才能完成这项工作?
我想说我想从注射点(x,y = 0)知道坐标x=5m
和y=2m
中的压力值。是否有代码来抓住"这个值?
我将尝试绘制钻孔周围的一些应力(例如正应力和剪切应力)。我可以通过简单地使用您建议的
命题来避免在未来情节中遇到的错误z[z == np.inf] = np.nan
并修改plot_surface命令?我问,因为我不确定我的值是否会在inf
之内。
答案 0 :(得分:1)
色标是全蓝色的,因为你在inf中的一个z值。您可以通过将z中的inf值设置为nan来解决此问题:
z[z == np.inf] = np.nan
然后告诉plot_surface使用vmin和vmax参数绘制的值的范围:
surf = ax.plot_surface(x, y, z, rstride=1, cstride=1, cmap=cm.jet, linewidth=0,
antialiased=True, vmin=np.nanmin(z), vmax=np.nanmax(z))
您可以轻松创建function来计算给定x和y的z,如下所示:
def calcZ(x,y):
r=np.sqrt(x**2+y**2)
P=(q/(rhof*4*pi*kappa))*(expn(1,(r**2)/(4*c*t)))
z = P/1000000
return z
答案 1 :(得分:0)
对于您的第一个问题,如果您在vmin=0.15, vmax=0.24
电话中添加ax.plot_surface
,则会获得彩色图表。我不知道为什么plot_surface不能更好地自动选择这些颜色限制,但我想它没有。
关于你的第二个问题,如果你想能够抓住任意点(不一定是网格中的那些点),你可以使用插值函数。例如,首先创建一个插值函数:
from scipy.interpolate import interp2d
intrp = interp2d(X, Y, z)
然后您可以使用它来计算任何您喜欢的值。你可以得到一个点:
a_single_point = intrp(2, 4)
或者从x = -3到-1的点线,沿y = 2:
vals = intrp(np.arange(-3, -1, .1), 2)
祝你好运!