使用SciPy

时间:2018-03-22 19:40:02

标签: python scipy differential-equations

我想在不同的时间绘制这个等式。所以时间应该是恒定的,x应该变化,然后绘制y?该方程是时间相关扩散方程的解析解。

到目前为止我的代码:

import numpy as np
from scipy.sparse import diags
import scipy as sp
import scipy.sparse
from scipy import special
import matplotlib.pyplot as plt

def Canalytical(intervals, D=1):

    points = 1000

    x=np.linspace(0, 1, intervals+1)
    t=1
    c=np.ones([intervals+1])

    sm = 0
    pos = 0

    for xi in x:

        for i in range(points):

            sm+=sp.special.erfc((1-xi+2*i)/(2*np.sqrt(D*t))) + 
                sp.special.erfc((1+xi+2*i)/(2*np.sqrt(D*t)))

        c[pos] = sm
        pos += 1
        sm = 0

    return c, x

c, xi = Canalytical(intervals=1000) 
plt.plot(xi, c)
plt.show()

I want to plot this equation

1 个答案:

答案 0 :(得分:2)

图像中的等式是错误的。在其中插入x = 0,您将看到它不为零。第二个erfc函数前面的符号应为-

时间t应作为参数传递给Canalytical,因此该函数可用于多个t值。

使用1000项的总和是过多的,因为erfc在无限远处衰减得非常快。 erfc(10)约为2e-45,远远超出机器精度,更不用说解决情节了。

另外,在使用NumPy评估函数时,请考虑使用矢量化。整个数组x可以立即传递给函数,从而消除了循环。剩下的就是:

import numpy as np
from scipy import special
import matplotlib.pyplot as plt
def Canalytical(intervals, t=1, D=1):
    points = 1000
    x = np.linspace(0, 1, intervals+1)
    c = np.zeros_like(x)
    for i in range(points):
        c += special.erfc((1-x+2*i)/(2*np.sqrt(D*t))) - special.erfc((1+x+2*i)/(2*np.sqrt(D*t)))
    return x, c
plt.plot(*Canalytical(intervals=1000, t=1)) 
plt.plot(*Canalytical(intervals=1000, t=0.1)) 
plt.plot(*Canalytical(intervals=1000, t=0.01)) 
plt.plot(*Canalytical(intervals=1000, t=0.001)) 
plt.show()

输出

plot