在 python 中编写集成时出现问题
Problem in writing an itegration in python
我有 2 列数组。我还有一个使用 2 列的方程式(积分)。我需要使用两列值来获得整数值。从某种意义上说,对于每个 s
都有 c
。
添加第三列,这是基于特定索引号的积分结果作为上限和下限。
例如,查看以下值:
ID=50
s = np.arange(0,100)
c = np.arange(200,300)
lanr=-4.56
lani=-2.33
而我需要解决的整合是c(s) * exp(lanr * s) * sin (lani * s)
。现在我的问题是添加第三列,其中包含 0,s[ID] 之间的积分结果,这意味着我需要具有我在 s=0
到 [=17 之间的问题中提到的细节的积分=].
我在下面写了一些不起作用的东西:
from scipy.integrate import quad
import numpy as np
from sympy import *
def f(s):
return c*(s) * exp(lanr * s) * sin (lani * s)
integ = []
for i in enumerate(s):
g = c * np.exp(lanr * s) * np.sin(lani * s)
integrate( f(s), s,0,ID)
也许以下内容与您正在寻找的内容相似?
一开始,我们可以尝试只做象征性的工作。 s
是基本变量。 c
是 s
的一个函数,在这种情况下写 c = s + 200
使 c
这样一个函数。
f=c*exp(lanr*s)*sin(lani*s)
是s
的一个更复杂的函数。 print(f)
给出 -(s+200)*exp(-4.56*s)*sin(2.33*s)
.
现在,您似乎对从 0
到某个值的 s
的 f
的积分感兴趣。我们将该值称为 t
。然后,该积分将是 t
的函数 g
。
from sympy import exp, sin, symbols, integrate, lambdify
s, t = symbols('s t')
lanr = -4.56
lani = -2.33
c = s + 200
f = c * exp(lanr * s) * sin (lani * s)
g = integrate(f, (s, 0, t))
如果只需要101个值,我们可以留在sympy里面:
values = [g.subs(t, ti).evalf() for ti in range(0, 101)]
如果需要更多的数值计算,lambdify()
可以将g
从sympy转换为numpy。
然后 numpy 还可以计算前 101 个值(这比在 sympy 中工作得快得多,但这只有在需要更多计算时才重要):
g_np = lambdify(t, g)
import numpy as np
x = np.arange(0,100)
y = g_np(x)
在这种情况下,结果将是
array([ 0. , -17.66531171, -17.80584637, -17.80185932,
-17.8019015 , -17.80190133, -17.80190133, -17.80190133,
-17.80190133, -17.80190133, -17.80190133, -17.80190133,
-17.80190133, -17.80190133, -17.80190133, -17.80190133,
...
这看起来很奇怪。也许某处有误会?还是原来的公式有误?
我有 2 列数组。我还有一个使用 2 列的方程式(积分)。我需要使用两列值来获得整数值。从某种意义上说,对于每个 s
都有 c
。
添加第三列,这是基于特定索引号的积分结果作为上限和下限。
例如,查看以下值:
ID=50
s = np.arange(0,100)
c = np.arange(200,300)
lanr=-4.56
lani=-2.33
而我需要解决的整合是c(s) * exp(lanr * s) * sin (lani * s)
。现在我的问题是添加第三列,其中包含 0,s[ID] 之间的积分结果,这意味着我需要具有我在 s=0
到 [=17 之间的问题中提到的细节的积分=].
我在下面写了一些不起作用的东西:
from scipy.integrate import quad
import numpy as np
from sympy import *
def f(s):
return c*(s) * exp(lanr * s) * sin (lani * s)
integ = []
for i in enumerate(s):
g = c * np.exp(lanr * s) * np.sin(lani * s)
integrate( f(s), s,0,ID)
也许以下内容与您正在寻找的内容相似?
一开始,我们可以尝试只做象征性的工作。 s
是基本变量。 c
是 s
的一个函数,在这种情况下写 c = s + 200
使 c
这样一个函数。
f=c*exp(lanr*s)*sin(lani*s)
是s
的一个更复杂的函数。 print(f)
给出 -(s+200)*exp(-4.56*s)*sin(2.33*s)
.
现在,您似乎对从 0
到某个值的 s
的 f
的积分感兴趣。我们将该值称为 t
。然后,该积分将是 t
的函数 g
。
from sympy import exp, sin, symbols, integrate, lambdify
s, t = symbols('s t')
lanr = -4.56
lani = -2.33
c = s + 200
f = c * exp(lanr * s) * sin (lani * s)
g = integrate(f, (s, 0, t))
如果只需要101个值,我们可以留在sympy里面:
values = [g.subs(t, ti).evalf() for ti in range(0, 101)]
如果需要更多的数值计算,lambdify()
可以将g
从sympy转换为numpy。
然后 numpy 还可以计算前 101 个值(这比在 sympy 中工作得快得多,但这只有在需要更多计算时才重要):
g_np = lambdify(t, g)
import numpy as np
x = np.arange(0,100)
y = g_np(x)
在这种情况下,结果将是
array([ 0. , -17.66531171, -17.80584637, -17.80185932,
-17.8019015 , -17.80190133, -17.80190133, -17.80190133,
-17.80190133, -17.80190133, -17.80190133, -17.80190133,
-17.80190133, -17.80190133, -17.80190133, -17.80190133,
...
这看起来很奇怪。也许某处有误会?还是原来的公式有误?