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

方程33
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
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发布于 2022-07-09 15:51:51
因此,您将一个未评估的Integrate传递给lambdify,而后者又将其调用转换为scipy.integrate.quad。
看起来,即使使用doit和simplify调用,也无法计算积分。你真的看过C_fms和I2_s吗?这是我在运行这段代码时首先要做的事情之一!
我从来没有看过这种方法。我已经看到了lambdify的客观表达式,然后尝试在quad中直接使用它。
quad有特定的要求(检查docs!)。目标函数必须返回一个数字,并且边界也必须是数字。
在第一个错误中,您将数组t_arr作为t界传递,并且它在检查数组比另一个边界0大的位置时得到了通常的ambiguity错误。那就是b < a测试。quad不能使用数组作为边界。
我不知道为什么第二种情况会避免这个问题--界限肯定来自其他地方。但是,当quad调用目标函数并期望浮点返回时,就会出现错误。相反,函数返回一个sympy表达式,sympy不能将该表达式转换为float。我猜表达式中有一些变量仍然是sympy.symbol。
在诊断lambdify问题时,查看生成的代码是个好主意。一种方法是在函数上使用help,help(I2_sf)。但是,您需要能够阅读和理解python,包括任何numpy和scipy函数。这并不总是容易的。
您试过使用sympy's自己的数字积分器吗?试图将sympy和numpy/scipy结合起来常常会有问题。
https://stackoverflow.com/questions/72912501
复制相似问题