变量内指数积分函数。 Python无法计算

时间:2016-12-21 19:18:05

标签: python exponential

我的数学问题在这里 - https://math.stackexchange.com/questions/2063507/solving-this-integral-involving-ei-function

这与种群动态有关,t =时间,N_t =时间t的种群,r =生长速度,K = cqrrying能力。

我的代码附在下面。

Python无法计算N_next的值,因为它在指数积分函数scipy.special.expi()内。我怎么能绕过这个呢? 它现在说" Scipy没有特殊属性"但根据这个 - https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.special.expi.html - 它应该是。

import math
import scipy
import numpy as np
import matplotlib
import matplotlib.pyplot as plt

t_f =100
N_0 = 10
t = []
N_t = [N_0,]
r = 2.5
K = 1000

for i in range(0,100):
    scipy.special.expi(r*N_next/K) = i*math.exp(r) + scipy.special.expi(r/K * N_t[i])
    N_t.append(N_next)
    t.append(i)

plt.plot(t,N_t)
plt.show

3 个答案:

答案 0 :(得分:0)

该错误是Python解释的奇特方式:您无法将表达式结果分配给函数调用

>> c

c =

       5142.1
       339.52
       22.417
       1.4802
     0.097731
    0.0064529
   0.00042607
   2.8132e-05
   1.8575e-06
   1.2265e-07
   8.0979e-09
   5.3469e-10
   3.5304e-11
    2.331e-12
   1.5391e-13
   1.0162e-14
   6.7099e-16
   4.4304e-17
   2.9253e-18
   1.9315e-19
   1.2753e-20
   8.4205e-22
   5.5598e-23
    3.671e-24
   2.4239e-25
   1.6004e-26
   1.0567e-27
   6.9771e-29
   4.6068e-30
   3.0418e-31

>> x = A\c

x =

       7029.1
       653.25
       60.709
        5.642
      0.52434
      0.04873
    0.0045287
   0.00042087
   3.9114e-05
    3.635e-06
   3.3782e-07
   3.1395e-08
   2.9177e-09
   2.7116e-10
     2.52e-11
    2.342e-12
   2.1765e-13
   2.0227e-14
   1.8798e-15
    1.747e-16
   1.6236e-17
   1.5089e-18
   1.4023e-19
   1.3033e-20
     1.21e-21
   1.1339e-22
   9.9766e-24
   1.1858e-24
   2.3902e-26
    2.078e-26

也许你在你的例子中混合了这一行?在这种情况下,请编辑您的帖子,以便我们为您提供帮助。

答案 1 :(得分:0)

https://math.stackexchange.com/questions/2063507/solving-this-integral-involving-ei-function中的答案提供了一个公式,您希望为 t 的值序列进行评估。在构建这样的脚本时,我建议你采用自下而上的方法。这是我到目前为止所写的内容。

from numpy import exp
import matplotlib.pyplot as plt

K = 1000
r = 2.5

N_0 = 10
N_t = 50

def Ei(x):
    return x

def Ei_inv(x):
    return 1/x

def N(t):
    return K*Ei_inv(exp(r)*t+Ei(r*N_0/K))/r

t = [_ for _ in range(40)]
N = [N(_) for _ in t]

plt.plot(t,N)
plt.show()
  • 我知道一些常数是什么;因此,我把它们放在代码中。
  • 我不知道Ei或它的逆是什么,或者我可能在哪里找到这些功能;作为一项临时措施,我写了“假”功能来取代他们的位置。
  • 现在我可以根据虚函数编写我实际想要评估的函数作为具有单个参数的另一个Python函数。那时我使用print (N(50))对我所拥有的内容进行了试用,以验证代码的各个部分是否在一起表现得很礼貌。
  • 我添加了两行,一行用于定义 x ,或者是时间,用于绘图的值,第二行用于 y N 价值观。

轮到你,用计算Ei及其倒数所需的任何东西替换虚函数。

答案 2 :(得分:0)

所以,我明白了。嗯,有点。代码现在非常耗费计算量。但它至少可以运作。它在下面。

import math
from scipy import *
from scipy.special import expi
import numpy as np

t_f =100
N_0 = 10
t = [0,]
n = [N_0,]
r = 2.5
K = 100
N_t = [N_0,]

for i in range(0,100):
    a= i*math.exp(r) + expi(r/K * N_0)
    n.append(a)
    t.append(i+1)

g = np.arange(0,1000,0.0001)
d = []
e = []

for i in g:
    x = expi(i)
    d.append(x)
    e.append(i)    

for j in range(1,99):
    b = n[j]
    c = []

    for i in g:
        c.append(b)

    t = np.subtract(d,c)
    for i in range(len(t) - 1):
        if t[i] == 0. or t[i] * t[i + 1] < 0.:
            y = e[i]
            print(y)

    N_next = math.floor(y*K/r)
    N_t.append(N_next)

print(N_t)
plot(t,N_t)