首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用lambdify时有关quad的问题

使用lambdify时有关quad的问题
EN

Stack Overflow用户
提问于 2022-07-08 13:56:21
回答 1查看 41关注 0票数 0

我试图解决这两个积分,我想使用一个数值方法,因为C_i最终会变得更加复杂,我想使用它在所有情况下。目前,C_i只是一个常量,所以_quad无法解决它。我想是因为它是一个Heaviside函数,它很难找到a,b。如果我走错了,请纠正我。

方程33

代码语言:javascript
复制
In [1]: import numpy as np
   ...: import scipy as sp
   ...: import sympy as smp
   ...: from sympy import DiracDelta
   ...: from sympy import Heaviside

In [2]: C_i = smp.Function('C_i')

In [3]: t, t0, x, v = smp.symbols('t, t0, x, v', positive=True)

In [4]: tot_l = 10

In [5]: C_fm = (1/tot_l)*v*smp.Integral(C_i(t0), (t0, (-x/v)+t, t))

In [6]: C_fm.doit()
Out[6]: 
0.1*v*Integral(C_i(t0), (t0, t - x/v, t))

In [7]: C_fm.doit().simplify()
Out[7]: 
0.1*v*Integral(C_i(t0), (t0, t - x/v, t))

In [8]: C_fms = C_fm.doit().simplify()

In [9]: t_arr = np.arange(0,1000,1)

In [10]: f_mean = smp.lambdify((x, v, t), C_fms, ['scipy', {'C_i': lambda e: 0.8}])

In [11]: try2 = f_mean(10, 0.1, t_arr)
Traceback (most recent call last):

  File "/var/folders/rd/wzfh_5h110l121rmlxn61v440000gn/T/ipykernel_3164/3786931540.py", line 1, in <module>
    try2 = f_mean(10, 0.1, t_arr)

  File "<lambdifygenerated-1>", line 2, in _lambdifygenerated
    return 0.1*v*quad(lambda t0: C_i(t0), t - x/v, t)[0]

  File "/opt/anaconda3/lib/python3.9/site-packages/scipy/integrate/quadpack.py", line 348, in quad
    flip, a, b = b < a, min(a, b), max(a, b)

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

方程34

代码语言:javascript
复制
In [12]: C_i = smp.Function('C_i')

In [13]: t, tao, x, v = smp.symbols('t, tao, x, v', positive=True)

In [14]: I2 = v*smp.Integral((C_i(t-tao))**2, (tao, 0, t))

In [15]: I2.doit()
Out[15]: 
v*Integral(C_i(t - tao)**2, (tao, 0, t))

In [16]: I2.doit().simplify()
Out[16]: 
v*Integral(C_i(t - tao)**2, (tao, 0, t))

In [17]: I2_s = I2.doit().simplify()

In [18]: tao_arr = np.arange(0,1000,1)

In [19]: I2_sf = smp.lambdify((v, tao), I2_s, ['scipy', {'C_i': lambda e: 0.8}])

In [20]: try2 = I2_sf(0.1, tao_arr)
Traceback (most recent call last):

  File "/var/folders/rd/wzfh_5h110l121rmlxn61v440000gn/T/ipykernel_3164/4262383171.py", line 1, in <module>
    try2 = I2_sf(0.1, tao_arr)

  File "<lambdifygenerated-2>", line 2, in _lambdifygenerated
    return v*quad(lambda tao: C_i(t - tao)**2, 0, t)[0]

  File "/opt/anaconda3/lib/python3.9/site-packages/scipy/integrate/quadpack.py", line 351, in quad
    retval = _quad(func, a, b, args, full_output, epsabs, epsrel, limit,

  File "/opt/anaconda3/lib/python3.9/site-packages/scipy/integrate/quadpack.py", line 463, in _quad
    return _quadpack._qagse(func,a,b,args,full_output,epsabs,epsrel,limit)

  File "/opt/anaconda3/lib/python3.9/site-packages/sympy/core/expr.py", line 345, in __float__
    raise TypeError("Cannot convert expression to float")

TypeError: Cannot convert expression to float
EN

回答 1

Stack Overflow用户

发布于 2022-07-09 15:51:51

因此,您将一个未评估的Integrate传递给lambdify,而后者又将其调用转换为scipy.integrate.quad

看起来,即使使用doitsimplify调用,也无法计算积分。你真的看过C_fmsI2_s吗?这是我在运行这段代码时首先要做的事情之一!

我从来没有看过这种方法。我已经看到了lambdify的客观表达式,然后尝试在quad中直接使用它。

quad有特定的要求(检查docs!)。目标函数必须返回一个数字,并且边界也必须是数字。

在第一个错误中,您将数组t_arr作为t界传递,并且它在检查数组比另一个边界0大的位置时得到了通常的ambiguity错误。那就是b < a测试。quad不能使用数组作为边界。

我不知道为什么第二种情况会避免这个问题--界限肯定来自其他地方。但是,当quad调用目标函数并期望浮点返回时,就会出现错误。相反,函数返回一个sympy表达式,sympy不能将该表达式转换为float。我猜表达式中有一些变量仍然是sympy.symbol

在诊断lambdify问题时,查看生成的代码是个好主意。一种方法是在函数上使用helphelp(I2_sf)。但是,您需要能够阅读和理解python,包括任何numpyscipy函数。这并不总是容易的。

您试过使用sympy's自己的数字积分器吗?试图将sympynumpy/scipy结合起来常常会有问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72912501

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档