求解由Python中的函数定义的数组中的每个元素的定积分

时间:2015-06-09 19:46:56

标签: function for-loop numpy scipy integrate

我试图整合数组的值。函数中使用的数组是" H"和积分的整合限制是"冲浪"和" base"。从.txt文件中读取值。 ' def flow_pramB(z)'定义要集成的函数和“def intendnd(a,b)'执行积分。然后我想把函数称为“integrand”'生成已集成的新数组。

import numpy as np
from scipy import integrate

datafile = np.genfromtxt(" filename/flow_line_num9.txt",delimiter='\t',skiprows=1, dtype=float)

#The first four parameters are all arrays of numbers 
ptID = datafile[:,0] 
surf = datafile[:,9] #m
base = datafile[:,10] #m
H = surf - base #m

Bo = 2.207 #Pa yr^1/3
Ct = .16612 #K^k
Tr = 273.39 #K
k = 1.17
Ts = -19.0 #celsius
Tb = -2.0 #celsius

@np.vectorize
def integrand(a,b):
    def flow_pramB(z):
        temp = []
        for i in range(0,len(ptID)):
            tempA = ((Ts-Tb)*pow((z/H[i]),.333333))+Tb
            temp.append(tempA)
        B = []
        for i in range(0,len(ptID)):
            Bpram = (Bo*np.exp((3155/temp[i]) - (Ct/(pow((Tr-temp[i]),k)))))
            B.append(Bpram)
        return B
    return integrate.quad(flow_pramB, a, b)

B = integrand(surf, base)

这段代码只是众多尝试中的一个例子。一个解决方案或只是让我知道我需要尝试其他模块才能使其工作将不胜感激!

1 个答案:

答案 0 :(得分:0)

未正确定义函数flow_pramB。它应该采用浮动并返回一个浮点数,而不是现在的列表。例如,这是一种可能的方法(注意我们使用numpy数组而不是for循环),

def flow_pramB(z):
    temp = ((Ts-Tb)*pow((z/H[:]),.333333))+Tb
    B = (Bo*np.exp((3155/temp[:]) - (Ct/(pow((Tr-temp[:]),k)))))
    return B.sum() # suming all the elements of B (probably not the right thing to do)

@np.vectorize
def integrand(a,b):
    return integrate.quad(flow_pramB, a, b)

B = integrand(surf, base)

这会运行,但会产生一些NaNs并发出警告,因为flow_param没有产生正确的结果(因为我不确定它应该产生什么)。这仍然可以让你了解如何使这项工作,

  1. 验证flow_paramB是否采用浮动并返回正确的浮点结果。
  2. 检查integrate.quad(flow_paramB, a_float, b_float)是否运行并产生正确的结果。
  3. 然后像你一样用np.vecorize装饰器包裹它。