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

Function 为Python中的函数定义的数组中的每个元素求解定积分,function,for-loop,numpy,scipy,integrate,Function,For Loop,Numpy,Scipy,Integrate,我正在尝试集成数组的值。函数中使用的数组为“H”,积分的积分极限为“surf”和“base”。这些值是从.txt文件中读取的。”def flow_pramB(z)'定义要集成的函数,'def被积函数(a,b)'执行积分。然后我想调用函数“integrand”来生成一个新的已集成的单个值数组 import numpy as np from scipy import integrate datafile = np.genfromtxt(" filename/flow_line_num9.txt",

我正在尝试集成数组的值。函数中使用的数组为“H”,积分的积分极限为“surf”和“base”。这些值是从.txt文件中读取的。”def flow_pramB(z)'定义要集成的函数,'def被积函数(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)

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

功能
flow\u pramB
定义不正确。它应该接受一个float并返回一个float,而不是像现在这样的列表。例如,这里有一种可能的方法(注意我们使用numpy数组而不是For循环)

这会运行,但会产生一些
nan
和警告,因为
flow\u param
不会产生正确的结果(因为我不确定它应该产生什么)。但这给了你一个想法,如何让它工作

  • 验证
    flow_paramB
    是否接受浮点并返回正确的浮点结果
  • 检查
    integrate.quad(flow_paramB,a_float,b_float)
    是否运行并生成正确的结果
  • 然后用
    np.vecorize
    decorator包装它
    函数
    flow\u pramB
    的定义不正确。它应该接受一个float并返回一个float,而不是像现在这样的列表。例如,这里有一种可能的方法(注意我们使用numpy数组而不是For循环)

    这会运行,但会产生一些
    nan
    和警告,因为
    flow\u param
    不会产生正确的结果(因为我不确定它应该产生什么)。但这给了你一个想法,如何让它工作

  • 验证
    flow_paramB
    是否接受浮点并返回正确的浮点结果
  • 检查
    integrate.quad(flow_paramB,a_float,b_float)
    是否运行并生成正确的结果
  • 然后用
    np.vecorize
    decorator包装它
    那么这个代码有什么问题?正在工作/不工作、太慢等?你也可以提供一个链接到
    flow\u line\u num9.txt
    ,否则很难知道发生了什么。代码看起来不错,您只需要将
    flow\u pramB
    矢量化一点,就可以使用numpy数组而不是循环(如果可能的话),否则在被
    quad
    调用时速度会非常慢。这是指向“flow\u line\u num9.txt”的链接,如果不起作用,请告诉我。这个程序不起作用。当我调用“被积函数”时,它似乎在最后一个循环中失败了。当我尝试运行它时,我得到一条错误消息“error:Supplied function不返回有效的float”,那么这段代码有什么问题?正在工作/不工作、太慢等?你也可以提供一个链接到
    flow\u line\u num9.txt
    ,否则很难知道发生了什么。代码看起来不错,您只需要将
    flow\u pramB
    矢量化一点,就可以使用numpy数组而不是循环(如果可能的话),否则在被
    quad
    调用时速度会非常慢。这是指向“flow\u line\u num9.txt”的链接,如果不起作用,请告诉我。这个程序不起作用。当我调用“被积函数”时,它似乎在最后一个循环中失败了。当我尝试运行它时,我得到一条错误消息“error:Supplied function不返回有效的float”,那么这段代码有什么问题?正在工作/不工作、太慢等?你也可以提供一个链接到
    flow\u line\u num9.txt
    ,否则很难知道发生了什么。代码看起来不错,您只需要将
    flow\u pramB
    矢量化一点,就可以使用numpy数组而不是循环(如果可能的话),否则在被
    quad
    调用时速度会非常慢。这是指向“flow\u line\u num9.txt”的链接,如果不起作用,请告诉我。这个程序不起作用。当我调用“被积函数”时,它似乎在最后一个循环中失败了。当我尝试运行它时,我收到一条错误消息“error:Supplied function not return a valid float”(错误:提供的函数不返回有效的浮点值),为您的帮助干杯!现在看起来flow_pramB只返回一个值,我这样想对吗?如果是这样,是否可以让函数(flow_pramB)创建一个包含一个未定义变量的数学函数数组,然后数组中的每个元素都将单独集成?为您的帮助干杯!现在看起来flow_pramB只返回一个值,我这样想对吗?如果是这样,是否可以让函数(flow_pramB)创建一个包含一个未定义变量的数学函数数组,然后数组中的每个元素都将单独集成?为您的帮助干杯!现在看起来flow_pramB只返回一个值,我这样想对吗?如果是这样,是否可以让函数(flow_pramB)创建一个包含一个未定义变量的数学函数数组,其中数组的每个元素将分别集成?
    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)