[英]Problem in writing an itegration in python
我有 2 列 arrays。 我還有一個使用 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
到s=ID
之間的問題中提到的帶有細節的積分。 我在下面寫了一些不起作用的東西:
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
is a function of s
, in this case writing c = s + 200
makes c
such a function.
f=c*exp(lanr*s)*sin(lani*s)
是更復雜的 function 的s
。 print(f)
給出-(s+200)*exp(-4.56*s)*sin(2.33*s)
。
現在,您似乎對f
的積分感興趣,因為s
從0
到某個值。 我們稱該值為t
。 然后,該積分將是t
的 function 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,
...
這看起來很奇怪。 也許在某個地方有一些誤解? 還是原來的公式有錯誤?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.