用Python(sypy,quad)集成一个函数,结果是另一个我想要p的函数

2024-10-04 01:24:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用python集成一个函数,其中的输出是一个新函数,而不是一个数值。例如,我有一个方程式(来自Arnett 1982——对超新星的分析描述):

def A(z,tm,tni):
     y=tm/(2*tni)
     tm=8.8             # diffusion parameter
     tni=8.77           # efolding time of Ni56
     return 2*z*np.exp((-2*z*y)+(z**2))

然后求A的积分,然后画出结果。首先,我天真地尝试过西皮·夸德公司名称:

^{pr2}$

其中B也是一个预定义的函数(这里没有介绍)。A和B都是z的函数,但是最后的方程是时间t的函数(我相信这就是我导致代码失败的原因)

A和B的积分从0到x,其中x是时间t的函数。尝试按代码的原样运行会出现错误:“ValueError:具有多个元素的数组的真值不明确。使用a.any()或a.all()”。在

所以经过短暂的搜索,我想也许辛普森会是最好的选择。不过,我在这方面也失败了。在

我想知道有没有人能给我一个有用的建议,如何完成这项任务?在

非常感谢, 扎克


Tags: of函数代码parametertimedef时间数值
3条回答

我想你要找的是lambda表达式(如果我没听错你说的话。。有关lambda函数的额外信息和一些示例,请参见here)。在

它们允许您在A中定义一个匿名函数并返回它,这样您就可以得到B函数了,应该是这样工作的:

 def A(parameters):
     return lambda x: x * parameters # for simplicity i applied a multiplication
                                     # but you can apply anything you want to x
 B = A(args)
 x = B(2)

希望我能给你一个体面的答复!在

我想你得到的错误来自于一个错误的调用scipy.integrate.quad公司名称:

  • 第一个参数只需要是函数名,然后对该函数的第一个变量进行积分。其他变量的值可以通过args关键字传递给函数。在
  • 的输出scipy.integrate.quad不仅包含积分值,还包含误差估计。所以返回一个由2个值组成的元组!在

最后,以下功能应该起作用:

def Arnett(t, z, Mni, tm=8.8, tni=8.77, tco=111.3, Eni=3.90e+10,
           Eco=6.78e+09): 
  x=t/tm
  f,err=integrate.quad(A,0,x,args=(tm,tni))      #integral of A
  h,err=integrate.quad(B,0,x,args=(tm,tni,tco))  #integral of B
  g=np.exp((-(x/tm)**2))
  return Mni*g*((Eni-Eco)*f+Eco*h)

但是一个更好的解决方案可能是对A和B进行分析积分,然后计算表达式as murison suggested。在

你可以把一个解析积分。假设我没有因为起床太晚而错过一些愚蠢的事情,下面的方法有帮助吗?在

import sympy as sy
sys.displayhook = sy.pprint
A, y, z, tm, t, tni = sy.symbols('A, y, z, tm, t, tni')
A = 2*z*sy.exp(-2*z*y + z**2)
expr = sy.integrate(A, (z,0,t)) # patience - this takes a while
expr
# check:
(sy.diff(expr,t).simplify() - A.replace(z,t)).simplify()
# thus, the result:
expr.replace(y,tm/(2*tni)).replace(t,t/tm)

最后一行给出了解析形式的A函数的积分,尽管它需要计算虚误差函数(可以用它来计算scipy.special.erfi()). 在

相关问题 更多 >