将Matlab代码转换为Python时如何解决此错误

时间:2019-03-28 22:19:05

标签: python-3.x matlab

我通过手动键入将Matlab代码转换为python。但是,我一直收到错误消息,但仍然无法修复。我在做什么错?如何获得Matlab中的情节?关于代码的信息很少。这是一种显式的有限差分方法,用于解决仅由中间区块生产的油藏中的压力分布。其类似于热方程,Ut = Uxx。有人告诉我添加更多文本,因为我的问题主要是代码,因此必须添加所有这些详细信息。我认为该通知现已消失。

[P_new[N] = 4000    #last blocks at all time levels equals 4000

IndexError: index 9 is out of bounds for axis 0 with size 9]

运行正常的Matlab代码如下:python代码如下。

clear
clc
% Solution of P_t = P_{xx}
L = 1000 ;  %ft length of reservoir
W = 100 ; %ft reservoir width
h = 50    ;%ft pay thickness
poro  = 0.25;  % rock porosity    
k_o =   5; %md effective perm to oil
P_i = 4000; %psia initial pressure
B_o = 1.25; %oil formation vol fact
mu = 5; %cp oil visc
c_t = 0.0000125; %1/atm total compressibility
Q_o = 10;%stb/day production rate from central well

alpha = c_t*mu*poro/k_o;

T = 1;
N_time = 50;
dt = T/N_time;

% % Number of grid cells
N =9; %number of grid cells
%N =11;%number of grid cells

dx = (L/(N-1));            %distance between grid blocks
x = 0+dx*0.5:dx:L+dx;     %points in space 

 for i=1:N
     P_old(i)=P_i;
     FPT(i)=0;
 end

FPT((N+1)/2)=-Q_o*B_o*mu/1.127/W/dx/h/k_o; %source term at the center block of grid cell

P_new = P_old;

 for j = 1:N_time
     for k = 1: N
         if k<2
              P_new(k)=4000;%P_old(k)+dt/alpha*((P_old(k+1)-2*P_old(k)+P_old(k))/dx^2+FPT(k));
         elseif k > N-1
             P_new(k) = 4000;%P_old(k)+dt/alpha*((P_old(k)-2*P_old(k)+P_old(k-1))/dx^2+FPT(k));
          else
              P_new(k) = P_old(k)+dt/alpha*((P_old(k+1)-2*P_old(k)+P_old(k-1))/dx^2+FPT(k));
         end
     end

    plot(x,P_new, '-x')
    xlabel('X')
    ylabel('P(X)')
    hold on
    grid on
    %%update "u_old" before you move forward to the next time level
    P_old = P_new;

 end

hold off

Python代码:

import numpy as np
import matplotlib.pyplot as plt

# Solution of P_t = P_{xx}
L = 1000    #ft length of reservoir
W = 100     #ft reservoir width
h = 50      #ft pay thickness
poro = 0.25   # rock porosity
k_o = 5     #md effective perm to oil
P_i = 4000  #psia initial pressure
B_o = 1.25  #oil formation vol fact
mu = 5  #cp oil visc
c_t = 0.0000125     #1/atm total compressibility
Q_o = 10        #stb/day production rate from central well


alpha = c_t * mu * poro / k_o

T = 1
N_time = 20
dt = T / N_time

# % Number of grid cells
N = 9   #number of grid cells
dx = (L / (N - 1))  #distance between grid blocks
x= np.arange(0.0,L+dx,dx) 

P_old = np.zeros_like(x)      #pressure at previous time level
P_new = np.zeros_like(x)      #pressure at previous time level
FPT = np.zeros_like(x)       

for i in range(0,N):
    P_old[i]= P_i
    FPT[int((N + 1) / 2)]= -Q_o * B_o * mu / (1.127 * W * dx * h * k_o) # source term at the center block of grid cell
P_new = P_old
d=np.arange(0,N)
for j in range(0,N_time):
        for k in range(0,N):
            P_new[0] = 4000    #pressure at first block for all time levels equals 4000          
            P_new[N] = 4000    #pressure at last block for all time levels equals 4000    
            P_new[k]= P_old[k] + dt / alpha * ((P_old[k+1] - 2 * P_old[k] + P_old[k - 1]) / dx ** 2 + FPT[k])

        plt.plot(x, P_new)
        plt.xlabel('X')
        plt.ylabel('P(X)')

        P_old = P_new

1 个答案:

答案 0 :(得分:0)

Matlab使用基于1的索引,Python数组使用基于“ 0”的索引。如果在python中定义长度为N的数组,则索引的范围为0到N-1。 因此,只需将代码中的索引N替换为索引N-1,如下所示即可。

import numpy as np
import matplotlib.pyplot as plt

# Solution of P_t = P_{xx}
L = 1000    #ft length of reservoir
W = 100     #ft reservoir width
h = 50      #ft pay thickness
poro = 0.25   # rock porosity
k_o = 5     #md effective perm to oil
P_i = 4000  #psia initial pressure
B_o = 1.25  #oil formation vol fact
mu = 5  #cp oil visc
c_t = 0.0000125     #1/atm total compressibility
Q_o = 10        #stb/day production rate from central well


alpha = c_t * mu * poro / k_o

T = 1
N_time = 20
dt = T / N_time

# % Number of grid cells
N = 9   #number of grid cells
dx = (L / (N - 1))  #distance between grid blocks
x= np.arange(0.0,L+dx,dx) 

P_old = np.zeros_like(x)      #pressure at previous time level
P_new = np.zeros_like(x)      #pressure at previous time level
FPT = np.zeros_like(x)       

for i in range(0,N):
    P_old[i]= P_i
    FPT[int((N + 1) / 2)]= -Q_o * B_o * mu / (1.127 * W * dx * h * k_o) # source term at the center block of grid cell
P_new = P_old
d=np.arange(0,N)
for j in range(0,N_time):
        for k in range(0,N-1):
            P_new[0] = 4000    #pressure at first block for all time levels equals 4000          
            P_new[N-1] = 4000    #pressure at last block for all time levels equals 4000    
            P_new[k]= P_old[k] + dt / alpha * ((P_old[k+1] - 2 * P_old[k] + P_old[k - 1]) / dx ** 2 + FPT[k])

        plt.plot(x, P_new)
        plt.xlabel('X')
        plt.ylabel('P(X)')

        P_old = P_new

输出: enter image description here

相关问题